diff --git a/FlatCAMApp.py b/FlatCAMApp.py index d568ce25..14c87db9 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -6,7 +6,9 @@ # MIT Licence # # ########################################################### -import urllib.request, urllib.parse, urllib.error +import urllib.request +import urllib.parse +import urllib.error import getopt import random import simplejson as json @@ -19,7 +21,6 @@ import subprocess import tkinter as tk from PyQt5 import QtPrintSupport -import urllib.request, urllib.parse, urllib.error from contextlib import contextmanager import gc @@ -221,7 +222,7 @@ class App(QtCore.QObject): os.makedirs(os.path.join(self.data_path, 'postprocessors')) App.log.debug('Created data postprocessors folder: ' + os.path.join(self.data_path, 'postprocessors')) - self.postprocessorpaths = os.path.join(self.data_path,'postprocessors') + self.postprocessorpaths = os.path.join(self.data_path, 'postprocessors') if not os.path.exists(self.postprocessorpaths): os.makedirs(self.postprocessorpaths) App.log.debug('Created postprocessors folder: ' + self.postprocessorpaths) @@ -397,10 +398,14 @@ class App(QtCore.QObject): # Excellon General "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb, "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb, - "excellon_format_upper_in": self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry, - "excellon_format_lower_in": self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry, - "excellon_format_upper_mm": self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry, - "excellon_format_lower_mm": self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry, + "excellon_format_upper_in": + self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry, + "excellon_format_lower_in": + self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry, + "excellon_format_upper_mm": + self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry, + "excellon_format_lower_mm": + self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry, "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio, "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio, "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio, @@ -1516,7 +1521,6 @@ class App(QtCore.QObject): self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect( lambda: self.on_toggle_units(no_pref=False)) - # ############################## # ### GUI PREFERENCES SIGNALS ## # ############################## @@ -2087,7 +2091,7 @@ class App(QtCore.QObject): ('BETA' if self.beta else ''), platform.architecture()[0], name) - ) + ) def defaults_read_form(self): for option in self.defaults_form_fields: @@ -2517,7 +2521,7 @@ class App(QtCore.QObject): :param show: Opens the shell. :param error: Shows the message as an error. :param warning: Shows the message as an warning. - :param warning: Shows the message as an success. + :param success: Shows the message as an success. :param selected: Indicate that something was selected on canvas :return: None """ @@ -4153,8 +4157,9 @@ class App(QtCore.QObject): # Setting plot colors handlers def on_pf_color_entry(self): - self.defaults['global_plot_fill'] = self.ui.general_defaults_form.general_gui_group.pf_color_entry.get_value()[:7] + \ - self.defaults['global_plot_fill'][7:9] + self.defaults['global_plot_fill'] = \ + self.ui.general_defaults_form.general_gui_group.pf_color_entry.get_value()[:7] + \ + self.defaults['global_plot_fill'][7:9] self.ui.general_defaults_form.general_gui_group.pf_color_button.setStyleSheet( "background-color:%s" % str(self.defaults['global_plot_fill'])[:7]) @@ -4177,18 +4182,21 @@ class App(QtCore.QObject): def on_pf_color_spinner(self): spinner_value = self.ui.general_defaults_form.general_gui_group.pf_color_alpha_spinner.value() self.ui.general_defaults_form.general_gui_group.pf_color_alpha_slider.setValue(spinner_value) - self.defaults['global_plot_fill'] = self.defaults['global_plot_fill'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') - self.defaults['global_plot_line'] = self.defaults['global_plot_line'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') + self.defaults['global_plot_fill'] = \ + self.defaults['global_plot_fill'][:7] + \ + (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') + self.defaults['global_plot_line'] = \ + self.defaults['global_plot_line'][:7] + \ + (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') def on_pf_color_slider(self): slider_value = self.ui.general_defaults_form.general_gui_group.pf_color_alpha_slider.value() self.ui.general_defaults_form.general_gui_group.pf_color_alpha_spinner.setValue(slider_value) def on_pl_color_entry(self): - self.defaults['global_plot_line'] = self.ui.general_defaults_form.general_gui_group.pl_color_entry.get_value()[:7] + \ - self.defaults['global_plot_line'][7:9] + self.defaults['global_plot_line'] = \ + self.ui.general_defaults_form.general_gui_group.pl_color_entry.get_value()[:7] + \ + self.defaults['global_plot_line'][7:9] self.ui.general_defaults_form.general_gui_group.pl_color_button.setStyleSheet( "background-color:%s" % str(self.defaults['global_plot_line'])[:7]) @@ -4211,8 +4219,9 @@ class App(QtCore.QObject): # Setting selection colors (left - right) handlers def on_sf_color_entry(self): - self.defaults['global_sel_fill'] = self.ui.general_defaults_form.general_gui_group.sf_color_entry.get_value()[:7] + \ - self.defaults['global_sel_fill'][7:9] + self.defaults['global_sel_fill'] = \ + self.ui.general_defaults_form.general_gui_group.sf_color_entry.get_value()[:7] + \ + self.defaults['global_sel_fill'][7:9] self.ui.general_defaults_form.general_gui_group.sf_color_button.setStyleSheet( "background-color:%s" % str(self.defaults['global_sel_fill'])[:7]) @@ -4235,18 +4244,21 @@ class App(QtCore.QObject): def on_sf_color_spinner(self): spinner_value = self.ui.general_defaults_form.general_gui_group.sf_color_alpha_spinner.value() self.ui.general_defaults_form.general_gui_group.sf_color_alpha_slider.setValue(spinner_value) - self.defaults['global_sel_fill'] = self.defaults['global_sel_fill'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') - self.defaults['global_sel_line'] = self.defaults['global_sel_line'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') + self.defaults['global_sel_fill'] = \ + self.defaults['global_sel_fill'][:7] + \ + (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') + self.defaults['global_sel_line'] = \ + self.defaults['global_sel_line'][:7] + \ + (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') def on_sf_color_slider(self): slider_value = self.ui.general_defaults_form.general_gui_group.sf_color_alpha_slider.value() self.ui.general_defaults_form.general_gui_group.sf_color_alpha_spinner.setValue(slider_value) def on_sl_color_entry(self): - self.defaults['global_sel_line'] = self.ui.general_defaults_form.general_gui_group.sl_color_entry.get_value()[:7] + \ - self.defaults['global_sel_line'][7:9] + self.defaults['global_sel_line'] = \ + self.ui.general_defaults_form.general_gui_group.sl_color_entry.get_value()[:7] + \ + self.defaults['global_sel_line'][7:9] self.ui.general_defaults_form.general_gui_group.sl_color_button.setStyleSheet( "background-color:%s" % str(self.defaults['global_sel_line'])[:7]) @@ -4292,10 +4304,12 @@ class App(QtCore.QObject): def on_alt_sf_color_spinner(self): spinner_value = self.ui.general_defaults_form.general_gui_group.alt_sf_color_alpha_spinner.value() self.ui.general_defaults_form.general_gui_group.alt_sf_color_alpha_slider.setValue(spinner_value) - self.defaults['global_alt_sel_fill'] = self.defaults['global_alt_sel_fill'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') - self.defaults['global_alt_sel_line'] = self.defaults['global_alt_sel_line'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') + self.defaults['global_alt_sel_fill'] = \ + self.defaults['global_alt_sel_fill'][:7] + \ + (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') + self.defaults['global_alt_sel_line'] = \ + self.defaults['global_alt_sel_line'][:7] + \ + (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') def on_alt_sf_color_slider(self): slider_value = self.ui.general_defaults_form.general_gui_group.alt_sf_color_alpha_slider.value() @@ -4816,7 +4830,6 @@ class App(QtCore.QObject): self.inform.emit( _("[WARNING_NOTCL] Adding Tool cancelled ...")) - # It's meant to delete tools in tool tables via a 'Delete' shortcut key but only if certain conditions are met # See description bellow. def on_delete_keypress(self): @@ -4995,9 +5008,9 @@ class App(QtCore.QObject): try: if isinstance(obj, FlatCAMExcellon): self.new_object("excellon", str(obj_name) + "_copy", initialize_excellon) - elif isinstance(obj,FlatCAMGerber): + elif isinstance(obj, FlatCAMGerber): self.new_object("gerber", str(obj_name) + "_copy", initialize) - elif isinstance(obj,FlatCAMGeometry): + elif isinstance(obj, FlatCAMGeometry): self.new_object("geometry", str(obj_name) + "_copy", initialize) except Exception as e: return "Operation failed: %s" % str(e) @@ -5039,9 +5052,9 @@ class App(QtCore.QObject): try: if isinstance(obj, FlatCAMExcellon): self.new_object("excellon", str(obj_name) + custom_name, initialize_excellon) - elif isinstance(obj,FlatCAMGerber): + elif isinstance(obj, FlatCAMGerber): self.new_object("gerber", str(obj_name) + custom_name, initialize_gerber) - elif isinstance(obj,FlatCAMGeometry): + elif isinstance(obj, FlatCAMGeometry): self.new_object("geometry", str(obj_name) + custom_name, initialize_geometry) except Exception as e: return "Operation failed: %s" % str(e) @@ -5176,8 +5189,8 @@ class App(QtCore.QObject): return "Operation failed: %s" % str(e) def on_set_zero_click(self, event): - #this function will be available only for mouse left click - pos =[] + # this function will be available only for mouse left click + pos = [] pos_canvas = self.plotcanvas.vispy_canvas.translate_coords(event.pos) if event.button == 1: if self.grid_status() == True: @@ -5188,7 +5201,7 @@ class App(QtCore.QObject): x = 0 - pos[0] y = 0 - pos[1] for obj in self.collection.get_list(): - obj.offset((x,y)) + obj.offset((x, y)) self.object_changed.emit(obj) obj.plot() # Update the object bounding box options @@ -5974,7 +5987,7 @@ class App(QtCore.QObject): else: # case when there is only an object under the click and we toggle it if len(objects_under_the_click_list) == 1: - if self.collection.get_active() is None : + if self.collection.get_active() is None: self.collection.set_active(objects_under_the_click_list[0]) # create the selection box around the selected object curr_sel_obj = self.collection.get_active() @@ -6146,8 +6159,12 @@ class App(QtCore.QObject): face = Color(self.defaults['global_sel_fill'], alpha=0.2) outline = Color(self.defaults['global_sel_line'], alpha=0.8) - self.sel_objects_list.append(self.move_tool.sel_shapes.add(sel_rect, color=outline, - face_color=face, update=True, layer=0, tolerance=None)) + self.sel_objects_list.append(self.move_tool.sel_shapes.add(sel_rect, + color=outline, + face_color=face, + update=True, + layer=0, + tolerance=None)) def draw_moving_selection_shape(self, old_coords, coords, **kwargs): """ @@ -6190,8 +6207,8 @@ class App(QtCore.QObject): msgbox = QtWidgets.QMessageBox() # msgbox.setText("Save changes ...") msgbox.setText(_("There are files/objects opened in FlatCAM.\n" - "Creating a New project will delete them.\n" - "Do you want to Save the project?")) + "Creating a New project will delete them.\n" + "Do you want to Save the project?")) msgbox.setWindowTitle(_("Save changes")) msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png')) bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole) @@ -6330,7 +6347,7 @@ class App(QtCore.QObject): try: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Gerber"), - directory=self.get_last_folder(), filter=_filter_) + directory=self.get_last_folder(), filter=_filter_) except TypeError: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Gerber"), filter=_filter_) @@ -6359,7 +6376,7 @@ class App(QtCore.QObject): try: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Excellon"), - directory=self.get_last_folder(), filter=_filter_) + directory=self.get_last_folder(), filter=_filter_) except TypeError: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open Excellon"), filter=_filter_) @@ -6389,7 +6406,7 @@ class App(QtCore.QObject): "All Files (*.*)" try: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open G-Code"), - directory=self.get_last_folder(), filter=_filter_) + directory=self.get_last_folder(), filter=_filter_) except TypeError: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open G-Code"), filter=_filter_) @@ -6415,9 +6432,9 @@ class App(QtCore.QObject): _filter_ = "FlatCAM Project (*.FlatPrj);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Project"), - directory=self.get_last_folder(), filter=_filter_) + directory=self.get_last_folder(), filter=_filter_) except TypeError: - filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Project"), filter = _filter_) + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Project"), filter=_filter_) # The Qt methods above will return a QString which can cause problems later. # So far json.dump() will fail to serialize it. @@ -6445,10 +6462,10 @@ class App(QtCore.QObject): _filter_ = "FlatCAM Config (*.FlatConfig);;FlatCAM Config (*.json);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Configuration File"), - directory=self.data_path, filter=_filter_) + directory=self.data_path, filter=_filter_) except TypeError: filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Open Configuration File"), - filter = _filter_) + filter=_filter_) if filename == "": self.inform.emit(_("[WARNING_NOTCL] Open Config cancelled.")) @@ -6490,14 +6507,14 @@ class App(QtCore.QObject): name = obj.options["name"] - filter = "SVG File (*.svg);;All Files (*.*)" + _filter = "SVG File (*.svg);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption=_("Export SVG"), directory=self.get_last_save_folder() + '/' + str(name), - filter=filter) + filter=_filter) except TypeError: - filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export SVG"), filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export SVG"), filter=_filter) filename = str(filename) @@ -6565,14 +6582,14 @@ class App(QtCore.QObject): name = self.collection.get_active().options["name"] - filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)" + _filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption="Save Gerber source file", directory=self.get_last_save_folder() + '/' + name, - filter=filter) + filter=_filter) except TypeError: - filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Gerber source file"), filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Gerber source file"), filter=_filter) filename = str(filename) @@ -6606,14 +6623,14 @@ class App(QtCore.QObject): name = self.collection.get_active().options["name"] - filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" + _filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption=_("Save Excellon source file"), directory=self.get_last_save_folder() + '/' + name, - filter=filter) + filter=_filter) except TypeError: - filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Excellon source file"), filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Excellon source file"), filter=_filter) filename = str(filename) @@ -6647,14 +6664,14 @@ class App(QtCore.QObject): name = self.collection.get_active().options["name"] - filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" + _filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption=_("Export Excellon"), directory=self.get_last_save_folder() + '/' + name, - filter=filter) + filter=_filter) except TypeError: - filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export Excellon"), filter=filter) + filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Export Excellon"), filter=_filter) filename = str(filename) @@ -6825,9 +6842,9 @@ class App(QtCore.QObject): self.worker_task.emit({'fcn': self.import_dxf, 'params': [filename, type_of_obj]}) - # ################################################################################################################ ## - # # ## The following section has the functions that are displayed and call the Editor tab CNCJob Tab ############### ## - # ################################################################################################################ ## + # ############################################################################################################### + # ### The following section has the functions that are displayed and call the Editor tab CNCJob Tab ############# + # ############################################################################################################### def init_code_editor(self, name): # Signals section @@ -6981,7 +6998,7 @@ class App(QtCore.QObject): _filter_ = "TCL script (*.FlatScript);;TCL script (*.TCL);;TCL script (*.TXT);;All Files (*.*)" try: filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Run TCL script"), - directory=self.get_last_folder(), filter=_filter_) + directory=self.get_last_folder(), filter=_filter_) except TypeError: filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Run TCL script"), filter=_filter_) @@ -7450,7 +7467,7 @@ class App(QtCore.QObject): ewhole = self.defaults["excellon_exp_integer"] efract = self.defaults["excellon_exp_decimals"] ezeros = self.defaults["excellon_exp_zeros"] - eformat = self.defaults[ "excellon_exp_format"] + eformat = self.defaults["excellon_exp_format"] fc_units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() if fc_units == 'MM': @@ -8629,35 +8646,6 @@ The normal flow when working in FlatCAM is the following:

self.ui.selected_scroll_area.setWidget(sel_title) -# tool_title = QtWidgets.QTextEdit( -# 'Shortcut Key List') -# tool_title.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) -# tool_title.setFrameStyle(QtWidgets.QFrame.NoFrame) -# # font = self.sel_title.font() -# # font.setPointSize(12) -# # self.sel_title.setFont(font) -# -# tool_text = ''' -#

Tool Tab - Choose an Item in Tools Menu

-# -#

Details:
-# Some of the functionality of FlatCAM have been implemented as tools (a sort of plugins).

-# -#

Most of the tools are accessible through the Tools menu or by using the associated shortcut keys.
-# Each such a tool, if it needs an object to be used as a source it will provide the way to select this object(s) through a series of comboboxes. The result of using a tool is either a Geometry, an information that can be used in the app or it can be a file that can be saved.

-# -#
    -#
-# -#

A list of key shortcuts is available through an menu entry in Help -> Shortcuts List or through it's own key shortcut: '`' (key left to 1).

-# -# ''' -# -# tool_title.setText(tool_text) -# tool_title.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) -# -# self.ui.tool_scroll_area.setWidget(tool_title) - def setup_obj_classes(self): """ Sets up application specifics on the FlatCAMObj class. @@ -8939,7 +8927,7 @@ The normal flow when working in FlatCAM is the following:

to_quit = quit self.save_timer = QtCore.QTimer() self.save_timer.setInterval(delay) - self.save_timer.timeout.connect(lambda : self.check_project_file_size(filename=filename, quit=to_quit)) + self.save_timer.timeout.connect(lambda: self.check_project_file_size(filename=filename, quit=to_quit)) self.save_timer.start() def check_project_file_size(self, filename, quit=None): diff --git a/README.md b/README.md index da1bc082..093796c4 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 13.08.2019 - added new option in ToolSub: the ability to close (or not) the resulting paths when using tool on Geometry objects. Added also a new category in the Edit -> Preferences -> Tools, the Substractor Tool Options +- some PEP8 changes in FlatCAMApp.py 12.08.2019