Просмотр исходного кода

Merged in marius_stanciu/flatcam_beta/Beta (pull request #203)

Beta
Marius Stanciu 6 лет назад
Родитель
Сommit
b67bec8052
7 измененных файлов с 205 добавлено и 302 удалено
  1. 7 13
      FlatCAM.py
  2. 6 9
      FlatCAMApp.py
  3. 123 267
      FlatCAMObj.py
  4. 9 0
      README.md
  5. 1 1
      flatcamTools/ToolPaint.py
  6. 54 10
      tclCommands/TclCommandCncjob.py
  7. 5 2
      tclCommands/TclCommandIsolate.py

+ 7 - 13
FlatCAM.py

@@ -58,19 +58,13 @@ if __name__ == '__main__':
     else:
     else:
         app.setAttribute(Qt.AA_EnableHighDpiScaling, False)
         app.setAttribute(Qt.AA_EnableHighDpiScaling, False)
 
 
-    # Create and display the splash screen
-    # from here: https://eli.thegreenplace.net/2009/05/09/creating-splash-screens-in-pyqt
-    # splash_pix = QtGui.QPixmap('share/splash.png')
-    # splash = QtWidgets.QSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
-    # # splash.setMask(splash_pix.mask())
-    # splash.show()
-    # app.processEvents()
-    # splash.showMessage("FlatCAM is initializing ...",
-    #                    alignment=Qt.AlignBottom | Qt.AlignLeft,
-    #                    color=QtGui.QColor("gray"))
-
     fc = App()
     fc = App()
-    # splash.finish(fc.ui)
-    fc.ui.show()
+
+    if settings.contains("maximized_gui"):
+        maximized_ui = settings.value('maximized_gui', type=bool)
+        if maximized_ui is True:
+            fc.ui.showMaximized()
+        else:
+            fc.ui.show()
 
 
     sys.exit(app.exec_())
     sys.exit(app.exec_())

+ 6 - 9
FlatCAMApp.py

@@ -2322,6 +2322,9 @@ class App(QtCore.QObject):
 
 
         self.set_ui_title(name=_("New Project - Not saved"))
         self.set_ui_title(name=_("New Project - Not saved"))
 
 
+        # finish the splash
+        # splash.finish(self.ui)
+
         # ###############################################################################
         # ###############################################################################
         # ####################### Finished the CONSTRUCTOR ##############################
         # ####################### Finished the CONSTRUCTOR ##############################
         # ###############################################################################
         # ###############################################################################
@@ -6493,7 +6496,7 @@ class App(QtCore.QObject):
 
 
         # Switch plot_area to preferences page
         # Switch plot_area to preferences page
         self.ui.plot_tab_area.setCurrentWidget(self.ui.preferences_tab)
         self.ui.plot_tab_area.setCurrentWidget(self.ui.preferences_tab)
-        self.ui.show()
+        # self.ui.show()
 
 
         # this disconnect() is done so the slot will be connected only once
         # this disconnect() is done so the slot will be connected only once
         try:
         try:
@@ -6948,7 +6951,7 @@ class App(QtCore.QObject):
 
 
         # Switch plot_area to preferences page
         # Switch plot_area to preferences page
         self.ui.plot_tab_area.setCurrentWidget(self.ui.shortcuts_tab)
         self.ui.plot_tab_area.setCurrentWidget(self.ui.shortcuts_tab)
-        self.ui.show()
+        # self.ui.show()
 
 
     def on_select_tab(self, name):
     def on_select_tab(self, name):
         # if the splitter is hidden, display it, else hide it but only if the current widget is the same
         # if the splitter is hidden, display it, else hide it but only if the current widget is the same
@@ -8320,7 +8323,7 @@ class App(QtCore.QObject):
                     self.ui.code_editor.moveCursor(QtGui.QTextCursor.Start)
                     self.ui.code_editor.moveCursor(QtGui.QTextCursor.Start)
 
 
                     self.handleTextChanged()
                     self.handleTextChanged()
-                    self.ui.show()
+                    # self.ui.show()
 
 
             except Exception as e:
             except Exception as e:
                 log.debug("App.on_fileopenscript() -> %s" % str(e))
                 log.debug("App.on_fileopenscript() -> %s" % str(e))
@@ -9672,12 +9675,6 @@ class App(QtCore.QObject):
                                 self.defaults["global_def_win_w"],
                                 self.defaults["global_def_win_w"],
                                 self.defaults["global_def_win_h"])
                                 self.defaults["global_def_win_h"])
             self.ui.splitter.setSizes([self.defaults["global_def_notebook_width"], 0])
             self.ui.splitter.setSizes([self.defaults["global_def_notebook_width"], 0])
-
-            settings = QSettings("Open Source", "FlatCAM")
-            if settings.contains("maximized_gui"):
-                maximized_ui = settings.value('maximized_gui', type=bool)
-                if maximized_ui is True:
-                    self.ui.showMaximized()
         except KeyError as e:
         except KeyError as e:
             log.debug("App.restore_main_win_geom() --> %s" % str(e))
             log.debug("App.restore_main_win_geom() --> %s" % str(e))
 
 

+ 123 - 267
FlatCAMObj.py

@@ -2923,16 +2923,16 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
             # job_obj.options["tooldia"] =
             # job_obj.options["tooldia"] =
 
 
             tools_csv = ','.join(tools)
             tools_csv = ','.join(tools)
-            ret_val = job_obj.generate_from_excellon_by_tool(self, tools_csv,
-                                                             drillz=float(self.options['drillz']),
-                                                             toolchange=self.options["toolchange"],
-                                                             toolchangexy=self.app.defaults["excellon_toolchangexy"],
-                                                             toolchangez=float(self.options["toolchangez"]),
-                                                             startz=float(self.options["startz"]) if
-                                                             self.options["startz"] else None,
-                                                             endz=float(self.options["endz"]),
-                                                             excellon_optimization_type=self.app.defaults[
-                                                                 "excellon_optimization_type"])
+            ret_val = job_obj.generate_from_excellon_by_tool(
+                self, tools_csv,
+                drillz=float(self.options['drillz']),
+                toolchange=self.options["toolchange"],
+                toolchangexy=self.app.defaults["excellon_toolchangexy"],
+                toolchangez=float(self.options["toolchangez"]),
+                startz=float(self.options["startz"]) if self.options["startz"] else None,
+                endz=float(self.options["endz"]),
+                excellon_optimization_type=self.app.defaults["excellon_optimization_type"])
+
             if ret_val == 'fail':
             if ret_val == 'fail':
                 return 'fail'
                 return 'fail'
             app_obj.progress.emit(50)
             app_obj.progress.emit(50)
@@ -3247,10 +3247,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             "depthperpass": 0.002,
             "depthperpass": 0.002,
             "extracut": False,
             "extracut": False,
             "endz": 2.0,
             "endz": 2.0,
+            "startz": None,
             "toolchange": False,
             "toolchange": False,
             "toolchangez": 1.0,
             "toolchangez": 1.0,
             "toolchangexy": "0.0, 0.0",
             "toolchangexy": "0.0, 0.0",
-            "startz": None,
             "ppname_g": 'default',
             "ppname_g": 'default',
             "z_pdepth": -0.02,
             "z_pdepth": -0.02,
             "feedrate_probe": 3.0,
             "feedrate_probe": 3.0,
@@ -4462,6 +4462,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
     def on_generatecnc_button_click(self, *args):
     def on_generatecnc_button_click(self, *args):
         log.debug("Generating CNCJob from Geometry ...")
         log.debug("Generating CNCJob from Geometry ...")
         self.app.report_usage("geometry_on_generatecnc_button")
         self.app.report_usage("geometry_on_generatecnc_button")
+
+        # this reads the values in the UI form to the self.options dictionary
         self.read_form()
         self.read_form()
 
 
         self.sel_tools = {}
         self.sel_tools = {}
@@ -4516,30 +4518,29 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             self.app.inform.emit('[ERROR_NOTCL] %s' %
             self.app.inform.emit('[ERROR_NOTCL] %s' %
                                  _("Failed. No tool selected in the tool table ..."))
                                  _("Failed. No tool selected in the tool table ..."))
 
 
-    def mtool_gen_cncjob(self, segx=None, segy=None, use_thread=True):
+    def mtool_gen_cncjob(self, tools_dict=None, tools_in_use=None, segx=None, segy=None, use_thread=True):
         """
         """
         Creates a multi-tool CNCJob out of this Geometry object.
         Creates a multi-tool CNCJob out of this Geometry object.
         The actual work is done by the target FlatCAMCNCjob object's
         The actual work is done by the target FlatCAMCNCjob object's
         `generate_from_geometry_2()` method.
         `generate_from_geometry_2()` method.
 
 
-        :param z_cut: Cut depth (negative)
-        :param z_move: Hight of the tool when travelling (not cutting)
-        :param feedrate: Feed rate while cutting on X - Y plane
-        :param feedrate_z: Feed rate while cutting on Z plane
-        :param feedrate_rapid: Feed rate while moving with rapids
-        :param tooldia: Tool diameter
-        :param outname: Name of the new object
-        :param spindlespeed: Spindle speed (RPM)
-        :param ppname_g Name of the postprocessor
+        :param tools_dict: a dictionary that holds the whole data needed to create the Gcode
+        (including the solid_geometry)
+
+        :param tools_in_use: the tools that are used, needed by some postprocessors
+        :type list of lists, each list in the list is made out of row elements of tools table from GUI
+
+        :param segx: number of segments on the X axis, for auto-levelling
+        :param segy: number of segments on the Y axis, for auto-levelling
+        :param use_thread: if True use threading
         :return: None
         :return: None
         """
         """
 
 
-        offset_str = ''
-        multitool_gcode = ''
-
         # use the name of the first tool selected in self.geo_tools_table which has the diameter passed as tool_dia
         # use the name of the first tool selected in self.geo_tools_table which has the diameter passed as tool_dia
         outname = "%s_%s" % (self.options["name"], 'cnc')
         outname = "%s_%s" % (self.options["name"], 'cnc')
 
 
+        tools_dict = self.sel_tools if tools_dict is None else tools_dict
+        tools_in_use = tools_in_use if tools_in_use is not None else self.get_selected_tools_table_items()
         segx = segx if segx is not None else float(self.app.defaults['geometry_segx'])
         segx = segx if segx is not None else float(self.app.defaults['geometry_segx'])
         segy = segy if segy is not None else float(self.app.defaults['geometry_segy'])
         segy = segy if segy is not None else float(self.app.defaults['geometry_segy'])
 
 
@@ -4564,6 +4565,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             assert isinstance(job_obj, FlatCAMCNCjob), \
             assert isinstance(job_obj, FlatCAMCNCjob), \
                 "Initializer expected a FlatCAMCNCjob, got %s" % type(job_obj)
                 "Initializer expected a FlatCAMCNCjob, got %s" % type(job_obj)
 
 
+            job_obj.options['xmin'] = xmin
+            job_obj.options['ymin'] = ymin
+            job_obj.options['xmax'] = xmax
+            job_obj.options['ymax'] = ymax
+
             # count the tools
             # count the tools
             tool_cnt = 0
             tool_cnt = 0
 
 
@@ -4573,121 +4579,28 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             job_obj.multitool = True
             job_obj.multitool = True
             job_obj.multigeo = False
             job_obj.multigeo = False
             job_obj.cnc_tools.clear()
             job_obj.cnc_tools.clear()
-            # job_obj.create_geometry()
-
-            job_obj.options['Tools_in_use'] = self.get_selected_tools_table_items()
-            job_obj.segx = segx
-            job_obj.segy = segy
 
 
-            try:
-                job_obj.z_pdepth = float(self.options["z_pdepth"])
-            except ValueError:
-                # try to convert comma to decimal point. if it's still not working error message and return
-                try:
-                    job_obj.z_pdepth = float(self.options["z_pdepth"].replace(',', '.'))
-                except ValueError:
-                    self.app.inform.emit('[ERROR_NOTCL] %s' %
-                                         _('Wrong value format for self.defaults["z_pdepth"] or '
-                                           'self.options["z_pdepth"]'))
+            job_obj.options['Tools_in_use'] = tools_in_use
+            job_obj.segx = segx if segx else float(self.app.defaults["geometry_segx"])
+            job_obj.segy = segy if segy else float(self.app.defaults["geometry_segy"])
 
 
-            try:
-                job_obj.feedrate_probe = float(self.options["feedrate_probe"])
-            except ValueError:
-                # try to convert comma to decimal point. if it's still not working error message and return
-                try:
-                    job_obj.feedrate_rapid = float(self.options["feedrate_probe"].replace(',', '.'))
-                except ValueError:
-                    self.app.inform.emit('[ERROR_NOTCL] %s' %
-                                         _('Wrong value format for self.defaults["feedrate_probe"] or '
-                                           'self.options["feedrate_probe"]'))
+            job_obj.z_pdepth = float(self.app.defaults["geometry_z_pdepth"])
+            job_obj.feedrate_probe = float(self.app.defaults["geometry_feedrate_probe"])
 
 
-            for tooluid_key in self.sel_tools:
+            for tooluid_key in list(tools_dict.keys()):
                 tool_cnt += 1
                 tool_cnt += 1
-                app_obj.progress.emit(20)
-
-                for diadict_key, diadict_value in self.sel_tools[tooluid_key].items():
-                    if diadict_key == 'tooldia':
-                        tooldia_val = float('%.4f' % float(diadict_value))
-                        dia_cnc_dict.update({
-                            diadict_key: tooldia_val
-                        })
-                    if diadict_key == 'offset':
-                        o_val = diadict_value.lower()
-                        dia_cnc_dict.update({
-                            diadict_key: o_val
-                        })
 
 
-                    if diadict_key == 'type':
-                        t_val = diadict_value
-                        dia_cnc_dict.update({
-                            diadict_key: t_val
-                        })
-
-                    if diadict_key == 'tool_type':
-                        tt_val = diadict_value
-                        dia_cnc_dict.update({
-                            diadict_key: tt_val
-                        })
-
-                    if diadict_key == 'data':
-                        for data_key, data_value in diadict_value.items():
-                            if data_key == "multidepth":
-                                multidepth = data_value
-                            if data_key == "depthperpass":
-                                depthpercut = data_value
-
-                            if data_key == "extracut":
-                                extracut = data_value
-                            if data_key == "startz":
-                                startz = data_value
-                            if data_key == "endz":
-                                endz = data_value
-
-                            if data_key == "toolchangez":
-                                toolchangez = data_value
-                            if data_key == "toolchangexy":
-                                toolchangexy = data_value
-                            if data_key == "toolchange":
-                                toolchange = data_value
-
-                            if data_key == "cutz":
-                                z_cut = data_value
-                            if data_key == "travelz":
-                                z_move = data_value
-
-                            if data_key == "feedrate":
-                                feedrate = data_value
-                            if data_key == "feedrate_z":
-                                feedrate_z = data_value
-                            if data_key == "feedrate_rapid":
-                                feedrate_rapid = data_value
-
-                            if data_key == "ppname_g":
-                                pp_geometry_name = data_value
-
-                            if data_key == "spindlespeed":
-                                spindlespeed = data_value
-                            if data_key == "dwell":
-                                dwell = data_value
-                            if data_key == "dwelltime":
-                                dwelltime = data_value
-
-                        datadict = deepcopy(diadict_value)
-                        dia_cnc_dict.update({
-                            diadict_key: datadict
-                        })
+                dia_cnc_dict = deepcopy(tools_dict[tooluid_key])
+                tooldia_val = float('%.4f' % float(tools_dict[tooluid_key]['tooldia']))
+                dia_cnc_dict.update({
+                    'tooldia': tooldia_val
+                })
 
 
                 if dia_cnc_dict['offset'] == 'in':
                 if dia_cnc_dict['offset'] == 'in':
                     tool_offset = -dia_cnc_dict['tooldia'] / 2
                     tool_offset = -dia_cnc_dict['tooldia'] / 2
-                    offset_str = 'inside'
                 elif dia_cnc_dict['offset'].lower() == 'out':
                 elif dia_cnc_dict['offset'].lower() == 'out':
                     tool_offset = dia_cnc_dict['tooldia'] / 2
                     tool_offset = dia_cnc_dict['tooldia'] / 2
-                    offset_str = 'outside'
-                elif dia_cnc_dict['offset'].lower() == 'path':
-                    offset_str = 'onpath'
-                    tool_offset = 0.0
-                else:
-                    offset_str = 'custom'
+                elif dia_cnc_dict['offset'].lower() == 'custom':
                     try:
                     try:
                         offset_value = float(self.ui.tool_offset_entry.get_value())
                         offset_value = float(self.ui.tool_offset_entry.get_value())
                     except ValueError:
                     except ValueError:
@@ -4705,10 +4618,31 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                                                 "no value is provided.\n"
                                                                 "no value is provided.\n"
                                                                 "Add a Tool Offset or change the Offset Type."))
                                                                 "Add a Tool Offset or change the Offset Type."))
                         return
                         return
+                else:
+                    tool_offset = 0.0
+
                 dia_cnc_dict.update({
                 dia_cnc_dict.update({
                     'offset_value': tool_offset
                     'offset_value': tool_offset
                 })
                 })
 
 
+                z_cut = tools_dict[tooluid_key]['data']["cutz"]
+                z_move = tools_dict[tooluid_key]['data']["travelz"]
+                feedrate = tools_dict[tooluid_key]['data']["feedrate"]
+                feedrate_z = tools_dict[tooluid_key]['data']["feedrate_z"]
+                feedrate_rapid = tools_dict[tooluid_key]['data']["feedrate_rapid"]
+                multidepth = tools_dict[tooluid_key]['data']["multidepth"]
+                extracut = tools_dict[tooluid_key]['data']["extracut"]
+                depthpercut = tools_dict[tooluid_key]['data']["depthperpass"]
+                toolchange = tools_dict[tooluid_key]['data']["toolchange"]
+                toolchangez = tools_dict[tooluid_key]['data']["toolchangez"]
+                toolchangexy = tools_dict[tooluid_key]['data']["toolchangexy"]
+                startz = tools_dict[tooluid_key]['data']["startz"]
+                endz = tools_dict[tooluid_key]['data']["endz"]
+                spindlespeed = tools_dict[tooluid_key]['data']["spindlespeed"]
+                dwell = tools_dict[tooluid_key]['data']["dwell"]
+                dwelltime = tools_dict[tooluid_key]['data']["dwelltime"]
+                pp_geometry_name = tools_dict[tooluid_key]['data']["ppname_g"]
+
                 spindledir = self.app.defaults['geometry_spindledir']
                 spindledir = self.app.defaults['geometry_spindledir']
                 tool_solid_geometry = self.solid_geometry
                 tool_solid_geometry = self.solid_geometry
 
 
@@ -4720,13 +4654,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 job_obj.options['type'] = 'Geometry'
                 job_obj.options['type'] = 'Geometry'
                 job_obj.options['tool_dia'] = tooldia_val
                 job_obj.options['tool_dia'] = tooldia_val
 
 
-                job_obj.options['xmin'] = xmin
-                job_obj.options['ymin'] = ymin
-                job_obj.options['xmax'] = xmax
-                job_obj.options['ymax'] = ymax
-
-                app_obj.progress.emit(40)
-
                 # it seems that the tolerance needs to be a lot lower value than 0.01 and it was hardcoded initially
                 # it seems that the tolerance needs to be a lot lower value than 0.01 and it was hardcoded initially
                 # to a value of 0.0005 which is 20 times less than 0.01
                 # to a value of 0.0005 which is 20 times less than 0.01
                 tol = float(self.app.defaults['global_tolerance']) / 20
                 tol = float(self.app.defaults['global_tolerance']) / 20
@@ -4780,44 +4707,29 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             assert isinstance(job_obj, FlatCAMCNCjob), \
             assert isinstance(job_obj, FlatCAMCNCjob), \
                 "Initializer expected a FlatCAMCNCjob, got %s" % type(job_obj)
                 "Initializer expected a FlatCAMCNCjob, got %s" % type(job_obj)
 
 
+            current_uid = int(1)
+
+            job_obj.options['xmin'] = xmin
+            job_obj.options['ymin'] = ymin
+            job_obj.options['xmax'] = xmax
+            job_obj.options['ymax'] = ymax
+
             # count the tools
             # count the tools
             tool_cnt = 0
             tool_cnt = 0
 
 
             dia_cnc_dict = {}
             dia_cnc_dict = {}
 
 
-            current_uid = int(1)
-
             # this turn on the FlatCAMCNCJob plot for multiple tools
             # this turn on the FlatCAMCNCJob plot for multiple tools
             job_obj.multitool = True
             job_obj.multitool = True
             job_obj.multigeo = True
             job_obj.multigeo = True
             job_obj.cnc_tools.clear()
             job_obj.cnc_tools.clear()
 
 
-            job_obj.options['xmin'] = xmin
-            job_obj.options['ymin'] = ymin
-            job_obj.options['xmax'] = xmax
-            job_obj.options['ymax'] = ymax
+            job_obj.options['Tools_in_use'] = tools_in_use
+            job_obj.segx = segx if segx else float(self.app.defaults["geometry_segx"])
+            job_obj.segy = segy if segy else float(self.app.defaults["geometry_segy"])
 
 
-            try:
-                job_obj.z_pdepth = float(self.options["z_pdepth"])
-            except ValueError:
-                # try to convert comma to decimal point. if it's still not working error message and return
-                try:
-                    job_obj.z_pdepth = float(self.options["z_pdepth"].replace(',', '.'))
-                except ValueError:
-                    self.app.inform.emit('[ERROR_NOTCL] %s' %
-                                         _('Wrong value format for self.defaults["z_pdepth"] or '
-                                           'self.options["z_pdepth"]'))
-
-            try:
-                job_obj.feedrate_probe = float(self.options["feedrate_probe"])
-            except ValueError:
-                # try to convert comma to decimal point. if it's still not working error message and return
-                try:
-                    job_obj.feedrate_rapid = float(self.options["feedrate_probe"].replace(',', '.'))
-                except ValueError:
-                    self.app.inform.emit('[ERROR_NOTCL]%s' %
-                                         _(' Wrong value format for self.defaults["feedrate_probe"] or '
-                                           'self.options["feedrate_probe"]'))
+            job_obj.z_pdepth = float(self.app.defaults["geometry_z_pdepth"])
+            job_obj.feedrate_probe = float(self.app.defaults["geometry_feedrate_probe"])
 
 
             # make sure that trying to make a CNCJob from an empty file is not creating an app crash
             # make sure that trying to make a CNCJob from an empty file is not creating an app crash
             if not self.solid_geometry:
             if not self.solid_geometry:
@@ -4830,103 +4742,28 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                          _('Cancelled. Empty file, it has no geometry'))
                                          _('Cancelled. Empty file, it has no geometry'))
                     return 'fail'
                     return 'fail'
 
 
-            for tooluid_key in self.sel_tools:
+            for tooluid_key in list(tools_dict.keys()):
                 tool_cnt += 1
                 tool_cnt += 1
-                app_obj.progress.emit(20)
+                dia_cnc_dict = deepcopy(tools_dict[tooluid_key])
+                tooldia_val = float('%.4f' % float(tools_dict[tooluid_key]['tooldia']))
 
 
-                # find the tool_dia associated with the tooluid_key
-                sel_tool_dia = self.sel_tools[tooluid_key]['tooldia']
+                dia_cnc_dict.update({
+                    'tooldia': tooldia_val
+                })
 
 
+                # find the tool_dia associated with the tooluid_key
                 # search in the self.tools for the sel_tool_dia and when found see what tooluid has
                 # search in the self.tools for the sel_tool_dia and when found see what tooluid has
                 # on the found tooluid in self.tools we also have the solid_geometry that interest us
                 # on the found tooluid in self.tools we also have the solid_geometry that interest us
                 for k, v in self.tools.items():
                 for k, v in self.tools.items():
-                    if float('%.4f' % float(v['tooldia'])) == float('%.4f' % float(sel_tool_dia)):
+                    if float('%.4f' % float(v['tooldia'])) == tooldia_val:
                         current_uid = int(k)
                         current_uid = int(k)
                         break
                         break
 
 
-                for diadict_key, diadict_value in self.sel_tools[tooluid_key].items():
-                    if diadict_key == 'tooldia':
-                        tooldia_val = float('%.4f' % float(diadict_value))
-                        dia_cnc_dict.update({
-                            diadict_key: tooldia_val
-                        })
-                    if diadict_key == 'offset':
-                        o_val = diadict_value.lower()
-                        dia_cnc_dict.update({
-                            diadict_key: o_val
-                        })
-
-                    if diadict_key == 'type':
-                        t_val = diadict_value
-                        dia_cnc_dict.update({
-                            diadict_key: t_val
-                        })
-
-                    if diadict_key == 'tool_type':
-                        tt_val = diadict_value
-                        dia_cnc_dict.update({
-                            diadict_key: tt_val
-                        })
-
-                    if diadict_key == 'data':
-                        for data_key, data_value in diadict_value.items():
-                            if data_key == "multidepth":
-                                multidepth = data_value
-                            if data_key == "depthperpass":
-                                depthpercut = data_value
-
-                            if data_key == "extracut":
-                                extracut = data_value
-                            if data_key == "startz":
-                                startz = data_value
-                            if data_key == "endz":
-                                endz = data_value
-
-                            if data_key == "toolchangez":
-                                toolchangez = data_value
-                            if data_key == "toolchangexy":
-                                toolchangexy = data_value
-                            if data_key == "toolchange":
-                                toolchange = data_value
-
-                            if data_key == "cutz":
-                                z_cut = data_value
-                            if data_key == "travelz":
-                                z_move = data_value
-
-                            if data_key == "feedrate":
-                                feedrate = data_value
-                            if data_key == "feedrate_z":
-                                feedrate_z = data_value
-                            if data_key == "feedrate_rapid":
-                                feedrate_rapid = data_value
-
-                            if data_key == "ppname_g":
-                                pp_geometry_name = data_value
-
-                            if data_key == "spindlespeed":
-                                spindlespeed = data_value
-                            if data_key == "dwell":
-                                dwell = data_value
-                            if data_key == "dwelltime":
-                                dwelltime = data_value
-
-                        datadict = deepcopy(diadict_value)
-                        dia_cnc_dict.update({
-                            diadict_key: datadict
-                        })
-
                 if dia_cnc_dict['offset'] == 'in':
                 if dia_cnc_dict['offset'] == 'in':
-                    tool_offset = -dia_cnc_dict['tooldia'] / 2
-                    offset_str = 'inside'
+                    tool_offset = -tooldia_val / 2
                 elif dia_cnc_dict['offset'].lower() == 'out':
                 elif dia_cnc_dict['offset'].lower() == 'out':
-                    tool_offset = dia_cnc_dict['tooldia'] / 2
-                    offset_str = 'outside'
-                elif dia_cnc_dict['offset'].lower() == 'path':
-                    offset_str = 'onpath'
-                    tool_offset = 0.0
-                else:
-                    offset_str = 'custom'
+                    tool_offset = tooldia_val / 2
+                elif dia_cnc_dict['offset'].lower() == 'custom':
                     try:
                     try:
                         offset_value = float(self.ui.tool_offset_entry.get_value())
                         offset_value = float(self.ui.tool_offset_entry.get_value())
                     except ValueError:
                     except ValueError:
@@ -4945,10 +4782,34 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                                "no value is provided.\n"
                                                "no value is provided.\n"
                                                "Add a Tool Offset or change the Offset Type."))
                                                "Add a Tool Offset or change the Offset Type."))
                         return
                         return
+                else:
+                    tool_offset = 0.0
+
                 dia_cnc_dict.update({
                 dia_cnc_dict.update({
                     'offset_value': tool_offset
                     'offset_value': tool_offset
                 })
                 })
 
 
+                z_cut = tools_dict[tooluid_key]['data']["cutz"]
+                z_move = tools_dict[tooluid_key]['data']["travelz"]
+                feedrate = tools_dict[tooluid_key]['data']["feedrate"]
+                feedrate_z = tools_dict[tooluid_key]['data']["feedrate_z"]
+                feedrate_rapid = tools_dict[tooluid_key]['data']["feedrate_rapid"]
+                multidepth = tools_dict[tooluid_key]['data']["multidepth"]
+                extracut = tools_dict[tooluid_key]['data']["extracut"]
+                depthpercut = tools_dict[tooluid_key]['data']["depthperpass"]
+                toolchange = tools_dict[tooluid_key]['data']["toolchange"]
+                toolchangez = tools_dict[tooluid_key]['data']["toolchangez"]
+                toolchangexy = tools_dict[tooluid_key]['data']["toolchangexy"]
+                startz = tools_dict[tooluid_key]['data']["startz"]
+                endz = tools_dict[tooluid_key]['data']["endz"]
+                spindlespeed = tools_dict[tooluid_key]['data']["spindlespeed"]
+                dwell = tools_dict[tooluid_key]['data']["dwell"]
+                dwelltime = tools_dict[tooluid_key]['data']["dwelltime"]
+                pp_geometry_name = tools_dict[tooluid_key]['data']["ppname_g"]
+
+                spindledir = self.app.defaults['geometry_spindledir']
+                tool_solid_geometry = self.tools[current_uid]['solid_geometry']
+
                 job_obj.coords_decimals = self.app.defaults["cncjob_coords_decimals"]
                 job_obj.coords_decimals = self.app.defaults["cncjob_coords_decimals"]
                 job_obj.fr_decimals = self.app.defaults["cncjob_fr_decimals"]
                 job_obj.fr_decimals = self.app.defaults["cncjob_fr_decimals"]
 
 
@@ -4957,11 +4818,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 job_obj.options['type'] = 'Geometry'
                 job_obj.options['type'] = 'Geometry'
                 job_obj.options['tool_dia'] = tooldia_val
                 job_obj.options['tool_dia'] = tooldia_val
 
 
-                app_obj.progress.emit(40)
-
-                spindledir = self.app.defaults['geometry_spindledir']
-                tool_solid_geometry = self.tools[current_uid]['solid_geometry']
-
                 # it seems that the tolerance needs to be a lot lower value than 0.01 and it was hardcoded initially
                 # it seems that the tolerance needs to be a lot lower value than 0.01 and it was hardcoded initially
                 # to a value of 0.0005 which is 20 times less than 0.01
                 # to a value of 0.0005 which is 20 times less than 0.01
                 tol = float(self.app.defaults['global_tolerance']) / 20
                 tol = float(self.app.defaults['global_tolerance']) / 20
@@ -4993,7 +4849,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 #     geo['geom'] for geo in dia_cnc_dict['gcode_parsed'] if geo['geom'].is_valid is True
                 #     geo['geom'] for geo in dia_cnc_dict['gcode_parsed'] if geo['geom'].is_valid is True
                 # ])
                 # ])
                 try:
                 try:
-                    dia_cnc_dict['solid_geometry'] = tool_solid_geometry
+                    dia_cnc_dict['solid_geometry'] = deepcopy(tool_solid_geometry)
                     self.app.inform.emit('[success] %s' % _("Finished G-Code processing..."))
                     self.app.inform.emit('[success] %s' % _("Finished G-Code processing..."))
                 except Exception as e:
                 except Exception as e:
                     self.app.inform.emit('[ERROR] %s: %s' % (_("G-Code processing failed with error"), str(e)))
                     self.app.inform.emit('[ERROR] %s: %s' % (_("G-Code processing failed with error"), str(e)))
@@ -5037,18 +4893,18 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             else:
             else:
                 self.app.new_object("cncjob", outname, job_init_multi_geometry)
                 self.app.new_object("cncjob", outname, job_init_multi_geometry)
 
 
-    def generatecncjob(self, outname=None,
-                       tooldia=None, offset=None,
-                       z_cut=None, z_move=None,
-                       feedrate=None, feedrate_z=None, feedrate_rapid=None,
-                       spindlespeed=None, dwell=None, dwelltime=None,
-                       multidepth=None, depthperpass=None,
-                       toolchange=None, toolchangez=None, toolchangexy=None,
-                       extracut=None, startz=None, endz=None,
-                       ppname_g=None,
-                       segx=None,
-                       segy=None,
-                       use_thread=True):
+    def generatecncjob(
+            self, outname=None,
+            tooldia=None, offset=None,
+            z_cut=None, z_move=None,
+            feedrate=None, feedrate_z=None, feedrate_rapid=None,
+            spindlespeed=None, dwell=None, dwelltime=None,
+            multidepth=None, depthperpass=None,
+            toolchange=None, toolchangez=None, toolchangexy=None,
+            extracut=None, startz=None, endz=None,
+            ppname_g=None,
+            segx=None, segy=None,
+            use_thread=True):
         """
         """
         Only used for TCL Command.
         Only used for TCL Command.
         Creates a CNCJob out of this Geometry object. The actual
         Creates a CNCJob out of this Geometry object. The actual

+ 9 - 0
README.md

@@ -9,6 +9,15 @@ CAD program, and create G-Code for Isolation routing.
 
 
 =================================================
 =================================================
 
 
+15.09.2019
+
+- refactored FlatCAMGeometry.mtool_gen_cncjob() method
+- fixed the TclCommandCncjob to work for multigeometry Geometry objects; still I had to fix the list of tools parameter, right now I am setting it to an empty list
+- update the Tcl Command isolate to be able to isolate exteriors, interiors besides the full isolation, using the iso_type parameter
+- fixed issue in ToolPaint that could not allow area painting of a geometry that was a list and not a Geometric element (polygon or MultiPolygon)
+- fixed UI showing before the initialization of FlatCAM is finished when the last state of GUI was maximized
+- finished updating the TclCommand cncjob to work for multi-geo Geometry objects with the parameters from the args
+
 14.09.2019
 14.09.2019
 
 
 - more string changes
 - more string changes

+ 1 - 1
flatcamTools/ToolPaint.py

@@ -2057,7 +2057,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                 pass
                 pass
 
 
             # this is were heavy lifting is done and creating the geometry to be painted
             # this is were heavy lifting is done and creating the geometry to be painted
-            target_geo = obj.solid_geometry
+            target_geo = MultiPolygon(obj.solid_geometry)
 
 
             if isinstance(obj, FlatCAMGerber):
             if isinstance(obj, FlatCAMGerber):
                 if self.app.defaults["tools_paint_plotting"] == 'progressive':
                 if self.app.defaults["tools_paint_plotting"] == 'progressive':

+ 54 - 10
tclCommands/TclCommandCncjob.py

@@ -28,15 +28,19 @@ class TclCommandCncjob(TclCommandSignaled):
         ('z_cut', float),
         ('z_cut', float),
         ('z_move', float),
         ('z_move', float),
         ('feedrate', float),
         ('feedrate', float),
+        ('feedrate_z', float),
         ('feedrate_rapid', float),
         ('feedrate_rapid', float),
-        ('spindlespeed', int),
         ('multidepth', bool),
         ('multidepth', bool),
         ('extracut', bool),
         ('extracut', bool),
         ('depthperpass', float),
         ('depthperpass', float),
         ('toolchange', int),
         ('toolchange', int),
         ('toolchangez', float),
         ('toolchangez', float),
         ('toolchangexy', tuple),
         ('toolchangexy', tuple),
+        ('startz', float),
         ('endz', float),
         ('endz', float),
+        ('spindlespeed', int),
+        ('dwell', bool),
+        ('dwelltime', float),
         ('ppname_g', str),
         ('ppname_g', str),
         ('outname', str)
         ('outname', str)
     ])
     ])
@@ -52,16 +56,20 @@ class TclCommandCncjob(TclCommandSignaled):
             ('tooldia', 'Tool diameter to show on screen.'),
             ('tooldia', 'Tool diameter to show on screen.'),
             ('z_cut', 'Z-axis cutting position.'),
             ('z_cut', 'Z-axis cutting position.'),
             ('z_move', 'Z-axis moving position.'),
             ('z_move', 'Z-axis moving position.'),
-            ('feedrate', 'Moving speed when cutting.'),
+            ('feedrate', 'Moving speed on X-Y plane when cutting.'),
+            ('feedrate_z', 'Moving speed on Z plane when cutting.'),
             ('feedrate_rapid', 'Rapid moving at speed when cutting.'),
             ('feedrate_rapid', 'Rapid moving at speed when cutting.'),
-            ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
             ('multidepth', 'Use or not multidepth cnccut. (True or False)'),
             ('multidepth', 'Use or not multidepth cnccut. (True or False)'),
-            ('depthperpass', 'Height of one layer for multidepth.'),
             ('extracut', 'Use or not an extra cnccut over the first point in path,in the job end (example: True)'),
             ('extracut', 'Use or not an extra cnccut over the first point in path,in the job end (example: True)'),
+            ('depthperpass', 'Height of one layer for multidepth.'),
             ('toolchange', 'Enable tool changes (example: True).'),
             ('toolchange', 'Enable tool changes (example: True).'),
             ('toolchangez', 'Z distance for toolchange (example: 30.0).'),
             ('toolchangez', 'Z distance for toolchange (example: 30.0).'),
             ('toolchangexy', 'X, Y coordonates for toolchange in format (x, y) (example: (2.0, 3.1) ).'),
             ('toolchangexy', 'X, Y coordonates for toolchange in format (x, y) (example: (2.0, 3.1) ).'),
+            ('startz', 'Height before the first move.'),
             ('endz', 'Height where the last move will park.'),
             ('endz', 'Height where the last move will park.'),
+            ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
+            ('dwell', 'True or False; use (or not) the dwell'),
+            ('dwelltime', 'Time to pause to allow the spindle to reach the full speed'),
             ('outname', 'Name of the resulting Geometry object.'),
             ('outname', 'Name of the resulting Geometry object.'),
             ('ppname_g', 'Name of the Geometry postprocessor. No quotes, case sensitive')
             ('ppname_g', 'Name of the Geometry postprocessor. No quotes, case sensitive')
         ]),
         ]),
@@ -90,21 +98,33 @@ class TclCommandCncjob(TclCommandSignaled):
         if not isinstance(obj, FlatCAMGeometry):
         if not isinstance(obj, FlatCAMGeometry):
             self.raise_tcl_error('Expected FlatCAMGeometry, got %s %s.' % (str(name), type(obj)))
             self.raise_tcl_error('Expected FlatCAMGeometry, got %s %s.' % (str(name), type(obj)))
 
 
+        args["tooldia"] = args["tooldia"] if "tooldia" in args else obj.options["cnctooldia"]
+
         args["z_cut"] = args["z_cut"] if "z_cut" in args else obj.options["cutz"]
         args["z_cut"] = args["z_cut"] if "z_cut" in args else obj.options["cutz"]
         args["z_move"] = args["z_move"] if "z_move" in args else obj.options["travelz"]
         args["z_move"] = args["z_move"] if "z_move" in args else obj.options["travelz"]
+
         args["feedrate"] = args["feedrate"] if "feedrate" in args else obj.options["feedrate"]
         args["feedrate"] = args["feedrate"] if "feedrate" in args else obj.options["feedrate"]
+        args["feedrate_z"] = args["feedrate_z"] if "feedrate_z" in args else obj.options["feedrate_z"]
         args["feedrate_rapid"] = args["feedrate_rapid"] if "feedrate_rapid" in args else obj.options["feedrate_rapid"]
         args["feedrate_rapid"] = args["feedrate_rapid"] if "feedrate_rapid" in args else obj.options["feedrate_rapid"]
-        args["spindlespeed"] = args["spindlespeed"] if "spindlespeed" in args else None
-        args["tooldia"] = args["tooldia"] if "tooldia" in args else obj.options["cnctooldia"]
+
         args["multidepth"] = args["multidepth"] if "multidepth" in args else obj.options["multidepth"]
         args["multidepth"] = args["multidepth"] if "multidepth" in args else obj.options["multidepth"]
-        args["depthperpass"] = args["depthperpass"] if "depthperpass" in args else obj.options["depthperpass"]
         args["extracut"] = args["extracut"] if "extracut" in args else obj.options["extracut"]
         args["extracut"] = args["extracut"] if "extracut" in args else obj.options["extracut"]
-        args["endz"]= args["endz"] if "endz" in args else obj.options["endz"]
+        args["depthperpass"] = args["depthperpass"] if "depthperpass" in args else obj.options["depthperpass"]
+
+        args["startz"] = args["startz"] if "startz" in args else \
+            self.app.defaults["geometry_startz"]
+        args["endz"] = args["endz"] if "endz" in args else obj.options["endz"]
+
+        args["spindlespeed"] = args["spindlespeed"] if "spindlespeed" in args else None
+        args["dwell"] = args["dwell"] if "dwell" in args else obj.options["dwell"]
+        args["dwelltime"] = args["dwelltime"] if "dwelltime" in args else obj.options["dwelltime"]
+
         args["ppname_g"] = args["ppname_g"] if "ppname_g" in args else obj.options["ppname_g"]
         args["ppname_g"] = args["ppname_g"] if "ppname_g" in args else obj.options["ppname_g"]
 
 
         args["toolchange"] = True if "toolchange" in args and args["toolchange"] == 1 else False
         args["toolchange"] = True if "toolchange" in args and args["toolchange"] == 1 else False
         args["toolchangez"] = args["toolchangez"] if "toolchangez" in args else obj.options["toolchangez"]
         args["toolchangez"] = args["toolchangez"] if "toolchangez" in args else obj.options["toolchangez"]
-        args["toolchangexy"] = args["toolchangexy"] if "toolchangexy" in args else obj.options["toolchangexy"]
+        args["toolchangexy"] = args["toolchangexy"] if "toolchangexy" in args else \
+            self.app.defaults["geometry_toolchangexy"]
 
 
         del args['name']
         del args['name']
 
 
@@ -114,4 +134,28 @@ class TclCommandCncjob(TclCommandSignaled):
         if not obj.multigeo:
         if not obj.multigeo:
             obj.generatecncjob(use_thread=False, **args)
             obj.generatecncjob(use_thread=False, **args)
         else:
         else:
-            self.raise_tcl_error('The object is a multi-geo geometry which is not supported in cncjob Tcl Command')
+            # Update the local_tools_dict values with the args value
+            local_tools_dict = deepcopy(obj.tools)
+
+            for tool_uid in list(local_tools_dict.keys()):
+                if 'data' in local_tools_dict[tool_uid]:
+                    local_tools_dict[tool_uid]['data']['cutz'] = args["z_cut"]
+                    local_tools_dict[tool_uid]['data']['travelz'] = args["z_move"]
+                    local_tools_dict[tool_uid]['data']['feedrate'] = args["feedrate"]
+                    local_tools_dict[tool_uid]['data']['feedrate_z'] = args["feedrate_z"]
+                    local_tools_dict[tool_uid]['data']['feedrate_rapid'] = args["feedrate_rapid"]
+                    local_tools_dict[tool_uid]['data']['multidepth'] = args["multidepth"]
+                    local_tools_dict[tool_uid]['data']['extracut'] = args["extracut"]
+                    local_tools_dict[tool_uid]['data']['depthperpass'] = args["depthperpass"]
+                    local_tools_dict[tool_uid]['data']['toolchange'] = args["toolchange"]
+                    local_tools_dict[tool_uid]['data']['toolchangez'] = args["toolchangez"]
+                    local_tools_dict[tool_uid]['data']['toolchangexy'] = args["toolchangexy"]
+                    local_tools_dict[tool_uid]['data']['startz'] = args["startz"]
+                    local_tools_dict[tool_uid]['data']['endz'] = args["endz"]
+                    local_tools_dict[tool_uid]['data']['spindlespeed'] = args["spindlespeed"]
+                    local_tools_dict[tool_uid]['data']['dwell'] = args["dwell"]
+                    local_tools_dict[tool_uid]['data']['dwelltime'] = args["dwelltime"]
+                    local_tools_dict[tool_uid]['data']['ppname_g'] = args["ppname_g"]
+                    print(local_tools_dict[tool_uid]['data'])
+            obj.mtool_gen_cncjob(tools_dict=local_tools_dict, tools_in_use=[], use_thread=False)
+            # self.raise_tcl_error('The object is a multi-geo geometry which is not supported in cncjob Tcl Command')

+ 5 - 2
tclCommands/TclCommandIsolate.py

@@ -29,7 +29,8 @@ class TclCommandIsolate(TclCommandSignaled):
         ('overlap', float),
         ('overlap', float),
         ('combine', int),
         ('combine', int),
         ('outname', str),
         ('outname', str),
-        ('follow', str)
+        ('follow', str),
+        ('iso_type', int)
 
 
     ])
     ])
 
 
@@ -46,7 +47,9 @@ class TclCommandIsolate(TclCommandSignaled):
             ('overlap', 'Fraction of tool diameter to overlap passes.'),
             ('overlap', 'Fraction of tool diameter to overlap passes.'),
             ('combine', 'Combine all passes into one geometry.'),
             ('combine', 'Combine all passes into one geometry.'),
             ('outname', 'Name of the resulting Geometry object.'),
             ('outname', 'Name of the resulting Geometry object.'),
-            ('follow', 'Create a Geometry that follows the Gerber path.')
+            ('follow', 'Create a Geometry that follows the Gerber path.'),
+            ('iso_type', 'A value of 0 will isolate exteriors, a value of 1 will isolate interiors '
+                         'and a value of 2 will do full isolation.')
         ]),
         ]),
         'examples': []
         'examples': []
     }
     }