diff --git a/FlatCAMApp.py b/FlatCAMApp.py index f21a830d..d0d47d7c 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -5253,15 +5253,15 @@ class App(QtCore.QObject): except IOError: exists = False - msg = "Project file exists. Overwrite?" - if exists: - msgbox = QtWidgets.QMessageBox() - msgbox.setInformativeText(msg) - msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel |QtWidgets.QMessageBox.Ok) - msgbox.setDefaultButton(QtWidgets.QMessageBox.Cancel) - result = msgbox.exec_() - if result ==QtWidgets.QMessageBox.Cancel: - return + # msg = "Project file exists. Overwrite?" + # if exists: + # msgbox = QtWidgets.QMessageBox() + # msgbox.setInformativeText(msg) + # msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel |QtWidgets.QMessageBox.Ok) + # msgbox.setDefaultButton(QtWidgets.QMessageBox.Cancel) + # result = msgbox.exec_() + # if result ==QtWidgets.QMessageBox.Cancel: + # return if thread is True: self.worker_task.emit({'fcn': self.save_project, diff --git a/FlatCAMObj.py b/FlatCAMObj.py index bd17c810..f93090c1 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -413,11 +413,6 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # type of isolation: 0 = exteriors, 1 = interiors, 2 = complete isolation (both interiors and exteriors) self.iso_type = 2 - # Attributes to be included in serialization - # Always append to it because it carries contents - # from predecessors. - self.ser_attrs += ['options', 'kind'] - self.multigeo = False self.apertures_row = 0 @@ -434,6 +429,11 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # self.ui.generate_bb_button.clicked.connect(self.on_generatebb_button_click) # self.ui.generate_noncopper_button.clicked.connect(self.on_generatenoncopper_button_click) + # Attributes to be included in serialization + # Always append to it because it carries contents + # from predecessors. + self.ser_attrs += ['options', 'kind'] + def set_ui(self, ui): """ Maps options with GUI inputs. @@ -1079,11 +1079,6 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # dict to hold the tool number as key and tool offset as value self.tool_offset ={} - # Attributes to be included in serialization - # Always append to it because it carries contents - # from predecessors. - self.ser_attrs += ['options', 'kind'] - # variable to store the total amount of drills per job self.tot_drill_cnt = 0 self.tool_row = 0 @@ -1100,6 +1095,11 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): self.multigeo = False + # Attributes to be included in serialization + # Always append to it because it carries contents + # from predecessors. + self.ser_attrs += ['options', 'kind'] + @staticmethod def merge(exc_list, exc_final): """ @@ -1995,8 +1995,14 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): tools = self.get_selected_tools_list() if len(tools) == 0: - self.app.inform.emit("[ERROR_NOTCL]Please select one or more tools from the list and try again.") - return + # if there is a single tool in the table (remember that the last 2 rows are for totals and do not count in + # tool number) it means that there are 3 rows (1 tool and 2 totals). + # in this case regardless of the selection status of that tool, use it. + if self.ui.tools_table.rowCount() == 3: + tools.append(self.ui.tools_table.item(0, 0).text()) + else: + self.app.inform.emit("[ERROR_NOTCL]Please select one or more tools from the list and try again.") + return xmin = self.options['xmin'] ymin = self.options['ymin'] @@ -3550,6 +3556,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.app.report_usage("geometry_on_generatecnc_button") self.read_form() + + self.sel_tools = {} + # test to see if we have tools available in the tool table if self.ui.geo_tools_table.selectedItems(): for x in self.ui.geo_tools_table.selectedItems(): @@ -3571,8 +3580,19 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): tooluid: copy.deepcopy(tooluid_value) }) self.mtool_gen_cncjob() - self.ui.geo_tools_table.clearSelection() + + elif self.ui.geo_tools_table.rowCount() == 1: + tooluid = int(self.ui.geo_tools_table.item(0, 5).text()) + + for tooluid_key, tooluid_value in self.tools.items(): + if int(tooluid_key) == tooluid: + self.sel_tools.update({ + tooluid: copy.deepcopy(tooluid_value) + }) + self.mtool_gen_cncjob() + self.ui.geo_tools_table.clearSelection() + else: self.app.inform.emit("[ERROR_NOTCL] Failed. No tool selected in the tool table ...") diff --git a/README.md b/README.md index e88f9235..70633a6c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,10 @@ CAD program, and create G-Code for Isolation routing. 17.02.2019 - changed some status bar messages -- New feature: added the capability to view the source code of the Gerber/Excellon file that was loaded into the app. The file is also stored as an object attribute for later use. THe view option is in the project context menu and in Menu -> Options -> View Source +- New feature: added the capability to view the source code of the Gerber/Excellon file that was loaded into the app. The file is also stored as an object attribute for later use. The view option is in the project context menu and in Menu -> Options -> View Source +- Serialized the source_file of the Objects so it is saved in the FlatCAM project and restored. +- if there is a single tool in the tool list (Geometry , Excellon) and the user click the Generate GCode, use that tool even if it is not selected +- 16.02.2019 diff --git a/camlib.py b/camlib.py index ddc76a05..49456d64 100644 --- a/camlib.py +++ b/camlib.py @@ -1913,11 +1913,13 @@ class Gerber (Geometry): # Aperture Macros self.aperture_macros = {} + self.source_file = '' + # Attributes to be included in serialization # Always append to it because it carries contents # from Geometry. self.ser_attrs += ['int_digits', 'frac_digits', 'apertures', - 'aperture_macros', 'solid_geometry'] + 'aperture_macros', 'solid_geometry', 'source_file'] #### Parser patterns #### # FS - Format Specification @@ -3295,6 +3297,8 @@ class Excellon(Geometry): # self.slots (list) to store the slots; each is a dictionary self.slots = [] + self.source_file = '' + # it serve to flag if a start routing or a stop routing was encountered # if a stop is encounter and this flag is still 0 (so there is no stop for a previous start) issue error self.routing_flag = 1 @@ -3325,7 +3329,8 @@ class Excellon(Geometry): # Always append to it because it carries contents # from Geometry. self.ser_attrs += ['tools', 'drills', 'zeros', 'excellon_format_upper_mm', 'excellon_format_lower_mm', - 'excellon_format_upper_in', 'excellon_format_lower_in', 'excellon_units', 'slots'] + 'excellon_format_upper_in', 'excellon_format_lower_in', 'excellon_units', 'slots', + 'source_file'] #### Patterns #### # Regex basics: