Browse Source

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

Beta
Marius Stanciu 6 years ago
parent
commit
c98adef9a7
52 changed files with 13475 additions and 2122 deletions
  1. 98 78
      FlatCAMApp.py
  2. 0 1
      FlatCAMCommon.py
  3. 79 92
      FlatCAMObj.py
  4. 3 0
      FlatCAMPool.py
  5. 14 14
      FlatCAMPostProc.py
  6. 3 3
      FlatCAMProcess.py
  7. 0 1
      FlatCAMTool.py
  8. 11 7
      FlatCAMTranslation.py
  9. 1 1
      FlatCAMWorker.py
  10. 51 0
      README.md
  11. 2 1
      camlib.py
  12. 5 5
      flatcamEditors/FlatCAMExcEditor.py
  13. 3 3
      flatcamEditors/FlatCAMGeoEditor.py
  14. 179 24
      flatcamEditors/FlatCAMGrbEditor.py
  15. 78 48
      flatcamGUI/FlatCAMGUI.py
  16. 14 16
      flatcamGUI/GUIElements.py
  17. 5 5
      flatcamGUI/ObjectUI.py
  18. 39 42
      flatcamTools/ToolCalculators.py
  19. 138 127
      flatcamTools/ToolCutOut.py
  20. 41 45
      flatcamTools/ToolDblSided.py
  21. 31 31
      flatcamTools/ToolFilm.py
  22. 29 29
      flatcamTools/ToolImage.py
  23. 5 6
      flatcamTools/ToolMeasurement.py
  24. 6 6
      flatcamTools/ToolMove.py
  25. 65 62
      flatcamTools/ToolNonCopperClear.py
  26. 11 12
      flatcamTools/ToolPDF.py
  27. 108 104
      flatcamTools/ToolPaint.py
  28. 5 5
      flatcamTools/ToolPanelize.py
  29. 21 23
      flatcamTools/ToolPcbWizard.py
  30. 14 6
      flatcamTools/ToolProperties.py
  31. 1 1
      flatcamTools/ToolShell.py
  32. 67 64
      flatcamTools/ToolSolderPaste.py
  33. 19 13
      flatcamTools/ToolSub.py
  34. 48 49
      flatcamTools/ToolTransform.py
  35. BIN
      locale/de/LC_MESSAGES/strings.mo
  36. 215 185
      locale/de/LC_MESSAGES/strings.po
  37. BIN
      locale/en/LC_MESSAGES/strings.mo
  38. 221 191
      locale/en/LC_MESSAGES/strings.po
  39. BIN
      locale/es/LC_MESSAGES/strings.mo
  40. 10771 0
      locale/es/LC_MESSAGES/strings.po
  41. BIN
      locale/pt_BR/LC_MESSAGES/strings.mo
  42. 391 225
      locale/pt_BR/LC_MESSAGES/strings.po
  43. BIN
      locale/ro/LC_MESSAGES/strings.mo
  44. 217 187
      locale/ro/LC_MESSAGES/strings.po
  45. BIN
      locale/ru/LC_MESSAGES/strings.mo
  46. 220 191
      locale/ru/LC_MESSAGES/strings.po
  47. 230 209
      locale_template/strings.pot
  48. 3 3
      postprocessors/Paste_1.py
  49. 0 1
      setup_ubuntu.sh
  50. BIN
      share/markarea32.png
  51. 5 2
      tclCommands/TclCommandCutout.py
  52. 8 4
      tclCommands/TclCommandGeoCutout.py

+ 98 - 78
FlatCAMApp.py

@@ -94,8 +94,8 @@ class App(QtCore.QObject):
     log.addHandler(handler)
     log.addHandler(handler)
 
 
     # Version
     # Version
-    version = 8.919
-    version_date = "2019/06/23"
+    version = 8.920
+    version_date = "2019/07/14"
     beta = True
     beta = True
 
 
     # current date now
     # current date now
@@ -272,9 +272,9 @@ class App(QtCore.QObject):
         # variable to store mouse coordinates
         # variable to store mouse coordinates
         self.mouse = [0, 0]
         self.mouse = [0, 0]
 
 
-        # ################# ##
-        # # Initialize GUI # ##
-        # ################# ##
+        # ###################
+        # # Initialize GUI ##
+        # ###################
 
 
         # FlatCAM colors used in plotting
         # FlatCAM colors used in plotting
         self.FC_light_green = '#BBF268BF'
         self.FC_light_green = '#BBF268BF'
@@ -285,15 +285,12 @@ class App(QtCore.QObject):
         QtCore.QObject.__init__(self)
         QtCore.QObject.__init__(self)
         self.ui = FlatCAMGUI(self.version, self.beta, self)
         self.ui = FlatCAMGUI(self.version, self.beta, self)
 
 
-        # self.connect(self.ui,
-        #              QtCore.SIGNAL("geomUpdate(int, int, int, int, int)"),
-        #              self.save_geometry) PyQt4
         self.ui.geom_update[int, int, int, int, int].connect(self.save_geometry)
         self.ui.geom_update[int, int, int, int, int].connect(self.save_geometry)
         self.ui.final_save.connect(self.final_save)
         self.ui.final_save.connect(self.final_save)
 
 
-        # ########### ##
-        # # ## Data ## ##
-        # ########### ##
+        # #############
+        # ### Data ####
+        # #############
         self.recent = []
         self.recent = []
         self.clipboard = QtWidgets.QApplication.clipboard()
         self.clipboard = QtWidgets.QApplication.clipboard()
         self.proc_container = FCVisibleProcessContainer(self.ui.activity_view)
         self.proc_container = FCVisibleProcessContainer(self.ui.activity_view)
@@ -581,9 +578,9 @@ class App(QtCore.QObject):
 
 
         }
         }
 
 
-        # ########################## ##
-        # # ## LOAD POSTPROCESSORS ## ##
-        # ########################## ##
+        # ############################
+        # ### LOAD POSTPROCESSORS ####
+        # ############################
 
 
         self.postprocessors = load_postprocessors(self)
         self.postprocessors = load_postprocessors(self)
 
 
@@ -600,9 +597,9 @@ class App(QtCore.QObject):
 
 
             self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
             self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
 
 
-        # ########################## ##
-        # # ## LOAD LANGUAGES ## ##
-        # ########################## ##
+        # ############################
+        # ### LOAD LANGUAGES      ####
+        # ############################
 
 
         self.languages = fcTranslate.load_languages()
         self.languages = fcTranslate.load_languages()
         for name in sorted(self.languages.values()):
         for name in sorted(self.languages.values()):
@@ -908,16 +905,16 @@ class App(QtCore.QObject):
             "tools_solderpaste_pp": 'Paste_1'
             "tools_solderpaste_pp": 'Paste_1'
         })
         })
 
 
-        # ############################ ##
-        # # ## Load defaults from file # ##
-        # ############################ ##
+        # ##############################
+        # ## Load defaults from file ###
+        # ##############################
 
 
         if user_defaults:
         if user_defaults:
             self.load_defaults(filename='current_defaults')
             self.load_defaults(filename='current_defaults')
 
 
-        # ######################### ##
-        # #### APPLY APP LANGUAGE # ##
-        # ######################### ##
+        # ###########################
+        # #### APPLY APP LANGUAGE ###
+        # ###########################
 
 
         ret_val = fcTranslate.apply_language('strings')
         ret_val = fcTranslate.apply_language('strings')
 
 
@@ -1198,10 +1195,10 @@ class App(QtCore.QObject):
         self.tools_form = None
         self.tools_form = None
         self.on_options_combo_change(0)  # Will show the initial form
         self.on_options_combo_change(0)  # Will show the initial form
 
 
-        # # ## Define OBJECT COLLECTION # ##
+        # ### Define OBJECT COLLECTION ###
         self.collection = ObjectCollection(self)
         self.collection = ObjectCollection(self)
         self.ui.project_tab_layout.addWidget(self.collection.view)
         self.ui.project_tab_layout.addWidget(self.collection.view)
-        # ###
+        # ################################
 
 
         self.log.debug("Finished creating Object Collection.")
         self.log.debug("Finished creating Object Collection.")
 
 
@@ -1274,9 +1271,9 @@ class App(QtCore.QObject):
             self.defaults['cncjob_annotation_fontcolor'])
             self.defaults['cncjob_annotation_fontcolor'])
         self.ui.cncjob_defaults_form.cncjob_gen_group.annotation_fontcolor_button.setStyleSheet(
         self.ui.cncjob_defaults_form.cncjob_gen_group.annotation_fontcolor_button.setStyleSheet(
             "background-color:%s" % str(self.defaults['cncjob_annotation_fontcolor'])[:7])
             "background-color:%s" % str(self.defaults['cncjob_annotation_fontcolor'])[:7])
-        # ### End of Data ## ##
+        # ### End of Data ####
 
 
-        # ### Plot Area ## ##
+        # ### Plot Area ####
         start_plot_time = time.time()   # debug
         start_plot_time = time.time()   # debug
         self.plotcanvas = PlotCanvas(self.ui.right_layout, self)
         self.plotcanvas = PlotCanvas(self.ui.right_layout, self)
 
 
@@ -1303,27 +1300,27 @@ class App(QtCore.QObject):
         end_plot_time = time.time()
         end_plot_time = time.time()
         self.log.debug("Finished Canvas initialization in %s seconds." % (str(end_plot_time - start_plot_time)))
         self.log.debug("Finished Canvas initialization in %s seconds." % (str(end_plot_time - start_plot_time)))
 
 
-        # # ## EDITOR section
+        # ### EDITOR section
         self.geo_editor = FlatCAMGeoEditor(self, disabled=True)
         self.geo_editor = FlatCAMGeoEditor(self, disabled=True)
         self.exc_editor = FlatCAMExcEditor(self)
         self.exc_editor = FlatCAMExcEditor(self)
         self.grb_editor = FlatCAMGrbEditor(self)
         self.grb_editor = FlatCAMGrbEditor(self)
 
 
-        # # ## Adjust tabs width ## ##
+        # ### Adjust tabs width ## ##
         # self.collection.view.setMinimumWidth(self.ui.options_scroll_area.widget().sizeHint().width() +
         # self.collection.view.setMinimumWidth(self.ui.options_scroll_area.widget().sizeHint().width() +
         #     self.ui.options_scroll_area.verticalScrollBar().sizeHint().width())
         #     self.ui.options_scroll_area.verticalScrollBar().sizeHint().width())
         self.collection.view.setMinimumWidth(290)
         self.collection.view.setMinimumWidth(290)
 
 
         self.log.debug("Finished adding FlatCAM Editor's.")
         self.log.debug("Finished adding FlatCAM Editor's.")
 
 
-        # # ## Worker ## ##
+        # ### Worker ####
         if self.defaults["global_worker_number"]:
         if self.defaults["global_worker_number"]:
             self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"]))
             self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"]))
         else:
         else:
             self.workers = WorkerStack(workers_number=2)
             self.workers = WorkerStack(workers_number=2)
         self.worker_task.connect(self.workers.add_task)
         self.worker_task.connect(self.workers.add_task)
 
 
-        # # ## Signal handling # ##
-        # # ## Custom signals
+        # ### Signal handling ###
+        # ### Custom signals  ###
         self.inform.connect(self.info)
         self.inform.connect(self.info)
         self.app_quit.connect(self.quit_application)
         self.app_quit.connect(self.quit_application)
         self.message.connect(self.message_dialog)
         self.message.connect(self.message_dialog)
@@ -1336,8 +1333,8 @@ class App(QtCore.QObject):
         self.file_opened.connect(lambda kind, filename: self.register_folder(filename))
         self.file_opened.connect(lambda kind, filename: self.register_folder(filename))
         self.file_saved.connect(lambda kind, filename: self.register_save_folder(filename))
         self.file_saved.connect(lambda kind, filename: self.register_save_folder(filename))
 
 
-        # # ## Standard signals
-        # # ## Menu
+        # ### Standard signals
+        # ### Menu
         self.ui.menufilenewproject.triggered.connect(self.on_file_new_click)
         self.ui.menufilenewproject.triggered.connect(self.on_file_new_click)
         self.ui.menufilenewgeo.triggered.connect(self.new_geometry_object)
         self.ui.menufilenewgeo.triggered.connect(self.new_geometry_object)
         self.ui.menufilenewgrb.triggered.connect(self.new_gerber_object)
         self.ui.menufilenewgrb.triggered.connect(self.new_gerber_object)
@@ -1484,9 +1481,9 @@ class App(QtCore.QObject):
         self.ui.pref_export_button.clicked.connect(self.on_export_preferences)
         self.ui.pref_export_button.clicked.connect(self.on_export_preferences)
         self.ui.pref_open_button.clicked.connect(self.on_preferences_open_folder)
         self.ui.pref_open_button.clicked.connect(self.on_preferences_open_folder)
 
 
-        # ############################ ##
-        # # ## GUI PREFERENCES SIGNALS # ##
-        # ############################ ##
+        # ##############################
+        # ### GUI PREFERENCES SIGNALS ##
+        # ##############################
         self.ui.general_options_form.general_app_group.units_radio.group_toggle_fn = self.on_toggle_units
         self.ui.general_options_form.general_app_group.units_radio.group_toggle_fn = self.on_toggle_units
         self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(
         self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(
             lambda: fcTranslate.on_language_apply_click(self, restart=True)
             lambda: fcTranslate.on_language_apply_click(self, restart=True)
@@ -1494,9 +1491,9 @@ class App(QtCore.QObject):
         self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
         self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
             lambda: self.on_toggle_units(no_pref=False))
             lambda: self.on_toggle_units(no_pref=False))
 
 
-        # ############################ ##
-        # # ## GUI PREFERENCES SIGNALS # ##
-        # ############################ ##
+        # ##############################
+        # ### GUI PREFERENCES SIGNALS ##
+        # ##############################
 
 
         # Setting plot colors signals
         # Setting plot colors signals
         self.ui.general_defaults_form.general_gui_group.pf_color_entry.editingFinished.connect(
         self.ui.general_defaults_form.general_gui_group.pf_color_entry.editingFinished.connect(
@@ -1602,21 +1599,21 @@ class App(QtCore.QObject):
         else:
         else:
             self.ui.splitter.setSizes([0, 1])
             self.ui.splitter.setSizes([0, 1])
 
 
-        # ################# ##
-        # # ## Other setups # ##
-        # ################# ##
+        # ###################
+        # ### Other setups ##
+        # ###################
         # Sets up FlatCAMObj, FCProcess and FCProcessContainer.
         # Sets up FlatCAMObj, FCProcess and FCProcessContainer.
         self.setup_obj_classes()
         self.setup_obj_classes()
-
         self.setup_recent_items()
         self.setup_recent_items()
         self.setup_component_editor()
         self.setup_component_editor()
 
 
-        # ########## ##
-        # # ## Shell # ##
-        # ########## ##
+        # ############
+        # ### Shell ##
+        # ############
 
 
-        # # ##
-        # Auto-complete KEYWORDS
+        # #########################
+        # Auto-complete KEYWORDS ##
+        # #########################
         self.tcl_commands_list = ['add_circle', 'add_poly', 'add_polygon', 'add_polyline', 'add_rectangle',
         self.tcl_commands_list = ['add_circle', 'add_poly', 'add_polygon', 'add_polyline', 'add_rectangle',
                                   'aligndrill', 'clear',
                                   'aligndrill', 'clear',
                                   'aligndrillgrid', 'cncjob', 'cutout', 'delete', 'drillcncjob',
                                   'aligndrillgrid', 'cncjob', 'cutout', 'delete', 'drillcncjob',
@@ -1852,9 +1849,9 @@ class App(QtCore.QObject):
         else:
         else:
             self.ui.shell_dock.hide()
             self.ui.shell_dock.hide()
 
 
-        # ###################### ##
-        # # ## Tools and Plugins # ##
-        # ###################### ##
+        # ########################
+        # ### Tools and Plugins ##
+        # ########################
 
 
         self.dblsidedtool = None
         self.dblsidedtool = None
         self.measurement_tool = None
         self.measurement_tool = None
@@ -1876,7 +1873,7 @@ class App(QtCore.QObject):
         # always install tools only after the shell is initialized because the self.inform.emit() depends on shell
         # always install tools only after the shell is initialized because the self.inform.emit() depends on shell
         self.install_tools()
         self.install_tools()
 
 
-        # # ## System Font Parsing # ##
+        # ### System Font Parsing ###
         # self.f_parse = ParseFont(self)
         # self.f_parse = ParseFont(self)
         # self.parse_system_fonts()
         # self.parse_system_fonts()
 
 
@@ -1890,9 +1887,9 @@ class App(QtCore.QObject):
                 print("ERROR: ", ext)
                 print("ERROR: ", ext)
                 sys.exit(2)
                 sys.exit(2)
 
 
-        # ######################## ##
-        # # ## Check for updates ## ##
-        # ######################## ##
+        # ##########################
+        # ### Check for updates ####
+        # ##########################
 
 
         # Separate thread (Not worker)
         # Separate thread (Not worker)
         # Check for updates on startup but only if the user consent and the app is not in Beta version
         # Check for updates on startup but only if the user consent and the app is not in Beta version
@@ -1905,9 +1902,9 @@ class App(QtCore.QObject):
                                    'params': []})
                                    'params': []})
             self.thr2.start(QtCore.QThread.LowPriority)
             self.thr2.start(QtCore.QThread.LowPriority)
 
 
-        # ################################# ##
-        # # ## Variables for global usage ## ##
-        # ################################# ##
+        # ###################################
+        # ### Variables for global usage ####
+        # ###################################
 
 
         # coordinates for relative position display
         # coordinates for relative position display
         self.rel_point1 = (0, 0)
         self.rel_point1 = (0, 0)
@@ -1979,8 +1976,10 @@ class App(QtCore.QObject):
         self.isHovering = False
         self.isHovering = False
         self.notHovering = True
         self.notHovering = True
 
 
-        # # ## Save defaults to factory_defaults.FlatConfig file # ##
-        # # ## It's done only once after install ########### ##
+        # #########################################################
+        # ### Save defaults to factory_defaults.FlatConfig file ###
+        # ### It's done only once after install ###################
+        # #########################################################
         factory_file = open(self.data_path + '/factory_defaults.FlatConfig')
         factory_file = open(self.data_path + '/factory_defaults.FlatConfig')
         fac_def_from_file = factory_file.read()
         fac_def_from_file = factory_file.read()
         factory_defaults = json.loads(fac_def_from_file)
         factory_defaults = json.loads(fac_def_from_file)
@@ -1994,6 +1993,7 @@ class App(QtCore.QObject):
             # Set the combobox in Preferences to the current layout
             # Set the combobox in Preferences to the current layout
             idx = self.ui.general_defaults_form.general_gui_set_group.layout_combo.findText(initial_lay)
             idx = self.ui.general_defaults_form.general_gui_set_group.layout_combo.findText(initial_lay)
             self.ui.general_defaults_form.general_gui_set_group.layout_combo.setCurrentIndex(idx)
             self.ui.general_defaults_form.general_gui_set_group.layout_combo.setCurrentIndex(idx)
+
         factory_file.close()
         factory_file.close()
 
 
         # and then make the  factory_defaults.FlatConfig file read_only os it can't be modified after creation.
         # and then make the  factory_defaults.FlatConfig file read_only os it can't be modified after creation.
@@ -3679,12 +3679,14 @@ class App(QtCore.QObject):
         def scale_options(sfactor):
         def scale_options(sfactor):
             for dim in dimensions:
             for dim in dimensions:
                 if dim == 'excellon_toolchangexy':
                 if dim == 'excellon_toolchangexy':
-                    coords_xy = [float(eval(a)) for a in self.defaults["excellon_toolchangexy"].split(",")]
+                    coordinates = self.defaults["excellon_toolchangexy"].split(",")
+                    coords_xy = [float(eval(a)) for a in coordinates if a != '']
                     coords_xy[0] *= sfactor
                     coords_xy[0] *= sfactor
                     coords_xy[1] *= sfactor
                     coords_xy[1] *= sfactor
                     self.options['excellon_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1])
                     self.options['excellon_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1])
                 elif dim == 'geometry_toolchangexy':
                 elif dim == 'geometry_toolchangexy':
-                    coords_xy = [float(eval(a)) for a in self.defaults["geometry_toolchangexy"].split(",")]
+                    coordinates = self.defaults["geometry_toolchangexy"].split(",")
+                    coords_xy = [float(eval(a)) for a in coordinates if a != '']
                     coords_xy[0] *= sfactor
                     coords_xy[0] *= sfactor
                     coords_xy[1] *= sfactor
                     coords_xy[1] *= sfactor
                     self.options['geometry_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1])
                     self.options['geometry_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1])
@@ -3725,38 +3727,48 @@ class App(QtCore.QObject):
                         sptools[t] *= sfactor
                         sptools[t] *= sfactor
                         self.options['tools_solderpaste_tools'] += "%f," % sptools[t]
                         self.options['tools_solderpaste_tools'] += "%f," % sptools[t]
                 elif dim == 'tools_solderpaste_xy_toolchange':
                 elif dim == 'tools_solderpaste_xy_toolchange':
-                    sp_coords = [float(eval(a)) for a in self.defaults["tools_solderpaste_xy_toolchange"].split(",")]
+                    coordinates = self.defaults["tools_solderpaste_xy_toolchange"].split(",")
+                    sp_coords = [float(eval(a)) for a in coordinates if a != '']
                     sp_coords[0] *= sfactor
                     sp_coords[0] *= sfactor
                     sp_coords[1] *= sfactor
                     sp_coords[1] *= sfactor
                     self.options['tools_solderpaste_xy_toolchange'] = "%f, %f" % (sp_coords[0], sp_coords[1])
                     self.options['tools_solderpaste_xy_toolchange'] = "%f, %f" % (sp_coords[0], sp_coords[1])
                 elif dim == 'global_gridx' or dim == 'global_gridy':
                 elif dim == 'global_gridx' or dim == 'global_gridy':
                     if new_units == 'IN':
                     if new_units == 'IN':
+                        val = 0.1
                         try:
                         try:
                             val = float(self.defaults[dim]) * sfactor
                             val = float(self.defaults[dim]) * sfactor
-                            self.options[dim] = float('%.6f' % val)
                         except Exception as e:
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.options[dim] = float('%.6f' % val)
                     else:
                     else:
+                        val = 0.1
                         try:
                         try:
                             val = float(self.defaults[dim]) * sfactor
                             val = float(self.defaults[dim]) * sfactor
-                            self.options[dim] = float('%.4f' % val)
                         except Exception as e:
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.options[dim] = float('%.4f' % val)
                 else:
                 else:
+                    val = 0.1
                     try:
                     try:
-                        self.options[dim] = float(self.options[dim]) * sfactor
+                        val = float(self.options[dim]) * sfactor
                     except Exception as e:
                     except Exception as e:
                         log.debug('App.on_toggle_units().scale_options() --> %s' % str(e))
                         log.debug('App.on_toggle_units().scale_options() --> %s' % str(e))
 
 
+                    self.options[dim] = val
+
         def scale_defaults(sfactor):
         def scale_defaults(sfactor):
             for dim in dimensions:
             for dim in dimensions:
                 if dim == 'excellon_toolchangexy':
                 if dim == 'excellon_toolchangexy':
-                    coords_xy = [float(eval(a)) for a in self.defaults["excellon_toolchangexy"].split(",")]
+                    coordinates = self.defaults["excellon_toolchangexy"].split(",")
+                    coords_xy = [float(eval(a)) for a in coordinates if a != '']
                     coords_xy[0] *= sfactor
                     coords_xy[0] *= sfactor
                     coords_xy[1] *= sfactor
                     coords_xy[1] *= sfactor
                     self.defaults['excellon_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1])
                     self.defaults['excellon_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1])
                 elif dim == 'geometry_toolchangexy':
                 elif dim == 'geometry_toolchangexy':
-                    coords_xy = [float(eval(a)) for a in self.defaults["geometry_toolchangexy"].split(",")]
+                    coordinates = self.defaults["geometry_toolchangexy"].split(",")
+                    coords_xy = [float(eval(a)) for a in coordinates if a != '']
                     coords_xy[0] *= sfactor
                     coords_xy[0] *= sfactor
                     coords_xy[1] *= sfactor
                     coords_xy[1] *= sfactor
                     self.defaults['geometry_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1])
                     self.defaults['geometry_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1])
@@ -3797,29 +3809,37 @@ class App(QtCore.QObject):
                         sptools[t] *= sfactor
                         sptools[t] *= sfactor
                         self.defaults['tools_solderpaste_tools'] += "%.4f," % sptools[t]
                         self.defaults['tools_solderpaste_tools'] += "%.4f," % sptools[t]
                 elif dim == 'tools_solderpaste_xy_toolchange':
                 elif dim == 'tools_solderpaste_xy_toolchange':
-                    sp_coords = [float(eval(a)) for a in self.defaults["tools_solderpaste_xy_toolchange"].split(",")]
+                    coordinates = self.defaults["tools_solderpaste_xy_toolchange"].split(",")
+                    sp_coords = [float(eval(a)) for a in coordinates if a != '']
                     sp_coords[0] *= sfactor
                     sp_coords[0] *= sfactor
                     sp_coords[1] *= sfactor
                     sp_coords[1] *= sfactor
                     self.defaults['tools_solderpaste_xy_toolchange'] = "%.4f, %.4f" % (sp_coords[0], sp_coords[1])
                     self.defaults['tools_solderpaste_xy_toolchange'] = "%.4f, %.4f" % (sp_coords[0], sp_coords[1])
                 elif dim == 'global_gridx' or dim == 'global_gridy':
                 elif dim == 'global_gridx' or dim == 'global_gridy':
                     if new_units == 'IN':
                     if new_units == 'IN':
+                        val = 0.1
                         try:
                         try:
                             val = float(self.defaults[dim]) * sfactor
                             val = float(self.defaults[dim]) * sfactor
-                            self.defaults[dim] = float('%.6f' % val)
                         except Exception as e:
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.defaults[dim] = float('%.6f' % val)
                     else:
                     else:
+                        val = 0.1
                         try:
                         try:
                             val = float(self.defaults[dim]) * sfactor
                             val = float(self.defaults[dim]) * sfactor
-                            self.defaults[dim] = float('%.4f' % val)
                         except Exception as e:
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.defaults[dim] = float('%.4f' % val)
                 else:
                 else:
+                    val = 0.1
                     try:
                     try:
-                        self.defaults[dim] = float(self.defaults[dim]) * sfactor
+                        val = float(self.defaults[dim]) * sfactor
                     except Exception as e:
                     except Exception as e:
                         log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
                         log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
 
 
+                    self.defaults[dim] = val
+
         # The scaling factor depending on choice of units.
         # The scaling factor depending on choice of units.
         factor = 1/25.4
         factor = 1/25.4
         if new_units == 'MM':
         if new_units == 'MM':
@@ -3827,11 +3847,11 @@ class App(QtCore.QObject):
 
 
         # Changing project units. Warn user.
         # Changing project units. Warn user.
         msgbox = QtWidgets.QMessageBox()
         msgbox = QtWidgets.QMessageBox()
-        msgbox.setWindowTitle("Toggle Units")
+        msgbox.setWindowTitle(_("Toggle Units"))
         msgbox.setWindowIcon(QtGui.QIcon('share/toggle_units32.png'))
         msgbox.setWindowIcon(QtGui.QIcon('share/toggle_units32.png'))
-        msgbox.setText("<B>Change project units ...</B>")
-        msgbox.setInformativeText("Changing the units of the project causes all geometrical "
-                                  "properties of all objects to be scaled accordingly.\nContinue?")
+        msgbox.setText(_("<B>Change project units ...</B>"))
+        msgbox.setInformativeText(_("Changing the units of the project causes all geometrical "
+                                    "properties of all objects to be scaled accordingly.\nContinue?"))
         bt_ok = msgbox.addButton(_('Ok'), QtWidgets.QMessageBox.AcceptRole)
         bt_ok = msgbox.addButton(_('Ok'), QtWidgets.QMessageBox.AcceptRole)
         bt_cancel = msgbox.addButton(_('Cancel'), QtWidgets.QMessageBox.RejectRole)
         bt_cancel = msgbox.addButton(_('Cancel'), QtWidgets.QMessageBox.RejectRole)
 
 
@@ -5447,7 +5467,7 @@ class App(QtCore.QObject):
         self.report_usage("on_shortcut_list()")
         self.report_usage("on_shortcut_list()")
 
 
         # add the tab if it was closed
         # add the tab if it was closed
-        self.ui.plot_tab_area.addTab(self.ui.shortcuts_tab, "Key Shortcut List")
+        self.ui.plot_tab_area.addTab(self.ui.shortcuts_tab, _("Key Shortcut List"))
 
 
         # delete the absolute and relative position and messages in the infobar
         # delete the absolute and relative position and messages in the infobar
         self.ui.position_label.setText("")
         self.ui.position_label.setText("")

+ 0 - 1
FlatCAMCommon.py

@@ -46,4 +46,3 @@ class LoudDict(dict):
         """
         """
 
 
         self.callback = callback
         self.callback = callback
-

+ 79 - 92
FlatCAMObj.py

@@ -35,9 +35,9 @@ class ValidationError(Exception):
 
 
         self.errors = errors
         self.errors = errors
 
 
-# ##################################### ##
-# #            FlatCAMObj              # ##
-# ##################################### ##
+# #######################################
+# #            FlatCAMObj              ##
+# #######################################
 
 
 
 
 class FlatCAMObj(QtCore.QObject):
 class FlatCAMObj(QtCore.QObject):
@@ -581,7 +581,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         try:
         try:
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             self.ui.apertures_table.itemChanged.disconnect()
             self.ui.apertures_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
             pass
             pass
 
 
         self.apertures_row = 0
         self.apertures_row = 0
@@ -903,7 +903,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 geo_obj.options["cnctooldia"] = str(self.options["isotooldia"])
                 geo_obj.options["cnctooldia"] = str(self.options["isotooldia"])
                 geo_obj.solid_geometry = []
                 geo_obj.solid_geometry = []
                 for i in range(passes):
                 for i in range(passes):
-                    iso_offset = (((2 * i + 1) / 2.0) * dia) - (i * overlap * dia)
+                    iso_offset = dia * ((2 * i + 1) / 2.0) - (i * overlap * dia)
 
 
                     # if milling type is climb then the move is counter-clockwise around features
                     # if milling type is climb then the move is counter-clockwise around features
                     if milling_type == 'cl':
                     if milling_type == 'cl':
@@ -929,6 +929,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                         break
                         break
                     else:
                     else:
                         empty_cnt += 1
                         empty_cnt += 1
+
                 if empty_cnt == len(geo_obj.solid_geometry):
                 if empty_cnt == len(geo_obj.solid_geometry):
                     raise ValidationError("Empty Geometry", None)
                     raise ValidationError("Empty Geometry", None)
                 geo_obj.multigeo = False
                 geo_obj.multigeo = False
@@ -938,7 +939,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         else:
         else:
             for i in range(passes):
             for i in range(passes):
 
 
-                offset = (2 * i + 1) / 2.0 * dia - i * overlap * dia
+                offset = dia * ((2 * i + 1) / 2.0) - (i * overlap * dia)
                 if passes > 1:
                 if passes > 1:
                     if self.iso_type == 0:
                     if self.iso_type == 0:
                         iso_name = self.options["name"] + "_ext_iso" + str(i + 1)
                         iso_name = self.options["name"] + "_ext_iso" + str(i + 1)
@@ -1215,7 +1216,11 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             cw_row = 0
             cw_row = 0
 
 
         self.marked_rows[:] = []
         self.marked_rows[:] = []
-        aperture = self.ui.apertures_table.item(cw_row, 1).text()
+
+        try:
+            aperture = self.ui.apertures_table.item(cw_row, 1).text()
+        except AttributeError:
+            return
 
 
         if self.ui.apertures_table.cellWidget(cw_row, 5).isChecked():
         if self.ui.apertures_table.cellWidget(cw_row, 5).isChecked():
             self.marked_rows.append(True)
             self.marked_rows.append(True)
@@ -1641,7 +1646,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
                 if option is not 'name':
                 if option is not 'name':
                     try:
                     try:
                         exc_final.options[option] = exc.options[option]
                         exc_final.options[option] = exc.options[option]
-                    except:
+                    except Exception as e:
                         exc.app.log.warning("Failed to copy option.", option)
                         exc.app.log.warning("Failed to copy option.", option)
 
 
             for drill in exc.drills:
             for drill in exc.drills:
@@ -1785,7 +1790,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
         try:
         try:
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             self.ui.tools_table.itemChanged.disconnect()
             self.ui.tools_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
             pass
             pass
 
 
         n = len(self.tools)
         n = len(self.tools)
@@ -2070,12 +2075,12 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
         for row in range(self.ui.tools_table.rowCount()):
         for row in range(self.ui.tools_table.rowCount()):
             try:
             try:
                 self.ui.tools_table.cellWidget(row, 5).clicked.disconnect()
                 self.ui.tools_table.cellWidget(row, 5).clicked.disconnect()
-            except:
+            except Exception as e:
                 pass
                 pass
 
 
         try:
         try:
             self.ui.plot_cb.stateChanged.disconnect()
             self.ui.plot_cb.stateChanged.disconnect()
-        except:
+        except Exception as e:
             pass
             pass
 
 
     def on_tool_offset_edit(self):
     def on_tool_offset_edit(self):
@@ -2957,7 +2962,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         })
         })
 
 
         if "cnctooldia" not in self.options:
         if "cnctooldia" not in self.options:
-            self.options["cnctooldia"] =  self.app.defaults["geometry_cnctooldia"]
+            self.options["cnctooldia"] = self.app.defaults["geometry_cnctooldia"]
             # try:
             # try:
             #     self.options["cnctooldia"] = [
             #     self.options["cnctooldia"] = [
             #         float(eval(dia)) for dia in str(self.app.defaults["geometry_cnctooldia"]).split(",")
             #         float(eval(dia)) for dia in str(self.app.defaults["geometry_cnctooldia"]).split(",")
@@ -3237,8 +3242,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                     self.default_data[def_key] = deepcopy(opt_val)
                     self.default_data[def_key] = deepcopy(opt_val)
 
 
         try:
         try:
+            temp_tools = self.options["cnctooldia"].split(",")
             tools_list = [
             tools_list = [
-                float(eval(dia)) for dia in self.options["cnctooldia"].split(",")
+                float(eval(dia)) for dia in temp_tools if dia != ''
             ]
             ]
         except Exception as e:
         except Exception as e:
             log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> Geometry General -> "
             log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> Geometry General -> "
@@ -3252,7 +3258,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 self.tools.update({
                 self.tools.update({
                     self.tooluid: {
                     self.tooluid: {
                         'tooldia': float(toold),
                         'tooldia': float(toold),
-                        'offset': ('Path'),
+                        'offset': 'Path',
                         'offset_value': 0.0,
                         'offset_value': 0.0,
                         'type': _('Rough'),
                         'type': _('Rough'),
                         'tool_type': 'C1',
                         'tool_type': 'C1',
@@ -3335,7 +3341,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             tool_offset = self.ui.geo_tools_table.cellWidget(current_row, 2)
             tool_offset = self.ui.geo_tools_table.cellWidget(current_row, 2)
             if tool_offset is not None:
             if tool_offset is not None:
                 tool_offset_txt = tool_offset.currentText()
                 tool_offset_txt = tool_offset.currentText()
-                if tool_offset_txt == ('Custom'):
+                if tool_offset_txt == 'Custom':
                     self.ui.tool_offset_entry.show()
                     self.ui.tool_offset_entry.show()
                     self.ui.tool_offset_lbl.show()
                     self.ui.tool_offset_lbl.show()
                 else:
                 else:
@@ -3575,7 +3581,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         # we do this HACK to make sure the tools attribute to be serialized is updated in the self.ser_attrs list
         # we do this HACK to make sure the tools attribute to be serialized is updated in the self.ser_attrs list
         try:
         try:
             self.ser_attrs.remove('tools')
             self.ser_attrs.remove('tools')
-        except:
+        except Exception as e:
             pass
             pass
         self.ser_attrs.append('tools')
         self.ser_attrs.append('tools')
 
 
@@ -3684,7 +3690,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         try:
         try:
             self.ser_attrs.remove('tools')
             self.ser_attrs.remove('tools')
             self.ser_attrs.append('tools')
             self.ser_attrs.append('tools')
-        except:
+        except Exception as e:
             pass
             pass
 
 
         self.app.inform.emit(_(
         self.app.inform.emit(_(
@@ -3718,9 +3724,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                         self.tools = deepcopy(temp_tools)
                         self.tools = deepcopy(temp_tools)
                         temp_tools.clear()
                         temp_tools.clear()
                     except AttributeError:
                     except AttributeError:
-                        self.app.inform.emit(_(
-                            "[WARNING_NOTCL] Failed. Select a tool to delete."
-                        ))
+                        self.app.inform.emit(_("[WARNING_NOTCL] Failed. Select a tool to delete."))
                         self.build_ui()
                         self.build_ui()
                         return
                         return
                     except Exception as e:
                     except Exception as e:
@@ -3728,9 +3732,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 # deselect the table
                 # deselect the table
                 # self.ui.geo_tools_table.clearSelection()
                 # self.ui.geo_tools_table.clearSelection()
             else:
             else:
-                self.app.inform.emit(_(
-                    "[WARNING_NOTCL] Failed. Select a tool to delete."
-                ))
+                self.app.inform.emit(_("[WARNING_NOTCL] Failed. Select a tool to delete."))
                 self.build_ui()
                 self.build_ui()
                 return
                 return
         else:
         else:
@@ -3747,14 +3749,12 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         # we do this HACK to make sure the tools attribute to be serialized is updated in the self.ser_attrs list
         # we do this HACK to make sure the tools attribute to be serialized is updated in the self.ser_attrs list
         try:
         try:
             self.ser_attrs.remove('tools')
             self.ser_attrs.remove('tools')
-        except:
+        except Exception as e:
             pass
             pass
         self.ser_attrs.append('tools')
         self.ser_attrs.append('tools')
 
 
         self.build_ui()
         self.build_ui()
-        self.app.inform.emit(_(
-            "[success] Tool was deleted in Tool Table."
-        ))
+        self.app.inform.emit(_("[success] Tool was deleted in Tool Table."))
 
 
         obj_active = self.app.collection.get_active()
         obj_active = self.app.collection.get_active()
         # if the object was MultiGeo and now it has no tool at all (therefore no geometry)
         # if the object was MultiGeo and now it has no tool at all (therefore no geometry)
@@ -3773,7 +3773,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 obj_active.options['ymin'] = ymin
                 obj_active.options['ymin'] = ymin
                 obj_active.options['xmax'] = xmax
                 obj_active.options['xmax'] = xmax
                 obj_active.options['ymax'] = ymax
                 obj_active.options['ymax'] = ymax
-            except:
+            except Exception as e:
                 obj_active.options['xmin'] = 0
                 obj_active.options['xmin'] = 0
                 obj_active.options['ymin'] = 0
                 obj_active.options['ymin'] = 0
                 obj_active.options['xmax'] = 0
                 obj_active.options['xmax'] = 0
@@ -3788,7 +3788,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         if row is None:
         if row is None:
             try:
             try:
                 current_row = self.ui.geo_tools_table.currentRow()
                 current_row = self.ui.geo_tools_table.currentRow()
-            except:
+            except Exception as e:
                 current_row = 0
                 current_row = 0
         else:
         else:
             current_row = row
             current_row = row
@@ -3884,7 +3884,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 ))
                 ))
                 return
                 return
 
 
-
         row = self.ui.geo_tools_table.currentRow()
         row = self.ui.geo_tools_table.currentRow()
         tool_uid = int(self.ui.geo_tools_table.item(row, 5).text())
         tool_uid = int(self.ui.geo_tools_table.item(row, 5).text())
 
 
@@ -3911,7 +3910,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 cb_txt = cw.currentText()
                 cb_txt = cw.currentText()
                 if cw_col == 2:
                 if cw_col == 2:
                     tooluid_value['offset'] = cb_txt
                     tooluid_value['offset'] = cb_txt
-                    if cb_txt == ('Custom'):
+                    if cb_txt == 'Custom':
                         self.ui.tool_offset_entry.show()
                         self.ui.tool_offset_entry.show()
                         self.ui.tool_offset_lbl.show()
                         self.ui.tool_offset_lbl.show()
                     else:
                     else:
@@ -3957,7 +3956,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         widget_changed = self.sender()
         widget_changed = self.sender()
         try:
         try:
             widget_idx = self.ui.grid3.indexOf(widget_changed)
             widget_idx = self.ui.grid3.indexOf(widget_changed)
-        except:
+        except Exception as e:
             return
             return
 
 
         # those are the indexes for the V-Tip Dia and V-Tip Angle, if edited calculate the new Cut Z
         # those are the indexes for the V-Tip Dia and V-Tip Angle, if edited calculate the new Cut Z
@@ -3992,8 +3991,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         except ValueError:
         except ValueError:
             # try to convert comma to decimal point. if it's still not working error message and return
             # try to convert comma to decimal point. if it's still not working error message and return
             try:
             try:
-                offset_value_item = float(self.ui.tool_offset_entry.get_value().replace(',', '.')
-                                     )
+                offset_value_item = float(self.ui.tool_offset_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_(
                 self.app.inform.emit(_(
                     "[ERROR_NOTCL] Wrong value format entered, "
                     "[ERROR_NOTCL] Wrong value format entered, "
@@ -4085,7 +4083,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 for tool in self.tools:
                 for tool in self.tools:
                     multigeo_solid_geometry += self.tools[tool]['solid_geometry']
                     multigeo_solid_geometry += self.tools[tool]['solid_geometry']
             else:
             else:
-                    multigeo_solid_geometry = self.solid_geometry
+                multigeo_solid_geometry = self.solid_geometry
 
 
             for geo in multigeo_solid_geometry:
             for geo in multigeo_solid_geometry:
                 if type(geo) == list:
                 if type(geo) == list:
@@ -4125,7 +4123,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                         txt = self.ui.geo_tools_table.item(x.row(), column).text()
                         txt = self.ui.geo_tools_table.item(x.row(), column).text()
                     except AttributeError:
                     except AttributeError:
                         txt = self.ui.geo_tools_table.cellWidget(x.row(), column).currentText()
                         txt = self.ui.geo_tools_table.cellWidget(x.row(), column).currentText()
-                    except:
+                    except Exception as e:
                         pass
                         pass
                     r.append(txt)
                     r.append(txt)
                 table_tools_items.append(r)
                 table_tools_items.append(r)
@@ -4360,7 +4358,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                 endz = data_value
                                 endz = data_value
 
 
                             if data_key == "toolchangez":
                             if data_key == "toolchangez":
-                                toolchangez =data_value
+                                toolchangez = data_value
                             if data_key == "toolchangexy":
                             if data_key == "toolchangexy":
                                 toolchangexy = data_value
                                 toolchangexy = data_value
                             if data_key == "toolchange":
                             if data_key == "toolchange":
@@ -4393,13 +4391,13 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                             diadict_key: datadict
                             diadict_key: datadict
                         })
                         })
 
 
-                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'
                     offset_str = 'inside'
-                elif dia_cnc_dict['offset'].lower() == ('out'):
-                    tool_offset = dia_cnc_dict['tooldia']  / 2
+                elif dia_cnc_dict['offset'].lower() == 'out':
+                    tool_offset = dia_cnc_dict['tooldia'] / 2
                     offset_str = 'outside'
                     offset_str = 'outside'
-                elif dia_cnc_dict['offset'].lower() == ('path'):
+                elif dia_cnc_dict['offset'].lower() == 'path':
                     offset_str = 'onpath'
                     offset_str = 'onpath'
                     tool_offset = 0.0
                     tool_offset = 0.0
                 else:
                 else:
@@ -4409,8 +4407,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                     except ValueError:
                     except ValueError:
                         # try to convert comma to decimal point. if it's still not working error message and return
                         # try to convert comma to decimal point. if it's still not working error message and return
                         try:
                         try:
-                            offset_value = float(self.ui.tool_offset_entry.get_value().replace(',', '.')
-                                                 )
+                            offset_value = float(self.ui.tool_offset_entry.get_value().replace(',', '.'))
                         except ValueError:
                         except ValueError:
                             self.app.inform.emit(_(
                             self.app.inform.emit(_(
                                 "[ERROR_NOTCL] Wrong value format entered, "
                                 "[ERROR_NOTCL] Wrong value format entered, "
@@ -4585,7 +4582,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
 
 
                     if diadict_key == 'data':
                     if diadict_key == 'data':
                         for data_key, data_value in diadict_value.items():
                         for data_key, data_value in diadict_value.items():
-                            if data_key ==  "multidepth":
+                            if data_key == "multidepth":
                                 multidepth = data_value
                                 multidepth = data_value
                             if data_key == "depthperpass":
                             if data_key == "depthperpass":
                                 depthpercut = data_value
                                 depthpercut = data_value
@@ -4598,7 +4595,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                 endz = data_value
                                 endz = data_value
 
 
                             if data_key == "toolchangez":
                             if data_key == "toolchangez":
-                                toolchangez =data_value
+                                toolchangez = data_value
                             if data_key == "toolchangexy":
                             if data_key == "toolchangexy":
                                 toolchangexy = data_value
                                 toolchangexy = data_value
                             if data_key == "toolchange":
                             if data_key == "toolchange":
@@ -4631,13 +4628,13 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                             diadict_key: datadict
                             diadict_key: datadict
                         })
                         })
 
 
-                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'
                     offset_str = 'inside'
-                elif dia_cnc_dict['offset'].lower() == ('out'):
-                    tool_offset = dia_cnc_dict['tooldia']  / 2
+                elif dia_cnc_dict['offset'].lower() == 'out':
+                    tool_offset = dia_cnc_dict['tooldia'] / 2
                     offset_str = 'outside'
                     offset_str = 'outside'
-                elif dia_cnc_dict['offset'].lower() == ('path'):
+                elif dia_cnc_dict['offset'].lower() == 'path':
                     offset_str = 'onpath'
                     offset_str = 'onpath'
                     tool_offset = 0.0
                     tool_offset = 0.0
                 else:
                 else:
@@ -4647,23 +4644,17 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                     except ValueError:
                     except ValueError:
                         # try to convert comma to decimal point. if it's still not working error message and return
                         # try to convert comma to decimal point. if it's still not working error message and return
                         try:
                         try:
-                            offset_value = float(self.ui.tool_offset_entry.get_value().replace(',', '.')
-                                                  )
+                            offset_value = float(self.ui.tool_offset_entry.get_value().replace(',', '.'))
                         except ValueError:
                         except ValueError:
-                            self.app.inform.emit(_(
-                                "[ERROR_NOTCL] Wrong value format entered, "
-                                "use a number."
-                            ))
+                            self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
+                                                   "use a number."))
                             return
                             return
                     if offset_value:
                     if offset_value:
                         tool_offset = float(offset_value)
                         tool_offset = float(offset_value)
                     else:
                     else:
-                        self.app.inform.emit(
-                            _(
-                                "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n"
-                                "Add a Tool Offset or change the Offset Type."
-                            )
-                        )
+                        self.app.inform.emit(_(
+                            "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n"
+                            "Add a Tool Offset or change the Offset Type."))
                         return
                         return
                 dia_cnc_dict.update({
                 dia_cnc_dict.update({
                     'offset_value': tool_offset
                     'offset_value': tool_offset
@@ -4908,7 +4899,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
 
 
         try:
         try:
             xfactor = float(xfactor)
             xfactor = float(xfactor)
-        except:
+        except Exception as e:
             self.app.inform.emit(_(
             self.app.inform.emit(_(
                 "[ERROR_NOTCL] Scale factor has to be a number: integer or float."))
                 "[ERROR_NOTCL] Scale factor has to be a number: integer or float."))
             return
             return
@@ -4918,10 +4909,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         else:
         else:
             try:
             try:
                 yfactor = float(yfactor)
                 yfactor = float(yfactor)
-            except:
-                self.app.inform.emit(_(
-                    "[ERROR_NOTCL] Scale factor has to be a number: integer or float."
-                ))
+            except Exception as e:
+                self.app.inform.emit(_("[ERROR_NOTCL] Scale factor has to be a number: integer or float."))
                 return
                 return
 
 
         if point is None:
         if point is None:
@@ -4943,19 +4932,19 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         # self.app.inform.emit("[success] Geometry Scale done.")
         # self.app.inform.emit("[success] Geometry Scale done.")
 
 
         def scale_recursion(geom):
         def scale_recursion(geom):
-            if type(geom) == list:
-                geoms=list()
+            if type(geom) is list:
+                geoms = list()
                 for local_geom in geom:
                 for local_geom in geom:
                     geoms.append(scale_recursion(local_geom))
                     geoms.append(scale_recursion(local_geom))
                 return geoms
                 return geoms
             else:
             else:
-                return  affinity.scale(geom, xfactor, yfactor, origin=(px, py))
+                return affinity.scale(geom, xfactor, yfactor, origin=(px, py))
 
 
         if self.multigeo is True:
         if self.multigeo is True:
             for tool in self.tools:
             for tool in self.tools:
                 self.tools[tool]['solid_geometry'] = scale_recursion(self.tools[tool]['solid_geometry'])
                 self.tools[tool]['solid_geometry'] = scale_recursion(self.tools[tool]['solid_geometry'])
         else:
         else:
-            self.solid_geometry=scale_recursion(self.solid_geometry)
+            self.solid_geometry = scale_recursion(self.solid_geometry)
 
 
         self.app.inform.emit(_(
         self.app.inform.emit(_(
             "[success] Geometry Scale done."
             "[success] Geometry Scale done."
@@ -4981,22 +4970,20 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             return
             return
 
 
         def translate_recursion(geom):
         def translate_recursion(geom):
-            if type(geom) == list:
-                geoms=list()
+            if type(geom) is list:
+                geoms = list()
                 for local_geom in geom:
                 for local_geom in geom:
                     geoms.append(translate_recursion(local_geom))
                     geoms.append(translate_recursion(local_geom))
                 return geoms
                 return geoms
             else:
             else:
-                return  affinity.translate(geom, xoff=dx, yoff=dy)
+                return affinity.translate(geom, xoff=dx, yoff=dy)
 
 
         if self.multigeo is True:
         if self.multigeo is True:
             for tool in self.tools:
             for tool in self.tools:
                 self.tools[tool]['solid_geometry'] = translate_recursion(self.tools[tool]['solid_geometry'])
                 self.tools[tool]['solid_geometry'] = translate_recursion(self.tools[tool]['solid_geometry'])
         else:
         else:
-            self.solid_geometry=translate_recursion(self.solid_geometry)
-        self.app.inform.emit(_(
-            "[success] Geometry Offset done."
-        ))
+            self.solid_geometry = translate_recursion(self.solid_geometry)
+        self.app.inform.emit(_("[success] Geometry Offset done."))
 
 
     def convert_units(self, units):
     def convert_units(self, units):
         self.ui_disconnect()
         self.ui_disconnect()
@@ -5060,8 +5047,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                         except ValueError:
                         except ValueError:
                             # try to convert comma to decimal point. if it's still not working error message and return
                             # try to convert comma to decimal point. if it's still not working error message and return
                             try:
                             try:
-                                custom_offset = float(self.ui.tool_offset_entry.get_value().replace(',', '.')
-                                )
+                                custom_offset = float(self.ui.tool_offset_entry.get_value().replace(',', '.'))
                             except ValueError:
                             except ValueError:
                                 self.app.inform.emit(_(
                                 self.app.inform.emit(_(
                                     "[ERROR_NOTCL] Wrong value format entered, "
                                     "[ERROR_NOTCL] Wrong value format entered, "
@@ -5142,7 +5128,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         try:
         try:
             # plot solid geometries found as members of self.tools attribute dict
             # plot solid geometries found as members of self.tools attribute dict
             # for MultiGeo
             # for MultiGeo
-            if self.multigeo == True: # geo multi tool usage
+            if self.multigeo is True:  # geo multi tool usage
                 for tooluid_key in self.tools:
                 for tooluid_key in self.tools:
                     solid_geometry = self.tools[tooluid_key]['solid_geometry']
                     solid_geometry = self.tools[tooluid_key]['solid_geometry']
                     self.plot_element(solid_geometry, visible=visible)
                     self.plot_element(solid_geometry, visible=visible)
@@ -5176,9 +5162,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
     def on_plot_cb_click_table(self):
     def on_plot_cb_click_table(self):
         # self.ui.cnc_tools_table.cellWidget(row, 2).widget().setCheckState(QtCore.Qt.Unchecked)
         # self.ui.cnc_tools_table.cellWidget(row, 2).widget().setCheckState(QtCore.Qt.Unchecked)
         self.ui_disconnect()
         self.ui_disconnect()
-        cw = self.sender()
-        cw_index = self.ui.geo_tools_table.indexAt(cw.pos())
-        cw_row = cw_index.row()
+        # cw = self.sender()
+        # cw_index = self.ui.geo_tools_table.indexAt(cw.pos())
+        # cw_row = cw_index.row()
         check_row = 0
         check_row = 0
 
 
         self.shapes.clear(update=True)
         self.shapes.clear(update=True)
@@ -5254,7 +5240,8 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                            'tool_type': 'C1',
                            'tool_type': 'C1',
                            'data': {} # a dict to hold the parameters
                            'data': {} # a dict to hold the parameters
                            'gcode': "" # a string with the actual GCODE
                            'gcode': "" # a string with the actual GCODE
-                           'gcode_parsed': {} # dictionary holding the CNCJob geometry and type of geometry (cut or move)
+                           'gcode_parsed': {} # dictionary holding the CNCJob geometry and type of geometry 
+                           (cut or move)
                            'solid_geometry': []
                            'solid_geometry': []
                            },
                            },
                            ...
                            ...
@@ -5516,7 +5503,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
             self.ui.cnc_tools_table.cellWidget(row, 6).clicked.disconnect(self.on_plot_cb_click_table)
             self.ui.cnc_tools_table.cellWidget(row, 6).clicked.disconnect(self.on_plot_cb_click_table)
         try:
         try:
             self.ui.plot_cb.stateChanged.disconnect(self.on_plot_cb_click)
             self.ui.plot_cb.stateChanged.disconnect(self.on_plot_cb_click)
-        except:
+        except Exception as e:
             pass
             pass
 
 
     def on_updateplot_button_click(self, *args):
     def on_updateplot_button_click(self, *args):
@@ -5728,13 +5715,13 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                 if self.cnc_tools[key]['data']['ppname_g'] == 'hpgl':
                 if self.cnc_tools[key]['data']['ppname_g'] == 'hpgl':
                     hpgl = True
                     hpgl = True
                     break
                     break
-        except:
+        except Exception as e:
             try:
             try:
                 for key in self.cnc_tools:
                 for key in self.cnc_tools:
                     if self.cnc_tools[key]['data']['ppname_e'] == 'Roland_MDX_20':
                     if self.cnc_tools[key]['data']['ppname_e'] == 'Roland_MDX_20':
                         roland = True
                         roland = True
                         break
                         break
-            except:
+            except Exception as e:
                 pass
                 pass
 
 
         # do not add gcode_header when using the Roland postprocessor, add it for every other postprocessor
         # do not add gcode_header when using the Roland postprocessor, add it for every other postprocessor
@@ -5843,7 +5830,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                     ))
                     ))
 
 
     def get_gcode(self, preamble='', postamble=''):
     def get_gcode(self, preamble='', postamble=''):
-        #we need this to be able get_gcode separatelly for shell command export_gcode
+        # we need this to be able get_gcode separatelly for shell command export_gcode
         return preamble + '\n' + self.gcode + "\n" + postamble
         return preamble + '\n' + self.gcode + "\n" + postamble
 
 
     def get_svg(self):
     def get_svg(self):
@@ -5870,9 +5857,9 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
     def on_plot_cb_click_table(self):
     def on_plot_cb_click_table(self):
         # self.ui.cnc_tools_table.cellWidget(row, 2).widget().setCheckState(QtCore.Qt.Unchecked)
         # self.ui.cnc_tools_table.cellWidget(row, 2).widget().setCheckState(QtCore.Qt.Unchecked)
         self.ui_disconnect()
         self.ui_disconnect()
-        cw = self.sender()
-        cw_index = self.ui.cnc_tools_table.indexAt(cw.pos())
-        cw_row = cw_index.row()
+        # cw = self.sender()
+        # cw_index = self.ui.cnc_tools_table.indexAt(cw.pos())
+        # cw_row = cw_index.row()
 
 
         kind = self.ui.cncplot_method_combo.get_value()
         kind = self.ui.cncplot_method_combo.get_value()
 
 
@@ -5915,7 +5902,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
         visible = visible if visible else self.options['plot']
         visible = visible if visible else self.options['plot']
 
 
         try:
         try:
-            if self.multitool is False: # single tool usage
+            if self.multitool is False:  # single tool usage
                 self.plot2(tooldia=float(self.options["tooldia"]), obj=self, visible=visible, kind=kind)
                 self.plot2(tooldia=float(self.options["tooldia"]), obj=self, visible=visible, kind=kind)
             else:
             else:
                 # multiple tools usage
                 # multiple tools usage

+ 3 - 0
FlatCAMPool.py

@@ -2,16 +2,19 @@ from PyQt5 import QtCore
 from multiprocessing import Pool
 from multiprocessing import Pool
 import dill
 import dill
 
 
+
 def run_dill_encoded(what):
 def run_dill_encoded(what):
     fun, args = dill.loads(what)
     fun, args = dill.loads(what)
     print("load", fun, args)
     print("load", fun, args)
     return fun(*args)
     return fun(*args)
 
 
+
 def apply_async(pool, fun, args):
 def apply_async(pool, fun, args):
     print("...", fun, args)
     print("...", fun, args)
     print("dumps", dill.dumps((fun, args)))
     print("dumps", dill.dumps((fun, args)))
     return pool.map_async(run_dill_encoded, (dill.dumps((fun, args)),))
     return pool.map_async(run_dill_encoded, (dill.dumps((fun, args)),))
 
 
+
 def func1():
 def func1():
     print("func")
     print("func")
 
 

+ 14 - 14
FlatCAMPostProc.py

@@ -1,10 +1,10 @@
-# ########################################################## ##
+# ##########################################################
 # FlatCAM: 2D Post-processing for Manufacturing            #
 # FlatCAM: 2D Post-processing for Manufacturing            #
 # http://flatcam.org                                       #
 # http://flatcam.org                                       #
 # File Author: Matthieu Berthomé                           #
 # File Author: Matthieu Berthomé                           #
 # Date: 5/26/2017                                          #
 # Date: 5/26/2017                                          #
 # MIT Licence                                              #
 # MIT Licence                                              #
-# ########################################################## ##
+# ##########################################################
 
 
 from importlib.machinery import SourceFileLoader
 from importlib.machinery import SourceFileLoader
 import os
 import os
@@ -12,19 +12,19 @@ from abc import ABCMeta, abstractmethod
 from datetime import datetime
 from datetime import datetime
 import math
 import math
 
 
-#module-root dictionary of postprocessors
+# module-root dictionary of postprocessors
 import FlatCAMApp
 import FlatCAMApp
 
 
 postprocessors = {}
 postprocessors = {}
 
 
 
 
 class ABCPostProcRegister(ABCMeta):
 class ABCPostProcRegister(ABCMeta):
-    #handles postprocessors registration on instantation
+    # handles postprocessors registration on instantation
     def __new__(cls, clsname, bases, attrs):
     def __new__(cls, clsname, bases, attrs):
         newclass = super(ABCPostProcRegister, cls).__new__(cls, clsname, bases, attrs)
         newclass = super(ABCPostProcRegister, cls).__new__(cls, clsname, bases, attrs)
         if object not in bases:
         if object not in bases:
             if newclass.__name__ in postprocessors:
             if newclass.__name__ in postprocessors:
-                FlatCAMApp.App.log.warning('Postprocessor %s has been overriden'%(newclass.__name__))
+                FlatCAMApp.App.log.warning('Postprocessor %s has been overriden' % newclass.__name__)
             postprocessors[newclass.__name__] = newclass()  # here is your register function
             postprocessors[newclass.__name__] = newclass()  # here is your register function
         return newclass
         return newclass
 
 
@@ -67,11 +67,11 @@ class FlatCAMPostProc(object, metaclass=ABCPostProcRegister):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def spindle_code(self,p):
+    def spindle_code(self, p):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def spindle_stop_code(self,p):
+    def spindle_stop_code(self, p):
         pass
         pass
 
 
 
 
@@ -121,32 +121,32 @@ class FlatCAMPostProc_Tools(object, metaclass=ABCPostProcRegister):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def feedrate_z_dispense_code(self,p):
+    def feedrate_z_dispense_code(self, p):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def spindle_fwd_code(self,p):
+    def spindle_fwd_code(self, p):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def spindle_rev_code(self,p):
+    def spindle_rev_code(self, p):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def spindle_off_code(self,p):
+    def spindle_off_code(self, p):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def dwell_fwd_code(self,p):
+    def dwell_fwd_code(self, p):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def dwell_rev_code(self,p):
+    def dwell_rev_code(self, p):
         pass
         pass
 
 
 
 
 def load_postprocessors(app):
 def load_postprocessors(app):
-    postprocessors_path_search = [os.path.join(app.data_path,'postprocessors','*.py'),
+    postprocessors_path_search = [os.path.join(app.data_path, 'postprocessors', '*.py'),
                                   os.path.join('postprocessors', '*.py')]
                                   os.path.join('postprocessors', '*.py')]
     import glob
     import glob
     for path_search in postprocessors_path_search:
     for path_search in postprocessors_path_search:

+ 3 - 3
FlatCAMProcess.py

@@ -1,10 +1,10 @@
-# ########################################################## ##
+# ##########################################################
 # FlatCAM: 2D Post-processing for Manufacturing            #
 # FlatCAM: 2D Post-processing for Manufacturing            #
 # http://flatcam.org                                       #
 # http://flatcam.org                                       #
 # Author: Juan Pablo Caram (c)                             #
 # Author: Juan Pablo Caram (c)                             #
 # Date: 2/5/2014                                           #
 # Date: 2/5/2014                                           #
 # MIT Licence                                              #
 # MIT Licence                                              #
-# ########################################################## ##
+# ##########################################################
 
 
 from flatcamGUI.FlatCAMGUI import FlatCAMActivityView
 from flatcamGUI.FlatCAMGUI import FlatCAMActivityView
 from PyQt5 import QtCore
 from PyQt5 import QtCore
@@ -153,4 +153,4 @@ class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer):
             self.view.set_busy(self.procs[0]().status_msg())
             self.view.set_busy(self.procs[0]().status_msg())
 
 
         else:
         else:
-            self.view.set_busy("%d processes running." % len(self.procs))
+            self.view.set_busy("%d processes running." % len(self.procs))

+ 0 - 1
FlatCAMTool.py

@@ -90,4 +90,3 @@ class FlatCAMTool(QtWidgets.QWidget):
         self.app.ui.tool_scroll_area.widget().setObjectName(self.toolName)
         self.app.ui.tool_scroll_area.widget().setObjectName(self.toolName)
 
 
         self.show()
         self.show()
-

+ 11 - 7
FlatCAMTranslation.py

@@ -16,6 +16,11 @@ from PyQt5.QtCore import QSettings
 from flatcamGUI.GUIElements import log
 from flatcamGUI.GUIElements import log
 import gettext
 import gettext
 
 
+import builtins
+
+if '_' not in builtins.__dict__:
+    _ = gettext.gettext
+
 # ISO639-1 codes from here: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
 # ISO639-1 codes from here: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
 languages_dict = {
 languages_dict = {
     'zh': 'Chinese',
     'zh': 'Chinese',
@@ -83,12 +88,13 @@ def on_language_apply_click(app, restart=False):
 
 
     if restart:
     if restart:
         msgbox = QtWidgets.QMessageBox()
         msgbox = QtWidgets.QMessageBox()
-        msgbox.setText("The application will restart.")
-        msgbox.setInformativeText("Are you sure do you want to change the current language to %s?" % name.capitalize())
-        msgbox.setWindowTitle("Apply Language ...")
+        msgbox.setText(_("The application will restart."))
+        msgbox.setInformativeText(_("Are you sure do you want to change the current language to %s?") %
+                                  name.capitalize())
+        msgbox.setWindowTitle(_("Apply Language ..."))
         msgbox.setWindowIcon(QtGui.QIcon('share/language32.png'))
         msgbox.setWindowIcon(QtGui.QIcon('share/language32.png'))
-        bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
-        bt_no = msgbox.addButton(_('No'), QtWidgets.QMessageBox.NoRole)
+        bt_yes = msgbox.addButton('Yes', QtWidgets.QMessageBox.YesRole)
+        bt_no = msgbox.addButton('No', QtWidgets.QMessageBox.NoRole)
 
 
         msgbox.setDefaultButton(bt_yes)
         msgbox.setDefaultButton(bt_yes)
         msgbox.exec_()
         msgbox.exec_()
@@ -156,5 +162,3 @@ def restart_program(app):
     app.save_defaults()
     app.save_defaults()
     python = sys.executable
     python = sys.executable
     os.execl(python, python, *sys.argv)
     os.execl(python, python, *sys.argv)
-
-

+ 1 - 1
FlatCAMWorker.py

@@ -36,7 +36,7 @@ class Worker(QtCore.QObject):
                 import pydevd
                 import pydevd
                 pydevd.settrace(suspend=False, trace_only_current_thread=True)
                 pydevd.settrace(suspend=False, trace_only_current_thread=True)
             except ImportError:
             except ImportError:
-                self.pydevd_failed=True
+                self.pydevd_failed = True
 
 
     def run(self):
     def run(self):
 
 

+ 51 - 0
README.md

@@ -9,6 +9,57 @@ CAD program, and create G-Code for Isolation routing.
 
 
 =================================================
 =================================================
 
 
+17.07.2019
+
+- added some more strings to the translateable ones, especially the radio button labels
+- updated the .POT file and the available translations
+- 51% progress in Spanish Google translation
+
+16.07.2019
+
+- PEP8 correction in flatcamTools
+- merged the Brazilian-portuguese language from a pull request made by Carlos Stein
+- more PEP8 corrections
+
+15.07.2019
+
+- some PEP8 corrections
+
+13.07.2019
+
+- fixed a possible issue in Gerber Object class
+- added a new tool in Gerber Editor: Mark Area Tool. It will mark the polygons in a edited Gerber object with areas within a defined range, allowing to delete some of the not necessary  copper features
+- added new menu links in the Gerber Editor menu for Eraser Tool and Mark Area Tool
+- added key shortcuts for Eraser Tool (CTRL+E) and Mark Area Tool (ALT+A) and updated the shortcuts list
+
+9.07.2019
+
+- some changes in the app.on_togle_units() to make sure we don't try to convert empty parameters which may cause crashes on FlatCAM units change
+- updated setup_ubuntu.sh file
+- made sure to import certain libraries in some of the FlatCAM files and not to rely on chained imports
+
+8.07.2019
+
+- fixed bug that allowed empty tool in the tools generated in Geometry object
+- fixed bug in Tool Cutout that did not allow the transfer of used cutout tool diameter to the cutout geometry object
+
+5.07.2019
+
+- fixed bug in CutOut Tool
+- some other bug in CutOut tool fixed
+
+1.07.2019
+
+- Spanish translation at 36%
+
+28.06.2019
+
+- Spanish translation (Google Translate) at 21%
+
+27.06.2019
+
+- added new translation: Spanish. Finished 10%
+
 23.06.2019
 23.06.2019
 
 
 - fixes issues with units conversion when the tool diameters are a list of comma separated values (NCC Tool, SolderPaste Tool and Geometry Object)
 - fixes issues with units conversion when the tool diameters are a list of comma separated values (NCC Tool, SolderPaste Tool and Geometry Object)

+ 2 - 1
camlib.py

@@ -7691,6 +7691,7 @@ def three_point_circle(p1, p2, p3):
 def distance(pt1, pt2):
 def distance(pt1, pt2):
     return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)
     return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)
 
 
+
 def distance_euclidian(x1, y1, x2, y2):
 def distance_euclidian(x1, y1, x2, y2):
     return sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
     return sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
 
 
@@ -7792,7 +7793,7 @@ class FlatCAMRTreeStorage(FlatCAMRTree):
         # super(FlatCAMRTreeStorage, self).insert(idx, obj)
         # super(FlatCAMRTreeStorage, self).insert(idx, obj)
         super().insert(idx, obj)
         super().insert(idx, obj)
 
 
-    #@profile
+    # @profile
     def remove(self, obj):
     def remove(self, obj):
         # See note about self.indexes in insert().
         # See note about self.indexes in insert().
         # objidx = self.indexes[obj]
         # objidx = self.indexes[obj]

+ 5 - 5
flatcamEditors/FlatCAMExcEditor.py

@@ -970,9 +970,9 @@ class FlatCAMExcEditor(QtCore.QObject):
         )
         )
         self.drill_axis_label.setFixedWidth(100)
         self.drill_axis_label.setFixedWidth(100)
 
 
-        self.drill_axis_radio = RadioSet([{'label': 'X', 'value': 'X'},
-                                          {'label': 'Y', 'value': 'Y'},
-                                          {'label': 'Angle', 'value': 'A'}])
+        self.drill_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'},
+                                          {'label': _('Y'), 'value': 'Y'},
+                                          {'label': _('Angle'), 'value': 'A'}])
         self.linear_form.addRow(self.drill_axis_label, self.drill_axis_radio)
         self.linear_form.addRow(self.drill_axis_label, self.drill_axis_radio)
 
 
         # Linear Drill Array pitch distance
         # Linear Drill Array pitch distance
@@ -1017,8 +1017,8 @@ class FlatCAMExcEditor(QtCore.QObject):
         self.circular_form = QtWidgets.QFormLayout()
         self.circular_form = QtWidgets.QFormLayout()
         self.circular_box.addLayout(self.circular_form)
         self.circular_box.addLayout(self.circular_form)
 
 
-        self.drill_direction_radio = RadioSet([{'label': 'CW', 'value': 'CW'},
-                                               {'label': 'CCW.', 'value': 'CCW'}])
+        self.drill_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
+                                               {'label': _('CCW'), 'value': 'CCW'}])
         self.circular_form.addRow(self.drill_direction_label, self.drill_direction_radio)
         self.circular_form.addRow(self.drill_direction_label, self.drill_direction_radio)
 
 
         self.drill_angle_label = QtWidgets.QLabel(_('Angle:'))
         self.drill_angle_label = QtWidgets.QLabel(_('Angle:'))

+ 3 - 3
flatcamEditors/FlatCAMGeoEditor.py

@@ -477,9 +477,9 @@ class PaintOptionsTool(FlatCAMTool):
         )
         )
         grid.addWidget(methodlabel, 3, 0)
         grid.addWidget(methodlabel, 3, 0)
         self.paintmethod_combo = RadioSet([
         self.paintmethod_combo = RadioSet([
-            {"label": "Standard", "value": "standard"},
-            {"label": "Seed-based", "value": "seed"},
-            {"label": "Straight lines", "value": "lines"}
+            {"label": _("Standard"), "value": "standard"},
+            {"label": _("Seed-based"), "value": "seed"},
+            {"label": _("Straight lines"), "value": "lines"}
         ], orientation='vertical', stretch=False)
         ], orientation='vertical', stretch=False)
         grid.addWidget(self.paintmethod_combo, 3, 1)
         grid.addWidget(self.paintmethod_combo, 3, 1)
 
 

+ 179 - 24
flatcamEditors/FlatCAMGrbEditor.py

@@ -1755,6 +1755,48 @@ class FCBuffer(FCShapeTool):
         self.draw_app.plot_all()
         self.draw_app.plot_all()
 
 
 
 
+class FCMarkArea(FCShapeTool):
+    def __init__(self, draw_app):
+        FCShapeTool.__init__(self, draw_app)
+        self.name = 'markarea'
+
+        # self.shape_buffer = self.draw_app.shape_buffer
+        self.draw_app = draw_app
+        self.app = draw_app.app
+
+        self.draw_app.app.inform.emit(_("Mark polygon areas in the edited Gerber ..."))
+        self.origin = (0, 0)
+
+        if self.draw_app.app.ui.splitter.sizes()[0] == 0:
+            self.draw_app.app.ui.splitter.setSizes([1, 1])
+        self.activate_markarea()
+
+    def activate_markarea(self):
+        self.draw_app.hide_tool('all')
+        self.draw_app.ma_tool_frame.show()
+
+        try:
+            self.draw_app.ma_threshold__button.clicked.disconnect()
+        except TypeError:
+            pass
+        self.draw_app.ma_threshold__button.clicked.connect(self.on_markarea_click)
+
+    def deactivate_markarea(self):
+        self.draw_app.ma_threshold__button.clicked.disconnect()
+        self.complete = True
+        self.draw_app.select_tool("select")
+        self.draw_app.hide_tool(self.name)
+
+    def on_markarea_click(self):
+        self.draw_app.on_markarea()
+        self.deactivate_markarea()
+
+    def clean_up(self):
+        self.draw_app.selected = []
+        self.draw_app.apertures_table.clearSelection()
+        self.draw_app.plot_all()
+
+
 class FCApertureMove(FCShapeTool):
 class FCApertureMove(FCShapeTool):
     def __init__(self, draw_app):
     def __init__(self, draw_app):
         DrawTool.__init__(self, draw_app)
         DrawTool.__init__(self, draw_app)
@@ -2273,8 +2315,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.custom_box = QtWidgets.QVBoxLayout()
         self.custom_box = QtWidgets.QVBoxLayout()
         layout.addLayout(self.custom_box)
         layout.addLayout(self.custom_box)
 
 
-
-        # # ## Gerber Apertures ## ##
+        # #########################
+        # ### Gerber Apertures ####
+        # #########################
         self.apertures_table_label = QtWidgets.QLabel(_('<b>Apertures:</b>'))
         self.apertures_table_label = QtWidgets.QLabel(_('<b>Apertures:</b>'))
         self.apertures_table_label.setToolTip(
         self.apertures_table_label.setToolTip(
             _("Apertures Table for the Gerber Object.")
             _("Apertures Table for the Gerber Object.")
@@ -2390,8 +2433,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         hlay_ad.addWidget(self.addaperture_btn)
         hlay_ad.addWidget(self.addaperture_btn)
         hlay_ad.addWidget(self.delaperture_btn)
         hlay_ad.addWidget(self.delaperture_btn)
 
 
-        # # ## BUFFER TOOL # ##
-
+        # ###################
+        # ### BUFFER TOOL ###
+        # ###################
         self.buffer_tool_frame = QtWidgets.QFrame()
         self.buffer_tool_frame = QtWidgets.QFrame()
         self.buffer_tool_frame.setContentsMargins(0, 0, 0, 0)
         self.buffer_tool_frame.setContentsMargins(0, 0, 0, 0)
         self.custom_box.addWidget(self.buffer_tool_frame)
         self.custom_box.addWidget(self.buffer_tool_frame)
@@ -2434,8 +2478,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.buffer_button = QtWidgets.QPushButton(_("Buffer"))
         self.buffer_button = QtWidgets.QPushButton(_("Buffer"))
         hlay_buf.addWidget(self.buffer_button)
         hlay_buf.addWidget(self.buffer_button)
 
 
-        # # ## SCALE TOOL # ##
-
+        # ##################
+        # ### SCALE TOOL ###
+        # ##################
         self.scale_tool_frame = QtWidgets.QFrame()
         self.scale_tool_frame = QtWidgets.QFrame()
         self.scale_tool_frame.setContentsMargins(0, 0, 0, 0)
         self.scale_tool_frame.setContentsMargins(0, 0, 0, 0)
         self.custom_box.addWidget(self.scale_tool_frame)
         self.custom_box.addWidget(self.scale_tool_frame)
@@ -2471,6 +2516,58 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.scale_button = QtWidgets.QPushButton(_("Scale"))
         self.scale_button = QtWidgets.QPushButton(_("Scale"))
         hlay_scale.addWidget(self.scale_button)
         hlay_scale.addWidget(self.scale_button)
 
 
+        # ######################
+        # ### Mark Area TOOL ###
+        # ######################
+        self.ma_tool_frame = QtWidgets.QFrame()
+        self.ma_tool_frame.setContentsMargins(0, 0, 0, 0)
+        self.custom_box.addWidget(self.ma_tool_frame)
+        self.ma_tools_box = QtWidgets.QVBoxLayout()
+        self.ma_tools_box.setContentsMargins(0, 0, 0, 0)
+        self.ma_tool_frame.setLayout(self.ma_tools_box)
+        self.ma_tool_frame.hide()
+
+        # Title
+        ma_title_lbl = QtWidgets.QLabel('<b>%s</b>' % _('Mark polygon areas:'))
+        ma_title_lbl.setToolTip(
+            _("Mark the polygon areas.")
+        )
+        self.ma_tools_box.addWidget(ma_title_lbl)
+
+        # Form Layout
+        ma_form_layout = QtWidgets.QFormLayout()
+        self.ma_tools_box.addLayout(ma_form_layout)
+
+        self.ma_upper_threshold_lbl = QtWidgets.QLabel(_("Area UPPER threshold:"))
+        self.ma_upper_threshold_lbl.setToolTip(
+            _("The threshold value, all areas less than this are marked.\n"
+              "Can have a value between 0.0000 and 9999.9999")
+        )
+        self.ma_upper_threshold_entry = FCEntry()
+        self.ma_upper_threshold_entry.setValidator(QtGui.QDoubleValidator(0.0000, 9999.9999, 4))
+
+        self.ma_lower_threshold_lbl = QtWidgets.QLabel(_("Area LOWER threshold:"))
+        self.ma_lower_threshold_lbl.setToolTip(
+            _("The threshold value, all areas more than this are marked.\n"
+              "Can have a value between 0.0000 and 9999.9999")
+        )
+        self.ma_lower_threshold_entry = FCEntry()
+        self.ma_lower_threshold_entry.setValidator(QtGui.QDoubleValidator(0.0000, 9999.9999, 4))
+
+        ma_form_layout.addRow(self.ma_upper_threshold_lbl, self.ma_upper_threshold_entry)
+        ma_form_layout.addRow(self.ma_lower_threshold_lbl, self.ma_lower_threshold_entry)
+
+        # Buttons
+        hlay_ma = QtWidgets.QHBoxLayout()
+        self.ma_tools_box.addLayout(hlay_ma)
+
+        self.ma_threshold__button = QtWidgets.QPushButton(_("Go"))
+        hlay_ma.addWidget(self.ma_threshold__button)
+
+        # ######################
+        # ### Add Pad Array ####
+        # ######################
+
         # add a frame and inside add a vertical box layout. Inside this vbox layout I add
         # add a frame and inside add a vertical box layout. Inside this vbox layout I add
         # all the add Pad array  widgets
         # all the add Pad array  widgets
         # this way I can hide/show the frame
         # this way I can hide/show the frame
@@ -2481,7 +2578,6 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.array_box.setContentsMargins(0, 0, 0, 0)
         self.array_box.setContentsMargins(0, 0, 0, 0)
         self.array_frame.setLayout(self.array_box)
         self.array_frame.setLayout(self.array_box)
 
 
-        # # ## Add Pad Array ## ##
         self.emptyarray_label = QtWidgets.QLabel('')
         self.emptyarray_label = QtWidgets.QLabel('')
         self.array_box.addWidget(self.emptyarray_label)
         self.array_box.addWidget(self.emptyarray_label)
 
 
@@ -2532,9 +2628,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         )
         )
         self.pad_axis_label.setFixedWidth(100)
         self.pad_axis_label.setFixedWidth(100)
 
 
-        self.pad_axis_radio = RadioSet([{'label': 'X', 'value': 'X'},
-                                        {'label': 'Y', 'value': 'Y'},
-                                        {'label': 'Angle', 'value': 'A'}])
+        self.pad_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'},
+                                        {'label': _('Y'), 'value': 'Y'},
+                                        {'label': _('Angle'), 'value': 'A'}])
         self.pad_axis_radio.set_value('X')
         self.pad_axis_radio.set_value('X')
         self.linear_form.addRow(self.pad_axis_label, self.pad_axis_radio)
         self.linear_form.addRow(self.pad_axis_label, self.pad_axis_radio)
 
 
@@ -2578,8 +2674,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.circular_form = QtWidgets.QFormLayout()
         self.circular_form = QtWidgets.QFormLayout()
         self.circular_box.addLayout(self.circular_form)
         self.circular_box.addLayout(self.circular_form)
 
 
-        self.pad_direction_radio = RadioSet([{'label': 'CW', 'value': 'CW'},
-                                             {'label': 'CCW.', 'value': 'CCW'}])
+        self.pad_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
+                                             {'label': _('CCW'), 'value': 'CCW'}])
         self.pad_direction_radio.set_value('CW')
         self.pad_direction_radio.set_value('CW')
         self.circular_form.addRow(self.pad_direction_label, self.pad_direction_radio)
         self.circular_form.addRow(self.pad_direction_label, self.pad_direction_radio)
 
 
@@ -2623,6 +2719,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                        "constructor": FCBuffer},
                        "constructor": FCBuffer},
             "scale": {"button": self.app.ui.aperture_scale_btn,
             "scale": {"button": self.app.ui.aperture_scale_btn,
                       "constructor": FCScale},
                       "constructor": FCScale},
+            "markarea": {"button": self.app.ui.aperture_markarea_btn,
+                      "constructor": FCMarkArea},
             "eraser": {"button": self.app.ui.aperture_eraser_btn,
             "eraser": {"button": self.app.ui.aperture_eraser_btn,
                       "constructor": FCEraser},
                       "constructor": FCEraser},
             "copy": {"button": self.app.ui.aperture_copy_btn,
             "copy": {"button": self.app.ui.aperture_copy_btn,
@@ -2670,12 +2768,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.gerber_obj = None
         self.gerber_obj = None
         self.gerber_obj_options = dict()
         self.gerber_obj_options = dict()
 
 
-        self.buffer_distance_entry.set_value(0.01)
-        self.scale_factor_entry.set_value(1.0)
-
         # VisPy Visuals
         # VisPy Visuals
         self.shapes = self.canvas.new_shape_collection(layers=1)
         self.shapes = self.canvas.new_shape_collection(layers=1)
         self.tool_shape = self.canvas.new_shape_collection(layers=1)
         self.tool_shape = self.canvas.new_shape_collection(layers=1)
+        self.ma_annotation = self.canvas.new_text_group()
+
         self.app.pool_recreated.connect(self.pool_recreated)
         self.app.pool_recreated.connect(self.pool_recreated)
 
 
         # Remove from scene
         # Remove from scene
@@ -2768,6 +2865,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.app.ui.grb_add_disc_menuitem.triggered.connect(self.on_disc_add)
         self.app.ui.grb_add_disc_menuitem.triggered.connect(self.on_disc_add)
         self.app.ui.grb_add_buffer_menuitem.triggered.connect(self.on_buffer)
         self.app.ui.grb_add_buffer_menuitem.triggered.connect(self.on_buffer)
         self.app.ui.grb_add_scale_menuitem.triggered.connect(self.on_scale)
         self.app.ui.grb_add_scale_menuitem.triggered.connect(self.on_scale)
+        self.app.ui.grb_add_eraser_menuitem.triggered.connect(self.on_eraser)
+        self.app.ui.grb_add_markarea_menuitem.triggered.connect(self.on_markarea)
+
         self.app.ui.grb_transform_menuitem.triggered.connect(self.transform_tool.run)
         self.app.ui.grb_transform_menuitem.triggered.connect(self.transform_tool.run)
 
 
         self.app.ui.grb_copy_menuitem.triggered.connect(self.on_copy_button)
         self.app.ui.grb_copy_menuitem.triggered.connect(self.on_copy_button)
@@ -2810,12 +2910,19 @@ class FlatCAMGrbEditor(QtCore.QObject):
             tt_aperture = self.sorted_apid[i]
             tt_aperture = self.sorted_apid[i]
             self.tool2tooldia[i + 1] = tt_aperture
             self.tool2tooldia[i + 1] = tt_aperture
 
 
-        if self.units == "IN":
-            self.apsize_entry.set_value(0.039)
-        else:
+        # Init GUI
+        if self.units == 'MM':
+            self.buffer_distance_entry.set_value(0.01)
+            self.scale_factor_entry.set_value(1.0)
+            self.ma_upper_threshold_entry.set_value(1.0)
             self.apsize_entry.set_value(1.00)
             self.apsize_entry.set_value(1.00)
+        else:
+            self.buffer_distance_entry.set_value(0.0003937)
+            self.scale_factor_entry.set_value(0.03937)
+            self.ma_upper_threshold_entry.set_value(0.00155)
+            self.apsize_entry.set_value(0.039)
+        self.ma_lower_threshold_entry.set_value(0.0)
 
 
-        # Init GUI
         self.pad_array_size_entry.set_value(5)
         self.pad_array_size_entry.set_value(5)
         self.pad_pitch_entry.set_value(2.54)
         self.pad_pitch_entry.set_value(2.54)
         self.pad_angle_entry.set_value(12)
         self.pad_angle_entry.set_value(12)
@@ -2827,12 +2934,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
         try:
         try:
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             self.apertures_table.itemChanged.disconnect()
             self.apertures_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
             pass
             pass
 
 
         try:
         try:
             self.apertures_table.cellPressed.disconnect()
             self.apertures_table.cellPressed.disconnect()
-        except:
+        except Exception as e:
             pass
             pass
 
 
         # updated units
         # updated units
@@ -3426,6 +3533,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
 
 
         self.shapes.clear(update=True)
         self.shapes.clear(update=True)
         self.tool_shape.clear(update=True)
         self.tool_shape.clear(update=True)
+        self.ma_annotation.clear(update=True)
 
 
     def edit_fcgerber(self, orig_grb_obj):
     def edit_fcgerber(self, orig_grb_obj):
         """
         """
@@ -3561,9 +3669,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.set_ui()
         self.set_ui()
 
 
         # do the delayed plot only if there is something to plot (the gerber is not empty)
         # do the delayed plot only if there is something to plot (the gerber is not empty)
-        if bool(self.gerber_obj.apertures):
-            self.start_delayed_plot(check_period=1000)
-        else:
+        try:
+            if bool(self.gerber_obj.apertures):
+                self.start_delayed_plot(check_period=1000)
+            else:
+                raise AttributeError
+        except AttributeError:
             # now that we have data (empty data actually), create the GUI interface and add it to the Tool Tab
             # now that we have data (empty data actually), create the GUI interface and add it to the Tool Tab
             self.build_ui(first_run=True)
             self.build_ui(first_run=True)
             # and add the first aperture to have something to play with
             # and add the first aperture to have something to play with
@@ -4509,6 +4620,48 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.plot_all()
         self.plot_all()
         self.app.inform.emit(_("[success] Done. Scale Tool completed."))
         self.app.inform.emit(_("[success] Done. Scale Tool completed."))
 
 
+    def on_markarea(self):
+        # clear previous marking
+        self.ma_annotation.clear(update=True)
+
+        self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
+        upper_threshold_val = None
+        lower_threshold_val = None
+        text = []
+        position = []
+
+        for apid in self.gerber_obj.apertures:
+            if 'geometry' in self.gerber_obj.apertures[apid]:
+                for geo_el in self.gerber_obj.apertures[apid]['geometry']:
+                    if 'solid' in geo_el:
+                        area = geo_el['solid'].area
+                        try:
+                            upper_threshold_val = self.ma_upper_threshold_entry.get_value()
+                        except Exception as e:
+                            return
+
+                        try:
+                            lower_threshold_val = self.ma_lower_threshold_entry.get_value()
+                        except Exception as e:
+                            lower_threshold_val = 0.0
+
+                        if area < float(upper_threshold_val) and area > float(lower_threshold_val):
+                            current_pos = geo_el['solid'].exterior.coords[-1]
+                            text_elem = '%.4f' % area
+                            text.append(text_elem)
+                            position.append(current_pos)
+
+        if text:
+            self.ma_annotation.set(text=text, pos=position, visible=True,
+                                   font_size=self.app.defaults["cncjob_annotation_fontsize"],
+                                   color=self.app.defaults["global_sel_draw_color"])
+            self.app.inform.emit(_("[success] Polygon areas marked."))
+        else:
+            self.app.inform.emit(_("[WARNING_NOTCL] There are no polygons to mark area."))
+
+    def on_eraser(self):
+        self.select_tool('eraser')
+
     def on_transform(self):
     def on_transform(self):
         if type(self.active_tool) == FCTransform:
         if type(self.active_tool) == FCTransform:
             self.select_tool('select')
             self.select_tool('select')
@@ -4526,6 +4679,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 self.buffer_tool_frame.hide()
                 self.buffer_tool_frame.hide()
             if tool_name == 'scale' or tool_name == 'all':
             if tool_name == 'scale' or tool_name == 'all':
                 self.scale_tool_frame.hide()
                 self.scale_tool_frame.hide()
+            if tool_name == 'markarea' or tool_name == 'all':
+                self.ma_tool_frame.hide()
         except Exception as e:
         except Exception as e:
             log.debug("FlatCAMGrbEditor.hide_tool() --> %s" % str(e))
             log.debug("FlatCAMGrbEditor.hide_tool() --> %s" % str(e))
         self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab)
         self.app.ui.notebook.setCurrentWidget(self.app.ui.selected_tab)

+ 78 - 48
flatcamGUI/FlatCAMGUI.py

@@ -488,6 +488,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                                                                       _('Buffer\tB'))
                                                                       _('Buffer\tB'))
         self.grb_add_scale_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/scale32.png'),
         self.grb_add_scale_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/scale32.png'),
                                                                      _('Scale\tS'))
                                                                      _('Scale\tS'))
+        self.grb_add_markarea_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/markarea32.png'),
+                                                                     _('Mark Area\tALT+A'))
+        self.grb_add_eraser_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/eraser26.png'),
+                                                                     _('Eraser\tCTRL+E'))
         self.grb_transform_menuitem = self.grb_editor_menu.addAction(
         self.grb_transform_menuitem = self.grb_editor_menu.addAction(
             QtGui.QIcon('share/transform.png'),_( "Transform\tALT+R")
             QtGui.QIcon('share/transform.png'),_( "Transform\tALT+R")
         )
         )
@@ -716,6 +720,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
 
 
         self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer'))
         self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer'))
         self.aperture_scale_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/scale32.png'), _('Scale'))
         self.aperture_scale_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/scale32.png'), _('Scale'))
+        self.aperture_markarea_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/markarea32.png'),
+                                                                     _('Mark Area'))
+
         self.aperture_eraser_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/eraser26.png'), _('Eraser'))
         self.aperture_eraser_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/eraser26.png'), _('Eraser'))
 
 
         self.grb_edit_toolbar.addSeparator()
         self.grb_edit_toolbar.addSeparator()
@@ -1546,6 +1553,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                         <td height="20"><strong>ESC</strong></td>
                         <td height="20"><strong>ESC</strong></td>
                         <td>&nbsp;Abort and return to Select</td>
                         <td>&nbsp;Abort and return to Select</td>
                     </tr>
                     </tr>
+                    <tr height="20">
+                        <td height="20"><strong>CTRL+E</strong></td>
+                        <td>&nbsp;Eraser Tool</td>
+                    </tr>
                     <tr height="20">
                     <tr height="20">
                         <td height="20"><strong>CTRL+S</strong></td>
                         <td height="20"><strong>CTRL+S</strong></td>
                         <td>&nbsp;Save Object and Exit Editor</td>
                         <td>&nbsp;Save Object and Exit Editor</td>
@@ -1553,6 +1564,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                     <tr height="20">
                     <tr height="20">
                         <td height="20">&nbsp;</td>
                         <td height="20">&nbsp;</td>
                         <td>&nbsp;</td>
                         <td>&nbsp;</td>
+                    </tr>
+                     <tr height="20">
+                        <td height="20"><strong>ALT+A</strong></td>
+                        <td>&nbsp;Mark Area Tool</td>
+                    </tr>
+                    <tr height="20">
+                        <td height="20"><strong>ALT+N</strong></td>
+                        <td>&nbsp;Poligonize Tool</td>
                     </tr>
                     </tr>
                     <tr height="20">
                     <tr height="20">
                         <td height="20"><strong>ALT+R</strong></td>
                         <td height="20"><strong>ALT+R</strong></td>
@@ -1945,6 +1964,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
 
 
         self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer'))
         self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer'))
         self.aperture_scale_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/scale32.png'), _('Scale'))
         self.aperture_scale_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/scale32.png'), _('Scale'))
+        self.aperture_markarea_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/markarea32.png'),
+                                                                     _('Mark Area'))
         self.aperture_eraser_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/eraser26.png'), _('Eraser'))
         self.aperture_eraser_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/eraser26.png'), _('Eraser'))
 
 
         self.grb_edit_toolbar.addSeparator()
         self.grb_edit_toolbar.addSeparator()
@@ -2604,6 +2625,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                     self.app.on_shortcut_list()
                     self.app.on_shortcut_list()
         elif self.app.call_source == 'grb_editor':
         elif self.app.call_source == 'grb_editor':
             if modifiers == QtCore.Qt.ControlModifier:
             if modifiers == QtCore.Qt.ControlModifier:
+                # Eraser Tool
+                if key == QtCore.Qt.Key_E or key == 'E':
+                    self.app.grb_editor.on_eraser()
+                    return
+
                 # save (update) the current geometry and return to the App
                 # save (update) the current geometry and return to the App
                 if key == QtCore.Qt.Key_S or key == 'S':
                 if key == QtCore.Qt.Key_S or key == 'S':
                     self.app.editor2object()
                     self.app.editor2object()
@@ -2617,11 +2643,15 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
             elif modifiers == QtCore.Qt.ShiftModifier:
             elif modifiers == QtCore.Qt.ShiftModifier:
                 pass
                 pass
             elif modifiers == QtCore.Qt.AltModifier:
             elif modifiers == QtCore.Qt.AltModifier:
+                # Mark Area Tool
+                if key == QtCore.Qt.Key_A or key == 'A':
+                    self.app.grb_editor.on_markarea()
+                    return
+
                 # Poligonize Tool
                 # Poligonize Tool
                 if key == QtCore.Qt.Key_N or key == 'N':
                 if key == QtCore.Qt.Key_N or key == 'N':
                     self.app.grb_editor.on_poligonize()
                     self.app.grb_editor.on_poligonize()
                     return
                     return
-
                 # Transformation Tool
                 # Transformation Tool
                 if key == QtCore.Qt.Key_R or key == 'R':
                 if key == QtCore.Qt.Key_R or key == 'R':
                     self.app.grb_editor.on_transform()
                     self.app.grb_editor.on_transform()
@@ -3756,8 +3786,8 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         self.unitslabel.setToolTip(_("The default value for FlatCAM units.\n"
         self.unitslabel.setToolTip(_("The default value for FlatCAM units.\n"
                                      "Whatever is selected here is set every time\n"
                                      "Whatever is selected here is set every time\n"
                                      "FLatCAM is started."))
                                      "FLatCAM is started."))
-        self.units_radio = RadioSet([{'label': 'IN', 'value': 'IN'},
-                                     {'label': 'MM', 'value': 'MM'}])
+        self.units_radio = RadioSet([{'label': _('IN'), 'value': 'IN'},
+                                     {'label': _('MM'), 'value': 'MM'}])
 
 
         # Application Level for FlatCAM
         # Application Level for FlatCAM
         self.app_level_label = QtWidgets.QLabel(_('<b>APP. LEVEL:</b>'))
         self.app_level_label = QtWidgets.QLabel(_('<b>APP. LEVEL:</b>'))
@@ -3826,8 +3856,8 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         self.panbuttonlabel.setToolTip(_("Select the mouse button to use for panning:\n"
         self.panbuttonlabel.setToolTip(_("Select the mouse button to use for panning:\n"
                                          "- MMB --> Middle Mouse Button\n"
                                          "- MMB --> Middle Mouse Button\n"
                                          "- RMB --> Right Mouse Button"))
                                          "- RMB --> Right Mouse Button"))
-        self.pan_button_radio = RadioSet([{'label': 'MMB', 'value': '3'},
-                                          {'label': 'RMB', 'value': '2'}])
+        self.pan_button_radio = RadioSet([{'label': _('MMB'), 'value': '3'},
+                                          {'label': _('RMB'), 'value': '2'}])
 
 
         # Multiple Selection Modifier Key
         # Multiple Selection Modifier Key
         self.mselectlabel = QtWidgets.QLabel(_('<b>Multiple Sel:</b>'))
         self.mselectlabel = QtWidgets.QLabel(_('<b>Multiple Sel:</b>'))
@@ -3893,7 +3923,7 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         self.worker_number_sb.set_range(2, 16)
         self.worker_number_sb.set_range(2, 16)
 
 
         # Geometric tolerance
         # Geometric tolerance
-        tol_label = QtWidgets.QLabel("Geo Tolerance:")
+        tol_label = QtWidgets.QLabel(_("Geo Tolerance:"))
         tol_label.setToolTip(_(
         tol_label.setToolTip(_(
             "This value can counter the effect of the Circle Steps\n"
             "This value can counter the effect of the Circle Steps\n"
             "parameter. Default value is 0.01.\n"
             "parameter. Default value is 0.01.\n"
@@ -4087,8 +4117,8 @@ class GerberOptPrefGroupUI(OptionsGroupUI):
               "- conventional / useful when there is no backlash compensation")
               "- conventional / useful when there is no backlash compensation")
         )
         )
         grid0.addWidget(milling_type_label, 3, 0)
         grid0.addWidget(milling_type_label, 3, 0)
-        self.milling_type_radio = RadioSet([{'label': 'Climb', 'value': 'cl'},
-                                            {'label': 'Conv.', 'value': 'cv'}])
+        self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'},
+                                            {'label': _('Conv.'), 'value': 'cv'}])
         grid0.addWidget(self.milling_type_radio, 3, 1)
         grid0.addWidget(self.milling_type_radio, 3, 1)
 
 
         # Combine passes
         # Combine passes
@@ -4245,8 +4275,8 @@ class GerberExpPrefGroupUI(OptionsGroupUI):
             _("The units used in the Gerber file.")
             _("The units used in the Gerber file.")
         )
         )
 
 
-        self.gerber_units_radio = RadioSet([{'label': 'INCH', 'value': 'IN'},
-                                            {'label': 'MM', 'value': 'MM'}])
+        self.gerber_units_radio = RadioSet([{'label': _('INCH'), 'value': 'IN'},
+                                            {'label': _('MM'), 'value': 'MM'}])
         self.gerber_units_radio.setToolTip(
         self.gerber_units_radio.setToolTip(
             _("The units used in the Gerber file.")
             _("The units used in the Gerber file.")
         )
         )
@@ -4300,8 +4330,8 @@ class GerberExpPrefGroupUI(OptionsGroupUI):
               "and Leading Zeros are kept.")
               "and Leading Zeros are kept.")
         )
         )
 
 
-        self.zeros_radio = RadioSet([{'label': 'LZ', 'value': 'L'},
-                                     {'label': 'TZ', 'value': 'T'}])
+        self.zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'L'},
+                                     {'label': _('TZ'), 'value': 'T'}])
         self.zeros_radio.setToolTip(
         self.zeros_radio.setToolTip(
             _("This sets the type of Gerber zeros.\n"
             _("This sets the type of Gerber zeros.\n"
               "If LZ then Leading Zeros are removed and\n"
               "If LZ then Leading Zeros are removed and\n"
@@ -4482,8 +4512,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
         )
         )
         grid2.addWidget(self.excellon_zeros_label, 0, 0)
         grid2.addWidget(self.excellon_zeros_label, 0, 0)
 
 
-        self.excellon_zeros_radio = RadioSet([{'label': 'LZ', 'value': 'L'},
-                                              {'label': 'TZ', 'value': 'T'}])
+        self.excellon_zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'L'},
+                                              {'label': _('TZ'), 'value': 'T'}])
         self.excellon_zeros_radio.setToolTip(
         self.excellon_zeros_radio.setToolTip(
             _("This sets the default type of Excellon zeros.\n"
             _("This sets the default type of Excellon zeros.\n"
               "If it is not detected in the parsed file the value here\n"
               "If it is not detected in the parsed file the value here\n"
@@ -4506,8 +4536,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
         )
         )
         grid2.addWidget(self.excellon_units_label, 1, 0)
         grid2.addWidget(self.excellon_units_label, 1, 0)
 
 
-        self.excellon_units_radio = RadioSet([{'label': 'INCH', 'value': 'INCH'},
-                                              {'label': 'MM', 'value': 'METRIC'}])
+        self.excellon_units_radio = RadioSet([{'label': _('INCH'), 'value': 'INCH'},
+                                              {'label': _('MM'), 'value': 'METRIC'}])
         self.excellon_units_radio.setToolTip(
         self.excellon_units_radio.setToolTip(
             _("This sets the units of Excellon files.\n"
             _("This sets the units of Excellon files.\n"
               "Some Excellon files don't have an header\n"
               "Some Excellon files don't have an header\n"
@@ -4533,8 +4563,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
         )
         )
         grid2.addWidget(self.excellon_optimization_label, 4, 0)
         grid2.addWidget(self.excellon_optimization_label, 4, 0)
 
 
-        self.excellon_optimization_radio = RadioSet([{'label': 'MH', 'value': 'M'},
-                                     {'label': 'Basic', 'value': 'B'}])
+        self.excellon_optimization_radio = RadioSet([{'label': _('MH'), 'value': 'M'},
+                                                     {'label': _('Basic'), 'value': 'B'}])
         self.excellon_optimization_radio.setToolTip(
         self.excellon_optimization_radio.setToolTip(
             _("This sets the optimization type for the Excellon drill path.\n"
             _("This sets the optimization type for the Excellon drill path.\n"
               "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n"
               "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n"
@@ -4670,8 +4700,8 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
               "- CCW = counter clockwise")
               "- CCW = counter clockwise")
         )
         )
 
 
-        self.spindledir_radio = RadioSet([{'label': 'CW', 'value': 'CW'},
-                                          {'label': 'CCW', 'value': 'CCW'}])
+        self.spindledir_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
+                                          {'label': _('CCW'), 'value': 'CCW'}])
         grid2.addWidget(spindle_dir_label, 6, 0)
         grid2.addWidget(spindle_dir_label, 6, 0)
         grid2.addWidget(self.spindledir_radio, 6, 1)
         grid2.addWidget(self.spindledir_radio, 6, 1)
 
 
@@ -4897,8 +4927,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
             _("The units used in the Excellon file.")
             _("The units used in the Excellon file.")
         )
         )
 
 
-        self.excellon_units_radio = RadioSet([{'label': 'INCH', 'value': 'INCH'},
-                                              {'label': 'MM', 'value': 'METRIC'}])
+        self.excellon_units_radio = RadioSet([{'label': _('INCH'), 'value': 'INCH'},
+                                              {'label': _('MM'), 'value': 'METRIC'}])
         self.excellon_units_radio.setToolTip(
         self.excellon_units_radio.setToolTip(
             _("The units used in the Excellon file.")
             _("The units used in the Excellon file.")
         )
         )
@@ -4953,8 +4983,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
               "Also it will have to be specified if LZ = leading zeros are kept\n"
               "Also it will have to be specified if LZ = leading zeros are kept\n"
               "or TZ = trailing zeros are kept.")
               "or TZ = trailing zeros are kept.")
         )
         )
-        self.format_radio = RadioSet([{'label': 'Decimal', 'value': 'dec'},
-                                      {'label': 'No-Decimal', 'value': 'ndec'}])
+        self.format_radio = RadioSet([{'label': _('Decimal'), 'value': 'dec'},
+                                      {'label': _('No-Decimal'), 'value': 'ndec'}])
         self.format_radio.setToolTip(
         self.format_radio.setToolTip(
             _("Select the kind of coordinates format used.\n"
             _("Select the kind of coordinates format used.\n"
               "Coordinates can be saved with decimal point or without.\n"
               "Coordinates can be saved with decimal point or without.\n"
@@ -4977,8 +5007,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
               "and Leading Zeros are removed.")
               "and Leading Zeros are removed.")
         )
         )
 
 
-        self.zeros_radio = RadioSet([{'label': 'LZ', 'value': 'LZ'},
-                                     {'label': 'TZ', 'value': 'TZ'}])
+        self.zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'LZ'},
+                                     {'label': _('TZ'), 'value': 'TZ'}])
         self.zeros_radio.setToolTip(
         self.zeros_radio.setToolTip(
             _("This sets the default type of Excellon zeros.\n"
             _("This sets the default type of Excellon zeros.\n"
               "If LZ then Leading Zeros are kept and\n"
               "If LZ then Leading Zeros are kept and\n"
@@ -5067,9 +5097,9 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
               "- 'Angle' - a custom angle for the array inclination")
               "- 'Angle' - a custom angle for the array inclination")
         )
         )
         # self.drill_axis_label.setFixedWidth(100)
         # self.drill_axis_label.setFixedWidth(100)
-        self.drill_axis_radio = RadioSet([{'label': 'X', 'value': 'X'},
-                                          {'label': 'Y', 'value': 'Y'},
-                                          {'label': 'Angle', 'value': 'A'}])
+        self.drill_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'},
+                                          {'label': _('Y'), 'value': 'Y'},
+                                          {'label': _('Angle'), 'value': 'A'}])
 
 
         grid0.addWidget(self.drill_axis_label, 4, 0)
         grid0.addWidget(self.drill_axis_label, 4, 0)
         grid0.addWidget(self.drill_axis_radio, 4, 1)
         grid0.addWidget(self.drill_axis_radio, 4, 1)
@@ -5105,8 +5135,8 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
               "Can be CW = clockwise or CCW = counter clockwise.")
               "Can be CW = clockwise or CCW = counter clockwise.")
         )
         )
 
 
-        self.drill_circular_dir_radio = RadioSet([{'label': 'CW', 'value': 'CW'},
-                                                  {'label': 'CCW.', 'value': 'CCW'}])
+        self.drill_circular_dir_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
+                                                  {'label': _('CCW'), 'value': 'CCW'}])
 
 
         grid0.addWidget(self.drill_circular_direction_label, 8, 0)
         grid0.addWidget(self.drill_circular_direction_label, 8, 0)
         grid0.addWidget(self.drill_circular_dir_radio, 8, 1)
         grid0.addWidget(self.drill_circular_dir_radio, 8, 1)
@@ -5294,8 +5324,8 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
               "- CCW = counter clockwise")
               "- CCW = counter clockwise")
         )
         )
 
 
-        self.spindledir_radio = RadioSet([{'label': 'CW', 'value': 'CW'},
-                                          {'label': 'CCW', 'value': 'CCW'}])
+        self.spindledir_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
+                                          {'label': _('CCW'), 'value': 'CCW'}])
         grid1.addWidget(spindle_dir_label, 9, 0)
         grid1.addWidget(spindle_dir_label, 9, 0)
         grid1.addWidget(self.spindledir_radio, 9, 1)
         grid1.addWidget(self.spindledir_radio, 9, 1)
 
 
@@ -5527,9 +5557,9 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI):
         )
         )
 
 
         self.cncplot_method_radio = RadioSet([
         self.cncplot_method_radio = RadioSet([
-            {"label": "All", "value": "all"},
-            {"label": "Travel", "value": "travel"},
-            {"label": "Cut", "value": "cut"}
+            {"label": _("All"), "value": "all"},
+            {"label": _("Travel"), "value": "travel"},
+            {"label": _("Cut"), "value": "cut"}
         ], stretch=False)
         ], stretch=False)
 
 
         grid0.addWidget(self.cncplot_method_label, 1, 0)
         grid0.addWidget(self.cncplot_method_label, 1, 0)
@@ -5811,9 +5841,9 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
         )
         )
         grid0.addWidget(methodlabel, 3, 0)
         grid0.addWidget(methodlabel, 3, 0)
         self.ncc_method_radio = RadioSet([
         self.ncc_method_radio = RadioSet([
-            {"label": "Standard", "value": "standard"},
-            {"label": "Seed-based", "value": "seed"},
-            {"label": "Straight lines", "value": "lines"}
+            {"label": _("Standard"), "value": "standard"},
+            {"label": _("Seed-based"), "value": "seed"},
+            {"label": _("Straight lines"), "value": "lines"}
         ], orientation='vertical', stretch=False)
         ], orientation='vertical', stretch=False)
         grid0.addWidget(self.ncc_method_radio, 3, 1)
         grid0.addWidget(self.ncc_method_radio, 3, 1)
 
 
@@ -5973,8 +6003,8 @@ class Tools2sidedPrefGroupUI(OptionsGroupUI):
         grid0.addWidget(self.mirror_axis_radio, 2, 1)
         grid0.addWidget(self.mirror_axis_radio, 2, 1)
 
 
         # ## Axis Location
         # ## Axis Location
-        self.axis_location_radio = RadioSet([{'label': 'Point', 'value': 'point'},
-                                             {'label': 'Box', 'value': 'box'}])
+        self.axis_location_radio = RadioSet([{'label': _('Point'), 'value': 'point'},
+                                             {'label': _('Box'), 'value': 'box'}])
         self.axloc_label = QtWidgets.QLabel(_("Axis Ref:"))
         self.axloc_label = QtWidgets.QLabel(_("Axis Ref:"))
         self.axloc_label.setToolTip(
         self.axloc_label.setToolTip(
             _("The axis should pass through a <b>point</b> or cut\n "
             _("The axis should pass through a <b>point</b> or cut\n "
@@ -6051,9 +6081,9 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
         )
         )
         grid0.addWidget(methodlabel, 3, 0)
         grid0.addWidget(methodlabel, 3, 0)
         self.paintmethod_combo = RadioSet([
         self.paintmethod_combo = RadioSet([
-            {"label": "Standard", "value": "standard"},
-            {"label": "Seed-based", "value": "seed"},
-            {"label": "Straight lines", "value": "lines"}
+            {"label": _("Standard"), "value": "standard"},
+            {"label": _("Seed-based"), "value": "seed"},
+            {"label": _("Straight lines"), "value": "lines"}
         ], orientation='vertical', stretch=False)
         ], orientation='vertical', stretch=False)
         grid0.addWidget(self.paintmethod_combo, 3, 1)
         grid0.addWidget(self.paintmethod_combo, 3, 1)
 
 
@@ -6084,8 +6114,8 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
         )
         )
         grid0.addWidget(selectlabel, 6, 0)
         grid0.addWidget(selectlabel, 6, 0)
         self.selectmethod_combo = RadioSet([
         self.selectmethod_combo = RadioSet([
-            {"label": "Single", "value": "single"},
-            {"label": "All", "value": "all"},
+            {"label": _("Single"), "value": "single"},
+            {"label": _("All"), "value": "all"},
             # {"label": "Rectangle", "value": "rectangle"}
             # {"label": "Rectangle", "value": "rectangle"}
         ])
         ])
         grid0.addWidget(self.selectmethod_combo, 6, 1)
         grid0.addWidget(self.selectmethod_combo, 6, 1)
@@ -6212,8 +6242,8 @@ class ToolsPanelizePrefGroupUI(OptionsGroupUI):
         grid0.addWidget(self.prows, 3, 1)
         grid0.addWidget(self.prows, 3, 1)
 
 
         # ## Type of resulting Panel object
         # ## Type of resulting Panel object
-        self.panel_type_radio = RadioSet([{'label': 'Gerber', 'value': 'gerber'},
-                                          {'label': 'Geo', 'value': 'geometry'}])
+        self.panel_type_radio = RadioSet([{'label': _('Gerber'), 'value': 'gerber'},
+                                          {'label': _('Geo'), 'value': 'geometry'}])
         self.panel_type_label = QtWidgets.QLabel(_("Panel Type:"))
         self.panel_type_label = QtWidgets.QLabel(_("Panel Type:"))
         self.panel_type_label.setToolTip(
         self.panel_type_label.setToolTip(
            _( "Choose the type of object for the panel object:\n"
            _( "Choose the type of object for the panel object:\n"

+ 14 - 16
flatcamGUI/GUIElements.py

@@ -242,9 +242,9 @@ class FloatEntry(QtWidgets.QLineEdit):
 
 
         try:
         try:
             evaled = eval(raw)
             evaled = eval(raw)
-        except:
-            if evaled is not None:
-                log.error("Could not evaluate: %s" % str(raw))
+        except Exception as e:
+            if raw is not '':
+                log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e)))
             return None
             return None
 
 
         return float(evaled)
         return float(evaled)
@@ -285,9 +285,9 @@ class FloatEntry2(QtWidgets.QLineEdit):
         evaled = 0.0
         evaled = 0.0
         try:
         try:
             evaled = eval(raw)
             evaled = eval(raw)
-        except:
-            if evaled is not None:
-                log.error("Could not evaluate: %s" % str(raw))
+        except Exception as e:
+            if raw is not '':
+                log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e)))
             return None
             return None
 
 
         return float(evaled)
         return float(evaled)
@@ -458,9 +458,9 @@ class EvalEntry(QtWidgets.QLineEdit):
         evaled = 0.0
         evaled = 0.0
         try:
         try:
             evaled = eval(raw)
             evaled = eval(raw)
-        except:
-            if evaled is not None:
-                log.error("Could not evaluate: %s" % str(raw))
+        except Exception as e:
+            if raw is not '':
+                log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e)))
             return None
             return None
         return evaled
         return evaled
 
 
@@ -497,9 +497,9 @@ class EvalEntry2(QtWidgets.QLineEdit):
         evaled = 0.0
         evaled = 0.0
         try:
         try:
             evaled = eval(raw)
             evaled = eval(raw)
-        except:
-            if evaled is not None:
-                log.error("Could not evaluate: %s" % str(raw))
+        except Exception as e:
+            if raw is not '':
+                log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e)))
             return None
             return None
         return evaled
         return evaled
 
 
@@ -785,7 +785,7 @@ class FCInputDialog(QtWidgets.QInputDialog):
 
 
     def get_value(self):
     def get_value(self):
         self.val, self.ok = self.getDouble(self, self.title, self.text, min=self.min,
         self.val, self.ok = self.getDouble(self, self.title, self.text, min=self.min,
-                                                      max=self.max, decimals=self.decimals, value=self.init_value)
+                                           max=self.max, decimals=self.decimals, value=self.init_value)
         return [self.val, self.ok]
         return [self.val, self.ok]
 
 
     # "Transform", "Enter the Angle value:"
     # "Transform", "Enter the Angle value:"
@@ -1449,7 +1449,7 @@ class FCTable(QtWidgets.QTableWidget):
             width += self.columnWidth(i)
             width += self.columnWidth(i)
         return width
         return width
 
 
-    # color is in format QtGui.Qcolor(r, g, b, alfa) with or without alfa
+    # color is in format QtGui.Qcolor(r, g, b, alpha) with or without alpfa
     def setColortoRow(self, rowIndex, color):
     def setColortoRow(self, rowIndex, color):
         for j in range(self.columnCount()):
         for j in range(self.columnCount()):
             self.item(rowIndex, j).setBackground(color)
             self.item(rowIndex, j).setBackground(color)
@@ -1625,7 +1625,6 @@ class Dialog_box(QtWidgets.QWidget):
         self.readyToEdit = True
         self.readyToEdit = True
 
 
 
 
-
 class _BrowserTextEdit(QTextEdit):
 class _BrowserTextEdit(QTextEdit):
 
 
     def __init__(self, version):
     def __init__(self, version):
@@ -1641,7 +1640,6 @@ class _BrowserTextEdit(QTextEdit):
         clear_action.triggered.connect(self.clear)
         clear_action.triggered.connect(self.clear)
         self.menu.exec_(event.globalPos())
         self.menu.exec_(event.globalPos())
 
 
-
     def clear(self):
     def clear(self):
         QTextEdit.clear(self)
         QTextEdit.clear(self)
         text = "FlatCAM %s (c)2014-2019 Juan Pablo Caram (Type help to get started)\n\n" % self.version
         text = "FlatCAM %s (c)2014-2019 Juan Pablo Caram (Type help to get started)\n\n" % self.version

+ 5 - 5
flatcamGUI/ObjectUI.py

@@ -299,8 +299,8 @@ class GerberObjectUI(ObjectUI):
             "- conventional / useful when there is no backlash compensation")
             "- conventional / useful when there is no backlash compensation")
         )
         )
         grid1.addWidget(self.milling_type_label, 3, 0)
         grid1.addWidget(self.milling_type_label, 3, 0)
-        self.milling_type_radio = RadioSet([{'label': 'Climb', 'value': 'cl'},
-                                            {'label': 'Conv.', 'value': 'cv'}])
+        self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'},
+                                            {'label': _('Conv.'), 'value': 'cv'}])
         grid1.addWidget(self.milling_type_radio, 3, 1)
         grid1.addWidget(self.milling_type_radio, 3, 1)
 
 
         # combine all passes CB
         # combine all passes CB
@@ -1361,9 +1361,9 @@ class CNCObjectUI(ObjectUI):
         )
         )
 
 
         self.cncplot_method_combo = RadioSet([
         self.cncplot_method_combo = RadioSet([
-            {"label": "All", "value": "all"},
-            {"label": "Travel", "value": "travel"},
-            {"label": "Cut", "value": "cut"}
+            {"label": _("All"), "value": "all"},
+            {"label": _("Travel"), "value": "travel"},
+            {"label": _("Cut"), "value": "cut"}
         ], stretch=False)
         ], stretch=False)
 
 
         self.annotation_label = QtWidgets.QLabel(_("<b>Display Annotation:</b>"))
         self.annotation_label = QtWidgets.QLabel(_("<b>Display Annotation:</b>"))

+ 39 - 42
flatcamTools/ToolCalculators.py

@@ -42,9 +42,9 @@ class ToolCalculator(FlatCAMTool):
                         """)
                         """)
         self.layout.addWidget(title_label)
         self.layout.addWidget(title_label)
 
 
-        #################### ##
-        # ## Units Calculator # ##
-        #################### ##
+        # #####################
+        # ## Units Calculator #
+        # #####################
 
 
         self.unists_spacer_label = QtWidgets.QLabel(" ")
         self.unists_spacer_label = QtWidgets.QLabel(" ")
         self.layout.addWidget(self.unists_spacer_label)
         self.layout.addWidget(self.unists_spacer_label)
@@ -53,14 +53,14 @@ class ToolCalculator(FlatCAMTool):
         units_label = QtWidgets.QLabel("<font size=3><b>%s</b></font>" % self.unitsName)
         units_label = QtWidgets.QLabel("<font size=3><b>%s</b></font>" % self.unitsName)
         self.layout.addWidget(units_label)
         self.layout.addWidget(units_label)
 
 
-        #Grid Layout
+        # Grid Layout
         grid_units_layout = QtWidgets.QGridLayout()
         grid_units_layout = QtWidgets.QGridLayout()
         self.layout.addLayout(grid_units_layout)
         self.layout.addLayout(grid_units_layout)
 
 
-        inch_label = QtWidgets.QLabel("INCH")
-        mm_label = QtWidgets.QLabel("MM")
+        inch_label = QtWidgets.QLabel(_("INCH"))
+        mm_label = QtWidgets.QLabel(_("MM"))
         grid_units_layout.addWidget(mm_label, 0, 0)
         grid_units_layout.addWidget(mm_label, 0, 0)
-        grid_units_layout.addWidget( inch_label, 0, 1)
+        grid_units_layout.addWidget(inch_label, 0, 1)
 
 
         self.inch_entry = FCEntry()
         self.inch_entry = FCEntry()
         # self.inch_entry.setFixedWidth(70)
         # self.inch_entry.setFixedWidth(70)
@@ -75,11 +75,9 @@ class ToolCalculator(FlatCAMTool):
         grid_units_layout.addWidget(self.mm_entry, 1, 0)
         grid_units_layout.addWidget(self.mm_entry, 1, 0)
         grid_units_layout.addWidget(self.inch_entry, 1, 1)
         grid_units_layout.addWidget(self.inch_entry, 1, 1)
 
 
-
-        ########################## ##
-        # ## V-shape Tool Calculator # ##
-        ########################## ##
-
+        # ##############################
+        # ## V-shape Tool Calculator ###
+        # ##############################
         self.v_shape_spacer_label = QtWidgets.QLabel(" ")
         self.v_shape_spacer_label = QtWidgets.QLabel(" ")
         self.layout.addWidget(self.v_shape_spacer_label)
         self.layout.addWidget(self.v_shape_spacer_label)
 
 
@@ -96,32 +94,31 @@ class ToolCalculator(FlatCAMTool):
         # self.tipDia_entry.setFixedWidth(70)
         # self.tipDia_entry.setFixedWidth(70)
         self.tipDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.tipDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.tipDia_label.setToolTip(_('This is the diameter of the tool tip.\n'
         self.tipDia_label.setToolTip(_('This is the diameter of the tool tip.\n'
-                                     'The manufacturer specifies it.'))
+                                       'The manufacturer specifies it.'))
 
 
         self.tipAngle_label = QtWidgets.QLabel(_("Tip Angle:"))
         self.tipAngle_label = QtWidgets.QLabel(_("Tip Angle:"))
         self.tipAngle_entry = FCEntry()
         self.tipAngle_entry = FCEntry()
         # self.tipAngle_entry.setFixedWidth(70)
         # self.tipAngle_entry.setFixedWidth(70)
         self.tipAngle_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.tipAngle_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.tipAngle_label.setToolTip(_("This is the angle of the tip of the tool.\n"
         self.tipAngle_label.setToolTip(_("This is the angle of the tip of the tool.\n"
-                                       "It is specified by manufacturer."))
+                                         "It is specified by manufacturer."))
 
 
         self.cutDepth_label = QtWidgets.QLabel(_("Cut Z:"))
         self.cutDepth_label = QtWidgets.QLabel(_("Cut Z:"))
         self.cutDepth_entry = FCEntry()
         self.cutDepth_entry = FCEntry()
         # self.cutDepth_entry.setFixedWidth(70)
         # self.cutDepth_entry.setFixedWidth(70)
         self.cutDepth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.cutDepth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.cutDepth_label.setToolTip(_("This is the depth to cut into the material.\n"
         self.cutDepth_label.setToolTip(_("This is the depth to cut into the material.\n"
-                                       "In the CNCJob is the CutZ parameter."))
+                                         "In the CNCJob is the CutZ parameter."))
 
 
         self.effectiveToolDia_label = QtWidgets.QLabel(_("Tool Diameter:"))
         self.effectiveToolDia_label = QtWidgets.QLabel(_("Tool Diameter:"))
         self.effectiveToolDia_entry = FCEntry()
         self.effectiveToolDia_entry = FCEntry()
         # self.effectiveToolDia_entry.setFixedWidth(70)
         # self.effectiveToolDia_entry.setFixedWidth(70)
         self.effectiveToolDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.effectiveToolDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.effectiveToolDia_label.setToolTip(_("This is the tool diameter to be entered into\n"
         self.effectiveToolDia_label.setToolTip(_("This is the tool diameter to be entered into\n"
-                                               "FlatCAM Gerber section.\n"
-                                               "In the CNCJob section it is called >Tool dia<."))
+                                                 "FlatCAM Gerber section.\n"
+                                                 "In the CNCJob section it is called >Tool dia<."))
         # self.effectiveToolDia_entry.setEnabled(False)
         # self.effectiveToolDia_entry.setEnabled(False)
 
 
-
         form_layout.addRow(self.tipDia_label, self.tipDia_entry)
         form_layout.addRow(self.tipDia_label, self.tipDia_entry)
         form_layout.addRow(self.tipAngle_label, self.tipAngle_entry)
         form_layout.addRow(self.tipAngle_label, self.tipAngle_entry)
         form_layout.addRow(self.cutDepth_label, self.cutDepth_entry)
         form_layout.addRow(self.cutDepth_label, self.cutDepth_entry)
@@ -132,16 +129,15 @@ class ToolCalculator(FlatCAMTool):
         # self.calculate_button.setFixedWidth(70)
         # self.calculate_button.setFixedWidth(70)
         self.calculate_vshape_button.setToolTip(
         self.calculate_vshape_button.setToolTip(
             _("Calculate either the Cut Z or the effective tool diameter,\n  "
             _("Calculate either the Cut Z or the effective tool diameter,\n  "
-            "depending on which is desired and which is known. ")
+              "depending on which is desired and which is known. ")
         )
         )
         self.empty_label = QtWidgets.QLabel(" ")
         self.empty_label = QtWidgets.QLabel(" ")
 
 
         form_layout.addRow(self.empty_label, self.calculate_vshape_button)
         form_layout.addRow(self.empty_label, self.calculate_vshape_button)
 
 
-
-        ################################## ##
-        # ## ElectroPlating Tool Calculator # ##
-        ################################## ##
+        # ####################################
+        # ## ElectroPlating Tool Calculator ##
+        # ####################################
 
 
         self.plate_spacer_label = QtWidgets.QLabel(" ")
         self.plate_spacer_label = QtWidgets.QLabel(" ")
         self.layout.addWidget(self.plate_spacer_label)
         self.layout.addWidget(self.plate_spacer_label)
@@ -150,7 +146,7 @@ class ToolCalculator(FlatCAMTool):
         plate_title_label = QtWidgets.QLabel("<font size=3><b>%s</b></font>" % self.eplateName)
         plate_title_label = QtWidgets.QLabel("<font size=3><b>%s</b></font>" % self.eplateName)
         plate_title_label.setToolTip(
         plate_title_label.setToolTip(
             _("This calculator is useful for those who plate the via/pad/drill holes,\n"
             _("This calculator is useful for those who plate the via/pad/drill holes,\n"
-            "using a method like grahite ink or calcium hypophosphite ink or palladium chloride.")
+              "using a method like grahite ink or calcium hypophosphite ink or palladium chloride.")
         )
         )
         self.layout.addWidget(plate_title_label)
         self.layout.addWidget(plate_title_label)
 
 
@@ -175,15 +171,14 @@ class ToolCalculator(FlatCAMTool):
         # self.cdensity_entry.setFixedWidth(70)
         # self.cdensity_entry.setFixedWidth(70)
         self.cdensity_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.cdensity_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.cdensity_label.setToolTip(_("Current density to pass through the board. \n"
         self.cdensity_label.setToolTip(_("Current density to pass through the board. \n"
-                                       "In Amps per Square Feet ASF."))
-
+                                         "In Amps per Square Feet ASF."))
 
 
         self.growth_label = QtWidgets.QLabel(_("Copper Growth:"))
         self.growth_label = QtWidgets.QLabel(_("Copper Growth:"))
         self.growth_entry = FCEntry()
         self.growth_entry = FCEntry()
         # self.growth_entry.setFixedWidth(70)
         # self.growth_entry.setFixedWidth(70)
         self.growth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.growth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.growth_label.setToolTip(_("How thick the copper growth is intended to be.\n"
         self.growth_label.setToolTip(_("How thick the copper growth is intended to be.\n"
-                                     "In microns."))
+                                       "In microns."))
 
 
         # self.growth_entry.setEnabled(False)
         # self.growth_entry.setEnabled(False)
 
 
@@ -192,7 +187,7 @@ class ToolCalculator(FlatCAMTool):
         # self.cvaluelabel.setFixedWidth(70)
         # self.cvaluelabel.setFixedWidth(70)
         self.cvalue_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.cvalue_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.cvaluelabel.setToolTip(_('This is the current intensity value\n'
         self.cvaluelabel.setToolTip(_('This is the current intensity value\n'
-                                     'to be set on the Power Supply. In Amps.'))
+                                      'to be set on the Power Supply. In Amps.'))
         self.cvalue_entry.setDisabled(True)
         self.cvalue_entry.setDisabled(True)
 
 
         self.timelabel = QtWidgets.QLabel(_("Time:"))
         self.timelabel = QtWidgets.QLabel(_("Time:"))
@@ -200,7 +195,7 @@ class ToolCalculator(FlatCAMTool):
         # self.timelabel.setFixedWidth(70)
         # self.timelabel.setFixedWidth(70)
         self.time_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.time_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.timelabel.setToolTip(_('This is the calculated time required for the procedure.\n'
         self.timelabel.setToolTip(_('This is the calculated time required for the procedure.\n'
-                                  'In minutes.'))
+                                    'In minutes.'))
         self.time_entry.setDisabled(True)
         self.time_entry.setDisabled(True)
 
 
         plate_form_layout.addRow(self.pcblengthlabel, self.pcblength_entry)
         plate_form_layout.addRow(self.pcblengthlabel, self.pcblength_entry)
@@ -214,8 +209,8 @@ class ToolCalculator(FlatCAMTool):
         self.calculate_plate_button = QtWidgets.QPushButton(_("Calculate"))
         self.calculate_plate_button = QtWidgets.QPushButton(_("Calculate"))
         # self.calculate_button.setFixedWidth(70)
         # self.calculate_button.setFixedWidth(70)
         self.calculate_plate_button.setToolTip(
         self.calculate_plate_button.setToolTip(
-            _("Calculate the current intensity value and the procedure time,\n  "
-            "depending on the parameters above")
+            _("Calculate the current intensity value and the procedure time,\n"
+              "depending on the parameters above")
         )
         )
         self.empty_label_2 = QtWidgets.QLabel(" ")
         self.empty_label_2 = QtWidgets.QLabel(" ")
 
 
@@ -223,6 +218,8 @@ class ToolCalculator(FlatCAMTool):
 
 
         self.layout.addStretch()
         self.layout.addStretch()
 
 
+        self.units = ''
+
         # ## Signals
         # ## Signals
         self.cutDepth_entry.textChanged.connect(self.on_calculate_tool_dia)
         self.cutDepth_entry.textChanged.connect(self.on_calculate_tool_dia)
         self.cutDepth_entry.editingFinished.connect(self.on_calculate_tool_dia)
         self.cutDepth_entry.editingFinished.connect(self.on_calculate_tool_dia)
@@ -256,7 +253,7 @@ class ToolCalculator(FlatCAMTool):
 
 
         self.set_tool_ui()
         self.set_tool_ui()
 
 
-        self.app.ui.notebook.setTabText(2, "Calc. Tool")
+        self.app.ui.notebook.setTabText(2, _("Calc. Tool"))
 
 
     def install(self, icon=None, separator=None, **kwargs):
     def install(self, icon=None, separator=None, **kwargs):
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs)
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs)
@@ -305,7 +302,7 @@ class ToolCalculator(FlatCAMTool):
                 tip_diameter = float(self.tipDia_entry.get_value().replace(',', '.'))
                 tip_diameter = float(self.tipDia_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         try:
         try:
@@ -316,7 +313,7 @@ class ToolCalculator(FlatCAMTool):
                 half_tip_angle = float(self.tipAngle_entry.get_value().replace(',', '.'))
                 half_tip_angle = float(self.tipAngle_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
         half_tip_angle /= 2
         half_tip_angle /= 2
 
 
@@ -328,7 +325,7 @@ class ToolCalculator(FlatCAMTool):
                 cut_depth = float(self.cutDepth_entry.get_value().replace(',', '.'))
                 cut_depth = float(self.cutDepth_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         tool_diameter = tip_diameter + (2 * cut_depth * math.tan(math.radians(half_tip_angle)))
         tool_diameter = tip_diameter + (2 * cut_depth * math.tan(math.radians(half_tip_angle)))
@@ -343,7 +340,7 @@ class ToolCalculator(FlatCAMTool):
                 mm_val = float(self.mm_entry.get_value().replace(',', '.'))
                 mm_val = float(self.mm_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
         self.inch_entry.set_value('%.6f' % (mm_val / 25.4))
         self.inch_entry.set_value('%.6f' % (mm_val / 25.4))
 
 
@@ -356,7 +353,7 @@ class ToolCalculator(FlatCAMTool):
                 inch_val = float(self.inch_entry.get_value().replace(',', '.'))
                 inch_val = float(self.inch_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
         self.mm_entry.set_value('%.6f' % (inch_val * 25.4))
         self.mm_entry.set_value('%.6f' % (inch_val * 25.4))
 
 
@@ -370,7 +367,7 @@ class ToolCalculator(FlatCAMTool):
                 length = float(self.pcblength_entry.get_value().replace(',', '.'))
                 length = float(self.pcblength_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         try:
         try:
@@ -381,7 +378,7 @@ class ToolCalculator(FlatCAMTool):
                 width = float(self.pcbwidth_entry.get_value().replace(',', '.'))
                 width = float(self.pcbwidth_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         try:
         try:
@@ -392,7 +389,7 @@ class ToolCalculator(FlatCAMTool):
                 density = float(self.cdensity_entry.get_value().replace(',', '.'))
                 density = float(self.cdensity_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         try:
         try:
@@ -403,7 +400,7 @@ class ToolCalculator(FlatCAMTool):
                 copper = float(self.growth_entry.get_value().replace(',', '.'))
                 copper = float(self.growth_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         calculated_current = (length * width * density) * 0.0021527820833419
         calculated_current = (length * width * density) * 0.0021527820833419
@@ -412,4 +409,4 @@ class ToolCalculator(FlatCAMTool):
         self.cvalue_entry.set_value('%.2f' % calculated_current)
         self.cvalue_entry.set_value('%.2f' % calculated_current)
         self.time_entry.set_value('%.1f' % calculated_time)
         self.time_entry.set_value('%.1f' % calculated_time)
 
 
-# end of file
+# end of file

+ 138 - 127
flatcamTools/ToolCutOut.py

@@ -2,6 +2,7 @@ from FlatCAMTool import FlatCAMTool
 from ObjectCollection import *
 from ObjectCollection import *
 from FlatCAMApp import *
 from FlatCAMApp import *
 from shapely.geometry import box
 from shapely.geometry import box
+from shapely.ops import cascaded_union, unary_union
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
@@ -353,7 +354,7 @@ class CutOut(FlatCAMTool):
                 dia = float(self.dia.get_value().replace(',', '.'))
                 dia = float(self.dia.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         if 0 in {dia}:
         if 0 in {dia}:
@@ -368,7 +369,7 @@ class CutOut(FlatCAMTool):
                 margin = float(self.margin.get_value().replace(',', '.'))
                 margin = float(self.margin.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         try:
         try:
@@ -379,7 +380,7 @@ class CutOut(FlatCAMTool):
                 gapsize = float(self.gapsize.get_value().replace(',', '.'))
                 gapsize = float(self.gapsize.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         try:
         try:
@@ -390,7 +391,7 @@ class CutOut(FlatCAMTool):
 
 
         if gaps not in ['LR', 'TB', '2LR', '2TB', '4', '8']:
         if gaps not in ['LR', 'TB', '2LR', '2TB', '4', '8']:
             self.app.inform.emit(_("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. "
             self.app.inform.emit(_("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. "
-                                 "Fill in a correct value and retry. "))
+                                   "Fill in a correct value and retry. "))
             return
             return
 
 
         if cutout_obj.multigeo is True:
         if cutout_obj.multigeo is True:
@@ -414,66 +415,71 @@ class CutOut(FlatCAMTool):
             else:
             else:
                 object_geo = cutout_obj.solid_geometry
                 object_geo = cutout_obj.solid_geometry
 
 
-            try:
-                __ = iter(object_geo)
-            except TypeError:
-                object_geo = [object_geo]
+            # try:
+            #     __ = iter(object_geo)
+            # except TypeError:
+            #     object_geo = [object_geo]
 
 
-            for geo in object_geo:
-                if isinstance(cutout_obj, FlatCAMGerber):
-                    geo = (geo.buffer(margin + abs(dia / 2))).exterior
-
-                # Get min and max data for each object as we just cut rectangles across X or Y
-                xmin, ymin, xmax, ymax = recursive_bounds(geo)
-
-                px = 0.5 * (xmin + xmax) + margin
-                py = 0.5 * (ymin + ymax) + margin
-                lenx = (xmax - xmin) + (margin * 2)
-                leny = (ymax - ymin) + (margin * 2)
-
-                if gaps == '8' or gaps == '2LR':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      xmin - gapsize,  # botleft_x
-                                                      py - gapsize + leny / 4,  # botleft_y
-                                                      xmax + gapsize,  # topright_x
-                                                      py + gapsize + leny / 4)  # topright_y
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      xmin - gapsize,
-                                                      py - gapsize - leny / 4,
-                                                      xmax + gapsize,
-                                                      py + gapsize - leny / 4)
-
-                if gaps == '8' or gaps == '2TB':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      px - gapsize + lenx / 4,
-                                                      ymin - gapsize,
-                                                      px + gapsize + lenx / 4,
-                                                      ymax + gapsize)
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      px - gapsize - lenx / 4,
-                                                      ymin - gapsize,
-                                                      px + gapsize - lenx / 4,
-                                                      ymax + gapsize)
-
-                if gaps == '4' or gaps == 'LR':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      xmin - gapsize,
-                                                      py - gapsize,
-                                                      xmax + gapsize,
-                                                      py + gapsize)
-
-                if gaps == '4' or gaps == 'TB':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      px - gapsize,
-                                                      ymin - gapsize,
-                                                      px + gapsize,
-                                                      ymax + gapsize)
+            object_geo = unary_union(object_geo)
 
 
-                try:
-                    for g in geo:
-                        solid_geo.append(g)
-                except TypeError:
-                    solid_geo.append(geo)
+            # for geo in object_geo:
+            if isinstance(cutout_obj, FlatCAMGerber):
+                geo = object_geo.buffer(margin + abs(dia / 2))
+                geo = geo.exterior
+            else:
+                geo = object_geo
+
+            # Get min and max data for each object as we just cut rectangles across X or Y
+            xmin, ymin, xmax, ymax = recursive_bounds(geo)
+
+            px = 0.5 * (xmin + xmax) + margin
+            py = 0.5 * (ymin + ymax) + margin
+            lenx = (xmax - xmin) + (margin * 2)
+            leny = (ymax - ymin) + (margin * 2)
+
+            if gaps == '8' or gaps == '2LR':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  xmin - gapsize,           # botleft_x
+                                                  py - gapsize + leny / 4,  # botleft_y
+                                                  xmax + gapsize,           # topright_x
+                                                  py + gapsize + leny / 4)  # topright_y
+                geo = self.subtract_poly_from_geo(geo,
+                                                  xmin - gapsize,
+                                                  py - gapsize - leny / 4,
+                                                  xmax + gapsize,
+                                                  py + gapsize - leny / 4)
+
+            if gaps == '8' or gaps == '2TB':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  px - gapsize + lenx / 4,
+                                                  ymin - gapsize,
+                                                  px + gapsize + lenx / 4,
+                                                  ymax + gapsize)
+                geo = self.subtract_poly_from_geo(geo,
+                                                  px - gapsize - lenx / 4,
+                                                  ymin - gapsize,
+                                                  px + gapsize - lenx / 4,
+                                                  ymax + gapsize)
+
+            if gaps == '4' or gaps == 'LR':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  xmin - gapsize,
+                                                  py - gapsize,
+                                                  xmax + gapsize,
+                                                  py + gapsize)
+
+            if gaps == '4' or gaps == 'TB':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  px - gapsize,
+                                                  ymin - gapsize,
+                                                  px + gapsize,
+                                                  ymax + gapsize)
+
+            try:
+                for g in geo:
+                    solid_geo.append(g)
+            except TypeError:
+                solid_geo.append(geo)
 
 
             geo_obj.solid_geometry = deepcopy(solid_geo)
             geo_obj.solid_geometry = deepcopy(solid_geo)
             xmin, ymin, xmax, ymax = recursive_bounds(geo_obj.solid_geometry)
             xmin, ymin, xmax, ymax = recursive_bounds(geo_obj.solid_geometry)
@@ -481,6 +487,7 @@ class CutOut(FlatCAMTool):
             geo_obj.options['ymin'] = ymin
             geo_obj.options['ymin'] = ymin
             geo_obj.options['xmax'] = xmax
             geo_obj.options['xmax'] = xmax
             geo_obj.options['ymax'] = ymax
             geo_obj.options['ymax'] = ymax
+            geo_obj.options['cnctooldia'] = str(dia)
 
 
         outname = cutout_obj.options["name"] + "_cutout"
         outname = cutout_obj.options["name"] + "_cutout"
         self.app.new_object('geometry', outname, geo_init)
         self.app.new_object('geometry', outname, geo_init)
@@ -516,7 +523,7 @@ class CutOut(FlatCAMTool):
                 dia = float(self.dia.get_value().replace(',', '.'))
                 dia = float(self.dia.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         if 0 in {dia}:
         if 0 in {dia}:
@@ -531,7 +538,7 @@ class CutOut(FlatCAMTool):
                 margin = float(self.margin.get_value().replace(',', '.'))
                 margin = float(self.margin.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         try:
         try:
@@ -542,7 +549,7 @@ class CutOut(FlatCAMTool):
                 gapsize = float(self.gapsize.get_value().replace(',', '.'))
                 gapsize = float(self.gapsize.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         try:
         try:
@@ -553,13 +560,13 @@ class CutOut(FlatCAMTool):
 
 
         if gaps not in ['LR', 'TB', '2LR', '2TB', '4', '8']:
         if gaps not in ['LR', 'TB', '2LR', '2TB', '4', '8']:
             self.app.inform.emit(_("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. "
             self.app.inform.emit(_("[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 or 8. "
-                                 "Fill in a correct value and retry. "))
+                                   "Fill in a correct value and retry. "))
             return
             return
 
 
         if cutout_obj.multigeo is True:
         if cutout_obj.multigeo is True:
             self.app.inform.emit(_("[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n"
             self.app.inform.emit(_("[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n"
-                                 "Optionally, this Multi-geo Geometry can be converted to Single-geo Geometry,\n"
-                                 "and after that perform Cutout."))
+                                   "Optionally, this Multi-geo Geometry can be converted to Single-geo Geometry,\n"
+                                   "and after that perform Cutout."))
             return
             return
 
 
         # Get min and max data for each object as we just cut rectangles across X or Y
         # Get min and max data for each object as we just cut rectangles across X or Y
@@ -575,65 +582,66 @@ class CutOut(FlatCAMTool):
             except TypeError:
             except TypeError:
                 object_geo = [object_geo]
                 object_geo = [object_geo]
 
 
-            for poly in object_geo:
-
-                xmin, ymin, xmax, ymax = poly.bounds
-                geo = box(xmin, ymin, xmax, ymax)
-
-                # if Gerber create a buffer at a distance
-                # if Geometry then cut through the geometry
-                if isinstance(cutout_obj, FlatCAMGerber):
-                    geo = geo.buffer(margin + abs(dia / 2))
-
-                px = 0.5 * (xmin + xmax) + margin
-                py = 0.5 * (ymin + ymax) + margin
-                lenx = (xmax - xmin) + (margin * 2)
-                leny = (ymax - ymin) + (margin * 2)
-
-                if gaps == '8' or gaps == '2LR':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      xmin - gapsize,  # botleft_x
-                                                      py - gapsize + leny / 4,  # botleft_y
-                                                      xmax + gapsize,  # topright_x
-                                                      py + gapsize + leny / 4)  # topright_y
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      xmin - gapsize,
-                                                      py - gapsize - leny / 4,
-                                                      xmax + gapsize,
-                                                      py + gapsize - leny / 4)
-
-                if gaps == '8' or gaps == '2TB':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      px - gapsize + lenx / 4,
-                                                      ymin - gapsize,
-                                                      px + gapsize + lenx / 4,
-                                                      ymax + gapsize)
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      px - gapsize - lenx / 4,
-                                                      ymin - gapsize,
-                                                      px + gapsize - lenx / 4,
-                                                      ymax + gapsize)
-
-                if gaps == '4' or gaps == 'LR':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      xmin - gapsize,
-                                                      py - gapsize,
-                                                      xmax + gapsize,
-                                                      py + gapsize)
-
-                if gaps == '4' or gaps == 'TB':
-                    geo = self.subtract_poly_from_geo(geo,
-                                                      px - gapsize,
-                                                      ymin - gapsize,
-                                                      px + gapsize,
-                                                      ymax + gapsize)
-                try:
-                    for g in geo:
-                        solid_geo.append(g)
-                except TypeError:
-                    solid_geo.append(geo)
+            object_geo = unary_union(object_geo)
+
+            xmin, ymin, xmax, ymax = object_geo.bounds
+            geo = box(xmin, ymin, xmax, ymax)
+
+            # if Gerber create a buffer at a distance
+            # if Geometry then cut through the geometry
+            if isinstance(cutout_obj, FlatCAMGerber):
+                geo = geo.buffer(margin + abs(dia / 2))
+
+            px = 0.5 * (xmin + xmax) + margin
+            py = 0.5 * (ymin + ymax) + margin
+            lenx = (xmax - xmin) + (margin * 2)
+            leny = (ymax - ymin) + (margin * 2)
+
+            if gaps == '8' or gaps == '2LR':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  xmin - gapsize,  # botleft_x
+                                                  py - gapsize + leny / 4,  # botleft_y
+                                                  xmax + gapsize,  # topright_x
+                                                  py + gapsize + leny / 4)  # topright_y
+                geo = self.subtract_poly_from_geo(geo,
+                                                  xmin - gapsize,
+                                                  py - gapsize - leny / 4,
+                                                  xmax + gapsize,
+                                                  py + gapsize - leny / 4)
+
+            if gaps == '8' or gaps == '2TB':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  px - gapsize + lenx / 4,
+                                                  ymin - gapsize,
+                                                  px + gapsize + lenx / 4,
+                                                  ymax + gapsize)
+                geo = self.subtract_poly_from_geo(geo,
+                                                  px - gapsize - lenx / 4,
+                                                  ymin - gapsize,
+                                                  px + gapsize - lenx / 4,
+                                                  ymax + gapsize)
+
+            if gaps == '4' or gaps == 'LR':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  xmin - gapsize,
+                                                  py - gapsize,
+                                                  xmax + gapsize,
+                                                  py + gapsize)
+
+            if gaps == '4' or gaps == 'TB':
+                geo = self.subtract_poly_from_geo(geo,
+                                                  px - gapsize,
+                                                  ymin - gapsize,
+                                                  px + gapsize,
+                                                  ymax + gapsize)
+            try:
+                for g in geo:
+                    solid_geo.append(g)
+            except TypeError:
+                solid_geo.append(geo)
 
 
             geo_obj.solid_geometry = deepcopy(solid_geo)
             geo_obj.solid_geometry = deepcopy(solid_geo)
+            geo_obj.options['cnctooldia'] = str(dia)
 
 
         outname = cutout_obj.options["name"] + "_cutout"
         outname = cutout_obj.options["name"] + "_cutout"
         self.app.new_object('geometry', outname, geo_init)
         self.app.new_object('geometry', outname, geo_init)
@@ -781,11 +789,13 @@ class CutOut(FlatCAMTool):
         convex_box = self.convex_box.get_value()
         convex_box = self.convex_box.get_value()
 
 
         def geo_init(geo_obj, app_obj):
         def geo_init(geo_obj, app_obj):
+            geo_union = unary_union(cutout_obj.solid_geometry)
+
             if convex_box:
             if convex_box:
-                geo = cutout_obj.solid_geometry.convex_hull
+                geo = geo_union.convex_hull
                 geo_obj.solid_geometry = geo.buffer(margin + abs(dia / 2))
                 geo_obj.solid_geometry = geo.buffer(margin + abs(dia / 2))
             else:
             else:
-                geo = cutout_obj.solid_geometry
+                geo = geo_union
                 geo = geo.buffer(margin + abs(dia / 2))
                 geo = geo.buffer(margin + abs(dia / 2))
                 if isinstance(geo, Polygon):
                 if isinstance(geo, Polygon):
                     geo_obj.solid_geometry = geo.exterior
                     geo_obj.solid_geometry = geo.exterior
@@ -794,6 +804,7 @@ class CutOut(FlatCAMTool):
                     for poly in geo:
                     for poly in geo:
                         solid_geo.append(poly.exterior)
                         solid_geo.append(poly.exterior)
                     geo_obj.solid_geometry = deepcopy(solid_geo)
                     geo_obj.solid_geometry = deepcopy(solid_geo)
+            geo_obj.options['cnctooldia'] = str(dia)
 
 
         outname = cutout_obj.options["name"] + "_cutout"
         outname = cutout_obj.options["name"] + "_cutout"
         self.app.new_object('geometry', outname, geo_init)
         self.app.new_object('geometry', outname, geo_init)

+ 41 - 45
flatcamTools/ToolDblSided.py

@@ -6,9 +6,9 @@ from PyQt5 import QtCore
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -44,7 +44,7 @@ class DblSidedTool(FlatCAMTool):
         self.gerber_object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
         self.gerber_object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
         self.gerber_object_combo.setCurrentIndex(1)
         self.gerber_object_combo.setCurrentIndex(1)
 
 
-        self.botlay_label = QtWidgets.QLabel("<b>GERBER:</b>")
+        self.botlay_label = QtWidgets.QLabel(_("<b>GERBER:</b>"))
         self.botlay_label.setToolTip(
         self.botlay_label.setToolTip(
             "Gerber  to be mirrored."
             "Gerber  to be mirrored."
         )
         )
@@ -52,8 +52,8 @@ class DblSidedTool(FlatCAMTool):
         self.mirror_gerber_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_gerber_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_gerber_button.setToolTip(
         self.mirror_gerber_button.setToolTip(
             _("Mirrors (flips) the specified object around \n"
             _("Mirrors (flips) the specified object around \n"
-            "the specified axis. Does not create a new \n"
-            "object, but modifies it.")
+              "the specified axis. Does not create a new \n"
+              "object, but modifies it.")
         )
         )
         self.mirror_gerber_button.setFixedWidth(60)
         self.mirror_gerber_button.setFixedWidth(60)
 
 
@@ -68,7 +68,7 @@ class DblSidedTool(FlatCAMTool):
         self.exc_object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex()))
         self.exc_object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex()))
         self.exc_object_combo.setCurrentIndex(1)
         self.exc_object_combo.setCurrentIndex(1)
 
 
-        self.excobj_label = QtWidgets.QLabel("<b>EXCELLON:</b>")
+        self.excobj_label = QtWidgets.QLabel(_("<b>EXCELLON:</b>"))
         self.excobj_label.setToolTip(
         self.excobj_label.setToolTip(
             _("Excellon Object to be mirrored.")
             _("Excellon Object to be mirrored.")
         )
         )
@@ -76,8 +76,8 @@ class DblSidedTool(FlatCAMTool):
         self.mirror_exc_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_exc_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_exc_button.setToolTip(
         self.mirror_exc_button.setToolTip(
             _("Mirrors (flips) the specified object around \n"
             _("Mirrors (flips) the specified object around \n"
-            "the specified axis. Does not create a new \n"
-            "object, but modifies it.")
+              "the specified axis. Does not create a new \n"
+              "object, but modifies it.")
         )
         )
         self.mirror_exc_button.setFixedWidth(60)
         self.mirror_exc_button.setFixedWidth(60)
 
 
@@ -92,7 +92,7 @@ class DblSidedTool(FlatCAMTool):
         self.geo_object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
         self.geo_object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
         self.geo_object_combo.setCurrentIndex(1)
         self.geo_object_combo.setCurrentIndex(1)
 
 
-        self.geoobj_label = QtWidgets.QLabel("<b>GEOMETRY</b>:")
+        self.geoobj_label = QtWidgets.QLabel(_("<b>GEOMETRY</b>:"))
         self.geoobj_label.setToolTip(
         self.geoobj_label.setToolTip(
             _("Geometry Obj to be mirrored.")
             _("Geometry Obj to be mirrored.")
         )
         )
@@ -100,8 +100,8 @@ class DblSidedTool(FlatCAMTool):
         self.mirror_geo_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_geo_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_geo_button.setToolTip(
         self.mirror_geo_button.setToolTip(
             _("Mirrors (flips) the specified object around \n"
             _("Mirrors (flips) the specified object around \n"
-            "the specified axis. Does not create a new \n"
-            "object, but modifies it.")
+              "the specified axis. Does not create a new \n"
+              "object, but modifies it.")
         )
         )
         self.mirror_geo_button.setFixedWidth(60)
         self.mirror_geo_button.setFixedWidth(60)
 
 
@@ -128,13 +128,13 @@ class DblSidedTool(FlatCAMTool):
         grid_lay1.addWidget(self.mirror_axis, 7, 1)
         grid_lay1.addWidget(self.mirror_axis, 7, 1)
 
 
         # ## Axis Location
         # ## Axis Location
-        self.axis_location = RadioSet([{'label': 'Point', 'value': 'point'},
-                                       {'label': 'Box', 'value': 'box'}])
+        self.axis_location = RadioSet([{'label': _('Point'), 'value': 'point'},
+                                       {'label': _('Box'), 'value': 'box'}])
         self.axloc_label = QtWidgets.QLabel(_("Axis Ref:"))
         self.axloc_label = QtWidgets.QLabel(_("Axis Ref:"))
         self.axloc_label.setToolTip(
         self.axloc_label.setToolTip(
             _("The axis should pass through a <b>point</b> or cut\n "
             _("The axis should pass through a <b>point</b> or cut\n "
-            "a specified <b>box</b> (in a FlatCAM object) through \n"
-            "the center.")
+              "a specified <b>box</b> (in a FlatCAM object) through \n"
+              "the center.")
         )
         )
         # grid_lay.addRow("Axis Location:", self.axis_location)
         # grid_lay.addRow("Axis Location:", self.axis_location)
         grid_lay1.addWidget(self.axloc_label, 8, 0)
         grid_lay1.addWidget(self.axloc_label, 8, 0)
@@ -152,17 +152,17 @@ class DblSidedTool(FlatCAMTool):
         self.pb_label = QtWidgets.QLabel("<b>%s</b>" % _('Point/Box Reference:'))
         self.pb_label = QtWidgets.QLabel("<b>%s</b>" % _('Point/Box Reference:'))
         self.pb_label.setToolTip(
         self.pb_label.setToolTip(
             _("If 'Point' is selected above it store the coordinates (x, y) through which\n"
             _("If 'Point' is selected above it store the coordinates (x, y) through which\n"
-            "the mirroring axis passes.\n"
-            "If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or Geo).\n"
-            "Through the center of this object pass the mirroring axis selected above.")
+              "the mirroring axis passes.\n"
+              "If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or Geo).\n"
+              "Through the center of this object pass the mirroring axis selected above.")
         )
         )
 
 
         self.add_point_button = QtWidgets.QPushButton(_("Add"))
         self.add_point_button = QtWidgets.QPushButton(_("Add"))
         self.add_point_button.setToolTip(
         self.add_point_button.setToolTip(
             _("Add the coordinates in format <b>(x, y)</b> through which the mirroring axis \n "
             _("Add the coordinates in format <b>(x, y)</b> through which the mirroring axis \n "
-            "selected in 'MIRROR AXIS' pass.\n"
-            "The (x, y) coordinates are captured by pressing SHIFT key\n"
-            "and left mouse button click on canvas or you can enter the coords manually.")
+              "selected in 'MIRROR AXIS' pass.\n"
+              "The (x, y) coordinates are captured by pressing SHIFT key\n"
+              "and left mouse button click on canvas or you can enter the coords manually.")
         )
         )
         self.add_point_button.setFixedWidth(60)
         self.add_point_button.setFixedWidth(60)
 
 
@@ -188,15 +188,14 @@ class DblSidedTool(FlatCAMTool):
         self.box_combo.hide()
         self.box_combo.hide()
         self.box_combo_type.hide()
         self.box_combo_type.hide()
 
 
-
         # ## Alignment holes
         # ## Alignment holes
         self.ah_label = QtWidgets.QLabel("<b>%s</b>" % _('Alignment Drill Coordinates:'))
         self.ah_label = QtWidgets.QLabel("<b>%s</b>" % _('Alignment Drill Coordinates:'))
         self.ah_label.setToolTip(
         self.ah_label.setToolTip(
-           _( "Alignment holes (x1, y1), (x2, y2), ... "
-            "on one side of the mirror axis. For each set of (x, y) coordinates\n"
-            "entered here, a pair of drills will be created:\n\n"
-            "- one drill at the coordinates from the field\n"
-            "- one drill in mirror position over the axis selected above in the 'Mirror Axis'.")
+           _("Alignment holes (x1, y1), (x2, y2), ... "
+             "on one side of the mirror axis. For each set of (x, y) coordinates\n"
+             "entered here, a pair of drills will be created:\n\n"
+             "- one drill at the coordinates from the field\n"
+             "- one drill in mirror position over the axis selected above in the 'Mirror Axis'.")
         )
         )
         self.layout.addWidget(self.ah_label)
         self.layout.addWidget(self.ah_label)
 
 
@@ -208,12 +207,12 @@ class DblSidedTool(FlatCAMTool):
         self.add_drill_point_button = QtWidgets.QPushButton(_("Add"))
         self.add_drill_point_button = QtWidgets.QPushButton(_("Add"))
         self.add_drill_point_button.setToolTip(
         self.add_drill_point_button.setToolTip(
             _("Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n"
             _("Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n"
-            "on one side of the mirror axis.\n\n"
-            "The coordinates set can be obtained:\n"
-            "- press SHIFT key and left mouse clicking on canvas. Then click Add.\n"
-            "- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the field.\n"
-            "- press SHIFT key and left mouse clicking on canvas. Then RMB click in the field and click Paste.\n"
-            "- by entering the coords manually in the format: (x1, y1), (x2, y2), ...")
+              "on one side of the mirror axis.\n\n"
+              "The coordinates set can be obtained:\n"
+              "- press SHIFT key and left mouse clicking on canvas. Then click Add.\n"
+              "- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the field.\n"
+              "- press SHIFT key and left mouse clicking on canvas. Then RMB click in the field and click Paste.\n"
+              "- by entering the coords manually in the format: (x1, y1), (x2, y2), ...")
         )
         )
         self.add_drill_point_button.setFixedWidth(60)
         self.add_drill_point_button.setFixedWidth(60)
 
 
@@ -224,7 +223,7 @@ class DblSidedTool(FlatCAMTool):
         self.dt_label = QtWidgets.QLabel("<b>%s</b>:" % _('Alignment Drill Diameter'))
         self.dt_label = QtWidgets.QLabel("<b>%s</b>:" % _('Alignment Drill Diameter'))
         self.dt_label.setToolTip(
         self.dt_label.setToolTip(
             _("Diameter of the drill for the "
             _("Diameter of the drill for the "
-            "alignment holes.")
+              "alignment holes.")
         )
         )
         self.layout.addWidget(self.dt_label)
         self.layout.addWidget(self.dt_label)
 
 
@@ -235,7 +234,7 @@ class DblSidedTool(FlatCAMTool):
         self.dd_label = QtWidgets.QLabel(_("Drill diam.:"))
         self.dd_label = QtWidgets.QLabel(_("Drill diam.:"))
         self.dd_label.setToolTip(
         self.dd_label.setToolTip(
             _("Diameter of the drill for the "
             _("Diameter of the drill for the "
-            "alignment holes.")
+              "alignment holes.")
         )
         )
         hlay.addWidget(self.dd_label)
         hlay.addWidget(self.dd_label)
         hlay.addWidget(self.drill_dia)
         hlay.addWidget(self.drill_dia)
@@ -247,8 +246,8 @@ class DblSidedTool(FlatCAMTool):
         self.create_alignment_hole_button = QtWidgets.QPushButton(_("Create Excellon Object"))
         self.create_alignment_hole_button = QtWidgets.QPushButton(_("Create Excellon Object"))
         self.create_alignment_hole_button.setToolTip(
         self.create_alignment_hole_button.setToolTip(
             _("Creates an Excellon Object containing the\n"
             _("Creates an Excellon Object containing the\n"
-            "specified alignment holes and their mirror\n"
-            "images.")
+              "specified alignment holes and their mirror\n"
+              "images.")
         )
         )
         hlay2.addWidget(self.create_alignment_hole_button)
         hlay2.addWidget(self.create_alignment_hole_button)
 
 
@@ -325,7 +324,7 @@ class DblSidedTool(FlatCAMTool):
                 px, py = self.point_entry.get_value()
                 px, py = self.point_entry.get_value()
             except TypeError:
             except TypeError:
                 self.app.inform.emit(_("[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates "
                 self.app.inform.emit(_("[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates "
-                                     "are missing. Add them and retry."))
+                                       "are missing. Add them and retry."))
                 return
                 return
         else:
         else:
             selection_index = self.box_combo.currentIndex()
             selection_index = self.box_combo.currentIndex()
@@ -361,7 +360,7 @@ class DblSidedTool(FlatCAMTool):
                 self.drill_dia.set_value(dia)
                 self.drill_dia.set_value(dia)
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
                 return
 
 
         if dia is '':
         if dia is '':
@@ -372,7 +371,8 @@ class DblSidedTool(FlatCAMTool):
         # holes = self.alignment_holes.get_value()
         # holes = self.alignment_holes.get_value()
         holes = eval('[{}]'.format(self.alignment_holes.text()))
         holes = eval('[{}]'.format(self.alignment_holes.text()))
         if not holes:
         if not holes:
-            self.app.inform.emit(_("[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them and retry."))
+            self.app.inform.emit(_("[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. "
+                                   "Add them and retry."))
             return
             return
 
 
         drills = []
         drills = []
@@ -418,7 +418,7 @@ class DblSidedTool(FlatCAMTool):
                 px, py = self.point_entry.get_value()
                 px, py = self.point_entry.get_value()
             except TypeError:
             except TypeError:
                 self.app.inform.emit(_("[WARNING_NOTCL] 'Point' coordinates missing. "
                 self.app.inform.emit(_("[WARNING_NOTCL] 'Point' coordinates missing. "
-                                     "Using Origin (0, 0) as mirroring reference."))
+                                       "Using Origin (0, 0) as mirroring reference."))
                 px, py = (0, 0)
                 px, py = (0, 0)
 
 
         else:
         else:
@@ -462,7 +462,7 @@ class DblSidedTool(FlatCAMTool):
             except Exception as e:
             except Exception as e:
                 log.debug("DblSidedTool.on_mirror_geo() --> %s" % str(e))
                 log.debug("DblSidedTool.on_mirror_geo() --> %s" % str(e))
                 self.app.inform.emit(_("[WARNING_NOTCL] There are no Point coordinates in the Point field. "
                 self.app.inform.emit(_("[WARNING_NOTCL] There are no Point coordinates in the Point field. "
-                                     "Add coords and try again ..."))
+                                       "Add coords and try again ..."))
                 return
                 return
         else:
         else:
             selection_index_box = self.box_combo.currentIndex()
             selection_index_box = self.box_combo.currentIndex()
@@ -553,8 +553,4 @@ class DblSidedTool(FlatCAMTool):
         self.box_combo.setCurrentIndex(0)
         self.box_combo.setCurrentIndex(0)
         self.box_combo_type.setCurrentIndex(0)
         self.box_combo_type.setCurrentIndex(0)
 
 
-
         self.drill_values = ""
         self.drill_values = ""
-
-
-

+ 31 - 31
flatcamTools/ToolFilm.py

@@ -13,9 +13,9 @@ from PyQt5 import QtGui, QtCore, QtWidgets
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -56,9 +56,9 @@ class Film(FlatCAMTool):
         self.tf_type_obj_combo_label = QtWidgets.QLabel(_("Object Type:"))
         self.tf_type_obj_combo_label = QtWidgets.QLabel(_("Object Type:"))
         self.tf_type_obj_combo_label.setToolTip(
         self.tf_type_obj_combo_label.setToolTip(
             _("Specify the type of object for which to create the film.\n"
             _("Specify the type of object for which to create the film.\n"
-            "The object can be of type: Gerber or Geometry.\n"
-            "The selection here decide the type of objects that will be\n"
-            "in the Film Object combobox.")
+              "The object can be of type: Gerber or Geometry.\n"
+              "The selection here decide the type of objects that will be\n"
+              "in the Film Object combobox.")
         )
         )
         tf_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo)
         tf_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo)
 
 
@@ -89,9 +89,9 @@ class Film(FlatCAMTool):
         self.tf_type_box_combo_label = QtWidgets.QLabel(_("Box Type:"))
         self.tf_type_box_combo_label = QtWidgets.QLabel(_("Box Type:"))
         self.tf_type_box_combo_label.setToolTip(
         self.tf_type_box_combo_label.setToolTip(
             _("Specify the type of object to be used as an container for\n"
             _("Specify the type of object to be used as an container for\n"
-            "film creation. It can be: Gerber or Geometry type."
-            "The selection here decide the type of objects that will be\n"
-            "in the Box Object combobox.")
+              "film creation. It can be: Gerber or Geometry type."
+              "The selection here decide the type of objects that will be\n"
+              "in the Box Object combobox.")
         )
         )
         tf_form_layout.addRow(self.tf_type_box_combo_label, self.tf_type_box_combo)
         tf_form_layout.addRow(self.tf_type_box_combo_label, self.tf_type_box_combo)
 
 
@@ -104,23 +104,23 @@ class Film(FlatCAMTool):
         self.tf_box_combo_label = QtWidgets.QLabel(_("Box Object:"))
         self.tf_box_combo_label = QtWidgets.QLabel(_("Box Object:"))
         self.tf_box_combo_label.setToolTip(
         self.tf_box_combo_label.setToolTip(
             _("The actual object that is used a container for the\n "
             _("The actual object that is used a container for the\n "
-            "selected object for which we create the film.\n"
-            "Usually it is the PCB outline but it can be also the\n"
-            "same object for which the film is created.")
+              "selected object for which we create the film.\n"
+              "Usually it is the PCB outline but it can be also the\n"
+              "same object for which the film is created.")
         )
         )
         tf_form_layout.addRow(self.tf_box_combo_label, self.tf_box_combo)
         tf_form_layout.addRow(self.tf_box_combo_label, self.tf_box_combo)
 
 
         # Film Type
         # Film Type
-        self.film_type = RadioSet([{'label': 'Positive', 'value': 'pos'},
-                                     {'label': 'Negative', 'value': 'neg'}])
+        self.film_type = RadioSet([{'label': _('Positive'), 'value': 'pos'},
+                                   {'label': _('Negative'), 'value': 'neg'}])
         self.film_type_label = QtWidgets.QLabel(_("Film Type:"))
         self.film_type_label = QtWidgets.QLabel(_("Film Type:"))
         self.film_type_label.setToolTip(
         self.film_type_label.setToolTip(
             _("Generate a Positive black film or a Negative film.\n"
             _("Generate a Positive black film or a Negative film.\n"
-            "Positive means that it will print the features\n"
-            "with black on a white canvas.\n"
-            "Negative means that it will print the features\n"
-            "with white on a black canvas.\n"
-            "The Film format is SVG.")
+              "Positive means that it will print the features\n"
+              "with black on a white canvas.\n"
+              "Negative means that it will print the features\n"
+              "with white on a black canvas.\n"
+              "The Film format is SVG.")
         )
         )
         tf_form_layout.addRow(self.film_type_label, self.film_type)
         tf_form_layout.addRow(self.film_type_label, self.film_type)
 
 
@@ -130,13 +130,13 @@ class Film(FlatCAMTool):
         self.boundary_label = QtWidgets.QLabel(_("Border:"))
         self.boundary_label = QtWidgets.QLabel(_("Border:"))
         self.boundary_label.setToolTip(
         self.boundary_label.setToolTip(
             _("Specify a border around the object.\n"
             _("Specify a border around the object.\n"
-            "Only for negative film.\n"
-            "It helps if we use as a Box Object the same \n"
-            "object as in Film Object. It will create a thick\n"
-            "black bar around the actual print allowing for a\n"
-            "better delimitation of the outline features which are of\n"
-            "white color like the rest and which may confound with the\n"
-            "surroundings if not for this border.")
+              "Only for negative film.\n"
+              "It helps if we use as a Box Object the same \n"
+              "object as in Film Object. It will create a thick\n"
+              "black bar around the actual print allowing for a\n"
+              "better delimitation of the outline features which are of\n"
+              "white color like the rest and which may confound with the\n"
+              "surroundings if not for this border.")
         )
         )
         tf_form_layout.addRow(self.boundary_label, self.boundary_entry)
         tf_form_layout.addRow(self.boundary_label, self.boundary_entry)
 
 
@@ -144,8 +144,8 @@ class Film(FlatCAMTool):
         self.film_scale_label = QtWidgets.QLabel(_("Scale Stroke:"))
         self.film_scale_label = QtWidgets.QLabel(_("Scale Stroke:"))
         self.film_scale_label.setToolTip(
         self.film_scale_label.setToolTip(
             _("Scale the line stroke thickness of each feature in the SVG file.\n"
             _("Scale the line stroke thickness of each feature in the SVG file.\n"
-            "It means that the line that envelope each SVG feature will be thicker or thinner,\n"
-            "therefore the fine features may be more affected by this parameter.")
+              "It means that the line that envelope each SVG feature will be thicker or thinner,\n"
+              "therefore the fine features may be more affected by this parameter.")
         )
         )
         tf_form_layout.addRow(self.film_scale_label, self.film_scale_entry)
         tf_form_layout.addRow(self.film_scale_label, self.film_scale_entry)
 
 
@@ -157,9 +157,9 @@ class Film(FlatCAMTool):
         self.film_object_button = QtWidgets.QPushButton(_("Save Film"))
         self.film_object_button = QtWidgets.QPushButton(_("Save Film"))
         self.film_object_button.setToolTip(
         self.film_object_button.setToolTip(
             _("Create a Film for the selected object, within\n"
             _("Create a Film for the selected object, within\n"
-            "the specified box. Does not create a new \n "
-            "FlatCAM object, but directly save it in SVG format\n"
-            "which can be opened with Inkscape.")
+              "the specified box. Does not create a new \n "
+              "FlatCAM object, but directly save it in SVG format\n"
+              "which can be opened with Inkscape.")
         )
         )
         hlay.addWidget(self.film_object_button)
         hlay.addWidget(self.film_object_button)
 
 
@@ -221,13 +221,13 @@ class Film(FlatCAMTool):
     def on_film_creation(self):
     def on_film_creation(self):
         try:
         try:
             name = self.tf_object_combo.currentText()
             name = self.tf_object_combo.currentText()
-        except:
+        except Exception as e:
             self.app.inform.emit(_("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry."))
             self.app.inform.emit(_("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry."))
             return
             return
 
 
         try:
         try:
             boxname = self.tf_box_combo.currentText()
             boxname = self.tf_box_combo.currentText()
-        except:
+        except Exception as e:
             self.app.inform.emit(_("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry."))
             self.app.inform.emit(_("[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry."))
             return
             return
 
 

+ 29 - 29
flatcamTools/ToolImage.py

@@ -13,9 +13,9 @@ from PyQt5 import QtGui, QtWidgets
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -52,8 +52,8 @@ class ToolImage(FlatCAMTool):
 
 
         self.tf_type_obj_combo_label = QtWidgets.QLabel(_("Object Type:"))
         self.tf_type_obj_combo_label = QtWidgets.QLabel(_("Object Type:"))
         self.tf_type_obj_combo_label.setToolTip(
         self.tf_type_obj_combo_label.setToolTip(
-           _( "Specify the type of object to create from the image.\n"
-            "It can be of type: Gerber or Geometry.")
+           _("Specify the type of object to create from the image.\n"
+             "It can be of type: Gerber or Geometry.")
 
 
         )
         )
         ti_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo)
         ti_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo)
@@ -62,7 +62,7 @@ class ToolImage(FlatCAMTool):
         self.dpi_entry = IntEntry()
         self.dpi_entry = IntEntry()
         self.dpi_label = QtWidgets.QLabel(_("DPI value:"))
         self.dpi_label = QtWidgets.QLabel(_("DPI value:"))
         self.dpi_label.setToolTip(
         self.dpi_label.setToolTip(
-           _( "Specify a DPI value for the image.")
+           _("Specify a DPI value for the image.")
         )
         )
         ti_form_layout.addRow(self.dpi_label, self.dpi_entry)
         ti_form_layout.addRow(self.dpi_label, self.dpi_entry)
 
 
@@ -77,11 +77,11 @@ class ToolImage(FlatCAMTool):
 
 
         # Type of image interpretation
         # Type of image interpretation
         self.image_type = RadioSet([{'label': 'B/W', 'value': 'black'},
         self.image_type = RadioSet([{'label': 'B/W', 'value': 'black'},
-                                     {'label': 'Color', 'value': 'color'}])
+                                    {'label': 'Color', 'value': 'color'}])
         self.image_type_label = QtWidgets.QLabel("<b>%s:</b>" % _('Image type'))
         self.image_type_label = QtWidgets.QLabel("<b>%s:</b>" % _('Image type'))
         self.image_type_label.setToolTip(
         self.image_type_label.setToolTip(
             _("Choose a method for the image interpretation.\n"
             _("Choose a method for the image interpretation.\n"
-            "B/W means a black & white image. Color means a colored image.")
+              "B/W means a black & white image. Color means a colored image.")
         )
         )
         ti2_form_layout.addRow(self.image_type_label, self.image_type)
         ti2_form_layout.addRow(self.image_type_label, self.image_type)
 
 
@@ -90,11 +90,11 @@ class ToolImage(FlatCAMTool):
         self.mask_bw_label = QtWidgets.QLabel("%s <b>B/W</b>:" % _('Mask value'))
         self.mask_bw_label = QtWidgets.QLabel("%s <b>B/W</b>:" % _('Mask value'))
         self.mask_bw_label.setToolTip(
         self.mask_bw_label.setToolTip(
             _("Mask for monochrome image.\n"
             _("Mask for monochrome image.\n"
-            "Takes values between [0 ... 255].\n"
-            "Decides the level of details to include\n"
-            "in the resulting geometry.\n"
-            "0 means no detail and 255 means everything \n"
-            "(which is totally black).")
+              "Takes values between [0 ... 255].\n"
+              "Decides the level of details to include\n"
+              "in the resulting geometry.\n"
+              "0 means no detail and 255 means everything \n"
+              "(which is totally black).")
         )
         )
         ti2_form_layout.addRow(self.mask_bw_label, self.mask_bw_entry)
         ti2_form_layout.addRow(self.mask_bw_label, self.mask_bw_entry)
 
 
@@ -103,9 +103,9 @@ class ToolImage(FlatCAMTool):
         self.mask_r_label = QtWidgets.QLabel("%s <b>R:</b>" % _('Mask value'))
         self.mask_r_label = QtWidgets.QLabel("%s <b>R:</b>" % _('Mask value'))
         self.mask_r_label.setToolTip(
         self.mask_r_label.setToolTip(
             _("Mask for RED color.\n"
             _("Mask for RED color.\n"
-            "Takes values between [0 ... 255].\n"
-            "Decides the level of details to include\n"
-            "in the resulting geometry.")
+              "Takes values between [0 ... 255].\n"
+              "Decides the level of details to include\n"
+              "in the resulting geometry.")
         )
         )
         ti2_form_layout.addRow(self.mask_r_label, self.mask_r_entry)
         ti2_form_layout.addRow(self.mask_r_label, self.mask_r_entry)
 
 
@@ -114,9 +114,9 @@ class ToolImage(FlatCAMTool):
         self.mask_g_label = QtWidgets.QLabel("%s <b>G:</b>" % _('Mask value'))
         self.mask_g_label = QtWidgets.QLabel("%s <b>G:</b>" % _('Mask value'))
         self.mask_g_label.setToolTip(
         self.mask_g_label.setToolTip(
             _("Mask for GREEN color.\n"
             _("Mask for GREEN color.\n"
-            "Takes values between [0 ... 255].\n"
-            "Decides the level of details to include\n"
-            "in the resulting geometry.")
+              "Takes values between [0 ... 255].\n"
+              "Decides the level of details to include\n"
+              "in the resulting geometry.")
         )
         )
         ti2_form_layout.addRow(self.mask_g_label, self.mask_g_entry)
         ti2_form_layout.addRow(self.mask_g_label, self.mask_g_entry)
 
 
@@ -125,9 +125,9 @@ class ToolImage(FlatCAMTool):
         self.mask_b_label = QtWidgets.QLabel("%s <b>B:</b>" % _('Mask value'))
         self.mask_b_label = QtWidgets.QLabel("%s <b>B:</b>" % _('Mask value'))
         self.mask_b_label.setToolTip(
         self.mask_b_label.setToolTip(
             _("Mask for BLUE color.\n"
             _("Mask for BLUE color.\n"
-            "Takes values between [0 ... 255].\n"
-            "Decides the level of details to include\n"
-            "in the resulting geometry.")
+              "Takes values between [0 ... 255].\n"
+              "Decides the level of details to include\n"
+              "in the resulting geometry.")
         )
         )
         ti2_form_layout.addRow(self.mask_b_label, self.mask_b_entry)
         ti2_form_layout.addRow(self.mask_b_label, self.mask_b_entry)
 
 
@@ -191,27 +191,27 @@ class ToolImage(FlatCAMTool):
         mask = []
         mask = []
         self.app.log.debug("on_file_importimage()")
         self.app.log.debug("on_file_importimage()")
 
 
-        filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
-                 "Bitmap File (*.BMP);;" \
-                 "PNG File (*.PNG);;" \
-                 "Jpeg File (*.JPG);;" \
-                 "All Files (*.*)"
+        _filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
+                  "Bitmap File (*.BMP);;" \
+                  "PNG File (*.PNG);;" \
+                  "Jpeg File (*.JPG);;" \
+                  "All Files (*.*)"
         try:
         try:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"),
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"),
-                                                         directory=self.app.get_last_folder(), filter=filter)
+                                                                 directory=self.app.get_last_folder(), filter=_filter)
         except TypeError:
         except TypeError:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"), filter=filter)
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"), filter=filter)
 
 
         filename = str(filename)
         filename = str(filename)
-        type = self.tf_type_obj_combo.get_value().lower()
+        type_obj = self.tf_type_obj_combo.get_value().lower()
         dpi = self.dpi_entry.get_value()
         dpi = self.dpi_entry.get_value()
         mode = self.image_type.get_value()
         mode = self.image_type.get_value()
-        mask = [self.mask_bw_entry.get_value(), self.mask_r_entry.get_value(),self.mask_g_entry.get_value(),
+        mask = [self.mask_bw_entry.get_value(), self.mask_r_entry.get_value(), self.mask_g_entry.get_value(),
                 self.mask_b_entry.get_value()]
                 self.mask_b_entry.get_value()]
 
 
         if filename == "":
         if filename == "":
             self.app.inform.emit(_("Open cancelled."))
             self.app.inform.emit(_("Open cancelled."))
         else:
         else:
             self.app.worker_task.emit({'fcn': self.app.import_image,
             self.app.worker_task.emit({'fcn': self.app.import_image,
-                                       'params': [filename, type, dpi, mode, mask]})
+                                       'params': [filename, type_obj, dpi, mode, mask]})
             #  self.import_svg(filename, "geometry")
             #  self.import_svg(filename, "geometry")

+ 5 - 6
flatcamTools/ToolMeasurement.py

@@ -14,9 +14,9 @@ from math import sqrt
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -40,10 +40,9 @@ class Measurement(FlatCAMTool):
         form_layout = QtWidgets.QFormLayout()
         form_layout = QtWidgets.QFormLayout()
         self.layout.addLayout(form_layout)
         self.layout.addLayout(form_layout)
 
 
-
         self.units_label = QtWidgets.QLabel(_("Units:"))
         self.units_label = QtWidgets.QLabel(_("Units:"))
         self.units_label.setToolTip(_("Those are the units in which the distance is measured."))
         self.units_label.setToolTip(_("Those are the units in which the distance is measured."))
-        self.units_value = QtWidgets.QLabel("%s" % str({'mm': "METRIC (mm)", 'in': "INCH (in)"}[self.units]))
+        self.units_value = QtWidgets.QLabel("%s" % str({'mm': _("METRIC (mm)"), 'in': _("INCH (in)")}[self.units]))
         self.units_value.setDisabled(True)
         self.units_value.setDisabled(True)
 
 
         self.start_label = QtWidgets.QLabel("<b>%s</b> %s:" % (_('Start'), _('Coords')))
         self.start_label = QtWidgets.QLabel("<b>%s</b> %s:" % (_('Start'), _('Coords')))
@@ -73,12 +72,10 @@ class Measurement(FlatCAMTool):
         self.distance_x_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.distance_x_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.distance_x_entry.setToolTip(_("This is the distance measured over the X axis."))
         self.distance_x_entry.setToolTip(_("This is the distance measured over the X axis."))
 
 
-
         self.distance_y_entry = FCEntry()
         self.distance_y_entry = FCEntry()
         self.distance_y_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.distance_y_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.distance_y_entry.setToolTip(_("This is the distance measured over the Y axis."))
         self.distance_y_entry.setToolTip(_("This is the distance measured over the Y axis."))
 
 
-
         self.total_distance_entry = FCEntry()
         self.total_distance_entry = FCEntry()
         self.total_distance_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.total_distance_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.total_distance_entry.setToolTip(_("This is the point to point Euclidian distance."))
         self.total_distance_entry.setToolTip(_("This is the point to point Euclidian distance."))
@@ -110,6 +107,8 @@ class Measurement(FlatCAMTool):
         self.rel_point2 = None
         self.rel_point2 = None
 
 
         self.active = False
         self.active = False
+        self.clicked_meas = None
+        self.meas_line = None
 
 
         self.original_call_source = 'app'
         self.original_call_source = 'app'
 
 
@@ -312,7 +311,7 @@ class Measurement(FlatCAMTool):
             # update utility geometry
             # update utility geometry
             if len(self.points) == 1:
             if len(self.points) == 1:
                 self.utility_geometry(pos=pos)
                 self.utility_geometry(pos=pos)
-        except:
+        except Exception as e:
             self.app.ui.position_label.setText("")
             self.app.ui.position_label.setText("")
             self.app.ui.rel_position_label.setText("")
             self.app.ui.rel_position_label.setText("")
 
 

+ 6 - 6
flatcamTools/ToolMove.py

@@ -14,9 +14,9 @@ from copy import copy
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -97,7 +97,7 @@ class ToolMove(FlatCAMTool):
                 pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos)
                 pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos)
 
 
                 # if GRID is active we need to get the snapped positions
                 # if GRID is active we need to get the snapped positions
-                if self.app.grid_status() == True:
+                if self.app.grid_status() is True:
                     pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
                     pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
                 else:
                 else:
                     pos = pos_canvas
                     pos = pos_canvas
@@ -117,7 +117,7 @@ class ToolMove(FlatCAMTool):
                     self.delete_shape()
                     self.delete_shape()
 
 
                     # if GRID is active we need to get the snapped positions
                     # if GRID is active we need to get the snapped positions
-                    if self.app.grid_status() == True:
+                    if self.app.grid_status() is True:
                         pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
                         pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
                     else:
                     else:
                         pos = pos_canvas
                         pos = pos_canvas
@@ -143,11 +143,11 @@ class ToolMove(FlatCAMTool):
 
 
                                     try:
                                     try:
                                         sel_obj.replotApertures.emit()
                                         sel_obj.replotApertures.emit()
-                                    except:
+                                    except Exception as e:
                                         pass
                                         pass
 
 
                                     # Update the object bounding box options
                                     # Update the object bounding box options
-                                    a,b,c,d = sel_obj.bounds()
+                                    a, b, c, d = sel_obj.bounds()
                                     sel_obj.options['xmin'] = a
                                     sel_obj.options['xmin'] = a
                                     sel_obj.options['ymin'] = b
                                     sel_obj.options['ymin'] = b
                                     sel_obj.options['xmax'] = c
                                     sel_obj.options['xmax'] = c
@@ -181,7 +181,7 @@ class ToolMove(FlatCAMTool):
         pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos)
         pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos)
 
 
         # if GRID is active we need to get the snapped positions
         # if GRID is active we need to get the snapped positions
-        if self.app.grid_status() == True:
+        if self.app.grid_status() is True:
             pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
             pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
         else:
         else:
             pos = pos_canvas
             pos = pos_canvas

+ 65 - 62
flatcamTools/ToolNonCopperClear.py

@@ -7,16 +7,16 @@
 # ########################################################## ##
 # ########################################################## ##
 
 
 from FlatCAMTool import FlatCAMTool
 from FlatCAMTool import FlatCAMTool
-from copy import copy,deepcopy
+from copy import copy, deepcopy
 from ObjectCollection import *
 from ObjectCollection import *
 import time
 import time
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
 from shapely.geometry import base
 from shapely.geometry import base
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -72,7 +72,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label.setToolTip(
         self.tools_table_label.setToolTip(
             _("Tools pool from which the algorithm\n"
             _("Tools pool from which the algorithm\n"
-            "will pick the ones used for copper clearing.")
+              "will pick the ones used for copper clearing.")
         )
         )
         self.tools_box.addWidget(self.tools_table_label)
         self.tools_box.addWidget(self.tools_table_label)
 
 
@@ -87,33 +87,33 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
 
         self.tools_table.horizontalHeaderItem(0).setToolTip(
         self.tools_table.horizontalHeaderItem(0).setToolTip(
             _("This is the Tool Number.\n"
             _("This is the Tool Number.\n"
-            "Non copper clearing will start with the tool with the biggest \n"
-            "diameter, continuing until there are no more tools.\n"
-            "Only tools that create NCC clearing geometry will still be present\n"
-            "in the resulting geometry. This is because with some tools\n"
-            "this function will not be able to create painting geometry.")
+              "Non copper clearing will start with the tool with the biggest \n"
+              "diameter, continuing until there are no more tools.\n"
+              "Only tools that create NCC clearing geometry will still be present\n"
+              "in the resulting geometry. This is because with some tools\n"
+              "this function will not be able to create painting geometry.")
             )
             )
         self.tools_table.horizontalHeaderItem(1).setToolTip(
         self.tools_table.horizontalHeaderItem(1).setToolTip(
             _("Tool Diameter. It's value (in current FlatCAM units) \n"
             _("Tool Diameter. It's value (in current FlatCAM units) \n"
-            "is the cut width into the material."))
+              "is the cut width into the material."))
 
 
         self.tools_table.horizontalHeaderItem(2).setToolTip(
         self.tools_table.horizontalHeaderItem(2).setToolTip(
             _("The Tool Type (TT) can be:<BR>"
             _("The Tool Type (TT) can be:<BR>"
-            "- <B>Circular</B> with 1 ... 4 teeth -> it is informative only. Being circular, <BR>"
-            "the cut width in material is exactly the tool diameter.<BR>"
-            "- <B>Ball</B> -> informative only and make reference to the Ball type endmill.<BR>"
-            "- <B>V-Shape</B> -> it will disable de Z-Cut parameter in the resulting geometry UI form "
-            "and enable two additional UI form fields in the resulting geometry: V-Tip Dia and "
-            "V-Tip Angle. Adjusting those two values will adjust the Z-Cut parameter such "
-            "as the cut width into material will be equal with the value in the Tool Diameter "
-            "column of this table.<BR>"
-            "Choosing the <B>V-Shape</B> Tool Type automatically will select the Operation Type "
-            "in the resulting geometry as Isolation."))
+              "- <B>Circular</B> with 1 ... 4 teeth -> it is informative only. Being circular, <BR>"
+              "the cut width in material is exactly the tool diameter.<BR>"
+              "- <B>Ball</B> -> informative only and make reference to the Ball type endmill.<BR>"
+              "- <B>V-Shape</B> -> it will disable de Z-Cut parameter in the resulting geometry UI form "
+              "and enable two additional UI form fields in the resulting geometry: V-Tip Dia and "
+              "V-Tip Angle. Adjusting those two values will adjust the Z-Cut parameter such "
+              "as the cut width into material will be equal with the value in the Tool Diameter "
+              "column of this table.<BR>"
+              "Choosing the <B>V-Shape</B> Tool Type automatically will select the Operation Type "
+              "in the resulting geometry as Isolation."))
 
 
         self.empty_label = QtWidgets.QLabel('')
         self.empty_label = QtWidgets.QLabel('')
         self.tools_box.addWidget(self.empty_label)
         self.tools_box.addWidget(self.empty_label)
 
 
-        #### Add a new Tool ## ##
+        # ### Add a new Tool ####
         hlay = QtWidgets.QHBoxLayout()
         hlay = QtWidgets.QHBoxLayout()
         self.tools_box.addLayout(hlay)
         self.tools_box.addLayout(hlay)
 
 
@@ -134,7 +134,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn.setToolTip(
         self.addtool_btn.setToolTip(
             _("Add a new tool to the Tool Table\n"
             _("Add a new tool to the Tool Table\n"
-            "with the diameter specified above.")
+              "with the diameter specified above.")
         )
         )
 
 
         # self.copytool_btn = QtWidgets.QPushButton('Copy')
         # self.copytool_btn = QtWidgets.QPushButton('Copy')
@@ -146,12 +146,12 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn.setToolTip(
         self.deltool_btn.setToolTip(
             _("Delete a selection of tools in the Tool Table\n"
             _("Delete a selection of tools in the Tool Table\n"
-            "by first selecting a row(s) in the Tool Table.")
+              "by first selecting a row(s) in the Tool Table.")
         )
         )
 
 
         grid2.addWidget(self.addtool_btn, 0, 0)
         grid2.addWidget(self.addtool_btn, 0, 0)
         # grid2.addWidget(self.copytool_btn, 0, 1)
         # grid2.addWidget(self.copytool_btn, 0, 1)
-        grid2.addWidget(self.deltool_btn, 0,2)
+        grid2.addWidget(self.deltool_btn, 0, 2)
 
 
         self.empty_label_0 = QtWidgets.QLabel('')
         self.empty_label_0 = QtWidgets.QLabel('')
         self.tools_box.addWidget(self.empty_label_0)
         self.tools_box.addWidget(self.empty_label_0)
@@ -165,14 +165,14 @@ class NonCopperClear(FlatCAMTool, Gerber):
         nccoverlabel = QtWidgets.QLabel(_('Overlap Rate:'))
         nccoverlabel = QtWidgets.QLabel(_('Overlap Rate:'))
         nccoverlabel.setToolTip(
         nccoverlabel.setToolTip(
             _("How much (fraction) of the tool width to overlap each tool pass.\n"
             _("How much (fraction) of the tool width to overlap each tool pass.\n"
-            "Example:\n"
-            "A value here of 0.25 means 25% from the tool diameter found above.\n\n"
-            "Adjust the value starting with lower values\n"
-            "and increasing it if areas that should be cleared are still \n"
-            "not cleared.\n"
-            "Lower values = faster processing, faster execution on PCB.\n"
-            "Higher values = slow processing and slow execution on CNC\n"
-            "due of too many paths.")
+              "Example:\n"
+              "A value here of 0.25 means 25% from the tool diameter found above.\n\n"
+              "Adjust the value starting with lower values\n"
+              "and increasing it if areas that should be cleared are still \n"
+              "not cleared.\n"
+              "Lower values = faster processing, faster execution on PCB.\n"
+              "Higher values = slow processing and slow execution on CNC\n"
+              "due of too many paths.")
         )
         )
         grid3.addWidget(nccoverlabel, 1, 0)
         grid3.addWidget(nccoverlabel, 1, 0)
         self.ncc_overlap_entry = FCEntry()
         self.ncc_overlap_entry = FCEntry()
@@ -190,9 +190,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
         methodlabel = QtWidgets.QLabel(_('Method:'))
         methodlabel = QtWidgets.QLabel(_('Method:'))
         methodlabel.setToolTip(
         methodlabel.setToolTip(
             _("Algorithm for non-copper clearing:<BR>"
             _("Algorithm for non-copper clearing:<BR>"
-            "<B>Standard</B>: Fixed step inwards.<BR>"
-            "<B>Seed-based</B>: Outwards from seed.<BR>"
-            "<B>Line-based</B>: Parallel lines.")
+              "<B>Standard</B>: Fixed step inwards.<BR>"
+              "<B>Seed-based</B>: Outwards from seed.<BR>"
+              "<B>Line-based</B>: Parallel lines.")
         )
         )
         grid3.addWidget(methodlabel, 3, 0)
         grid3.addWidget(methodlabel, 3, 0)
         self.ncc_method_radio = RadioSet([
         self.ncc_method_radio = RadioSet([
@@ -206,7 +206,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         pathconnectlabel = QtWidgets.QLabel(_("Connect:"))
         pathconnectlabel = QtWidgets.QLabel(_("Connect:"))
         pathconnectlabel.setToolTip(
         pathconnectlabel.setToolTip(
             _("Draw lines between resulting\n"
             _("Draw lines between resulting\n"
-            "segments to minimize tool lifts.")
+              "segments to minimize tool lifts.")
         )
         )
         grid3.addWidget(pathconnectlabel, 4, 0)
         grid3.addWidget(pathconnectlabel, 4, 0)
         self.ncc_connect_cb = FCCheckBox()
         self.ncc_connect_cb = FCCheckBox()
@@ -215,7 +215,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         contourlabel = QtWidgets.QLabel(_("Contour:"))
         contourlabel = QtWidgets.QLabel(_("Contour:"))
         contourlabel.setToolTip(
         contourlabel.setToolTip(
             _("Cut around the perimeter of the polygon\n"
             _("Cut around the perimeter of the polygon\n"
-            "to trim rough edges.")
+              "to trim rough edges.")
         )
         )
         grid3.addWidget(contourlabel, 5, 0)
         grid3.addWidget(contourlabel, 5, 0)
         self.ncc_contour_cb = FCCheckBox()
         self.ncc_contour_cb = FCCheckBox()
@@ -224,12 +224,12 @@ class NonCopperClear(FlatCAMTool, Gerber):
         restlabel = QtWidgets.QLabel(_("Rest M.:"))
         restlabel = QtWidgets.QLabel(_("Rest M.:"))
         restlabel.setToolTip(
         restlabel.setToolTip(
             _("If checked, use 'rest machining'.\n"
             _("If checked, use 'rest machining'.\n"
-            "Basically it will clear copper outside PCB features,\n"
-            "using the biggest tool and continue with the next tools,\n"
-            "from bigger to smaller, to clear areas of copper that\n"
-            "could not be cleared by previous tool, until there is\n"
-            "no more copper to clear or there are no more tools.\n"
-            "If not checked, use the standard algorithm.")
+              "Basically it will clear copper outside PCB features,\n"
+              "using the biggest tool and continue with the next tools,\n"
+              "from bigger to smaller, to clear areas of copper that\n"
+              "could not be cleared by previous tool, until there is\n"
+              "no more copper to clear or there are no more tools.\n"
+              "If not checked, use the standard algorithm.")
         )
         )
         grid3.addWidget(restlabel, 6, 0)
         grid3.addWidget(restlabel, 6, 0)
         self.ncc_rest_cb = FCCheckBox()
         self.ncc_rest_cb = FCCheckBox()
@@ -238,7 +238,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.generate_ncc_button = QtWidgets.QPushButton(_('Generate Geometry'))
         self.generate_ncc_button = QtWidgets.QPushButton(_('Generate Geometry'))
         self.generate_ncc_button.setToolTip(
         self.generate_ncc_button.setToolTip(
             _("Create the Geometry Object\n"
             _("Create the Geometry Object\n"
-            "for non-copper routing.")
+              "for non-copper routing.")
         )
         )
         self.tools_box.addWidget(self.generate_ncc_button)
         self.tools_box.addWidget(self.generate_ncc_button)
 
 
@@ -344,8 +344,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
 
         try:
         try:
             dias = [float(eval(dia)) for dia in self.app.defaults["tools_ncctools"].split(",") if dia != '']
             dias = [float(eval(dia)) for dia in self.app.defaults["tools_ncctools"].split(",") if dia != '']
-        except:
-            log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> TOOLS -> NCC Tools.")
+        except Exception as e:
+            log.error("At least one tool diameter needed. "
+                      "Verify in Edit -> Preferences -> TOOLS -> NCC Tools. %s" % str(e))
             return
             return
 
 
         self.tooluid = 0
         self.tooluid = 0
@@ -393,10 +394,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
             for tooluid_key, tooluid_value in self.ncc_tools.items():
             for tooluid_key, tooluid_value in self.ncc_tools.items():
                 if float('%.4f' % tooluid_value['tooldia']) == tool_sorted:
                 if float('%.4f' % tooluid_value['tooldia']) == tool_sorted:
                     tool_id += 1
                     tool_id += 1
-                    id = QtWidgets.QTableWidgetItem('%d' % int(tool_id))
-                    id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
+                    id_ = QtWidgets.QTableWidgetItem('%d' % int(tool_id))
+                    id_.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
                     row_no = tool_id - 1
                     row_no = tool_id - 1
-                    self.tools_table.setItem(row_no, 0, id)  # Tool name/id
+                    self.tools_table.setItem(row_no, 0, id_)  # Tool name/id
 
 
                     # Make sure that the drill diameter when in MM is with no more than 2 decimals
                     # Make sure that the drill diameter when in MM is with no more than 2 decimals
                     # There are no drill bits in MM with more than 3 decimals diameter
                     # There are no drill bits in MM with more than 3 decimals diameter
@@ -478,7 +479,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number."))
+                                           "use a number."))
                     return
                     return
             if tool_dia is None:
             if tool_dia is None:
                 self.build_ui()
                 self.build_ui()
@@ -486,7 +487,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 return
                 return
 
 
         if tool_dia == 0:
         if tool_dia == 0:
-            self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format."))
+            self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, "
+                                   "in Float format."))
             return
             return
 
 
         # construct a list of all 'tooluid' in the self.tools
         # construct a list of all 'tooluid' in the self.tools
@@ -568,7 +570,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                         break
                         break
                 restore_dia_item = self.tools_table.item(row, 1)
                 restore_dia_item = self.tools_table.item(row, 1)
                 restore_dia_item.setText(str(old_tool_dia))
                 restore_dia_item.setText(str(old_tool_dia))
-                self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table."))
+                self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. "
+                                       "New diameter value is already in the Tool Table."))
         self.build_ui()
         self.build_ui()
 
 
     def on_tool_delete(self, rows_to_delete=None, all=None):
     def on_tool_delete(self, rows_to_delete=None, all=None):
@@ -625,13 +628,13 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 over = float(self.ncc_overlap_entry.get_value().replace(',', '.'))
                 over = float(self.ncc_overlap_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
         over = over if over else self.app.defaults["tools_nccoverlap"]
         over = over if over else self.app.defaults["tools_nccoverlap"]
 
 
         if over >= 1 or over < 0:
         if over >= 1 or over < 0:
             self.app.inform.emit(_("[ERROR_NOTCL] Overlap value must be between "
             self.app.inform.emit(_("[ERROR_NOTCL] Overlap value must be between "
-                                  "0 (inclusive) and 1 (exclusive), "))
+                                   "0 (inclusive) and 1 (exclusive), "))
             return
             return
 
 
         try:
         try:
@@ -642,7 +645,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 margin = float(self.ncc_margin_entry.get_value().replace(',', '.'))
                 margin = float(self.ncc_margin_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
         margin = margin if margin else self.app.defaults["tools_nccmargin"]
         margin = margin if margin else self.app.defaults["tools_nccmargin"]
 
 
@@ -662,13 +665,14 @@ class NonCopperClear(FlatCAMTool, Gerber):
         # Get source object.
         # Get source object.
         try:
         try:
             self.ncc_obj = self.app.collection.get_by_name(self.obj_name)
             self.ncc_obj = self.app.collection.get_by_name(self.obj_name)
-        except:
+        except Exception as e:
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             return "Could not retrieve object: %s" % self.obj_name
             return "Could not retrieve object: %s" % self.obj_name
 
 
         # Prepare non-copper polygons
         # Prepare non-copper polygons
         try:
         try:
-            bounding_box = self.ncc_obj.solid_geometry.envelope.buffer(distance=margin, join_style=base.JOIN_STYLE.mitre)
+            bounding_box = self.ncc_obj.solid_geometry.envelope.buffer(distance=margin,
+                                                                       join_style=base.JOIN_STYLE.mitre)
         except AttributeError:
         except AttributeError:
             self.app.inform.emit(_("[ERROR_NOTCL] No Gerber file available."))
             self.app.inform.emit(_("[ERROR_NOTCL] No Gerber file available."))
             return
             return
@@ -679,7 +683,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
             empty = MultiPolygon([empty])
             empty = MultiPolygon([empty])
 
 
         # clear non copper using standard algorithm
         # clear non copper using standard algorithm
-        if clearing_method == False:
+        if clearing_method is False:
             self.clear_non_copper(
             self.clear_non_copper(
                 empty=empty,
                 empty=empty,
                 over=over,
                 over=over,
@@ -736,7 +740,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 area = empty.buffer(-offset)
                 area = empty.buffer(-offset)
                 try:
                 try:
                     area = area.difference(cleared)
                     area = area.difference(cleared)
-                except:
+                except Exception as e:
                     continue
                     continue
 
 
                 # Transform area to MultiPolygon
                 # Transform area to MultiPolygon
@@ -758,8 +762,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                                                              overlap=over, contour=contour, connect=connect)
                                                              overlap=over, contour=contour, connect=connect)
                                 if cp:
                                 if cp:
                                     cleared_geo += list(cp.get_objects())
                                     cleared_geo += list(cp.get_objects())
-                            except:
-                                log.warning("Polygon can not be cleared.")
+                            except Exception as e:
+                                log.warning("Polygon can not be cleared. %s" % str(e))
                                 app_obj.poly_not_cleared = True
                                 app_obj.poly_not_cleared = True
                                 continue
                                 continue
 
 
@@ -850,7 +854,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 tool = sorted_tools.pop(0)
                 tool = sorted_tools.pop(0)
                 self.app.inform.emit(_('[success] Non-Copper Rest Clearing with ToolDia = %s started.') % str(tool))
                 self.app.inform.emit(_('[success] Non-Copper Rest Clearing with ToolDia = %s started.') % str(tool))
 
 
-                tool_used = tool  - 1e-12
+                tool_used = tool - 1e-12
                 cleared_geo[:] = []
                 cleared_geo[:] = []
 
 
                 # Area to clear
                 # Area to clear
@@ -973,4 +977,3 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
 
     def reset_fields(self):
     def reset_fields(self):
         self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
         self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
-

+ 11 - 12
flatcamTools/ToolPDF.py

@@ -207,8 +207,8 @@ class ToolPDF(FlatCAMTool):
             while True:
             while True:
                 self.parsing_promises.remove(short_name)
                 self.parsing_promises.remove(short_name)
                 time.sleep(0.1)
                 time.sleep(0.1)
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolPDF.open_pdf() --> %s" % str(e))
         self.app.inform.emit(_("[success] Opened: %s") % filename)
         self.app.inform.emit(_("[success] Opened: %s") % filename)
 
 
     def layer_rendering_as_excellon(self, filename, ap_dict, layer_nr):
     def layer_rendering_as_excellon(self, filename, ap_dict, layer_nr):
@@ -264,8 +264,8 @@ class ToolPDF(FlatCAMTool):
 
 
         with self.app.proc_container.new(_("Rendering PDF layer #%d ...") % int(layer_nr)):
         with self.app.proc_container.new(_("Rendering PDF layer #%d ...") % int(layer_nr)):
 
 
-            ret = self.app.new_object("excellon", outname, obj_init, autoselected=False)
-            if ret == 'fail':
+            ret_val = self.app.new_object("excellon", outname, obj_init, autoselected=False)
+            if ret_val == 'fail':
                 self.app.inform.emit(_('[ERROR_NOTCL] Open PDF file failed.'))
                 self.app.inform.emit(_('[ERROR_NOTCL] Open PDF file failed.'))
                 return
                 return
             # Register recent file
             # Register recent file
@@ -300,7 +300,7 @@ class ToolPDF(FlatCAMTool):
                             global_clear_geo.append(geo_el['clear'])
                             global_clear_geo.append(geo_el['clear'])
 
 
                 if global_clear_geo:
                 if global_clear_geo:
-                    solid= []
+                    solid = []
                     for apid in grb_obj.apertures:
                     for apid in grb_obj.apertures:
                         if 'geometry' in grb_obj.apertures[apid]:
                         if 'geometry' in grb_obj.apertures[apid]:
                             for elem in grb_obj.apertures[apid]['geometry']:
                             for elem in grb_obj.apertures[apid]['geometry']:
@@ -360,7 +360,7 @@ class ToolPDF(FlatCAMTool):
 
 
         try:
         try:
             self.check_thread.stop()
             self.check_thread.stop()
-        except:
+        except Exception as e:
             pass
             pass
 
 
         self.check_thread.setInterval(check_period)
         self.check_thread.setInterval(check_period)
@@ -458,7 +458,7 @@ class ToolPDF(FlatCAMTool):
 
 
         # on stroke color change we create a new apertures dictionary and store the old one in a storage from where
         # on stroke color change we create a new apertures dictionary and store the old one in a storage from where
         # it will be transformed into Gerber object
         # it will be transformed into Gerber object
-        old_color = [None, None ,None]
+        old_color = [None, None, None]
 
 
         # signal that we have clear geometry and the geometry will be added to a special layer_nr = 0
         # signal that we have clear geometry and the geometry will be added to a special layer_nr = 0
         flag_clear_geo = False
         flag_clear_geo = False
@@ -681,10 +681,8 @@ class ToolPDF(FlatCAMTool):
                 current_subpath = 'rectangle'
                 current_subpath = 'rectangle'
                 x = (float(match.group(1)) + offset_geo[0]) * self.point_to_unit_factor * scale_geo[0]
                 x = (float(match.group(1)) + offset_geo[0]) * self.point_to_unit_factor * scale_geo[0]
                 y = (float(match.group(2)) + offset_geo[1]) * self.point_to_unit_factor * scale_geo[1]
                 y = (float(match.group(2)) + offset_geo[1]) * self.point_to_unit_factor * scale_geo[1]
-                width = (float(match.group(3)) + offset_geo[0]) * \
-                        self.point_to_unit_factor * scale_geo[0]
-                height = (float(match.group(4)) + offset_geo[1]) * \
-                         self.point_to_unit_factor * scale_geo[1]
+                width = (float(match.group(3)) + offset_geo[0]) * self.point_to_unit_factor * scale_geo[0]
+                height = (float(match.group(4)) + offset_geo[1]) * self.point_to_unit_factor * scale_geo[1]
                 pt1 = (x, y)
                 pt1 = (x, y)
                 pt2 = (x+width, y)
                 pt2 = (x+width, y)
                 pt3 = (x+width, y+height)
                 pt3 = (x+width, y+height)
@@ -758,7 +756,8 @@ class ToolPDF(FlatCAMTool):
                         for subp in path['lines']:
                         for subp in path['lines']:
                             geo = copy(subp)
                             geo = copy(subp)
                             try:
                             try:
-                                geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles)
+                                geo = LineString(geo).buffer((float(applied_size) / 2),
+                                                             resolution=self.step_per_circles)
                                 path_geo.append(geo)
                                 path_geo.append(geo)
                             except ValueError:
                             except ValueError:
                                 pass
                                 pass

+ 108 - 104
flatcamTools/ToolPaint.py

@@ -7,14 +7,14 @@
 # ########################################################## ##
 # ########################################################## ##
 
 
 from FlatCAMTool import FlatCAMTool
 from FlatCAMTool import FlatCAMTool
-from copy import copy,deepcopy
+from copy import copy, deepcopy
 from ObjectCollection import *
 from ObjectCollection import *
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -65,11 +65,11 @@ class ToolPaint(FlatCAMTool, Gerber):
         form_layout.addRow(self.object_label, self.object_combo)
         form_layout.addRow(self.object_label, self.object_combo)
         form_layout.addRow(e_lab_0)
         form_layout.addRow(e_lab_0)
 
 
-        #### Tools ## ##
+        # ### Tools ## ##
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label.setToolTip(
         self.tools_table_label.setToolTip(
             _("Tools pool from which the algorithm\n"
             _("Tools pool from which the algorithm\n"
-            "will pick the ones used for painting.")
+              "will pick the ones used for painting.")
         )
         )
         self.tools_box.addWidget(self.tools_table_label)
         self.tools_box.addWidget(self.tools_table_label)
 
 
@@ -84,33 +84,33 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
         self.tools_table.horizontalHeaderItem(0).setToolTip(
         self.tools_table.horizontalHeaderItem(0).setToolTip(
             _("This is the Tool Number.\n"
             _("This is the Tool Number.\n"
-            "Painting will start with the tool with the biggest diameter,\n"
-            "continuing until there are no more tools.\n"
-            "Only tools that create painting geometry will still be present\n"
-            "in the resulting geometry. This is because with some tools\n"
-            "this function will not be able to create painting geometry.")
+              "Painting will start with the tool with the biggest diameter,\n"
+              "continuing until there are no more tools.\n"
+              "Only tools that create painting geometry will still be present\n"
+              "in the resulting geometry. This is because with some tools\n"
+              "this function will not be able to create painting geometry.")
             )
             )
         self.tools_table.horizontalHeaderItem(1).setToolTip(
         self.tools_table.horizontalHeaderItem(1).setToolTip(
             _("Tool Diameter. It's value (in current FlatCAM units) \n"
             _("Tool Diameter. It's value (in current FlatCAM units) \n"
-            "is the cut width into the material."))
+              "is the cut width into the material."))
 
 
         self.tools_table.horizontalHeaderItem(2).setToolTip(
         self.tools_table.horizontalHeaderItem(2).setToolTip(
             _("The Tool Type (TT) can be:<BR>"
             _("The Tool Type (TT) can be:<BR>"
-            "- <B>Circular</B> with 1 ... 4 teeth -> it is informative only. Being circular, <BR>"
-            "the cut width in material is exactly the tool diameter.<BR>"
-            "- <B>Ball</B> -> informative only and make reference to the Ball type endmill.<BR>"
-            "- <B>V-Shape</B> -> it will disable de Z-Cut parameter in the resulting geometry UI form "
-            "and enable two additional UI form fields in the resulting geometry: V-Tip Dia and "
-            "V-Tip Angle. Adjusting those two values will adjust the Z-Cut parameter such "
-            "as the cut width into material will be equal with the value in the Tool Diameter "
-            "column of this table.<BR>"
-            "Choosing the <B>V-Shape</B> Tool Type automatically will select the Operation Type "
-            "in the resulting geometry as Isolation."))
+              "- <B>Circular</B> with 1 ... 4 teeth -> it is informative only. Being circular, <BR>"
+              "the cut width in material is exactly the tool diameter.<BR>"
+              "- <B>Ball</B> -> informative only and make reference to the Ball type endmill.<BR>"
+              "- <B>V-Shape</B> -> it will disable de Z-Cut parameter in the resulting geometry UI form "
+              "and enable two additional UI form fields in the resulting geometry: V-Tip Dia and "
+              "V-Tip Angle. Adjusting those two values will adjust the Z-Cut parameter such "
+              "as the cut width into material will be equal with the value in the Tool Diameter "
+              "column of this table.<BR>"
+              "Choosing the <B>V-Shape</B> Tool Type automatically will select the Operation Type "
+              "in the resulting geometry as Isolation."))
 
 
         self.empty_label = QtWidgets.QLabel('')
         self.empty_label = QtWidgets.QLabel('')
         self.tools_box.addWidget(self.empty_label)
         self.tools_box.addWidget(self.empty_label)
 
 
-        #### Add a new Tool ## ##
+        # ### Add a new Tool ## ##
         hlay = QtWidgets.QHBoxLayout()
         hlay = QtWidgets.QHBoxLayout()
         self.tools_box.addLayout(hlay)
         self.tools_box.addLayout(hlay)
 
 
@@ -131,7 +131,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn.setToolTip(
         self.addtool_btn.setToolTip(
             _("Add a new tool to the Tool Table\n"
             _("Add a new tool to the Tool Table\n"
-            "with the diameter specified above.")
+              "with the diameter specified above.")
         )
         )
 
 
         # self.copytool_btn = QtWidgets.QPushButton('Copy')
         # self.copytool_btn = QtWidgets.QPushButton('Copy')
@@ -143,12 +143,12 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn.setToolTip(
         self.deltool_btn.setToolTip(
             _("Delete a selection of tools in the Tool Table\n"
             _("Delete a selection of tools in the Tool Table\n"
-            "by first selecting a row(s) in the Tool Table.")
+              "by first selecting a row(s) in the Tool Table.")
         )
         )
 
 
         grid2.addWidget(self.addtool_btn, 0, 0)
         grid2.addWidget(self.addtool_btn, 0, 0)
         # grid2.addWidget(self.copytool_btn, 0, 1)
         # grid2.addWidget(self.copytool_btn, 0, 1)
-        grid2.addWidget(self.deltool_btn, 0,2)
+        grid2.addWidget(self.deltool_btn, 0, 2)
 
 
         self.empty_label_0 = QtWidgets.QLabel('')
         self.empty_label_0 = QtWidgets.QLabel('')
         self.tools_box.addWidget(self.empty_label_0)
         self.tools_box.addWidget(self.empty_label_0)
@@ -177,8 +177,8 @@ class ToolPaint(FlatCAMTool, Gerber):
         marginlabel = QtWidgets.QLabel(_('Margin:'))
         marginlabel = QtWidgets.QLabel(_('Margin:'))
         marginlabel.setToolTip(
         marginlabel.setToolTip(
             _("Distance by which to avoid\n"
             _("Distance by which to avoid\n"
-            "the edges of the polygon to\n"
-            "be painted.")
+              "the edges of the polygon to\n"
+              "be painted.")
         )
         )
         grid3.addWidget(marginlabel, 2, 0)
         grid3.addWidget(marginlabel, 2, 0)
         self.paintmargin_entry = FCEntry()
         self.paintmargin_entry = FCEntry()
@@ -188,15 +188,15 @@ class ToolPaint(FlatCAMTool, Gerber):
         methodlabel = QtWidgets.QLabel(_('Method:'))
         methodlabel = QtWidgets.QLabel(_('Method:'))
         methodlabel.setToolTip(
         methodlabel.setToolTip(
             _("Algorithm for non-copper clearing:<BR>"
             _("Algorithm for non-copper clearing:<BR>"
-            "<B>Standard</B>: Fixed step inwards.<BR>"
-            "<B>Seed-based</B>: Outwards from seed.<BR>"
-            "<B>Line-based</B>: Parallel lines.")
+              "<B>Standard</B>: Fixed step inwards.<BR>"
+              "<B>Seed-based</B>: Outwards from seed.<BR>"
+              "<B>Line-based</B>: Parallel lines.")
         )
         )
         grid3.addWidget(methodlabel, 3, 0)
         grid3.addWidget(methodlabel, 3, 0)
         self.paintmethod_combo = RadioSet([
         self.paintmethod_combo = RadioSet([
-            {"label": "Standard", "value": "standard"},
-            {"label": "Seed-based", "value": "seed"},
-            {"label": "Straight lines", "value": "lines"}
+            {"label": _("Standard"), "value": "standard"},
+            {"label": _("Seed-based"), "value": "seed"},
+            {"label": _("Straight lines"), "value": "lines"}
         ], orientation='vertical', stretch=False)
         ], orientation='vertical', stretch=False)
         grid3.addWidget(self.paintmethod_combo, 3, 1)
         grid3.addWidget(self.paintmethod_combo, 3, 1)
 
 
@@ -204,7 +204,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         pathconnectlabel = QtWidgets.QLabel(_("Connect:"))
         pathconnectlabel = QtWidgets.QLabel(_("Connect:"))
         pathconnectlabel.setToolTip(
         pathconnectlabel.setToolTip(
             _("Draw lines between resulting\n"
             _("Draw lines between resulting\n"
-            "segments to minimize tool lifts.")
+              "segments to minimize tool lifts.")
         )
         )
         grid3.addWidget(pathconnectlabel, 4, 0)
         grid3.addWidget(pathconnectlabel, 4, 0)
         self.pathconnect_cb = FCCheckBox()
         self.pathconnect_cb = FCCheckBox()
@@ -213,7 +213,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         contourlabel = QtWidgets.QLabel(_("Contour:"))
         contourlabel = QtWidgets.QLabel(_("Contour:"))
         contourlabel.setToolTip(
         contourlabel.setToolTip(
             _("Cut around the perimeter of the polygon\n"
             _("Cut around the perimeter of the polygon\n"
-            "to trim rough edges.")
+              "to trim rough edges.")
         )
         )
         grid3.addWidget(contourlabel, 5, 0)
         grid3.addWidget(contourlabel, 5, 0)
         self.paintcontour_cb = FCCheckBox()
         self.paintcontour_cb = FCCheckBox()
@@ -222,12 +222,12 @@ class ToolPaint(FlatCAMTool, Gerber):
         restlabel = QtWidgets.QLabel(_("Rest M.:"))
         restlabel = QtWidgets.QLabel(_("Rest M.:"))
         restlabel.setToolTip(
         restlabel.setToolTip(
             _("If checked, use 'rest machining'.\n"
             _("If checked, use 'rest machining'.\n"
-            "Basically it will clear copper outside PCB features,\n"
-            "using the biggest tool and continue with the next tools,\n"
-            "from bigger to smaller, to clear areas of copper that\n"
-            "could not be cleared by previous tool, until there is\n"
-            "no more copper to clear or there are no more tools.\n\n"
-            "If not checked, use the standard algorithm.")
+              "Basically it will clear copper outside PCB features,\n"
+              "using the biggest tool and continue with the next tools,\n"
+              "from bigger to smaller, to clear areas of copper that\n"
+              "could not be cleared by previous tool, until there is\n"
+              "no more copper to clear or there are no more tools.\n\n"
+              "If not checked, use the standard algorithm.")
         )
         )
         grid3.addWidget(restlabel, 6, 0)
         grid3.addWidget(restlabel, 6, 0)
         self.rest_cb = FCCheckBox()
         self.rest_cb = FCCheckBox()
@@ -237,15 +237,15 @@ class ToolPaint(FlatCAMTool, Gerber):
         selectlabel = QtWidgets.QLabel(_('Selection:'))
         selectlabel = QtWidgets.QLabel(_('Selection:'))
         selectlabel.setToolTip(
         selectlabel.setToolTip(
             _("How to select the polygons to paint.<BR>"
             _("How to select the polygons to paint.<BR>"
-            "Options:<BR>"
-            "- <B>Single</B>: left mouse click on the polygon to be painted.<BR>"
-            "- <B>All</B>: paint all polygons.")
+              "Options:<BR>"
+              "- <B>Single</B>: left mouse click on the polygon to be painted.<BR>"
+              "- <B>All</B>: paint all polygons.")
         )
         )
         grid3.addWidget(selectlabel, 7, 0)
         grid3.addWidget(selectlabel, 7, 0)
         # grid3 = QtWidgets.QGridLayout()
         # grid3 = QtWidgets.QGridLayout()
         self.selectmethod_combo = RadioSet([
         self.selectmethod_combo = RadioSet([
-            {"label": "Single", "value": "single"},
-            {"label": "All", "value": "all"},
+            {"label": _("Single"), "value": "single"},
+            {"label": _("All"), "value": "all"},
             # {"label": "Rectangle", "value": "rectangle"}
             # {"label": "Rectangle", "value": "rectangle"}
         ])
         ])
         grid3.addWidget(self.selectmethod_combo, 7, 1)
         grid3.addWidget(self.selectmethod_combo, 7, 1)
@@ -254,10 +254,10 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.generate_paint_button = QtWidgets.QPushButton(_('Create Paint Geometry'))
         self.generate_paint_button = QtWidgets.QPushButton(_('Create Paint Geometry'))
         self.generate_paint_button.setToolTip(
         self.generate_paint_button.setToolTip(
             _("After clicking here, click inside<BR>"
             _("After clicking here, click inside<BR>"
-            "the polygon you wish to be painted if <B>Single</B> is selected.<BR>"
-            "If <B>All</B>  is selected then the Paint will start after click.<BR>"
-            "A new Geometry object with the tool<BR>"
-            "paths will be created.")
+              "the polygon you wish to be painted if <B>Single</B> is selected.<BR>"
+              "If <B>All</B>  is selected then the Paint will start after click.<BR>"
+              "A new Geometry object with the tool<BR>"
+              "paths will be created.")
         )
         )
         self.tools_box.addWidget(self.generate_paint_button)
         self.tools_box.addWidget(self.generate_paint_button)
 
 
@@ -314,7 +314,6 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.generate_paint_button.clicked.connect(self.on_paint_button_click)
         self.generate_paint_button.clicked.connect(self.on_paint_button_click)
         self.selectmethod_combo.activated_custom.connect(self.on_radio_selection)
         self.selectmethod_combo.activated_custom.connect(self.on_radio_selection)
 
 
-
     def install(self, icon=None, separator=None, **kwargs):
     def install(self, icon=None, separator=None, **kwargs):
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+P', **kwargs)
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+P', **kwargs)
 
 
@@ -430,7 +429,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.on_tool_add(self.app.defaults["tools_painttooldia"], muted=True)
         self.on_tool_add(self.app.defaults["tools_painttooldia"], muted=True)
 
 
         # if the Paint Method is "Single" disable the tool table context menu
         # if the Paint Method is "Single" disable the tool table context menu
-        if  self.default_data["selectmethod"] == "single":
+        if self.default_data["selectmethod"] == "single":
             self.tools_table.setContextMenuPolicy(Qt.NoContextMenu)
             self.tools_table.setContextMenuPolicy(Qt.NoContextMenu)
 
 
     def build_ui(self):
     def build_ui(self):
@@ -522,8 +521,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
         try:
         try:
             self.tools_table.itemChanged.disconnect()
             self.tools_table.itemChanged.disconnect()
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolPaint.on_tool_add() --> %s" % str(e))
 
 
         if dia:
         if dia:
             tool_dia = dia
             tool_dia = dia
@@ -586,10 +585,12 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.build_ui()
         self.build_ui()
 
 
     def on_tool_edit(self):
     def on_tool_edit(self):
+        old_tool_dia = ''
+
         try:
         try:
             self.tools_table.itemChanged.disconnect()
             self.tools_table.itemChanged.disconnect()
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolPaint.on_tool_edit() --> %s" % str(e))
 
 
         tool_dias = []
         tool_dias = []
         for k, v in self.paint_tools.items():
         for k, v in self.paint_tools.items():
@@ -624,7 +625,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                         break
                         break
                 restore_dia_item = self.tools_table.item(row, 1)
                 restore_dia_item = self.tools_table.item(row, 1)
                 restore_dia_item.setText(str(old_tool_dia))
                 restore_dia_item.setText(str(old_tool_dia))
-                self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table."))
+                self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. "
+                                       "New diameter value is already in the Tool Table."))
         self.build_ui()
         self.build_ui()
 
 
     # def on_tool_copy(self, all=None):
     # def on_tool_copy(self, all=None):
@@ -685,7 +687,8 @@ class ToolPaint(FlatCAMTool, Gerber):
     def on_tool_delete(self, rows_to_delete=None, all=None):
     def on_tool_delete(self, rows_to_delete=None, all=None):
         try:
         try:
             self.tools_table.itemChanged.disconnect()
             self.tools_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
+            log.debug("ToolPaint.on_tool_delete() --> %s" % str(e))
             pass
             pass
 
 
         deleted_tools_list = []
         deleted_tools_list = []
@@ -741,12 +744,12 @@ class ToolPaint(FlatCAMTool, Gerber):
                 overlap = float(self.paintoverlap_entry.get_value().replace(',', '.'))
                 overlap = float(self.paintoverlap_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         if overlap >= 1 or overlap < 0:
         if overlap >= 1 or overlap < 0:
             self.app.inform.emit(_("[ERROR_NOTCL] Overlap value must be between "
             self.app.inform.emit(_("[ERROR_NOTCL] Overlap value must be between "
-                                  "0 (inclusive) and 1 (exclusive), "))
+                                   "0 (inclusive) and 1 (exclusive), "))
             return
             return
 
 
         self.app.inform.emit(_("[WARNING_NOTCL] Click inside the desired polygon."))
         self.app.inform.emit(_("[WARNING_NOTCL] Click inside the desired polygon."))
@@ -760,7 +763,8 @@ class ToolPaint(FlatCAMTool, Gerber):
         # Get source object.
         # Get source object.
         try:
         try:
             self.paint_obj = self.app.collection.get_by_name(str(self.obj_name))
             self.paint_obj = self.app.collection.get_by_name(str(self.obj_name))
-        except:
+        except Exception as e:
+            log.debug("ToolPaint.on_paint_button_click() --> %s" % str(e))
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             return
             return
 
 
@@ -774,7 +778,7 @@ class ToolPaint(FlatCAMTool, Gerber):
             self.app.inform.emit(_("[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..."))
             self.app.inform.emit(_("[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..."))
             return 'Fail'
             return 'Fail'
 
 
-        o_name = '%s_multitool_paint' % (self.obj_name)
+        o_name = '%s_multitool_paint' % self.obj_name
 
 
         if select_method == "all":
         if select_method == "all":
             self.paint_poly_all(self.paint_obj,
             self.paint_poly_all(self.paint_obj,
@@ -811,15 +815,13 @@ class ToolPaint(FlatCAMTool, Gerber):
             self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot)
             self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot)
             self.app.plotcanvas.vis_connect('mouse_press', doit)
             self.app.plotcanvas.vis_connect('mouse_press', doit)
 
 
-    def paint_poly(self, obj, inside_pt, tooldia, overlap,
-                    outname=None, connect=True,
-                    contour=True):
+    def paint_poly(self, obj, inside_pt, tooldia, overlap, outname=None, connect=True, contour=True):
         """
         """
         Paints a polygon selected by clicking on its interior.
         Paints a polygon selected by clicking on its interior.
 
 
         Note:
         Note:
             * The margin is taken directly from the form.
             * The margin is taken directly from the form.
-
+        :param obj: painted object
         :param inside_pt: [x, y]
         :param inside_pt: [x, y]
         :param tooldia: Diameter of the painting tool
         :param tooldia: Diameter of the painting tool
         :param overlap: Overlap of the tool between passes.
         :param overlap: Overlap of the tool between passes.
@@ -864,34 +866,34 @@ class ToolPaint(FlatCAMTool, Gerber):
             def paint_p(polyg):
             def paint_p(polyg):
                 if paint_method == "seed":
                 if paint_method == "seed":
                     # Type(cp) == FlatCAMRTreeStorage | None
                     # Type(cp) == FlatCAMRTreeStorage | None
-                    cp = self.clear_polygon2(polyg,
-                                             tooldia=tooldia,
-                                             steps_per_circle=self.app.defaults["geometry_circle_steps"],
-                                             overlap=overlap,
-                                             contour=contour,
-                                             connect=connect)
+                    cpoly = self.clear_polygon2(polyg,
+                                                tooldia=tooldia,
+                                                steps_per_circle=self.app.defaults["geometry_circle_steps"],
+                                                overlap=overlap,
+                                                contour=contour,
+                                                connect=connect)
 
 
                 elif paint_method == "lines":
                 elif paint_method == "lines":
                     # Type(cp) == FlatCAMRTreeStorage | None
                     # Type(cp) == FlatCAMRTreeStorage | None
-                    cp = self.clear_polygon3(polyg,
-                                             tooldia=tooldia,
-                                             steps_per_circle=self.app.defaults["geometry_circle_steps"],
-                                             overlap=overlap,
-                                             contour=contour,
-                                             connect=connect)
+                    cpoly = self.clear_polygon3(polyg,
+                                                tooldia=tooldia,
+                                                steps_per_circle=self.app.defaults["geometry_circle_steps"],
+                                                overlap=overlap,
+                                                contour=contour,
+                                                connect=connect)
 
 
                 else:
                 else:
                     # Type(cp) == FlatCAMRTreeStorage | None
                     # Type(cp) == FlatCAMRTreeStorage | None
-                    cp = self.clear_polygon(polyg,
-                                             tooldia=tooldia,
-                                             steps_per_circle=self.app.defaults["geometry_circle_steps"],
-                                             overlap=overlap,
-                                             contour=contour,
-                                             connect=connect)
-
-                if cp is not None:
-                    geo_obj.solid_geometry += list(cp.get_objects())
-                    return cp
+                    cpoly = self.clear_polygon(polyg,
+                                               tooldia=tooldia,
+                                               steps_per_circle=self.app.defaults["geometry_circle_steps"],
+                                               overlap=overlap,
+                                               contour=contour,
+                                               connect=connect)
+
+                if cpoly is not None:
+                    geo_obj.solid_geometry += list(cpoly.get_objects())
+                    return cpoly
                 else:
                 else:
                     self.app.inform.emit(_('[ERROR_NOTCL] Geometry could not be painted completely'))
                     self.app.inform.emit(_('[ERROR_NOTCL] Geometry could not be painted completely'))
                     return None
                     return None
@@ -975,12 +977,11 @@ class ToolPaint(FlatCAMTool, Gerber):
         # Background
         # Background
         self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
         self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
 
 
-    def paint_poly_all(self, obj, overlap, outname=None,
-                       connect=True, contour=True):
+    def paint_poly_all(self, obj, overlap, outname=None, connect=True, contour=True):
         """
         """
         Paints all polygons in this object.
         Paints all polygons in this object.
 
 
-        :param tooldia:
+        :param obj: painted object
         :param overlap:
         :param overlap:
         :param outname:
         :param outname:
         :param connect: Connect lines to avoid tool lifts.
         :param connect: Connect lines to avoid tool lifts.
@@ -1055,6 +1056,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         def gen_paintarea(geo_obj, app_obj):
         def gen_paintarea(geo_obj, app_obj):
             assert isinstance(geo_obj, FlatCAMGeometry), \
             assert isinstance(geo_obj, FlatCAMGeometry), \
                 "Initializer expected a FlatCAMGeometry, got %s" % type(geo_obj)
                 "Initializer expected a FlatCAMGeometry, got %s" % type(geo_obj)
+            tool_dia = None
 
 
             sorted_tools = []
             sorted_tools = []
             for row in range(self.tools_table.rowCount()):
             for row in range(self.tools_table.rowCount()):
@@ -1083,7 +1085,7 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
                 for geo in recurse(obj.solid_geometry):
                 for geo in recurse(obj.solid_geometry):
                     try:
                     try:
-                        #Polygons are the only really paintable geometries, lines in theory have no area to be painted
+                        # Polygons are the only really paintable geometries, lines in theory have no area to be painted
                         if not isinstance(geo, Polygon):
                         if not isinstance(geo, Polygon):
                             continue
                             continue
                         poly_buf = geo.buffer(-paint_margin)
                         poly_buf = geo.buffer(-paint_margin)
@@ -1109,11 +1111,11 @@ class ToolPaint(FlatCAMTool, Gerber):
                         else:
                         else:
                             # Type(cp) == FlatCAMRTreeStorage | None
                             # Type(cp) == FlatCAMRTreeStorage | None
                             cp = self.clear_polygon(poly_buf,
                             cp = self.clear_polygon(poly_buf,
-                                                     tooldia=tool_dia,
-                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
-                                                     overlap=over,
-                                                     contour=cont,
-                                                     connect=conn)
+                                                    tooldia=tool_dia,
+                                                    steps_per_circle=self.app.defaults["geometry_circle_steps"],
+                                                    overlap=over,
+                                                    contour=cont,
+                                                    connect=conn)
 
 
                         if cp is not None:
                         if cp is not None:
                             total_geometry += list(cp.get_objects())
                             total_geometry += list(cp.get_objects())
@@ -1121,7 +1123,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                         log.debug("Could not Paint the polygons. %s" % str(e))
                         log.debug("Could not Paint the polygons. %s" % str(e))
                         self.app.inform.emit(
                         self.app.inform.emit(
                             _("[ERROR] Could not do Paint All. Try a different combination of parameters. "
                             _("[ERROR] Could not do Paint All. Try a different combination of parameters. "
-                            "Or a different Method of paint\n%s") % str(e))
+                              "Or a different Method of paint\n%s") % str(e))
                         return
                         return
 
 
                 # add the solid_geometry to the current too in self.paint_tools dictionary and then reset the
                 # add the solid_geometry to the current too in self.paint_tools dictionary and then reset the
@@ -1160,6 +1162,7 @@ class ToolPaint(FlatCAMTool, Gerber):
             assert isinstance(geo_obj, FlatCAMGeometry), \
             assert isinstance(geo_obj, FlatCAMGeometry), \
                 "Initializer expected a FlatCAMGeometry, got %s" % type(geo_obj)
                 "Initializer expected a FlatCAMGeometry, got %s" % type(geo_obj)
 
 
+            tool_dia = None
             sorted_tools = []
             sorted_tools = []
             for row in range(self.tools_table.rowCount()):
             for row in range(self.tools_table.rowCount()):
                 sorted_tools.append(float(self.tools_table.item(row, 1).text()))
                 sorted_tools.append(float(self.tools_table.item(row, 1).text()))
@@ -1184,12 +1187,13 @@ class ToolPaint(FlatCAMTool, Gerber):
                     try:
                     try:
                         geo = Polygon(geo) if not isinstance(geo, Polygon) else geo
                         geo = Polygon(geo) if not isinstance(geo, Polygon) else geo
                         poly_buf = geo.buffer(-paint_margin)
                         poly_buf = geo.buffer(-paint_margin)
+                        cp = None
 
 
                         if paint_method == "standard":
                         if paint_method == "standard":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             # Type(cp) == FlatCAMRTreeStorage | None
                             cp = self.clear_polygon(poly_buf, tooldia=tool_dia,
                             cp = self.clear_polygon(poly_buf, tooldia=tool_dia,
-                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
-                                                     overlap=over, contour=cont, connect=conn)
+                                                    steps_per_circle=self.app.defaults["geometry_circle_steps"],
+                                                    overlap=over, contour=cont, connect=conn)
 
 
                         elif paint_method == "seed":
                         elif paint_method == "seed":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             # Type(cp) == FlatCAMRTreeStorage | None
@@ -1200,8 +1204,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                         elif paint_method == "lines":
                         elif paint_method == "lines":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             # Type(cp) == FlatCAMRTreeStorage | None
                             cp = self.clear_polygon3(poly_buf, tooldia=tool_dia,
                             cp = self.clear_polygon3(poly_buf, tooldia=tool_dia,
-                                                    steps_per_circle=self.app.defaults["geometry_circle_steps"],
-                                                    overlap=over, contour=cont, connect=conn)
+                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
+                                                     overlap=over, contour=cont, connect=conn)
 
 
                         if cp is not None:
                         if cp is not None:
                             cleared_geo += list(cp.get_objects())
                             cleared_geo += list(cp.get_objects())
@@ -1210,7 +1214,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                         log.debug("Could not Paint the polygons. %s" % str(e))
                         log.debug("Could not Paint the polygons. %s" % str(e))
                         self.app.inform.emit(
                         self.app.inform.emit(
                             _("[ERROR] Could not do Paint All. Try a different combination of parameters. "
                             _("[ERROR] Could not do Paint All. Try a different combination of parameters. "
-                            "Or a different Method of paint\n%s") % str(e))
+                              "Or a different Method of paint\n%s") % str(e))
                         return
                         return
 
 
                 # find the tooluid associated with the current tool_dia so we know where to add the tool solid_geometry
                 # find the tooluid associated with the current tool_dia so we know where to add the tool solid_geometry
@@ -1240,8 +1244,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                     has_solid_geo += 1
                     has_solid_geo += 1
             if has_solid_geo == 0:
             if has_solid_geo == 0:
                 self.app.inform.emit(_("[ERROR_NOTCL] There is no Painting Geometry in the file.\n"
                 self.app.inform.emit(_("[ERROR_NOTCL] There is no Painting Geometry in the file.\n"
-                                      "Usually it means that the tool diameter is too big for the painted geometry.\n"
-                                      "Change the painting parameters and try again."))
+                                       "Usually it means that the tool diameter is too big for the painted geometry.\n"
+                                       "Change the painting parameters and try again."))
                 return
                 return
 
 
             # Experimental...
             # Experimental...

+ 5 - 5
flatcamTools/ToolPanelize.py

@@ -81,8 +81,8 @@ class Panelize(FlatCAMTool):
         self.layout.addLayout(form_layout)
         self.layout.addLayout(form_layout)
 
 
         # Type of box Panel object
         # Type of box Panel object
-        self.reference_radio = RadioSet([{'label': 'Object', 'value': 'object'},
-                                         {'label': 'Bounding Box', 'value': 'bbox'}])
+        self.reference_radio = RadioSet([{'label': _('Object'), 'value': 'object'},
+                                         {'label': _('Bounding Box'), 'value': 'bbox'}])
         self.box_label = QtWidgets.QLabel(_("<b>Penelization Reference:</b>"))
         self.box_label = QtWidgets.QLabel(_("<b>Penelization Reference:</b>"))
         self.box_label.setToolTip(
         self.box_label.setToolTip(
             _("Choose the reference for panelization:\n"
             _("Choose the reference for panelization:\n"
@@ -178,8 +178,8 @@ class Panelize(FlatCAMTool):
         form_layout.addRow(QtWidgets.QLabel(""))
         form_layout.addRow(QtWidgets.QLabel(""))
 
 
         # Type of resulting Panel object
         # Type of resulting Panel object
-        self.panel_type_radio = RadioSet([{'label': 'Gerber', 'value': 'gerber'},
-                                          {'label': 'Geometry', 'value': 'geometry'}])
+        self.panel_type_radio = RadioSet([{'label': _('Gerber'), 'value': 'gerber'},
+                                          {'label': _('Geo'), 'value': 'geometry'}])
         self.panel_type_label = QtWidgets.QLabel(_("<b>Panel Type:</b>"))
         self.panel_type_label = QtWidgets.QLabel(_("<b>Panel Type:</b>"))
         self.panel_type_label.setToolTip(
         self.panel_type_label.setToolTip(
             _("Choose the type of object for the panel object:\n"
             _("Choose the type of object for the panel object:\n"
@@ -269,7 +269,7 @@ class Panelize(FlatCAMTool):
         FlatCAMTool.run(self)
         FlatCAMTool.run(self)
         self.set_tool_ui()
         self.set_tool_ui()
 
 
-        self.app.ui.notebook.setTabText(2, "Panel. Tool")
+        self.app.ui.notebook.setTabText(2, _("Panel. Tool"))
 
 
     def install(self, icon=None, separator=None, **kwargs):
     def install(self, icon=None, separator=None, **kwargs):
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+Z', **kwargs)
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+Z', **kwargs)

+ 21 - 23
flatcamTools/ToolPcbWizard.py

@@ -18,9 +18,9 @@ from io import StringIO
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -56,9 +56,8 @@ class PcbWizard(FlatCAMTool):
 
 
         self.excellon_label = QtWidgets.QLabel(_("Excellon file:"))
         self.excellon_label = QtWidgets.QLabel(_("Excellon file:"))
         self.excellon_label.setToolTip(
         self.excellon_label.setToolTip(
-           _( "Load the Excellon file.\n"
-              "Usually it has a .DRL extension")
-
+           _("Load the Excellon file.\n"
+             "Usually it has a .DRL extension")
         )
         )
         self.excellon_brn = FCButton(_("Open"))
         self.excellon_brn = FCButton(_("Open"))
         form_layout.addRow(self.excellon_label, self.excellon_brn)
         form_layout.addRow(self.excellon_label, self.excellon_brn)
@@ -66,7 +65,6 @@ class PcbWizard(FlatCAMTool):
         self.inf_label = QtWidgets.QLabel(_("INF file:"))
         self.inf_label = QtWidgets.QLabel(_("INF file:"))
         self.inf_label.setToolTip(
         self.inf_label.setToolTip(
             _("Load the INF file.")
             _("Load the INF file.")
-
         )
         )
         self.inf_btn = FCButton(_("Open"))
         self.inf_btn = FCButton(_("Open"))
         form_layout.addRow(self.inf_label, self.inf_btn)
         form_layout.addRow(self.inf_label, self.inf_btn)
@@ -96,7 +94,7 @@ class PcbWizard(FlatCAMTool):
         self.int_entry.set_range(1, 10)
         self.int_entry.set_range(1, 10)
         self.int_label = QtWidgets.QLabel(_("Int. digits:"))
         self.int_label = QtWidgets.QLabel(_("Int. digits:"))
         self.int_label.setToolTip(
         self.int_label.setToolTip(
-           _( "The number of digits for the integral part of the coordinates.")
+           _("The number of digits for the integral part of the coordinates.")
         )
         )
         form_layout1.addRow(self.int_label, self.int_entry)
         form_layout1.addRow(self.int_label, self.int_entry)
 
 
@@ -110,9 +108,9 @@ class PcbWizard(FlatCAMTool):
         form_layout1.addRow(self.frac_label, self.frac_entry)
         form_layout1.addRow(self.frac_label, self.frac_entry)
 
 
         # Zeros suppression for coordinates
         # Zeros suppression for coordinates
-        self.zeros_radio = RadioSet([{'label': 'LZ', 'value': 'LZ'},
-                                     {'label': 'TZ', 'value': 'TZ'},
-                                     {'label': 'No Suppression', 'value': 'D'}])
+        self.zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'LZ'},
+                                     {'label': _('TZ'), 'value': 'TZ'},
+                                     {'label': _('No Suppression'), 'value': 'D'}])
         self.zeros_label = QtWidgets.QLabel(_("Zeros supp.:"))
         self.zeros_label = QtWidgets.QLabel(_("Zeros supp.:"))
         self.zeros_label.setToolTip(
         self.zeros_label.setToolTip(
             _("The type of zeros suppression used.\n"
             _("The type of zeros suppression used.\n"
@@ -124,8 +122,8 @@ class PcbWizard(FlatCAMTool):
         form_layout1.addRow(self.zeros_label, self.zeros_radio)
         form_layout1.addRow(self.zeros_label, self.zeros_radio)
 
 
         # Units type
         # Units type
-        self.units_radio = RadioSet([{'label': 'INCH', 'value': 'INCH'},
-                                    {'label': 'MM', 'value': 'METRIC'}])
+        self.units_radio = RadioSet([{'label': _('INCH'), 'value': 'INCH'},
+                                    {'label': _('MM'), 'value': 'METRIC'}])
         self.units_label = QtWidgets.QLabel("<b>%s:</b>" % _('Units'))
         self.units_label = QtWidgets.QLabel("<b>%s:</b>" % _('Units'))
         self.units_label.setToolTip(
         self.units_label.setToolTip(
             _("The type of units that the coordinates and tool\n"
             _("The type of units that the coordinates and tool\n"
@@ -283,18 +281,17 @@ class PcbWizard(FlatCAMTool):
         """
         """
         self.app.log.debug("on_load_excellon_click()")
         self.app.log.debug("on_load_excellon_click()")
 
 
-        filter = "Excellon Files(*.DRL *.DRD *.TXT);;All Files (*.*)"
+        _filter = "Excellon Files(*.DRL *.DRD *.TXT);;All Files (*.*)"
         try:
         try:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"),
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"),
                                                                  directory=self.app.get_last_folder(),
                                                                  directory=self.app.get_last_folder(),
-                                                                 filter=filter)
+                                                                 filter=_filter)
         except TypeError:
         except TypeError:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"),
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"),
-                                                                 filter=filter)
+                                                                 filter=_filter)
 
 
         filename = str(filename)
         filename = str(filename)
 
 
-
         if filename == "":
         if filename == "":
             self.app.inform.emit(_("Open cancelled."))
             self.app.inform.emit(_("Open cancelled."))
         else:
         else:
@@ -307,14 +304,14 @@ class PcbWizard(FlatCAMTool):
                 """
                 """
         self.app.log.debug("on_load_inf_click()")
         self.app.log.debug("on_load_inf_click()")
 
 
-        filter = "INF Files(*.INF);;All Files (*.*)"
+        _filter = "INF Files(*.INF);;All Files (*.*)"
         try:
         try:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"),
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"),
                                                                  directory=self.app.get_last_folder(),
                                                                  directory=self.app.get_last_folder(),
-                                                                 filter=filter)
+                                                                 filter=_filter)
         except TypeError:
         except TypeError:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"),
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"),
-                                                                 filter=filter)
+                                                                 filter=_filter)
 
 
         filename = str(filename)
         filename = str(filename)
 
 
@@ -338,7 +335,7 @@ class PcbWizard(FlatCAMTool):
 
 
             match = tool_re.search(eline)
             match = tool_re.search(eline)
             if match:
             if match:
-                tool =int( match.group(1))
+                tool = int(match.group(1))
                 dia = float(match.group(2))
                 dia = float(match.group(2))
                 # if dia < 0.1:
                 # if dia < 0.1:
                 #     # most likely the file is in INCH
                 #     # most likely the file is in INCH
@@ -396,7 +393,7 @@ class PcbWizard(FlatCAMTool):
                               (str(self.app.version), str(self.app.version_date))
                               (str(self.app.version), str(self.app.version_date))
                     header += ';Created on : %s' % time_str + '\n'
                     header += ';Created on : %s' % time_str + '\n'
                     header += ';FILE_FORMAT={integral}:{fractional}\n'.format(integral=self.integral,
                     header += ';FILE_FORMAT={integral}:{fractional}\n'.format(integral=self.integral,
-                                                                               fractional=self.fractional)
+                                                                              fractional=self.fractional)
                     header += '{units},{zeros}\n'.format(units=self.units, zeros=self.zeros)
                     header += '{units},{zeros}\n'.format(units=self.units, zeros=self.zeros)
                     for k, v in self.tools_from_inf.items():
                     for k, v in self.tools_from_inf.items():
                         header += 'T{tool}C{dia}\n'.format(tool=int(k), dia=float(v))
                         header += 'T{tool}C{dia}\n'.format(tool=int(k), dia=float(v))
@@ -425,7 +422,8 @@ class PcbWizard(FlatCAMTool):
                 app_obj.log.debug("Could not import Excellon object.")
                 app_obj.log.debug("Could not import Excellon object.")
                 app_obj.progress.emit(0)
                 app_obj.progress.emit(0)
                 return "fail"
                 return "fail"
-            except:
+            except Exception as e:
+                app_obj.log.debug("PcbWizard.on_import_excellon().obj_init() %s" % str(e))
                 msg = _("[ERROR_NOTCL] An internal error has occurred. See shell.\n")
                 msg = _("[ERROR_NOTCL] An internal error has occurred. See shell.\n")
                 msg += app_obj.traceback.format_exc()
                 msg += app_obj.traceback.format_exc()
                 app_obj.inform.emit(msg)
                 app_obj.inform.emit(msg)
@@ -449,8 +447,8 @@ class PcbWizard(FlatCAMTool):
                     # Object name
                     # Object name
                     name = self.outname
                     name = self.outname
 
 
-                    ret = self.app.new_object("excellon", name, obj_init, autoselected=False)
-                    if ret == 'fail':
+                    ret_val = self.app.new_object("excellon", name, obj_init, autoselected=False)
+                    if ret_val == 'fail':
                         self.app.inform.emit(_('[ERROR_NOTCL] Import Excellon file failed.'))
                         self.app.inform.emit(_('[ERROR_NOTCL] Import Excellon file failed.'))
                         return
                         return
 
 

+ 14 - 6
flatcamTools/ToolProperties.py

@@ -13,9 +13,9 @@ from FlatCAMObj import *
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -49,7 +49,7 @@ class Properties(FlatCAMTool):
         self.properties_box.addWidget(title_label)
         self.properties_box.addWidget(title_label)
 
 
         # self.layout.setMargin(0)  # PyQt4
         # self.layout.setMargin(0)  # PyQt4
-        self.properties_box.setContentsMargins(0, 0, 0, 0) # PyQt5
+        self.properties_box.setContentsMargins(0, 0, 0, 0)  # PyQt5
 
 
         self.vlay = QtWidgets.QVBoxLayout()
         self.vlay = QtWidgets.QVBoxLayout()
 
 
@@ -62,7 +62,7 @@ class Properties(FlatCAMTool):
         self.treeWidget.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Expanding)
         self.treeWidget.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Expanding)
 
 
         self.vlay.addWidget(self.treeWidget)
         self.vlay.addWidget(self.treeWidget)
-        self.vlay.setStretch(0,0)
+        self.vlay.setStretch(0, 0)
 
 
     def run(self, toggle=True):
     def run(self, toggle=True):
         self.app.report_usage("ToolProperties()")
         self.app.report_usage("ToolProperties()")
@@ -130,9 +130,14 @@ class Properties(FlatCAMTool):
 
 
         self.addChild(obj_type, ['Object Type:', ('%s' % (obj.kind.capitalize()))], True)
         self.addChild(obj_type, ['Object Type:', ('%s' % (obj.kind.capitalize()))], True)
         try:
         try:
-            self.addChild(obj_type, ['Geo Type:', ('%s' % ({False: "Single-Geo", True: "Multi-Geo"}[obj.multigeo]))], True)
+            self.addChild(obj_type,
+                          ['Geo Type:',
+                           ('%s' % ({False: "Single-Geo", True: "Multi-Geo"}[obj.multigeo]))
+                           ],
+                          True
+                          )
         except Exception as e:
         except Exception as e:
-            pass
+            log.debug("Properties.addItems() --> %s" % str(e))
 
 
         self.addChild(obj_name, [obj.options['name']])
         self.addChild(obj_name, [obj.options['name']])
 
 
@@ -163,7 +168,10 @@ class Properties(FlatCAMTool):
                            'in': 'Inch',
                            'in': 'Inch',
                            'mm': 'Metric'
                            'mm': 'Metric'
                        }
                        }
-                       [str(self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower())]], True)
+                       [str(self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower())]
+                       ],
+                      True
+                      )
 
 
         for option in obj.options:
         for option in obj.options:
             if option is 'name':
             if option is 'name':

+ 1 - 1
flatcamTools/ToolShell.py

@@ -15,9 +15,9 @@ import html
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 

+ 67 - 64
flatcamTools/ToolSolderPaste.py

@@ -26,9 +26,9 @@ from io import StringIO
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -66,11 +66,11 @@ class SolderPaste(FlatCAMTool):
         )
         )
         obj_form_layout.addRow(self.object_label, self.obj_combo)
         obj_form_layout.addRow(self.object_label, self.obj_combo)
 
 
-        #### Tools ## ##
+        # ### Tools ## ##
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label.setToolTip(
         self.tools_table_label.setToolTip(
             _("Tools pool from which the algorithm\n"
             _("Tools pool from which the algorithm\n"
-            "will pick the ones used for dispensing solder paste.")
+              "will pick the ones used for dispensing solder paste.")
         )
         )
         self.layout.addWidget(self.tools_table_label)
         self.layout.addWidget(self.tools_table_label)
 
 
@@ -85,16 +85,16 @@ class SolderPaste(FlatCAMTool):
 
 
         self.tools_table.horizontalHeaderItem(0).setToolTip(
         self.tools_table.horizontalHeaderItem(0).setToolTip(
             _("This is the Tool Number.\n"
             _("This is the Tool Number.\n"
-            "The solder dispensing will start with the tool with the biggest \n"
-            "diameter, continuing until there are no more Nozzle tools.\n"
-            "If there are no longer tools but there are still pads not covered\n "
-            "with solder paste, the app will issue a warning message box.")
+              "The solder dispensing will start with the tool with the biggest \n"
+              "diameter, continuing until there are no more Nozzle tools.\n"
+              "If there are no longer tools but there are still pads not covered\n "
+              "with solder paste, the app will issue a warning message box.")
             )
             )
         self.tools_table.horizontalHeaderItem(1).setToolTip(
         self.tools_table.horizontalHeaderItem(1).setToolTip(
-           _( "Nozzle tool Diameter. It's value (in current FlatCAM units)\n"
-            "is the width of the solder paste dispensed."))
+           _("Nozzle tool Diameter. It's value (in current FlatCAM units)\n"
+             "is the width of the solder paste dispensed."))
 
 
-        #### Add a new Tool ## ##
+        # ### Add a new Tool ## ##
         hlay_tools = QtWidgets.QHBoxLayout()
         hlay_tools = QtWidgets.QHBoxLayout()
         self.layout.addLayout(hlay_tools)
         self.layout.addLayout(hlay_tools)
 
 
@@ -115,13 +115,13 @@ class SolderPaste(FlatCAMTool):
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn.setToolTip(
         self.addtool_btn.setToolTip(
             _("Add a new nozzle tool to the Tool Table\n"
             _("Add a new nozzle tool to the Tool Table\n"
-            "with the diameter specified above.")
+              "with the diameter specified above.")
         )
         )
 
 
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn.setToolTip(
         self.deltool_btn.setToolTip(
-           _( "Delete a selection of tools in the Tool Table\n"
-            "by first selecting a row(s) in the Tool Table.")
+           _("Delete a selection of tools in the Tool Table\n"
+             "by first selecting a row(s) in the Tool Table.")
         )
         )
 
 
         self.soldergeo_btn = QtWidgets.QPushButton(_("Generate Geo"))
         self.soldergeo_btn = QtWidgets.QPushButton(_("Generate Geo"))
@@ -142,10 +142,10 @@ class SolderPaste(FlatCAMTool):
         step1_lbl = QtWidgets.QLabel("<b>%s:</b>" % _('STEP 1:'))
         step1_lbl = QtWidgets.QLabel("<b>%s:</b>" % _('STEP 1:'))
         step1_lbl.setToolTip(
         step1_lbl.setToolTip(
             _("First step is to select a number of nozzle tools for usage\n"
             _("First step is to select a number of nozzle tools for usage\n"
-            "and then optionally modify the GCode parameters bellow.")
+              "and then optionally modify the GCode parameters bellow.")
         )
         )
         step1_description_lbl = QtWidgets.QLabel(_("Select tools.\n"
         step1_description_lbl = QtWidgets.QLabel(_("Select tools.\n"
-                                                 "Modify parameters."))
+                                                   "Modify parameters."))
 
 
         grid0_1.addWidget(step1_lbl, 0, 0, alignment=Qt.AlignTop)
         grid0_1.addWidget(step1_lbl, 0, 0, alignment=Qt.AlignTop)
         grid0_1.addWidget(step1_description_lbl, 0, 2, alignment=Qt.AlignBottom)
         grid0_1.addWidget(step1_description_lbl, 0, 2, alignment=Qt.AlignBottom)
@@ -174,7 +174,6 @@ class SolderPaste(FlatCAMTool):
         self.z_dispense_label = QtWidgets.QLabel(_("Z Dispense:"))
         self.z_dispense_label = QtWidgets.QLabel(_("Z Dispense:"))
         self.z_dispense_label.setToolTip(
         self.z_dispense_label.setToolTip(
             _("The height (Z) when doing solder paste dispensing.")
             _("The height (Z) when doing solder paste dispensing.")
-
         )
         )
         self.gcode_form_layout.addRow(self.z_dispense_label, self.z_dispense_entry)
         self.gcode_form_layout.addRow(self.z_dispense_label, self.z_dispense_entry)
 
 
@@ -190,8 +189,8 @@ class SolderPaste(FlatCAMTool):
         self.z_travel_entry = FCEntry()
         self.z_travel_entry = FCEntry()
         self.z_travel_label = QtWidgets.QLabel(_("Z Travel:"))
         self.z_travel_label = QtWidgets.QLabel(_("Z Travel:"))
         self.z_travel_label.setToolTip(
         self.z_travel_label.setToolTip(
-           _( "The height (Z) for travel between pads\n"
-            "(without dispensing solder paste).")
+           _("The height (Z) for travel between pads\n"
+             "(without dispensing solder paste).")
         )
         )
         self.gcode_form_layout.addRow(self.z_travel_label, self.z_travel_entry)
         self.gcode_form_layout.addRow(self.z_travel_label, self.z_travel_entry)
 
 
@@ -199,7 +198,7 @@ class SolderPaste(FlatCAMTool):
         self.z_toolchange_entry = FCEntry()
         self.z_toolchange_entry = FCEntry()
         self.z_toolchange_label = QtWidgets.QLabel(_("Z Toolchange:"))
         self.z_toolchange_label = QtWidgets.QLabel(_("Z Toolchange:"))
         self.z_toolchange_label.setToolTip(
         self.z_toolchange_label.setToolTip(
-           _( "The height (Z) for tool (nozzle) change.")
+           _("The height (Z) for tool (nozzle) change.")
         )
         )
         self.gcode_form_layout.addRow(self.z_toolchange_label, self.z_toolchange_entry)
         self.gcode_form_layout.addRow(self.z_toolchange_label, self.z_toolchange_entry)
 
 
@@ -208,7 +207,7 @@ class SolderPaste(FlatCAMTool):
         self.xy_toolchange_label = QtWidgets.QLabel(_("XY Toolchange:"))
         self.xy_toolchange_label = QtWidgets.QLabel(_("XY Toolchange:"))
         self.xy_toolchange_label.setToolTip(
         self.xy_toolchange_label.setToolTip(
             _("The X,Y location for tool (nozzle) change.\n"
             _("The X,Y location for tool (nozzle) change.\n"
-            "The format is (x, y) where x and y are real numbers.")
+              "The format is (x, y) where x and y are real numbers.")
         )
         )
         self.gcode_form_layout.addRow(self.xy_toolchange_label, self.xy_toolchange_entry)
         self.gcode_form_layout.addRow(self.xy_toolchange_label, self.xy_toolchange_entry)
 
 
@@ -216,7 +215,7 @@ class SolderPaste(FlatCAMTool):
         self.frxy_entry = FCEntry()
         self.frxy_entry = FCEntry()
         self.frxy_label = QtWidgets.QLabel(_("Feedrate X-Y:"))
         self.frxy_label = QtWidgets.QLabel(_("Feedrate X-Y:"))
         self.frxy_label.setToolTip(
         self.frxy_label.setToolTip(
-           _( "Feedrate (speed) while moving on the X-Y plane.")
+           _("Feedrate (speed) while moving on the X-Y plane.")
         )
         )
         self.gcode_form_layout.addRow(self.frxy_label, self.frxy_entry)
         self.gcode_form_layout.addRow(self.frxy_label, self.frxy_entry)
 
 
@@ -225,7 +224,7 @@ class SolderPaste(FlatCAMTool):
         self.frz_label = QtWidgets.QLabel(_("Feedrate Z:"))
         self.frz_label = QtWidgets.QLabel(_("Feedrate Z:"))
         self.frz_label.setToolTip(
         self.frz_label.setToolTip(
             _("Feedrate (speed) while moving vertically\n"
             _("Feedrate (speed) while moving vertically\n"
-            "(on Z plane).")
+              "(on Z plane).")
         )
         )
         self.gcode_form_layout.addRow(self.frz_label, self.frz_entry)
         self.gcode_form_layout.addRow(self.frz_label, self.frz_entry)
 
 
@@ -233,8 +232,8 @@ class SolderPaste(FlatCAMTool):
         self.frz_dispense_entry = FCEntry()
         self.frz_dispense_entry = FCEntry()
         self.frz_dispense_label = QtWidgets.QLabel(_("Feedrate Z Dispense:"))
         self.frz_dispense_label = QtWidgets.QLabel(_("Feedrate Z Dispense:"))
         self.frz_dispense_label.setToolTip(
         self.frz_dispense_label.setToolTip(
-           _( "Feedrate (speed) while moving up vertically\n"
-            " to Dispense position (on Z plane).")
+           _("Feedrate (speed) while moving up vertically\n"
+             " to Dispense position (on Z plane).")
         )
         )
         self.gcode_form_layout.addRow(self.frz_dispense_label, self.frz_dispense_entry)
         self.gcode_form_layout.addRow(self.frz_dispense_label, self.frz_dispense_entry)
 
 
@@ -242,8 +241,8 @@ class SolderPaste(FlatCAMTool):
         self.speedfwd_entry = FCEntry()
         self.speedfwd_entry = FCEntry()
         self.speedfwd_label = QtWidgets.QLabel(_("Spindle Speed FWD:"))
         self.speedfwd_label = QtWidgets.QLabel(_("Spindle Speed FWD:"))
         self.speedfwd_label.setToolTip(
         self.speedfwd_label.setToolTip(
-           _( "The dispenser speed while pushing solder paste\n"
-            "through the dispenser nozzle.")
+           _("The dispenser speed while pushing solder paste\n"
+             "through the dispenser nozzle.")
         )
         )
         self.gcode_form_layout.addRow(self.speedfwd_label, self.speedfwd_entry)
         self.gcode_form_layout.addRow(self.speedfwd_label, self.speedfwd_entry)
 
 
@@ -259,8 +258,8 @@ class SolderPaste(FlatCAMTool):
         self.speedrev_entry = FCEntry()
         self.speedrev_entry = FCEntry()
         self.speedrev_label = QtWidgets.QLabel(_("Spindle Speed REV:"))
         self.speedrev_label = QtWidgets.QLabel(_("Spindle Speed REV:"))
         self.speedrev_label.setToolTip(
         self.speedrev_label.setToolTip(
-           _( "The dispenser speed while retracting solder paste\n"
-            "through the dispenser nozzle.")
+           _("The dispenser speed while retracting solder paste\n"
+             "through the dispenser nozzle.")
         )
         )
         self.gcode_form_layout.addRow(self.speedrev_label, self.speedrev_entry)
         self.gcode_form_layout.addRow(self.speedrev_label, self.speedrev_entry)
 
 
@@ -269,7 +268,7 @@ class SolderPaste(FlatCAMTool):
         self.dwellrev_label = QtWidgets.QLabel(_("Dwell REV:"))
         self.dwellrev_label = QtWidgets.QLabel(_("Dwell REV:"))
         self.dwellrev_label.setToolTip(
         self.dwellrev_label.setToolTip(
             _("Pause after solder paste dispenser retracted,\n"
             _("Pause after solder paste dispenser retracted,\n"
-            "to allow pressure equilibrium.")
+              "to allow pressure equilibrium.")
         )
         )
         self.gcode_form_layout.addRow(self.dwellrev_label, self.dwellrev_entry)
         self.gcode_form_layout.addRow(self.dwellrev_label, self.dwellrev_entry)
 
 
@@ -289,8 +288,8 @@ class SolderPaste(FlatCAMTool):
 
 
         self.solder_gcode_btn = QtWidgets.QPushButton(_("Generate GCode"))
         self.solder_gcode_btn = QtWidgets.QPushButton(_("Generate GCode"))
         self.solder_gcode_btn.setToolTip(
         self.solder_gcode_btn.setToolTip(
-           _( "Generate GCode for Solder Paste dispensing\n"
-            "on PCB pads.")
+           _("Generate GCode for Solder Paste dispensing\n"
+             "on PCB pads.")
         )
         )
 
 
         self.generation_frame = QtWidgets.QFrame()
         self.generation_frame = QtWidgets.QFrame()
@@ -300,7 +299,6 @@ class SolderPaste(FlatCAMTool):
         self.generation_box.setContentsMargins(0, 0, 0, 0)
         self.generation_box.setContentsMargins(0, 0, 0, 0)
         self.generation_frame.setLayout(self.generation_box)
         self.generation_frame.setLayout(self.generation_box)
 
 
-
         # ## Buttons
         # ## Buttons
         grid2 = QtWidgets.QGridLayout()
         grid2 = QtWidgets.QGridLayout()
         self.generation_box.addLayout(grid2)
         self.generation_box.addLayout(grid2)
@@ -308,7 +306,7 @@ class SolderPaste(FlatCAMTool):
         step2_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 2:'))
         step2_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 2:'))
         step2_lbl.setToolTip(
         step2_lbl.setToolTip(
             _("Second step is to create a solder paste dispensing\n"
             _("Second step is to create a solder paste dispensing\n"
-            "geometry out of an Solder Paste Mask Gerber file.")
+              "geometry out of an Solder Paste Mask Gerber file.")
         )
         )
         grid2.addWidget(step2_lbl, 0, 0)
         grid2.addWidget(step2_lbl, 0, 0)
         grid2.addWidget(self.soldergeo_btn, 0, 2)
         grid2.addWidget(self.soldergeo_btn, 0, 2)
@@ -325,9 +323,9 @@ class SolderPaste(FlatCAMTool):
 
 
         self.geo_object_label = QtWidgets.QLabel(_("Geo Result:"))
         self.geo_object_label = QtWidgets.QLabel(_("Geo Result:"))
         self.geo_object_label.setToolTip(
         self.geo_object_label.setToolTip(
-           _( "Geometry Solder Paste object.\n"
-            "The name of the object has to end in:\n"
-            "'_solderpaste' as a protection.")
+           _("Geometry Solder Paste object.\n"
+             "The name of the object has to end in:\n"
+             "'_solderpaste' as a protection.")
         )
         )
         geo_form_layout.addRow(self.geo_object_label, self.geo_obj_combo)
         geo_form_layout.addRow(self.geo_object_label, self.geo_obj_combo)
 
 
@@ -336,11 +334,11 @@ class SolderPaste(FlatCAMTool):
 
 
         step3_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 3:'))
         step3_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 3:'))
         step3_lbl.setToolTip(
         step3_lbl.setToolTip(
-           _( "Third step is to select a solder paste dispensing geometry,\n"
-            "and then generate a CNCJob object.\n\n"
-            "REMEMBER: if you want to create a CNCJob with new parameters,\n"
-            "first you need to generate a geometry with those new params,\n"
-            "and only after that you can generate an updated CNCJob.")
+           _("Third step is to select a solder paste dispensing geometry,\n"
+             "and then generate a CNCJob object.\n\n"
+             "REMEMBER: if you want to create a CNCJob with new parameters,\n"
+             "first you need to generate a geometry with those new params,\n"
+             "and only after that you can generate an updated CNCJob.")
         )
         )
 
 
         grid3.addWidget(step3_lbl, 0, 0)
         grid3.addWidget(step3_lbl, 0, 0)
@@ -358,10 +356,10 @@ class SolderPaste(FlatCAMTool):
 
 
         self.cnc_object_label = QtWidgets.QLabel(_("CNC Result:"))
         self.cnc_object_label = QtWidgets.QLabel(_("CNC Result:"))
         self.cnc_object_label.setToolTip(
         self.cnc_object_label.setToolTip(
-           _( "CNCJob Solder paste object.\n"
-            "In order to enable the GCode save section,\n"
-            "the name of the object has to end in:\n"
-            "'_solderpaste' as a protection.")
+           _("CNCJob Solder paste object.\n"
+             "In order to enable the GCode save section,\n"
+             "the name of the object has to end in:\n"
+             "'_solderpaste' as a protection.")
         )
         )
         cnc_form_layout.addRow(self.cnc_object_label, self.cnc_obj_combo)
         cnc_form_layout.addRow(self.cnc_object_label, self.cnc_obj_combo)
 
 
@@ -371,19 +369,19 @@ class SolderPaste(FlatCAMTool):
         self.solder_gcode_view_btn = QtWidgets.QPushButton(_("View GCode"))
         self.solder_gcode_view_btn = QtWidgets.QPushButton(_("View GCode"))
         self.solder_gcode_view_btn.setToolTip(
         self.solder_gcode_view_btn.setToolTip(
             _("View the generated GCode for Solder Paste dispensing\n"
             _("View the generated GCode for Solder Paste dispensing\n"
-            "on PCB pads.")
+              "on PCB pads.")
         )
         )
 
 
         self.solder_gcode_save_btn = QtWidgets.QPushButton(_("Save GCode"))
         self.solder_gcode_save_btn = QtWidgets.QPushButton(_("Save GCode"))
         self.solder_gcode_save_btn.setToolTip(
         self.solder_gcode_save_btn.setToolTip(
-           _( "Save the generated GCode for Solder Paste dispensing\n"
-            "on PCB pads, to a file.")
+           _("Save the generated GCode for Solder Paste dispensing\n"
+             "on PCB pads, to a file.")
         )
         )
 
 
         step4_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 4:'))
         step4_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 4:'))
         step4_lbl.setToolTip(
         step4_lbl.setToolTip(
-           _( "Fourth step (and last) is to select a CNCJob made from \n"
-            "a solder paste dispensing geometry, and then view/save it's GCode.")
+           _("Fourth step (and last) is to select a CNCJob made from \n"
+             "a solder paste dispensing geometry, and then view/save it's GCode.")
         )
         )
 
 
         grid4.addWidget(step4_lbl, 0, 0)
         grid4.addWidget(step4_lbl, 0, 0)
@@ -402,6 +400,7 @@ class SolderPaste(FlatCAMTool):
         self.form_fields = {}
         self.form_fields = {}
 
 
         self.units = ''
         self.units = ''
+        self.name = ""
 
 
         # this will be used in the combobox context menu, for delete entry
         # this will be used in the combobox context menu, for delete entry
         self.obj_to_be_deleted_name = ''
         self.obj_to_be_deleted_name = ''
@@ -607,7 +606,6 @@ class SolderPaste(FlatCAMTool):
         if current_row < 0:
         if current_row < 0:
             current_row = 0
             current_row = 0
 
 
-
         # populate the form with the data from the tool associated with the row parameter
         # populate the form with the data from the tool associated with the row parameter
         try:
         try:
             tooluid = int(self.tools_table.item(current_row, 2).text())
             tooluid = int(self.tools_table.item(current_row, 2).text())
@@ -754,7 +752,7 @@ class SolderPaste(FlatCAMTool):
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number."))
+                                           "use a number."))
                     return
                     return
             if tool_dia is None:
             if tool_dia is None:
                 self.build_ui()
                 self.build_ui()
@@ -762,7 +760,8 @@ class SolderPaste(FlatCAMTool):
                 return
                 return
 
 
         if tool_dia == 0:
         if tool_dia == 0:
-            self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format."))
+            self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter with non-zero value, "
+                                   "in Float format."))
             return
             return
 
 
         # construct a list of all 'tooluid' in the self.tooltable_tools
         # construct a list of all 'tooluid' in the self.tooltable_tools
@@ -825,7 +824,7 @@ class SolderPaste(FlatCAMTool):
                     new_tool_dia = float(self.tools_table.item(row, 1).text().replace(',', '.'))
                     new_tool_dia = float(self.tools_table.item(row, 1).text().replace(',', '.'))
                 except ValueError:
                 except ValueError:
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number."))
+                                           "use a number."))
                     return
                     return
 
 
             tooluid = int(self.tools_table.item(row, 2).text())
             tooluid = int(self.tools_table.item(row, 2).text())
@@ -844,7 +843,8 @@ class SolderPaste(FlatCAMTool):
                         break
                         break
                 restore_dia_item = self.tools_table.item(row, 1)
                 restore_dia_item = self.tools_table.item(row, 1)
                 restore_dia_item.setText(str(old_tool_dia))
                 restore_dia_item.setText(str(old_tool_dia))
-                self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool Table."))
+                self.app.inform.emit(_("[WARNING_NOTCL] Edit cancelled. "
+                                       "New diameter value is already in the Tool Table."))
         self.build_ui()
         self.build_ui()
 
 
     def on_tool_delete(self, rows_to_delete=None, all=None):
     def on_tool_delete(self, rows_to_delete=None, all=None):
@@ -964,6 +964,7 @@ class SolderPaste(FlatCAMTool):
 
 
         :param name: the outname for the resulting geometry object
         :param name: the outname for the resulting geometry object
         :param work_object: the source Gerber object from which the geometry is created
         :param work_object: the source Gerber object from which the geometry is created
+        :param use_thread: use thread, True or False
         :return: a Geometry type object
         :return: a Geometry type object
         """
         """
         proc = self.app.proc_container.new(_("Creating Solder Paste dispensing geometry."))
         proc = self.app.proc_container.new(_("Creating Solder Paste dispensing geometry."))
@@ -1030,8 +1031,8 @@ class SolderPaste(FlatCAMTool):
 
 
             for tool in sorted_tools:
             for tool in sorted_tools:
                 offset = tool / 2
                 offset = tool / 2
-                for uid, v in self.tooltable_tools.items():
-                    if float('%.4f' % float(v['tooldia'])) == tool:
+                for uid, vl in self.tooltable_tools.items():
+                    if float('%.4f' % float(vl['tooldia'])) == tool:
                         tooluid = int(uid)
                         tooluid = int(uid)
                         break
                         break
 
 
@@ -1064,19 +1065,19 @@ class SolderPaste(FlatCAMTool):
                         round_diag_2 = round(diag_2_intersect.length, 2)
                         round_diag_2 = round(diag_2_intersect.length, 2)
 
 
                     if round_diag_1 == round_diag_2:
                     if round_diag_1 == round_diag_2:
-                        l = distance((x_min, y_min), (x_max, y_min))
+                        length = distance((x_min, y_min), (x_max, y_min))
                         h = distance((x_min, y_min), (x_min, y_max))
                         h = distance((x_min, y_min), (x_min, y_max))
 
 
-                        if offset >= l / 2 or offset >= h / 2:
+                        if offset >= length / 2 or offset >= h / 2:
                             pass
                             pass
                         else:
                         else:
-                            if l > h:
+                            if length > h:
                                 h_half = h / 2
                                 h_half = h / 2
                                 start = [x_min, (y_min + h_half)]
                                 start = [x_min, (y_min + h_half)]
-                                stop = [(x_min + l), (y_min + h_half)]
+                                stop = [(x_min + length), (y_min + h_half)]
                                 geo = LineString([start, stop])
                                 geo = LineString([start, stop])
                             else:
                             else:
-                                l_half = l / 2
+                                l_half = length / 2
                                 start = [(x_min + l_half), y_min]
                                 start = [(x_min + l_half), y_min]
                                 stop = [(x_min + l_half), (y_min + h)]
                                 stop = [(x_min + l_half), (y_min + h)]
                                 geo = LineString([start, stop])
                                 geo = LineString([start, stop])
@@ -1151,7 +1152,8 @@ class SolderPaste(FlatCAMTool):
             return 'fail'
             return 'fail'
 
 
         if obj.special_group != 'solder_paste_tool':
         if obj.special_group != 'solder_paste_tool':
-            self.app.inform.emit(_("[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool geometry."))
+            self.app.inform.emit(_("[WARNING_NOTCL] This Geometry can't be processed. "
+                                   "NOT a solder_paste_tool geometry."))
             return 'fail'
             return 'fail'
 
 
         a = 0
         a = 0
@@ -1314,7 +1316,8 @@ class SolderPaste(FlatCAMTool):
         # then append the text from GCode to the text editor
         # then append the text from GCode to the text editor
         try:
         try:
             lines = StringIO(gcode)
             lines = StringIO(gcode)
-        except:
+        except Exception as e:
+            log.debug("ToolSolderpaste.on_view_gcode() --> %s" % str(e))
             self.app.inform.emit(_("[ERROR_NOTCL] No Gcode in the object..."))
             self.app.inform.emit(_("[ERROR_NOTCL] No Gcode in the object..."))
             return
             return
 
 

+ 19 - 13
flatcamTools/ToolSub.py

@@ -155,7 +155,6 @@ class ToolSub(FlatCAMTool):
         self.sub_follow_union = None
         self.sub_follow_union = None
         self.sub_clear_union = None
         self.sub_clear_union = None
 
 
-
         self.sub_grb_obj = None
         self.sub_grb_obj = None
         self.sub_grb_obj_name = None
         self.sub_grb_obj_name = None
         self.target_grb_obj = None
         self.target_grb_obj = None
@@ -172,16 +171,18 @@ class ToolSub(FlatCAMTool):
         # store here the options from target_obj
         # store here the options from target_obj
         self.target_options = {}
         self.target_options = {}
 
 
+        self.sub_union = []
+
         try:
         try:
             self.intersect_btn.clicked.disconnect(self.on_grb_intersection_click)
             self.intersect_btn.clicked.disconnect(self.on_grb_intersection_click)
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolSub.__init__() --> %s" % str(e))
         self.intersect_btn.clicked.connect(self.on_grb_intersection_click)
         self.intersect_btn.clicked.connect(self.on_grb_intersection_click)
 
 
         try:
         try:
             self.intersect_geo_btn.clicked.disconnect()
             self.intersect_geo_btn.clicked.disconnect()
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolSub.__init__() --> %s" % str(e))
         self.intersect_geo_btn.clicked.connect(self.on_geo_intersection_click)
         self.intersect_geo_btn.clicked.connect(self.on_geo_intersection_click)
 
 
     def install(self, icon=None, separator=None, **kwargs):
     def install(self, icon=None, separator=None, **kwargs):
@@ -233,7 +234,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         # Get source object.
         try:
         try:
             self.target_grb_obj = self.app.collection.get_by_name(self.target_grb_obj_name)
             self.target_grb_obj = self.app.collection.get_by_name(self.target_grb_obj_name)
-        except:
+        except Exception as e:
+            log.debug("ToolSub.on_grb_intersection_click() --> %s" % str(e))
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             return "Could not retrieve object: %s" % self.target_grb_obj_name
             return "Could not retrieve object: %s" % self.target_grb_obj_name
 
 
@@ -245,7 +247,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         # Get source object.
         try:
         try:
             self.sub_grb_obj = self.app.collection.get_by_name(self.sub_grb_obj_name)
             self.sub_grb_obj = self.app.collection.get_by_name(self.sub_grb_obj_name)
-        except:
+        except Exception as e:
+            log.debug("ToolSub.on_grb_intersection_click() --> %s" % str(e))
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.obj_name)
             return "Could not retrieve object: %s" % self.sub_grb_obj_name
             return "Could not retrieve object: %s" % self.sub_grb_obj_name
 
 
@@ -424,7 +427,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         # Get source object.
         try:
         try:
             self.target_geo_obj = self.app.collection.get_by_name(self.target_geo_obj_name)
             self.target_geo_obj = self.app.collection.get_by_name(self.target_geo_obj_name)
-        except:
+        except Exception as e:
+            log.debug("ToolSub.on_geo_intersection_click() --> %s" % str(e))
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.target_geo_obj_name)
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.target_geo_obj_name)
             return "Could not retrieve object: %s" % self.target_grb_obj_name
             return "Could not retrieve object: %s" % self.target_grb_obj_name
 
 
@@ -436,7 +440,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         # Get source object.
         try:
         try:
             self.sub_geo_obj = self.app.collection.get_by_name(self.sub_geo_obj_name)
             self.sub_geo_obj = self.app.collection.get_by_name(self.sub_geo_obj_name)
-        except:
+        except Exception as e:
+            log.debug("ToolSub.on_geo_intersection_click() --> %s" % str(e))
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.sub_geo_obj_name)
             self.app.inform.emit(_("[ERROR_NOTCL] Could not retrieve object: %s") % self.sub_geo_obj_name)
             return "Could not retrieve object: %s" % self.sub_geo_obj_name
             return "Could not retrieve object: %s" % self.sub_geo_obj_name
 
 
@@ -533,8 +538,8 @@ class ToolSub(FlatCAMTool):
                     geo_obj.tools = deepcopy(self.new_tools)
                     geo_obj.tools = deepcopy(self.new_tools)
                     for tool in geo_obj.tools:
                     for tool in geo_obj.tools:
                         geo_obj.tools[tool]['solid_geometry'] = deepcopy(self.new_solid_geometry)
                         geo_obj.tools[tool]['solid_geometry'] = deepcopy(self.new_solid_geometry)
-                except:
-                    pass
+                except Exception as e:
+                    log.debug("ToolSub.new_geo_object() --> %s" % str(e))
 
 
         with self.app.proc_container.new(_("Generating new object ...")):
         with self.app.proc_container.new(_("Generating new object ...")):
             ret = self.app.new_object('geometry', outname, obj_init, autoselected=False)
             ret = self.app.new_object('geometry', outname, obj_init, autoselected=False)
@@ -584,7 +589,6 @@ class ToolSub(FlatCAMTool):
         """
         """
         # log.debug("checking parsing --> %s" % str(self.parsing_promises))
         # log.debug("checking parsing --> %s" % str(self.parsing_promises))
 
 
-
         try:
         try:
             if not self.promises:
             if not self.promises:
                 self.check_thread.stop()
                 self.check_thread.stop()
@@ -614,4 +618,6 @@ class ToolSub(FlatCAMTool):
         self.sub_gerber_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
         self.sub_gerber_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
 
 
         self.target_geo_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
         self.target_geo_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
-        self.sub_geo_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
+        self.sub_geo_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
+
+# end of file

+ 48 - 49
flatcamTools/ToolTransform.py

@@ -11,9 +11,9 @@ from FlatCAMObj import *
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 
 fcTranslate.apply_language('strings')
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
     _ = gettext.gettext
 
 
@@ -68,9 +68,9 @@ class ToolTransform(FlatCAMTool):
         self.rotate_label = QtWidgets.QLabel(_("Angle:"))
         self.rotate_label = QtWidgets.QLabel(_("Angle:"))
         self.rotate_label.setToolTip(
         self.rotate_label.setToolTip(
             _("Angle for Rotation action, in degrees.\n"
             _("Angle for Rotation action, in degrees.\n"
-            "Float number between -360 and 359.\n"
-            "Positive numbers for CW motion.\n"
-            "Negative numbers for CCW motion.")
+              "Float number between -360 and 359.\n"
+              "Positive numbers for CW motion.\n"
+              "Negative numbers for CCW motion.")
         )
         )
         self.rotate_label.setFixedWidth(70)
         self.rotate_label.setFixedWidth(70)
 
 
@@ -82,8 +82,8 @@ class ToolTransform(FlatCAMTool):
         self.rotate_button.set_value(_("Rotate"))
         self.rotate_button.set_value(_("Rotate"))
         self.rotate_button.setToolTip(
         self.rotate_button.setToolTip(
             _("Rotate the selected object(s).\n"
             _("Rotate the selected object(s).\n"
-            "The point of reference is the middle of\n"
-            "the bounding box for all selected objects.")
+              "The point of reference is the middle of\n"
+              "the bounding box for all selected objects.")
         )
         )
         self.rotate_button.setFixedWidth(90)
         self.rotate_button.setFixedWidth(90)
 
 
@@ -107,7 +107,7 @@ class ToolTransform(FlatCAMTool):
         self.skewx_label = QtWidgets.QLabel(_("Angle X:"))
         self.skewx_label = QtWidgets.QLabel(_("Angle X:"))
         self.skewx_label.setToolTip(
         self.skewx_label.setToolTip(
             _("Angle for Skew action, in degrees.\n"
             _("Angle for Skew action, in degrees.\n"
-            "Float number between -360 and 359.")
+              "Float number between -360 and 359.")
         )
         )
         self.skewx_label.setFixedWidth(70)
         self.skewx_label.setFixedWidth(70)
         self.skewx_entry = FCEntry()
         self.skewx_entry = FCEntry()
@@ -118,14 +118,14 @@ class ToolTransform(FlatCAMTool):
         self.skewx_button.set_value(_("Skew X"))
         self.skewx_button.set_value(_("Skew X"))
         self.skewx_button.setToolTip(
         self.skewx_button.setToolTip(
             _("Skew/shear the selected object(s).\n"
             _("Skew/shear the selected object(s).\n"
-            "The point of reference is the middle of\n"
-            "the bounding box for all selected objects."))
+              "The point of reference is the middle of\n"
+              "the bounding box for all selected objects."))
         self.skewx_button.setFixedWidth(90)
         self.skewx_button.setFixedWidth(90)
 
 
         self.skewy_label = QtWidgets.QLabel(_("Angle Y:"))
         self.skewy_label = QtWidgets.QLabel(_("Angle Y:"))
         self.skewy_label.setToolTip(
         self.skewy_label.setToolTip(
             _("Angle for Skew action, in degrees.\n"
             _("Angle for Skew action, in degrees.\n"
-            "Float number between -360 and 359.")
+              "Float number between -360 and 359.")
         )
         )
         self.skewy_label.setFixedWidth(70)
         self.skewy_label.setFixedWidth(70)
         self.skewy_entry = FCEntry()
         self.skewy_entry = FCEntry()
@@ -136,8 +136,8 @@ class ToolTransform(FlatCAMTool):
         self.skewy_button.set_value(_("Skew Y"))
         self.skewy_button.set_value(_("Skew Y"))
         self.skewy_button.setToolTip(
         self.skewy_button.setToolTip(
             _("Skew/shear the selected object(s).\n"
             _("Skew/shear the selected object(s).\n"
-            "The point of reference is the middle of\n"
-            "the bounding box for all selected objects."))
+              "The point of reference is the middle of\n"
+              "the bounding box for all selected objects."))
         self.skewy_button.setFixedWidth(90)
         self.skewy_button.setFixedWidth(90)
 
 
         form1_child_1.addWidget(self.skewx_entry)
         form1_child_1.addWidget(self.skewx_entry)
@@ -174,8 +174,8 @@ class ToolTransform(FlatCAMTool):
         self.scalex_button.set_value(_("Scale X"))
         self.scalex_button.set_value(_("Scale X"))
         self.scalex_button.setToolTip(
         self.scalex_button.setToolTip(
             _("Scale the selected object(s).\n"
             _("Scale the selected object(s).\n"
-            "The point of reference depends on \n"
-            "the Scale reference checkbox state."))
+              "The point of reference depends on \n"
+              "the Scale reference checkbox state."))
         self.scalex_button.setFixedWidth(90)
         self.scalex_button.setFixedWidth(90)
 
 
         self.scaley_label = QtWidgets.QLabel(_("Factor Y:"))
         self.scaley_label = QtWidgets.QLabel(_("Factor Y:"))
@@ -191,8 +191,8 @@ class ToolTransform(FlatCAMTool):
         self.scaley_button.set_value(_("Scale Y"))
         self.scaley_button.set_value(_("Scale Y"))
         self.scaley_button.setToolTip(
         self.scaley_button.setToolTip(
             _("Scale the selected object(s).\n"
             _("Scale the selected object(s).\n"
-            "The point of reference depends on \n"
-            "the Scale reference checkbox state."))
+              "The point of reference depends on \n"
+              "the Scale reference checkbox state."))
         self.scaley_button.setFixedWidth(90)
         self.scaley_button.setFixedWidth(90)
 
 
         self.scale_link_cb = FCCheckBox()
         self.scale_link_cb = FCCheckBox()
@@ -200,7 +200,7 @@ class ToolTransform(FlatCAMTool):
         self.scale_link_cb.setText(_("Link"))
         self.scale_link_cb.setText(_("Link"))
         self.scale_link_cb.setToolTip(
         self.scale_link_cb.setToolTip(
             _("Scale the selected object(s)\n"
             _("Scale the selected object(s)\n"
-            "using the Scale Factor X for both axis."))
+              "using the Scale Factor X for both axis."))
         self.scale_link_cb.setFixedWidth(70)
         self.scale_link_cb.setFixedWidth(70)
 
 
         self.scale_zero_ref_cb = FCCheckBox()
         self.scale_zero_ref_cb = FCCheckBox()
@@ -208,9 +208,9 @@ class ToolTransform(FlatCAMTool):
         self.scale_zero_ref_cb.setText(_("Scale Reference"))
         self.scale_zero_ref_cb.setText(_("Scale Reference"))
         self.scale_zero_ref_cb.setToolTip(
         self.scale_zero_ref_cb.setToolTip(
             _("Scale the selected object(s)\n"
             _("Scale the selected object(s)\n"
-            "using the origin reference when checked,\n"
-            "and the center of the biggest bounding box\n"
-            "of the selected objects when unchecked."))
+              "using the origin reference when checked,\n"
+              "and the center of the biggest bounding box\n"
+              "of the selected objects when unchecked."))
 
 
         form2_child_1.addWidget(self.scalex_entry)
         form2_child_1.addWidget(self.scalex_entry)
         form2_child_1.addWidget(self.scalex_button)
         form2_child_1.addWidget(self.scalex_button)
@@ -248,8 +248,8 @@ class ToolTransform(FlatCAMTool):
         self.offx_button.set_value(_("Offset X"))
         self.offx_button.set_value(_("Offset X"))
         self.offx_button.setToolTip(
         self.offx_button.setToolTip(
             _("Offset the selected object(s).\n"
             _("Offset the selected object(s).\n"
-            "The point of reference is the middle of\n"
-            "the bounding box for all selected objects.\n"))
+              "The point of reference is the middle of\n"
+              "the bounding box for all selected objects.\n"))
         self.offx_button.setFixedWidth(90)
         self.offx_button.setFixedWidth(90)
 
 
         self.offy_label = QtWidgets.QLabel(_("Value Y:"))
         self.offy_label = QtWidgets.QLabel(_("Value Y:"))
@@ -265,8 +265,8 @@ class ToolTransform(FlatCAMTool):
         self.offy_button.set_value(_("Offset Y"))
         self.offy_button.set_value(_("Offset Y"))
         self.offy_button.setToolTip(
         self.offy_button.setToolTip(
             _("Offset the selected object(s).\n"
             _("Offset the selected object(s).\n"
-            "The point of reference is the middle of\n"
-            "the bounding box for all selected objects.\n"))
+              "The point of reference is the middle of\n"
+              "the bounding box for all selected objects.\n"))
         self.offy_button.setFixedWidth(90)
         self.offy_button.setFixedWidth(90)
 
 
         form3_child_1.addWidget(self.offx_entry)
         form3_child_1.addWidget(self.offx_entry)
@@ -295,7 +295,7 @@ class ToolTransform(FlatCAMTool):
         self.flipx_button.set_value(_("Flip on X"))
         self.flipx_button.set_value(_("Flip on X"))
         self.flipx_button.setToolTip(
         self.flipx_button.setToolTip(
             _("Flip the selected object(s) over the X axis.\n"
             _("Flip the selected object(s) over the X axis.\n"
-            "Does not create a new object.\n ")
+              "Does not create a new object.\n ")
         )
         )
         self.flipx_button.setFixedWidth(100)
         self.flipx_button.setFixedWidth(100)
 
 
@@ -303,7 +303,7 @@ class ToolTransform(FlatCAMTool):
         self.flipy_button.set_value(_("Flip on Y"))
         self.flipy_button.set_value(_("Flip on Y"))
         self.flipy_button.setToolTip(
         self.flipy_button.setToolTip(
             _("Flip the selected object(s) over the X axis.\n"
             _("Flip the selected object(s) over the X axis.\n"
-            "Does not create a new object.\n ")
+              "Does not create a new object.\n ")
         )
         )
         self.flipy_button.setFixedWidth(90)
         self.flipy_button.setFixedWidth(90)
 
 
@@ -312,21 +312,21 @@ class ToolTransform(FlatCAMTool):
         self.flip_ref_cb.setText(_("Ref Pt"))
         self.flip_ref_cb.setText(_("Ref Pt"))
         self.flip_ref_cb.setToolTip(
         self.flip_ref_cb.setToolTip(
             _("Flip the selected object(s)\n"
             _("Flip the selected object(s)\n"
-            "around the point in Point Entry Field.\n"
-            "\n"
-            "The point coordinates can be captured by\n"
-            "left click on canvas together with pressing\n"
-            "SHIFT key. \n"
-            "Then click Add button to insert coordinates.\n"
-            "Or enter the coords in format (x, y) in the\n"
-            "Point Entry field and click Flip on X(Y)"))
+              "around the point in Point Entry Field.\n"
+              "\n"
+              "The point coordinates can be captured by\n"
+              "left click on canvas together with pressing\n"
+              "SHIFT key. \n"
+              "Then click Add button to insert coordinates.\n"
+              "Or enter the coords in format (x, y) in the\n"
+              "Point Entry field and click Flip on X(Y)"))
         self.flip_ref_cb.setFixedWidth(70)
         self.flip_ref_cb.setFixedWidth(70)
 
 
         self.flip_ref_label = QtWidgets.QLabel(_("Point:"))
         self.flip_ref_label = QtWidgets.QLabel(_("Point:"))
         self.flip_ref_label.setToolTip(
         self.flip_ref_label.setToolTip(
             _("Coordinates in format (x, y) used as reference for mirroring.\n"
             _("Coordinates in format (x, y) used as reference for mirroring.\n"
-            "The 'x' in (x, y) will be used when using Flip on X and\n"
-            "the 'y' in (x, y) will be used when using Flip on Y and")
+              "The 'x' in (x, y) will be used when using Flip on X and\n"
+              "the 'y' in (x, y) will be used when using Flip on Y and")
         )
         )
         self.flip_ref_label.setFixedWidth(70)
         self.flip_ref_label.setFixedWidth(70)
         self.flip_ref_entry = EvalEntry2("(0, 0)")
         self.flip_ref_entry = EvalEntry2("(0, 0)")
@@ -337,8 +337,8 @@ class ToolTransform(FlatCAMTool):
         self.flip_ref_button.set_value(_("Add"))
         self.flip_ref_button.set_value(_("Add"))
         self.flip_ref_button.setToolTip(
         self.flip_ref_button.setToolTip(
             _("The point coordinates can be captured by\n"
             _("The point coordinates can be captured by\n"
-            "left click on canvas together with pressing\n"
-            "SHIFT key. Then click Add button to insert."))
+              "left click on canvas together with pressing\n"
+              "SHIFT key. Then click Add button to insert."))
         self.flip_ref_button.setFixedWidth(90)
         self.flip_ref_button.setFixedWidth(90)
 
 
         form4_child_hlay.addStretch()
         form4_child_hlay.addStretch()
@@ -350,8 +350,7 @@ class ToolTransform(FlatCAMTool):
 
 
         form4_layout.addRow(self.flip_ref_cb)
         form4_layout.addRow(self.flip_ref_cb)
         form4_layout.addRow(self.flip_ref_label, form4_child_1)
         form4_layout.addRow(self.flip_ref_label, form4_child_1)
-        self.ois_flip = OptionalInputSection(self.flip_ref_cb,
-                                              [self.flip_ref_entry, self.flip_ref_button], logic=True)
+        self.ois_flip = OptionalInputSection(self.flip_ref_cb, [self.flip_ref_entry, self.flip_ref_button], logic=True)
 
 
         self.transform_lay.addStretch()
         self.transform_lay.addStretch()
 
 
@@ -455,7 +454,7 @@ class ToolTransform(FlatCAMTool):
         if self.app.defaults["tools_transform_mirror_point"]:
         if self.app.defaults["tools_transform_mirror_point"]:
             self.flip_ref_entry.set_value(self.app.defaults["tools_transform_mirror_point"])
             self.flip_ref_entry.set_value(self.app.defaults["tools_transform_mirror_point"])
         else:
         else:
-            self.flip_ref_entry.set_value((0,0))
+            self.flip_ref_entry.set_value((0, 0))
 
 
     def on_rotate(self):
     def on_rotate(self):
         try:
         try:
@@ -466,10 +465,10 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.rotate_entry.get_value().replace(',', '.'))
                 value = float(self.rotate_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
-                                       'params': [value]})
+                                   'params': [value]})
         # self.on_rotate_action(value)
         # self.on_rotate_action(value)
         return
         return
 
 
@@ -500,7 +499,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.skewx_entry.get_value().replace(',', '.'))
                 value = float(self.skewx_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         # self.on_skew("X", value)
         # self.on_skew("X", value)
@@ -518,7 +517,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.skewy_entry.get_value().replace(',', '.'))
                 value = float(self.skewy_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         # self.on_skew("Y", value)
         # self.on_skew("Y", value)
@@ -536,7 +535,7 @@ class ToolTransform(FlatCAMTool):
                 xvalue = float(self.scalex_entry.get_value().replace(',', '.'))
                 xvalue = float(self.scalex_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale X, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale X, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -570,7 +569,7 @@ class ToolTransform(FlatCAMTool):
                 yvalue = float(self.scaley_entry.get_value().replace(',', '.'))
                 yvalue = float(self.scaley_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale Y, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale Y, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -599,7 +598,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.offx_entry.get_value().replace(',', '.'))
                 value = float(self.offx_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         # self.on_offset("X", value)
         # self.on_offset("X", value)
@@ -617,7 +616,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.offy_entry.get_value().replace(',', '.'))
                 value = float(self.offy_entry.get_value().replace(',', '.'))
             except ValueError:
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
-                                     "use a number."))
+                                       "use a number."))
                 return
                 return
 
 
         # self.on_offset("Y", value)
         # self.on_offset("Y", value)

BIN
locale/de/LC_MESSAGES/strings.mo


File diff suppressed because it is too large
+ 215 - 185
locale/de/LC_MESSAGES/strings.po


BIN
locale/en/LC_MESSAGES/strings.mo


File diff suppressed because it is too large
+ 221 - 191
locale/en/LC_MESSAGES/strings.po


BIN
locale/es/LC_MESSAGES/strings.mo


+ 10771 - 0
locale/es/LC_MESSAGES/strings.po

@@ -0,0 +1,10771 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2019-07-17 13:26+0300\n"
+"PO-Revision-Date: 2019-07-17 14:09+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Generator: Poedit 2.2.3\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Basepath: ../../..\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Poedit-SearchPathExcluded-0: build\n"
+"X-Poedit-SearchPathExcluded-1: doc\n"
+"X-Poedit-SearchPathExcluded-2: tests\n"
+
+#: FlatCAMApp.py:922
+msgid "[ERROR] Could not find the Language files. The App strings are missing."
+msgstr ""
+"[ERROR] No se pudieron encontrar los archivos de idioma. Las cadenas de "
+"aplicación faltan."
+
+#: FlatCAMApp.py:1833
+msgid ""
+"(Type help to get started)\n"
+"\n"
+msgstr ""
+"(Escriba ayuda para empezar)\n"
+"\n"
+
+#: FlatCAMApp.py:2018 ObjectCollection.py:80 flatcamTools/ToolImage.py:213
+#: flatcamTools/ToolPcbWizard.py:296 flatcamTools/ToolPcbWizard.py:319
+msgid "Open cancelled."
+msgstr "Abierto cancelado."
+
+#: FlatCAMApp.py:2032
+msgid "Open Config file failed."
+msgstr "El archivo de configuración abierto falló."
+
+#: FlatCAMApp.py:2046
+msgid "Open Script file failed."
+msgstr "Error al abrir el archivo de script."
+
+#: FlatCAMApp.py:2244
+msgid "[WARNING_NOTCL] Select a Geometry, Gerber or Excellon Object to edit."
+msgstr ""
+"[WARNING_NOTCL] Seleccione un objeto Geometry, Gerber o Excellon para editar."
+
+#: FlatCAMApp.py:2254
+msgid ""
+"[WARNING_NOTCL] Simultanoeus editing of tools geometry in a MultiGeo "
+"Geometry is not possible.\n"
+"Edit only one geometry at a time."
+msgstr ""
+"[WARNING_NOTCL] La edición simultánea de la geometría de herramientas en una "
+"Geometría Geo múltiple no es posible.\n"
+"Editar solo una geometría a la vez."
+
+#: FlatCAMApp.py:2309
+msgid "[WARNING_NOTCL] Editor is activated ..."
+msgstr "[WARNING_NOTCL] Editor está activado ..."
+
+#: FlatCAMApp.py:2327
+msgid "Do you want to save the edited object?"
+msgstr "Quieres guardar el objeto editado?"
+
+#: FlatCAMApp.py:2328 flatcamGUI/FlatCAMGUI.py:1637
+msgid "Close Editor"
+msgstr "Cerrar Editor"
+
+#: FlatCAMApp.py:2331 FlatCAMApp.py:3423 FlatCAMApp.py:6009
+#: FlatCAMTranslation.py:96 flatcamGUI/FlatCAMGUI.py:3760
+msgid "Yes"
+msgstr "Sí"
+
+#: FlatCAMApp.py:2332 FlatCAMApp.py:3424 FlatCAMApp.py:6010
+#: FlatCAMTranslation.py:97 flatcamGUI/FlatCAMGUI.py:3761
+msgid "No"
+msgstr "No"
+
+#: FlatCAMApp.py:2333 FlatCAMApp.py:3425 FlatCAMApp.py:3856 FlatCAMApp.py:6011
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: FlatCAMApp.py:2360
+msgid "[WARNING] Object empty after edit."
+msgstr "[WARNING] Objeto vacío después de editar."
+
+#: FlatCAMApp.py:2382 FlatCAMApp.py:2401 FlatCAMApp.py:2413
+msgid "[WARNING_NOTCL] Select a Gerber, Geometry or Excellon Object to update."
+msgstr ""
+"[WARNING_NOTCL] Seleccione un objeto Gerber, Geometry o Excellon para "
+"actualizar."
+
+#: FlatCAMApp.py:2385
+#, python-format
+msgid "[selected] %s is updated, returning to App..."
+msgstr "[selected] %s Se actualiza, volviendo a la aplicación ..."
+
+#: FlatCAMApp.py:2750
+msgid "[ERROR] Could not load defaults file."
+msgstr "[ERROR] No se pudo cargar el archivo por defecto."
+
+#: FlatCAMApp.py:2762
+msgid "[ERROR] Failed to parse defaults file."
+msgstr "[ERROR] Error al analizar el archivo por defecto."
+
+#: FlatCAMApp.py:2783 FlatCAMApp.py:2787
+msgid "Import FlatCAM Preferences"
+msgstr "Importar preferencias de FlatCAM"
+
+#: FlatCAMApp.py:2793
+msgid "[WARNING_NOTCL] FlatCAM preferences import cancelled."
+msgstr "[WARNING_NOTCL] Preferencia de preferencias de FlatCAM cancelada."
+
+#: FlatCAMApp.py:2801 FlatCAMApp.py:2855 FlatCAMApp.py:3302
+msgid "[ERROR_NOTCL] Could not load defaults file."
+msgstr "[ERROR_NOTCL] No se pudo cargar el archivo por defecto."
+
+#: FlatCAMApp.py:2809 FlatCAMApp.py:3311
+msgid "[ERROR_NOTCL] Failed to parse defaults file."
+msgstr "[ERROR_NOTCL] Error al analizar el archivo por defecto."
+
+#: FlatCAMApp.py:2812
+#, python-format
+msgid "[success] Imported Defaults from %s"
+msgstr "[success] Valores predeterminados importados de%s"
+
+#: FlatCAMApp.py:2827 FlatCAMApp.py:2832
+msgid "Export FlatCAM Preferences"
+msgstr "Exportar preferencias de FlatCAM"
+
+#: FlatCAMApp.py:2839
+msgid "[WARNING_NOTCL] FlatCAM preferences export cancelled."
+msgstr "[WARNING_NOTCL] Preferencia de exportación de FlatCAM cancelada."
+
+#: FlatCAMApp.py:2874 FlatCAMApp.py:3356
+msgid "[ERROR_NOTCL] Failed to write defaults to file."
+msgstr ""
+"[ERROR_NOTCL] Error al escribir los valores predeterminados en el archivo."
+
+#: FlatCAMApp.py:2927
+msgid "[ERROR_NOTCL] Failed to open recent files file for writing."
+msgstr ""
+"[ERROR_NOTCL] Error al abrir el archivo de archivos recientes para escribir."
+
+#: FlatCAMApp.py:3004 camlib.py:4457
+msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n"
+msgstr "[ERROR_NOTCL] Ha ocurrido un error interno. Ver concha\n"
+
+#: FlatCAMApp.py:3005
+#, python-brace-format
+msgid ""
+"Object ({kind}) failed because: {error} \n"
+"\n"
+msgstr "El objeto ({kind}) falló porque: {error}\n"
+
+#: FlatCAMApp.py:3025
+msgid "Converting units to "
+msgstr "Convertir unidades a "
+
+#: FlatCAMApp.py:3104 FlatCAMApp.py:3107 FlatCAMApp.py:3110 FlatCAMApp.py:3113
+#, python-brace-format
+msgid ""
+"[selected] {kind} created/selected: <span style=\"color:{color};\">{name}</"
+"span>"
+msgstr ""
+"[selected] {kind} creado / seleccionado: <span style = \"color: {color};\"> "
+"{name} </span>"
+
+#: FlatCAMApp.py:3207
+#, python-brace-format
+msgid ""
+"<font size=8><B>FlatCAM</B></font><BR>Version {version} {beta} ({date}) - "
+"{arch} <BR><BR>2D Computer-Aided Printed Circuit Board<BR>Manufacturing."
+"<BR><BR>(c) 2014-2019 <B>Juan Pablo Caram</B><BR><BR><B> Main Contributors:</"
+"B><BR>Denis Hayrullin<BR>Kamil Sopko<BR>Marius Stanciu<BR>Matthieu "
+"Berthomé<BR>and many others found <a href = \"https://bitbucket.org/jpcgt/"
+"flatcam/pull-requests/?state=MERGED\">here.</a><BR><BR>Development is done "
+"<a href = \"https://bitbucket.org/jpcgt/flatcam/src/Beta/\">here.</"
+"a><BR>DOWNLOAD area <a href = \"https://bitbucket.org/jpcgt/flatcam/"
+"downloads/\">here.</a><BR>"
+msgstr ""
+"<font size=8><B> FlatCAM</B></font><BR>Versión {version} {beta} ({date}) - "
+"{arch}<BR><BR> Placa de circuito impresa asistida por computadora 2D <BR> "
+"Fabricación. <BR><BR> (c) 2014-2019 <B> Juan Pablo Caram </B><BR><BR><B> "
+"Colaboradores principales: </B><BR> Denis Hayrullin <BR > Kamil Sopko <BR> "
+"Marius Stanciu <BR> Matthieu Berthomé <BR> y muchos otros encontraron <a "
+"href = \"https://bitbucket.org/jpcgt/flatcam/pull-requests/?state=MERGED\"> "
+"aquí. </a><BR><BR> El desarrollo se realiza <a href = \"https://bitbucket."
+"org/jpcgt/flatcam/src/Beta/\"> aquí. </a><BR> Área de DESCARGA <a href = "
+"\"https://bitbucket.org/jpcgt/flatcam/downloads/\"> aquí. </a><BR>"
+
+#: FlatCAMApp.py:3360
+msgid "[success] Defaults saved."
+msgstr "[success] Valores predeterminados guardados."
+
+#: FlatCAMApp.py:3381
+msgid "[ERROR_NOTCL] Could not load factory defaults file."
+msgstr ""
+"[ERROR_NOTCL] No se pudo cargar el archivo de valores predeterminados de "
+"fábrica."
+
+#: FlatCAMApp.py:3390
+msgid "[ERROR_NOTCL] Failed to parse factory defaults file."
+msgstr ""
+"[ERROR_NOTCL] Error al analizar el archivo de valores predeterminados de "
+"fábrica."
+
+#: FlatCAMApp.py:3404
+msgid "[ERROR_NOTCL] Failed to write factory defaults to file."
+msgstr ""
+"[ERROR_NOTCL] Error al escribir los valores predeterminados de fábrica en el "
+"archivo."
+
+#: FlatCAMApp.py:3408
+msgid "Factory defaults saved."
+msgstr "Valores predeterminados de fábrica guardados."
+
+#: FlatCAMApp.py:3413 flatcamGUI/FlatCAMGUI.py:3136
+msgid "[WARNING_NOTCL] Application is saving the project. Please wait ..."
+msgstr ""
+"[WARNING_NOTCL] La aplicación es guardar el proyecto. Por favor espera ..."
+
+#: FlatCAMApp.py:3418
+msgid ""
+"There are files/objects modified in FlatCAM. \n"
+"Do you want to Save the project?"
+msgstr ""
+"Hay archivos / objetos modificados en FlatCAM.\n"
+"¿Quieres guardar el proyecto?"
+
+#: FlatCAMApp.py:3421 FlatCAMApp.py:6007
+msgid "Save changes"
+msgstr "Guardar cambios"
+
+#: FlatCAMApp.py:3488
+msgid ""
+"[ERROR] Failed join. The Geometry objects are of different types.\n"
+"At least one is MultiGeo type and the other is SingleGeo type. A possibility "
+"is to convert from one to another and retry joining \n"
+"but in the case of converting from MultiGeo to SingleGeo, informations may "
+"be lost and the result may not be what was expected. \n"
+"Check the generated GCODE."
+msgstr ""
+"[ERROR] Error al unirse. Los objetos de geometría son de diferentes tipos.\n"
+"Al menos uno es de tipo MultiGeo y el otro es de tipo SingleGeo. Una "
+"posibilidad es convertir de uno a otro y volver a intentar unirse.\n"
+"pero en el caso de la conversión de MultiGeo a SingleGeo, las informaciones "
+"pueden perderse y el resultado puede no ser el esperado.\n"
+"Compruebe el GCODE generado."
+
+#: FlatCAMApp.py:3529
+msgid "[ERROR_NOTCL] Failed. Excellon joining works only on Excellon objects."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. La unión de Excellon funciona solo en objetos de "
+"Excellon."
+
+#: FlatCAMApp.py:3551
+msgid "[ERROR_NOTCL] Failed. Gerber joining works only on Gerber objects."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. La unión de gerber funciona solo en objetos de "
+"gerber."
+
+#: FlatCAMApp.py:3566 FlatCAMApp.py:3591
+msgid "[ERROR_NOTCL] Failed. Select a Geometry Object and try again."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. Seleccione un objeto de geometría y vuelva a "
+"intentarlo."
+
+#: FlatCAMApp.py:3570 FlatCAMApp.py:3595
+#, python-format
+msgid "[ERROR_NOTCL] Expected a FlatCAMGeometry, got %s"
+msgstr "[ERROR_NOTCL] Se esperaba un FlatCAMGeometry, se obtuvo%s"
+
+#: FlatCAMApp.py:3583
+msgid "[success] A Geometry object was converted to MultiGeo type."
+msgstr "[success] Un objeto Geometry fue convertido al tipo MultiGeo."
+
+#: FlatCAMApp.py:3609
+msgid "[success] A Geometry object was converted to SingleGeo type."
+msgstr "[success] Un objeto Geometry fue convertido al tipo SingleGeo."
+
+#: FlatCAMApp.py:3850
+msgid "Toggle Units"
+msgstr "(Escriba ayuda para empezar)"
+
+#: FlatCAMApp.py:3852
+msgid "<B>Change project units ...</B>"
+msgstr "<B>Cambiar unidades de proyecto ...</B>"
+
+#: FlatCAMApp.py:3853
+msgid ""
+"Changing the units of the project causes all geometrical properties of all "
+"objects to be scaled accordingly.\n"
+"Continue?"
+msgstr ""
+"El cambio de las unidades del proyecto hace que todas las propiedades "
+"geométricas de todos los objetos se escalen en consecuencia.\n"
+"¿Continuar?"
+
+#: FlatCAMApp.py:3855 FlatCAMApp.py:4694 FlatCAMApp.py:6282 FlatCAMApp.py:6293
+#: FlatCAMApp.py:6533 FlatCAMApp.py:6543
+msgid "Ok"
+msgstr "De acuerdo"
+
+#: FlatCAMApp.py:3900
+#, python-format
+msgid "[success] Converted units to %s"
+msgstr "[success] Unidades convertidas a%s"
+
+#: FlatCAMApp.py:3911
+msgid "[WARNING_NOTCL] Units conversion cancelled."
+msgstr "[WARNING_NOTCL] Conversión de unidades cancelada."
+
+#: FlatCAMApp.py:4563
+msgid "Open file"
+msgstr "Abrir documento"
+
+#: FlatCAMApp.py:4594 FlatCAMApp.py:4599
+msgid "Export G-Code ..."
+msgstr "Exportar G-Code ..."
+
+#: FlatCAMApp.py:4602
+msgid "[WARNING_NOTCL] Export Code cancelled."
+msgstr "[WARNING_NOTCL] Código de exportación cancelado."
+
+#: FlatCAMApp.py:4612
+msgid "[WARNING] No such file or directory"
+msgstr "[WARNING] El fichero o directorio no existe"
+
+#: FlatCAMApp.py:4619
+#, python-format
+msgid "Saved to: %s"
+msgstr "Guardado en:%s"
+
+#: FlatCAMApp.py:4682 FlatCAMApp.py:4715 FlatCAMApp.py:4726 FlatCAMApp.py:4737
+#: flatcamTools/ToolNonCopperClear.py:490 flatcamTools/ToolSolderPaste.py:763
+msgid ""
+"[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float "
+"format."
+msgstr ""
+"[WARNING_NOTCL] Introduzca un diámetro de herramienta con valor distinto de "
+"cero, en formato Float."
+
+#: FlatCAMApp.py:4687 FlatCAMApp.py:4720 FlatCAMApp.py:4731 FlatCAMApp.py:4742
+#: flatcamGUI/FlatCAMGUI.py:3031
+msgid "[WARNING_NOTCL] Adding Tool cancelled ..."
+msgstr "[WARNING_NOTCL] Añadiendo herramienta cancelada ..."
+
+#: FlatCAMApp.py:4690
+msgid ""
+"Adding Tool works only when Advanced is checked.\n"
+"Go to Preferences -> General - Show Advanced Options."
+msgstr ""
+"Agregar herramienta solo funciona cuando se selecciona Avanzado.\n"
+"Vaya a Preferencias -> General - Mostrar opciones avanzadas."
+
+#: FlatCAMApp.py:4803
+msgid "Object(s) deleted ..."
+msgstr "Objeto (s) eliminado (s) ..."
+
+#: FlatCAMApp.py:4807
+msgid "Failed. No object(s) selected..."
+msgstr "Ha fallado. Ningún objeto (s) seleccionado ..."
+
+#: FlatCAMApp.py:4809
+msgid "Save the work in Editor and try again ..."
+msgstr "Guarda el trabajo en el Editor y vuelve a intentarlo ..."
+
+#: FlatCAMApp.py:4822
+msgid "Click to set the origin ..."
+msgstr "Haga clic para establecer el origen ..."
+
+#: FlatCAMApp.py:4834
+msgid "Jump to ..."
+msgstr "Salta a ..."
+
+#: FlatCAMApp.py:4835
+msgid "Enter the coordinates in format X,Y:"
+msgstr "Introduzca las coordenadas en formato X, Y:"
+
+#: FlatCAMApp.py:4842
+msgid "Wrong coordinates. Enter coordinates in format: X,Y"
+msgstr "Coordenadas erróneas. Introduzca las coordenadas en formato: X, Y"
+
+#: FlatCAMApp.py:4860 flatcamEditors/FlatCAMExcEditor.py:2320
+#: flatcamEditors/FlatCAMExcEditor.py:2327
+#: flatcamEditors/FlatCAMGeoEditor.py:3648
+#: flatcamEditors/FlatCAMGeoEditor.py:3662
+#: flatcamEditors/FlatCAMGrbEditor.py:1040
+#: flatcamEditors/FlatCAMGrbEditor.py:1141
+#: flatcamEditors/FlatCAMGrbEditor.py:1409
+#: flatcamEditors/FlatCAMGrbEditor.py:1666
+#: flatcamEditors/FlatCAMGrbEditor.py:4071
+#: flatcamEditors/FlatCAMGrbEditor.py:4085 flatcamGUI/FlatCAMGUI.py:2435
+#: flatcamGUI/FlatCAMGUI.py:2447
+msgid "[success] Done."
+msgstr "[success] Hecho."
+
+#: FlatCAMApp.py:4992 FlatCAMApp.py:5059
+msgid "[WARNING_NOTCL] No object is selected. Select an object and try again."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto está seleccionado. Seleccione un objeto y "
+"vuelva a intentarlo."
+
+#: FlatCAMApp.py:5100
+msgid "[success] Origin set ..."
+msgstr "[success] Origen establecido ..."
+
+#: FlatCAMApp.py:5120
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: FlatCAMApp.py:5140
+msgid "[WARNING_NOTCL] No object selected to Flip on Y axis."
+msgstr "[WARNING_NOTCL] Ningún objeto seleccionado para voltear en el eje Y."
+
+#: FlatCAMApp.py:5165
+msgid "[success] Flip on Y axis done."
+msgstr "[success] Flip en el eje Y hecho."
+
+#: FlatCAMApp.py:5167 FlatCAMApp.py:5207
+#: flatcamEditors/FlatCAMGeoEditor.py:1355
+#: flatcamEditors/FlatCAMGrbEditor.py:5498 flatcamTools/ToolTransform.py:747
+#, python-format
+msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed."
+msgstr "[ERROR_NOTCL] Debido a %s, la acción Flip no se ejecutó."
+
+#: FlatCAMApp.py:5180
+msgid "[WARNING_NOTCL] No object selected to Flip on X axis."
+msgstr "[WARNING_NOTCL] Ningún objeto seleccionado para voltear en el eje X."
+
+#: FlatCAMApp.py:5205
+msgid "[success] Flip on X axis done."
+msgstr "[success] Flip en el eje X hecho."
+
+#: FlatCAMApp.py:5220
+msgid "[WARNING_NOTCL] No object selected to Rotate."
+msgstr "[WARNING_NOTCL] Ningún objeto seleccionado para rotar."
+
+#: FlatCAMApp.py:5223 FlatCAMApp.py:5268 FlatCAMApp.py:5299
+msgid "Transform"
+msgstr "Transformar"
+
+#: FlatCAMApp.py:5223 FlatCAMApp.py:5268 FlatCAMApp.py:5299
+msgid "Enter the Angle value:"
+msgstr "Ingrese el valor del ángulo:"
+
+#: FlatCAMApp.py:5253
+msgid "[success] Rotation done."
+msgstr "[success] Rotación realizada."
+
+#: FlatCAMApp.py:5255 flatcamEditors/FlatCAMGeoEditor.py:1298
+#: flatcamEditors/FlatCAMGrbEditor.py:5427 flatcamTools/ToolTransform.py:676
+#, python-format
+msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed."
+msgstr "[ERROR_NOTCL] Debido a%s, no se ejecutó el movimiento de rotación."
+
+#: FlatCAMApp.py:5266
+msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto seleccionado para sesgar / esquilar en el eje "
+"X."
+
+#: FlatCAMApp.py:5287
+msgid "[success] Skew on X axis done."
+msgstr "[success] Sesgo en eje x hecho."
+
+#: FlatCAMApp.py:5297
+msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto seleccionado para sesgar / esquilar en el eje "
+"Y."
+
+#: FlatCAMApp.py:5318
+msgid "[success] Skew on Y axis done."
+msgstr "[success] Sesgo en eje Y hecho."
+
+#: FlatCAMApp.py:5388
+msgid "Grid On/Off"
+msgstr "Grid On / Off"
+
+#: FlatCAMApp.py:5401 flatcamEditors/FlatCAMGeoEditor.py:937
+#: flatcamEditors/FlatCAMGrbEditor.py:2424
+#: flatcamEditors/FlatCAMGrbEditor.py:5016 flatcamGUI/ObjectUI.py:991
+#: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:207
+#: flatcamTools/ToolNonCopperClear.py:134 flatcamTools/ToolPaint.py:131
+#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478
+#: flatcamTools/ToolTransform.py:337
+msgid "Add"
+msgstr "Añadir"
+
+#: FlatCAMApp.py:5402 FlatCAMObj.py:3300
+#: flatcamEditors/FlatCAMGrbEditor.py:2429 flatcamGUI/FlatCAMGUI.py:531
+#: flatcamGUI/FlatCAMGUI.py:731 flatcamGUI/FlatCAMGUI.py:1635
+#: flatcamGUI/FlatCAMGUI.py:1974 flatcamGUI/ObjectUI.py:1007
+#: flatcamTools/ToolNonCopperClear.py:146 flatcamTools/ToolPaint.py:143
+#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480
+msgid "Delete"
+msgstr "Borrar"
+
+#: FlatCAMApp.py:5415
+msgid "New Grid ..."
+msgstr "Nueva rejilla ..."
+
+#: FlatCAMApp.py:5416
+msgid "Enter a Grid Value:"
+msgstr "Introduzca un valor de cuadrícula:"
+
+#: FlatCAMApp.py:5424 FlatCAMApp.py:5451
+msgid ""
+"[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float "
+"format."
+msgstr ""
+"[WARNING_NOTCL] Introduzca un valor de cuadrícula con un valor distinto de "
+"cero, en formato Float."
+
+#: FlatCAMApp.py:5430
+msgid "[success] New Grid added ..."
+msgstr "[success] Nueva cuadrícula agregada ..."
+
+#: FlatCAMApp.py:5433
+msgid "[WARNING_NOTCL] Grid already exists ..."
+msgstr "[WARNING_NOTCL] La rejilla ya existe ..."
+
+#: FlatCAMApp.py:5436
+msgid "[WARNING_NOTCL] Adding New Grid cancelled ..."
+msgstr "[WARNING_NOTCL] Añadiendo nueva grilla cancelada ..."
+
+#: FlatCAMApp.py:5458
+msgid "[ERROR_NOTCL] Grid Value does not exist ..."
+msgstr "[ERROR_NOTCL]El valor de cuadrícula no existe ..."
+
+#: FlatCAMApp.py:5461
+msgid "[success] Grid Value deleted ..."
+msgstr "[success] Valor de cuadrícula eliminado ..."
+
+#: FlatCAMApp.py:5464
+msgid "[WARNING_NOTCL] Delete Grid value cancelled ..."
+msgstr "[WARNING_NOTCL] Eliminar el valor de cuadrícula cancelado ..."
+
+#: FlatCAMApp.py:5470
+msgid "Key Shortcut List"
+msgstr "Lista de atajos de teclas"
+
+#: FlatCAMApp.py:5503
+msgid "[WARNING_NOTCL] No object selected to copy it's name"
+msgstr "[WARNING_NOTCL] Ningún objeto seleccionado para copiar su nombre"
+
+#: FlatCAMApp.py:5507
+msgid "Name copied on clipboard ..."
+msgstr "Nombre copiado en el portapapeles ..."
+
+#: FlatCAMApp.py:5549 flatcamEditors/FlatCAMGrbEditor.py:4012
+msgid "[success] Coordinates copied to clipboard."
+msgstr "[success] Coordenadas copiadas al portapapeles."
+
+#: FlatCAMApp.py:5805 FlatCAMApp.py:5808 FlatCAMApp.py:5811 FlatCAMApp.py:5814
+#: FlatCAMApp.py:5829 FlatCAMApp.py:5832 FlatCAMApp.py:5835 FlatCAMApp.py:5838
+#: FlatCAMApp.py:5878 FlatCAMApp.py:5881 FlatCAMApp.py:5884 FlatCAMApp.py:5887
+#: ObjectCollection.py:719 ObjectCollection.py:722 ObjectCollection.py:725
+#: ObjectCollection.py:728
+#, python-brace-format
+msgid "[selected]<span style=\"color:{color};\">{name}</span> selected"
+msgstr "[selected]<span style=\"color: {color};\"> {name} </span> seleccionado"
+
+#: FlatCAMApp.py:6004
+msgid ""
+"There are files/objects opened in FlatCAM.\n"
+"Creating a New project will delete them.\n"
+"Do you want to Save the project?"
+msgstr ""
+"Hay archivos / objetos abiertos en FlatCAM.\n"
+"Crear un nuevo proyecto los borrará.\n"
+"¿Quieres guardar el proyecto?"
+
+#: FlatCAMApp.py:6025
+msgid "[success] New Project created..."
+msgstr "[success] Nuevo proyecto creado ..."
+
+#: FlatCAMApp.py:6141 FlatCAMApp.py:6144 flatcamGUI/FlatCAMGUI.py:612
+#: flatcamGUI/FlatCAMGUI.py:1851
+msgid "Open Gerber"
+msgstr "Abrir gerber"
+
+#: FlatCAMApp.py:6149
+msgid "[WARNING_NOTCL] Open Gerber cancelled."
+msgstr "[WARNING_NOTCL] Gerber abierto cancelado."
+
+#: FlatCAMApp.py:6170 FlatCAMApp.py:6173 flatcamGUI/FlatCAMGUI.py:613
+#: flatcamGUI/FlatCAMGUI.py:1852
+msgid "Open Excellon"
+msgstr "Abierto Excellon"
+
+#: FlatCAMApp.py:6178
+msgid "[WARNING_NOTCL] Open Excellon cancelled."
+msgstr "[WARNING_NOTCL] Abierto Excellon cancelado."
+
+#: FlatCAMApp.py:6200 FlatCAMApp.py:6203
+msgid "Open G-Code"
+msgstr "Código G abierto"
+
+#: FlatCAMApp.py:6208
+msgid "[WARNING_NOTCL] Open G-Code cancelled."
+msgstr "[WARNING_NOTCL] Open G-Code cancelado."
+
+#: FlatCAMApp.py:6226 FlatCAMApp.py:6229
+msgid "Open Project"
+msgstr "Proyecto abierto"
+
+#: FlatCAMApp.py:6237
+msgid "[WARNING_NOTCL] Open Project cancelled."
+msgstr "[WARNING_NOTCL] Proyecto abierto cancelado."
+
+#: FlatCAMApp.py:6256 FlatCAMApp.py:6259
+msgid "Open Configuration File"
+msgstr "Abrir archivo de configuración"
+
+#: FlatCAMApp.py:6263
+msgid "[WARNING_NOTCL] Open Config cancelled."
+msgstr "[WARNING_NOTCL] Abrir configuración cancelada."
+
+#: FlatCAMApp.py:6278 FlatCAMApp.py:6529 FlatCAMApp.py:8682 FlatCAMApp.py:8702
+#: FlatCAMApp.py:8723 FlatCAMApp.py:8745
+msgid "[WARNING_NOTCL] No object selected."
+msgstr "[WARNING_NOTCL] Ningún objeto seleccionado."
+
+#: FlatCAMApp.py:6279 FlatCAMApp.py:6530
+msgid "Please Select a Geometry object to export"
+msgstr "Seleccione un objeto de geometría para exportar"
+
+#: FlatCAMApp.py:6290
+msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used."
+msgstr ""
+"[ERROR_NOTCL] Solo se pueden utilizar objetos Geometry, Gerber y CNCJob."
+
+#: FlatCAMApp.py:6303 FlatCAMApp.py:6307
+msgid "Export SVG"
+msgstr "Exportar SVG"
+
+#: FlatCAMApp.py:6312
+msgid "[WARNING_NOTCL] Export SVG cancelled."
+msgstr "[WARNING_NOTCL] Exportación SVG cancelada."
+
+#: FlatCAMApp.py:6331
+msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4"
+msgstr ""
+"[WARNING_NOTCL] Los datos deben ser una matriz 3D con la última dimensión 3 "
+"o 4"
+
+#: FlatCAMApp.py:6337 FlatCAMApp.py:6341
+msgid "Export PNG Image"
+msgstr "Exportar imagen PNG"
+
+#: FlatCAMApp.py:6346
+msgid "Export PNG cancelled."
+msgstr "Exportación PNG cancelada."
+
+#: FlatCAMApp.py:6365
+msgid ""
+"[WARNING_NOTCL] No object selected. Please select an Gerber object to export."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto seleccionado. Por favor, seleccione un objeto "
+"Gerber para exportar."
+
+#: FlatCAMApp.py:6370 FlatCAMApp.py:6493
+msgid ""
+"[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. Solo los objetos Gerber se pueden guardar como "
+"archivos Gerber ..."
+
+#: FlatCAMApp.py:6382
+msgid "Save Gerber source file"
+msgstr "Guardar el archivo fuente de Gerber"
+
+#: FlatCAMApp.py:6387
+msgid "[WARNING_NOTCL] Save Gerber source file cancelled."
+msgstr "[WARNING_NOTCL] Guardar el archivo fuente de Gerber cancelado."
+
+#: FlatCAMApp.py:6406
+msgid ""
+"[WARNING_NOTCL] No object selected. Please select an Excellon object to "
+"export."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto seleccionado. Por favor, seleccione un objeto "
+"Excellon para exportar."
+
+#: FlatCAMApp.py:6411 FlatCAMApp.py:6452
+msgid ""
+"[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. Solo los objetos Excellon se pueden guardar como "
+"archivos Excellon ..."
+
+#: FlatCAMApp.py:6419 FlatCAMApp.py:6423
+msgid "Save Excellon source file"
+msgstr "Guardar el archivo fuente de Excellon"
+
+#: FlatCAMApp.py:6428
+msgid "[WARNING_NOTCL] Saving Excellon source file cancelled."
+msgstr "[WARNING_NOTCL] Guardando el archivo fuente Excellon cancelado."
+
+#: FlatCAMApp.py:6447
+msgid ""
+"[WARNING_NOTCL] No object selected. Please Select an Excellon object to "
+"export."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto seleccionado. Seleccione un objeto Excellon "
+"para exportar."
+
+#: FlatCAMApp.py:6460 FlatCAMApp.py:6464
+msgid "Export Excellon"
+msgstr "Exportar Excellon"
+
+#: FlatCAMApp.py:6469
+msgid "[WARNING_NOTCL] Export Excellon cancelled."
+msgstr "[WARNING_NOTCL] Exportación excellon cancelada."
+
+#: FlatCAMApp.py:6488
+msgid ""
+"[WARNING_NOTCL] No object selected. Please Select an Gerber object to export."
+msgstr ""
+"[WARNING_NOTCL] Ningún objeto seleccionado. Seleccione un objeto Gerber para "
+"exportar."
+
+#: FlatCAMApp.py:6501 FlatCAMApp.py:6505
+msgid "Export Gerber"
+msgstr "Gerber Exportación"
+
+#: FlatCAMApp.py:6510
+msgid "[WARNING_NOTCL] Export Gerber cancelled."
+msgstr "[WARNING_NOTCL] Exportación Gerber cancelada."
+
+#: FlatCAMApp.py:6540
+msgid "[ERROR_NOTCL] Only Geometry objects can be used."
+msgstr "[ERROR_NOTCL] Solo se pueden utilizar objetos de geometría."
+
+#: FlatCAMApp.py:6554 FlatCAMApp.py:6558
+msgid "Export DXF"
+msgstr "Exportar DXF"
+
+#: FlatCAMApp.py:6564
+msgid "[WARNING_NOTCL] Export DXF cancelled."
+msgstr "[WARNING_NOTCL] Exportación DXF cancelada."
+
+#: FlatCAMApp.py:6584 FlatCAMApp.py:6587
+msgid "Import SVG"
+msgstr "Importar SVG"
+
+#: FlatCAMApp.py:6596
+msgid "[WARNING_NOTCL] Open SVG cancelled."
+msgstr "[WARNING_NOTCL] Abierto SVG cancelado."
+
+#: FlatCAMApp.py:6615 FlatCAMApp.py:6619
+msgid "Import DXF"
+msgstr "Importar DXF"
+
+#: FlatCAMApp.py:6628
+msgid "[WARNING_NOTCL] Open DXF cancelled."
+msgstr "[WARNING_NOTCL] Abierto DXF cancelado."
+
+#: FlatCAMApp.py:6646
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#: FlatCAMApp.py:6666
+msgid ""
+"[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file."
+msgstr ""
+"[WARNING_NOTCL] Seleccione un archivo Gerber o Excellon para ver su archivo "
+"fuente."
+
+#: FlatCAMApp.py:6673
+msgid ""
+"[WARNING_NOTCL] There is no selected object for which to see it's source "
+"file code."
+msgstr ""
+"[WARNING_NOTCL] No hay ningún objeto seleccionado para el cual ver su código "
+"fuente."
+
+#: FlatCAMApp.py:6681
+msgid "Source Editor"
+msgstr "Editor de fuente"
+
+#: FlatCAMApp.py:6691
+#, python-format
+msgid "[ERROR]App.on_view_source() -->%s"
+msgstr "[ERROR]App.on_view_source() -->%s"
+
+#: FlatCAMApp.py:6703 FlatCAMApp.py:7845 FlatCAMObj.py:5593
+#: flatcamTools/ToolSolderPaste.py:1280
+msgid "Code Editor"
+msgstr "Editor de código"
+
+#: FlatCAMApp.py:6715
+msgid "Script Editor"
+msgstr "Editor de guiones"
+
+#: FlatCAMApp.py:6718
+msgid ""
+"#\n"
+"# CREATE A NEW FLATCAM TCL SCRIPT\n"
+"# TCL Tutorial here: https://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial."
+"html\n"
+"#\n"
+"\n"
+"# FlatCAM commands list:\n"
+"# AddCircle, AddPolygon, AddPolyline, AddRectangle, AlignDrill, "
+"AlignDrillGrid, ClearShell, Cncjob,\n"
+"# Cutout, Delete, Drillcncjob, ExportGcode, ExportSVG, Exteriors, GeoCutout, "
+"GeoUnion, GetNames, GetSys,\n"
+"# ImportSvg, Interiors, Isolate, Follow, JoinExcellon, JoinGeometry, "
+"ListSys, MillHoles, Mirror, New,\n"
+"# NewGeometry, Offset, OpenExcellon, OpenGCode, OpenGerber, OpenProject, "
+"Options, Paint, Panelize,\n"
+"# Plot, SaveProject, SaveSys, Scale, SetActive, SetSys, Skew, SubtractPoly,"
+"SubtractRectangle, Version,\n"
+"# WriteGCode\n"
+"#\n"
+"\n"
+msgstr ""
+"#\n"
+"# CREAR UN NUEVO SCRIPT FLATCAM TCL\n"
+"# Tutorial TCL aquí: https://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial."
+"html\n"
+"#\n"
+"\n"
+"# Lista de comandos FlatCAM:\n"
+"# AddCircle, AddPolygon, AddPolyline, AddRectangle, AlignDrill, "
+"AlignDrillGrid, ClearShell, Cncjob,\n"
+"# Cutout, Delete, Drillcncjob, ExportGcode, ExportSVG, Exteriors, GeoCutout, "
+"GeoUnion, GetNames, GetSys,\n"
+"# ImportSvg, Interiors, Isolate, Follow, JoinExcellon, JoinGeometry, "
+"ListSys, MillHoles, Mirror, New,\n"
+"# NewGeometry, Offset, OpenExcellon, OpenGCode, OpenGerber, OpenProject, "
+"Options, Paint, Panelize,\n"
+"# Plot, SaveProject, SaveSys, Scale, SetActive, SetSys, Skew, SubtractPoly,"
+"SubtractRectangle, Version,\n"
+"# WriteGCode\n"
+"#\n"
+"\n"
+
+#: FlatCAMApp.py:6741 FlatCAMApp.py:6744
+msgid "Open TCL script"
+msgstr "Abrir script TCL"
+
+#: FlatCAMApp.py:6752
+msgid "[WARNING_NOTCL] Open TCL script cancelled."
+msgstr "[WARNING_NOTCL] Abrir el script TCL cancelado."
+
+#: FlatCAMApp.py:6764
+#, python-format
+msgid "[ERROR]App.on_fileopenscript() -->%s"
+msgstr "[ERROR]App.on_fileopenscript() -->%s"
+
+#: FlatCAMApp.py:6790 FlatCAMApp.py:6793
+msgid "Run TCL script"
+msgstr "Ejecutar script TCL"
+
+#: FlatCAMApp.py:6801
+msgid "[WARNING_NOTCL] Run TCL script cancelled."
+msgstr "[WARNING_NOTCL] Ejecutar script TCL cancelado."
+
+#: FlatCAMApp.py:6851 FlatCAMApp.py:6855
+msgid "Save Project As ..."
+msgstr "Guardar proyecto como ..."
+
+#: FlatCAMApp.py:6852
+#, python-brace-format
+msgid "{l_save}/Project_{date}"
+msgstr "{l_save}/Proyecto_{date}"
+
+#: FlatCAMApp.py:6860
+msgid "[WARNING_NOTCL] Save Project cancelled."
+msgstr "[WARNING_NOTCL] Guardar proyecto cancelado."
+
+#: FlatCAMApp.py:6904
+msgid "Exporting SVG"
+msgstr "Exportando SVG"
+
+#: FlatCAMApp.py:6938 FlatCAMApp.py:7044 FlatCAMApp.py:7159
+#, python-format
+msgid "[success] SVG file exported to %s"
+msgstr "[success] Archivo SVG exportado a %s"
+
+#: FlatCAMApp.py:6969 FlatCAMApp.py:7090
+#, python-format
+msgid "[WARNING_NOTCL] No object Box. Using instead %s"
+msgstr "[WARNING_NOTCL] Cuadro sin objeto. Usando en su lugar %s"
+
+#: FlatCAMApp.py:7047 FlatCAMApp.py:7162
+msgid "Generating Film ... Please wait."
+msgstr "Generando Película ... Por favor espere."
+
+#: FlatCAMApp.py:7310
+#, python-format
+msgid "[success] Excellon file exported to %s"
+msgstr "[success] Excelente archivo exportado a %s"
+
+#: FlatCAMApp.py:7317
+msgid "Exporting Excellon"
+msgstr "Exportando excellon"
+
+#: FlatCAMApp.py:7322 FlatCAMApp.py:7329
+msgid "[ERROR_NOTCL] Could not export Excellon file."
+msgstr "[ERROR_NOTCL] No se pudo exportar el archivo de Excellon."
+
+#: FlatCAMApp.py:7427
+#, python-format
+msgid "[success] Gerber file exported to %s"
+msgstr "[success] Archivo Gerber exportado a %s"
+
+#: FlatCAMApp.py:7434
+msgid "Exporting Gerber"
+msgstr "Gerber exportador"
+
+#: FlatCAMApp.py:7439 FlatCAMApp.py:7446
+msgid "[ERROR_NOTCL] Could not export Gerber file."
+msgstr "[ERROR_NOTCL] No se pudo exportar el archivo Gerber."
+
+#: FlatCAMApp.py:7486
+#, python-format
+msgid "[success] DXF file exported to %s"
+msgstr "[success] Archivo DXF exportado a %s"
+
+#: FlatCAMApp.py:7492
+msgid "Exporting DXF"
+msgstr "Exportando DXF"
+
+#: FlatCAMApp.py:7497 FlatCAMApp.py:7504
+msgid "[[WARNING_NOTCL]] Could not export DXF file."
+msgstr "[WARNING_NOTCL] No se pudo exportar el archivo DXF."
+
+#: FlatCAMApp.py:7524 FlatCAMApp.py:7566 FlatCAMApp.py:7610
+msgid ""
+"[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and "
+"Gerber are supported"
+msgstr ""
+"[ERROR_NOTCL] El tipo no soportado se elige como parámetro. Solo Geometría y "
+"Gerber son compatibles"
+
+#: FlatCAMApp.py:7534
+msgid "Importing SVG"
+msgstr "Importando SVG"
+
+#: FlatCAMApp.py:7545 FlatCAMApp.py:7587 FlatCAMApp.py:7630 FlatCAMApp.py:7707
+#: FlatCAMApp.py:7768 FlatCAMApp.py:7831 flatcamTools/ToolPDF.py:212
+#, python-format
+msgid "[success] Opened: %s"
+msgstr "[success] Abrió: %s"
+
+#: FlatCAMApp.py:7576
+msgid "Importing DXF"
+msgstr "Importando DXF"
+
+#: FlatCAMApp.py:7618
+msgid "Importing Image"
+msgstr "Importando imagen"
+
+#: FlatCAMApp.py:7659 FlatCAMApp.py:7661
+#, python-format
+msgid "[ERROR_NOTCL] Failed to open file: %s"
+msgstr "[ERROR_NOTCL] Error al abrir el archivo: %s"
+
+#: FlatCAMApp.py:7664
+#, python-brace-format
+msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}"
+msgstr "[ERROR_NOTCL] Error al analizar el archivo: {name}. {error}"
+
+#: FlatCAMApp.py:7671 FlatCAMObj.py:4271
+#: flatcamEditors/FlatCAMExcEditor.py:2077
+msgid "[ERROR] An internal error has ocurred. See shell.\n"
+msgstr "[ERROR] Ha ocurrido un error interno. Ver concha.\n"
+
+#: FlatCAMApp.py:7680
+msgid ""
+"[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation."
+msgstr ""
+"[ERROR_NOTCL] El objeto no es un archivo Gerber o está vacío. Anulando la "
+"creación de objetos."
+
+#: FlatCAMApp.py:7688
+msgid "Opening Gerber"
+msgstr "Apertura de gerber"
+
+#: FlatCAMApp.py:7698
+msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file."
+msgstr ""
+"[ERROR_NOTCL] Gerber abierto fracasó. Probablemente no sea un archivo de "
+"Gerber."
+
+#: FlatCAMApp.py:7731 flatcamTools/ToolPcbWizard.py:418
+msgid "[ERROR_NOTCL] This is not Excellon file."
+msgstr "[ERROR_NOTCL] Este no es un archivo de Excellon."
+
+#: FlatCAMApp.py:7734
+#, python-format
+msgid "[ERROR_NOTCL] Cannot open file: %s"
+msgstr "[ERROR_NOTCL] No se puede abrir el archivo: %s"
+
+#: FlatCAMApp.py:7739 flatcamTools/ToolPcbWizard.py:427
+msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n"
+msgstr "[ERROR_NOTCL] Ha ocurrido un error interno. Ver concha.\n"
+
+#: FlatCAMApp.py:7752 flatcamTools/ToolPDF.py:262
+#: flatcamTools/ToolPcbWizard.py:440
+#, python-format
+msgid "[ERROR_NOTCL] No geometry found in file: %s"
+msgstr "[ERROR_NOTCL] No se encontró geometría en el archivo: %s"
+
+#: FlatCAMApp.py:7755
+msgid "Opening Excellon."
+msgstr "Apertura Excellon."
+
+#: FlatCAMApp.py:7761
+msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file."
+msgstr ""
+"[ERROR_NOTCL] Error al abrir el archivo Excellon. Probablemente no sea un "
+"archivo de Excellon."
+
+#: FlatCAMApp.py:7798
+#, python-format
+msgid "[ERROR_NOTCL] Failed to open %s"
+msgstr "[ERROR_NOTCL] Error al abrir %s"
+
+#: FlatCAMApp.py:7808
+msgid "[ERROR_NOTCL] This is not GCODE"
+msgstr "[ERROR_NOTCL] Esto no es GCODE"
+
+#: FlatCAMApp.py:7814
+msgid "Opening G-Code."
+msgstr "Apertura del código G."
+
+#: FlatCAMApp.py:7822
+msgid ""
+"[ERROR_NOTCL] Failed to create CNCJob Object. Probable not a GCode file.\n"
+" Attempting to create a FlatCAM CNCJob Object from G-Code file failed during "
+"processing"
+msgstr ""
+"[ERROR_NOTCL] Error al crear el objeto CNCJob. Probablemente no sea un "
+"archivo GCode.\n"
+"  El intento de crear un objeto FlatCAM CNCJob desde un archivo G-Code falló "
+"durante el procesamiento"
+
+#: FlatCAMApp.py:7862
+#, python-format
+msgid "[ERROR_NOTCL] Failed to open config file: %s"
+msgstr "[ERROR_NOTCL] Error al abrir el archivo de configuración: %s"
+
+#: FlatCAMApp.py:7888 FlatCAMApp.py:7905
+#, python-format
+msgid "[ERROR_NOTCL] Failed to open project file: %s"
+msgstr "[ERROR_NOTCL] Error al abrir el archivo de proyecto: %s"
+
+#: FlatCAMApp.py:7928
+#, python-format
+msgid "[success] Project loaded from: %s"
+msgstr "[success] Proyecto cargado desde: %s"
+
+#: FlatCAMApp.py:8033
+msgid "Available commands:\n"
+msgstr "Comandos disponibles:\n"
+
+#: FlatCAMApp.py:8035
+msgid ""
+"\n"
+"\n"
+"Type help <command_name> for usage.\n"
+" Example: help open_gerber"
+msgstr ""
+"\n"
+"\n"
+"Escriba help <command_name> para su uso.\n"
+"Ejemplo: help open_gerber"
+
+#: FlatCAMApp.py:8185
+msgid "Shows list of commands."
+msgstr "Muestra la lista de comandos."
+
+#: FlatCAMApp.py:8242
+msgid "[ERROR_NOTCL] Failed to load recent item list."
+msgstr "[ERROR_NOTCL] Error al cargar la lista de elementos recientes."
+
+#: FlatCAMApp.py:8249
+msgid "[ERROR_NOTCL] Failed to parse recent item list."
+msgstr "[ERROR_NOTCL] Error al analizar la lista de elementos recientes."
+
+#: FlatCAMApp.py:8293
+msgid "Clear Recent files"
+msgstr "Borrar archivos recientes"
+
+#: FlatCAMApp.py:8310 flatcamGUI/FlatCAMGUI.py:975
+msgid "<b>Shortcut Key List</b>"
+msgstr "<b> Lista de teclas de acceso directo </b>"
+
+#: FlatCAMApp.py:8317
+msgid ""
+"\n"
+"<p><span style=\"font-size:14px\"><strong>Selected Tab - Choose an Item from "
+"Project Tab</strong></span></p>\n"
+"\n"
+"<p><span style=\"font-size:10px\"><strong>Details</strong>:<br />\n"
+"The normal flow when working in FlatCAM is the following:</span></p>\n"
+"\n"
+"<ol>\n"
+"\t<li><span style=\"font-size:10px\">Loat/Import a Gerber, Excellon, Gcode, "
+"DXF, Raster Image or SVG file into FlatCAM using either the menu&#39;s, "
+"toolbars, key shortcuts or even dragging and dropping the files on the GUI."
+"<br />\n"
+"\t<br />\n"
+"\tYou can also load a <strong>FlatCAM project</strong> by double clicking on "
+"the project file, drag &amp; drop of the file into the FLATCAM GUI or "
+"through the menu/toolbar links offered within the app.</span><br />\n"
+"\t&nbsp;</li>\n"
+"\t<li><span style=\"font-size:10px\">Once an object is available in the "
+"Project Tab, by selecting it and then focusing on <strong>SELECTED TAB </"
+"strong>(more simpler is to double click the object name in the Project Tab), "
+"<strong>SELECTED TAB </strong>will be updated with the object properties "
+"according to it&#39;s kind: Gerber, Excellon, Geometry or CNCJob object.<br /"
+">\n"
+"\t<br />\n"
+"\tIf the selection of the object is done on the canvas by single click "
+"instead, and the <strong>SELECTED TAB</strong> is in focus, again the object "
+"properties will be displayed into the Selected Tab. Alternatively, double "
+"clicking on the object on the canvas will bring the <strong>SELECTED TAB</"
+"strong> and populate it even if it was out of focus.<br />\n"
+"\t<br />\n"
+"\tYou can change the parameters in this screen and the flow direction is "
+"like this:<br />\n"
+"\t<br />\n"
+"\t<strong>Gerber/Excellon Object</strong> -&gt; Change Param -&gt; Generate "
+"Geometry -&gt;<strong> Geometry Object </strong>-&gt; Add tools (change "
+"param in Selected Tab) -&gt; Generate CNCJob -&gt;<strong> CNCJob Object </"
+"strong>-&gt; Verify GCode (through Edit CNC Code) and/or append/prepend to "
+"GCode (again, done in <strong>SELECTED TAB)&nbsp;</strong>-&gt; Save GCode</"
+"span></li>\n"
+"</ol>\n"
+"\n"
+"<p><span style=\"font-size:10px\">A list of key shortcuts is available "
+"through an menu entry in <strong>Help -&gt; Shortcuts List</strong>&nbsp;or "
+"through it&#39;s own key shortcut: <strng>F3</strong>.</span></p>\n"
+"\n"
+"        "
+msgstr ""
+"\n"
+"<p><span style=\"font-size: 14px\"><strong> Pestaña seleccionada: elija un "
+"elemento en la pestaña Proyecto </strong></span></p>\n"
+"\n"
+"<p><span style=\"font-size: 10px\"><strong> Detalles </strong>: <br />\n"
+"El flujo normal cuando se trabaja en FlatCAM es el siguiente: </span></p>\n"
+"\n"
+"<ol>\n"
+"<li><span style=\"font-size: 10px\"> Loat / Importe un archivo Gerber, "
+"Excellon, Gcode, DXF, Raster Image o SVG en FlatCAM usando los menús, barras "
+"de herramientas, atajos de teclado o incluso arrastrando y soltando los "
+"archivos en la GUI. <br />\n"
+"<br />\n"
+"También puede cargar un <strong> proyecto FlatCAM </strong> haciendo doble "
+"clic en el archivo del proyecto, arrastrar & amp; coloque el archivo en la "
+"GUI de FLATCAM o a través de los enlaces del menú / barra de herramientas "
+"que se ofrecen dentro de la aplicación. </span><br />\n"
+"& nbsp; </li>\n"
+"<li><span style=\"font-size: 10px\"> Una vez que un objeto está disponible "
+"en la pestaña Proyecto, al seleccionarlo y luego concentrarse en <strong> "
+"TABLA SELECCIONADA </strong> (más simple es hacer doble clic en el objeto "
+"nombre en la pestaña Proyecto), <strong> TABLA SELECCIONADA </strong> se "
+"actualizará con las propiedades del objeto según su tipo: objetos Gerber, "
+"Excellon, Geometry o CNCJob. <br />\n"
+"<br />\n"
+"Si, en su lugar, la selección del objeto se realiza en el lienzo con un solo "
+"clic y la <strong> PESTAÑA SELECCIONADA </strong> está enfocada, nuevamente "
+"las propiedades del objeto se mostrarán en la pestaña Seleccionado. "
+"Alternativamente, al hacer doble clic en el objeto en el lienzo, aparecerá "
+"<strong> TABLA SELECCIONADA </strong> y se rellenará incluso si está "
+"desenfocado. <br />\n"
+"<br />\n"
+"Puede cambiar los parámetros en esta pantalla y la dirección del flujo es "
+"así: <br />\n"
+"<br />\n"
+"<strong> Objeto Gerber / Excellon </strong> - & gt; Cambiar parámetro - & "
+"gt; Generar geometría - & gt; <strong> Objeto de geometría </strong> - & gt; "
+"Agregar herramientas (cambiar parámetro en la pestaña Seleccionada) - & gt; "
+"Generar CNCJob - & gt; <strong> CNCJob Object </strong> - & gt; Verifique "
+"GCode (a través de Editar código CNC) y / o agregue / anteponga a GCode "
+"(nuevamente, hecho en <strong> TABLA SELECCIONADA) & nbsp; </strong> - & gt; "
+"Guardar GCode </span> </li>\n"
+"</ol>\n"
+"\n"
+"<p><span style=\"font-size: 10px\"> Una lista de accesos directos clave está "
+"disponible a través de una entrada de menú en <strong> Ayuda - & gt; Lista "
+"de accesos directos </strong> & nbsp; o mediante el método abreviado de su "
+"propia tecla: <strng>F3</strong>.</span></p>\n"
+"\n"
+" "
+
+#: FlatCAMApp.py:8424
+msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect."
+msgstr ""
+"[WARNING_NOTCL] Falló la comprobación de la última versión. No pudo conectar."
+
+#: FlatCAMApp.py:8431
+msgid "[ERROR_NOTCL] Could not parse information about latest version."
+msgstr ""
+"[ERROR_NOTCL] No se pudo analizar la información sobre la última versión."
+
+#: FlatCAMApp.py:8441
+msgid "[success] FlatCAM is up to date!"
+msgstr "[success] FlatCAM está al día!"
+
+#: FlatCAMApp.py:8446
+msgid "Newer Version Available"
+msgstr "Nueva versión disponible"
+
+#: FlatCAMApp.py:8447
+msgid ""
+"There is a newer version of FlatCAM available for download:\n"
+"\n"
+msgstr ""
+"Hay una versión más nueva de FlatCAM disponible para descargar:\n"
+"\n"
+
+#: FlatCAMApp.py:8449
+msgid "info"
+msgstr "info"
+
+#: FlatCAMApp.py:8468
+msgid "[success] All plots disabled."
+msgstr "[success] Todas las parcelas con discapacidad."
+
+#: FlatCAMApp.py:8474
+msgid "[success] All non selected plots disabled."
+msgstr "[success] Todas las parcelas no seleccionadas deshabilitadas."
+
+#: FlatCAMApp.py:8480
+msgid "[success] All plots enabled."
+msgstr "[success] Todas las parcelas habilitadas."
+
+#: FlatCAMApp.py:8486
+msgid "[success] Selected plots enabled..."
+msgstr "[success] Parcelas seleccionadas habilitadas ..."
+
+#: FlatCAMApp.py:8494
+msgid "[success] Selected plots disabled..."
+msgstr "[success] Parcelas seleccionadas deshabilitadas ..."
+
+#: FlatCAMApp.py:8504 FlatCAMApp.py:8517
+msgid "Working ..."
+msgstr "Trabajando ..."
+
+#: FlatCAMApp.py:8551
+msgid "Saving FlatCAM Project"
+msgstr "Proyecto FlatCAM de ahorro"
+
+#: FlatCAMApp.py:8572 FlatCAMApp.py:8603
+#, python-format
+msgid "[success] Project saved to: %s"
+msgstr "[success] Proyecto guardado en: %s"
+
+#: FlatCAMApp.py:8590
+#, python-format
+msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it."
+msgstr ""
+"[ERROR_NOTCL] Error al verificar el archivo del proyecto: %s. Vuelva a "
+"intentarlo para guardarlo."
+
+#: FlatCAMApp.py:8597
+#, python-format
+msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it."
+msgstr ""
+"[ERROR_NOTCL] Error al analizar el archivo de proyecto guardado: %s. Vuelva "
+"a intentarlo para guardarlo."
+
+#: FlatCAMApp.py:8605
+#, python-format
+msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it."
+msgstr ""
+"[ERROR_NOTCL] Error al guardar el archivo de proyecto: %s. Vuelva a "
+"intentarlo para guardarlo."
+
+#: FlatCAMObj.py:207
+#, python-brace-format
+msgid "[success] Name changed from {old} to {new}"
+msgstr "[success] El nombre cambió de {old} a {new}"
+
+#: FlatCAMObj.py:553 FlatCAMObj.py:2038 FlatCAMObj.py:3305 FlatCAMObj.py:5490
+msgid "<span style=\"color:green;\"><b>Basic</b></span>"
+msgstr "<span style=\"color:green;\"><b>Basic</b></span>"
+
+#: FlatCAMObj.py:565 FlatCAMObj.py:2054 FlatCAMObj.py:3327 FlatCAMObj.py:5496
+msgid "<span style=\"color:red;\"><b>Advanced</b></span>"
+msgstr "<span style=\"color:red;\"><b>Avanzado</b></span>"
+
+#: FlatCAMObj.py:927 FlatCAMObj.py:982
+#, python-format
+msgid "[success] Isolation geometry created: %s"
+msgstr "[success] Geometría de aislamiento creada: %s"
+
+#: FlatCAMObj.py:1161
+msgid "Plotting Apertures"
+msgstr "Aperturas de trazado"
+
+#: FlatCAMObj.py:1881 flatcamEditors/FlatCAMExcEditor.py:1368
+msgid "Total Drills"
+msgstr "Taladros totales"
+
+#: FlatCAMObj.py:1907 flatcamEditors/FlatCAMExcEditor.py:1400
+msgid "Total Slots"
+msgstr "Ranuras totales"
+
+#: FlatCAMObj.py:2110 FlatCAMObj.py:3379 FlatCAMObj.py:3679 FlatCAMObj.py:3874
+#: FlatCAMObj.py:3887 FlatCAMObj.py:4004 FlatCAMObj.py:4421 FlatCAMObj.py:4659
+#: FlatCAMObj.py:5072 flatcamEditors/FlatCAMExcEditor.py:1474
+#: flatcamTools/ToolCalculators.py:304 flatcamTools/ToolCalculators.py:315
+#: flatcamTools/ToolCalculators.py:327 flatcamTools/ToolCalculators.py:342
+#: flatcamTools/ToolCalculators.py:355 flatcamTools/ToolCalculators.py:369
+#: flatcamTools/ToolCalculators.py:380 flatcamTools/ToolCalculators.py:391
+#: flatcamTools/ToolCalculators.py:402 flatcamTools/ToolFilm.py:241
+#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:481
+#: flatcamTools/ToolNonCopperClear.py:553
+#: flatcamTools/ToolNonCopperClear.py:630
+#: flatcamTools/ToolNonCopperClear.py:647 flatcamTools/ToolPaint.py:537
+#: flatcamTools/ToolPaint.py:609 flatcamTools/ToolPaint.py:746
+#: flatcamTools/ToolPaint.py:846 flatcamTools/ToolPaint.py:1000
+#: flatcamTools/ToolPanelize.py:385 flatcamTools/ToolPanelize.py:397
+#: flatcamTools/ToolPanelize.py:410 flatcamTools/ToolPanelize.py:423
+#: flatcamTools/ToolPanelize.py:435 flatcamTools/ToolPanelize.py:446
+#: flatcamTools/ToolSolderPaste.py:754 flatcamTools/ToolSolderPaste.py:826
+msgid "[ERROR_NOTCL] Wrong value format entered, use a number."
+msgstr "[ERROR_NOTCL] Formato de valor incorrecto introducido, use un número."
+
+#: FlatCAMObj.py:2334 FlatCAMObj.py:2426 FlatCAMObj.py:2549
+msgid ""
+"[ERROR_NOTCL] Please select one or more tools from the list and try again."
+msgstr ""
+"[ERROR_NOTCL] Por favor seleccione una o más herramientas de la lista e "
+"intente nuevamente."
+
+#: FlatCAMObj.py:2341
+msgid ""
+"[ERROR_NOTCL] Milling tool for DRILLS is larger than hole size. Cancelled."
+msgstr ""
+"[ERROR_NOTCL] La herramienta de fresado para TALADRO es más grande que el "
+"tamaño del orificio. Cancelado."
+
+#: FlatCAMObj.py:2355 FlatCAMObj.py:2450 FlatCAMObj.py:2569
+msgid "Tool_nr"
+msgstr "Herramienta_nu"
+
+#: FlatCAMObj.py:2355 FlatCAMObj.py:2450 FlatCAMObj.py:2569
+#: flatcamEditors/FlatCAMExcEditor.py:819
+#: flatcamEditors/FlatCAMExcEditor.py:2020 flatcamGUI/ObjectUI.py:556
+#: flatcamTools/ToolNonCopperClear.py:83 flatcamTools/ToolPaint.py:80
+#: flatcamTools/ToolPcbWizard.py:76 flatcamTools/ToolSolderPaste.py:81
+msgid "Diameter"
+msgstr "Diámetro"
+
+#: FlatCAMObj.py:2355 FlatCAMObj.py:2450 FlatCAMObj.py:2569
+msgid "Drills_Nr"
+msgstr "Taladros_nu"
+
+#: FlatCAMObj.py:2355 FlatCAMObj.py:2450 FlatCAMObj.py:2569
+msgid "Slots_Nr"
+msgstr "Ranuras_nu"
+
+#: FlatCAMObj.py:2436
+msgid ""
+"[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled."
+msgstr ""
+"[ERROR_NOTCL] La herramienta de fresado para SLOTS es más grande que el "
+"tamaño del orificio. Cancelado."
+
+#: FlatCAMObj.py:2611 FlatCAMObj.py:4309 FlatCAMObj.py:4525 FlatCAMObj.py:4842
+msgid ""
+"[ERROR_NOTCL] Wrong value format for self.defaults[\"z_pdepth\"] or self."
+"options[\"z_pdepth\"]"
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto para self.defaults [\"z_pdepth\"] "
+"o self.options [\"z_pdepth\"]"
+
+#: FlatCAMObj.py:2623 FlatCAMObj.py:4321 FlatCAMObj.py:4537 FlatCAMObj.py:4854
+msgid ""
+"[ERROR_NOTCL] Wrong value format for self.defaults[\"feedrate_probe\"] or "
+"self.options[\"feedrate_probe\"]"
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto para self.defaults "
+"[\"feedrate_probe\"] o self.options [\"feedrate_probe\"]"
+
+#: FlatCAMObj.py:2655 FlatCAMObj.py:4730 FlatCAMObj.py:4735 FlatCAMObj.py:4885
+msgid "Generating CNC Code"
+msgstr "Generando Código CNC"
+
+#: FlatCAMObj.py:2681 FlatCAMObj.py:5031 camlib.py:5167 camlib.py:5626
+#: camlib.py:5889
+msgid ""
+"[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the "
+"format (x, y) \n"
+"but now there is only one value, not two. "
+msgstr ""
+"[ERROR] El campo Toolchange X, Y en Editar -> Preferencias tiene que estar "
+"en el formato (x, y)\n"
+"pero ahora solo hay un valor, no dos. "
+
+#: FlatCAMObj.py:3001 FlatCAMObj.py:3930 FlatCAMObj.py:3931 FlatCAMObj.py:3940
+msgid "Iso"
+msgstr "Aisl."
+
+#: FlatCAMObj.py:3001 FlatCAMObj.py:3262 FlatCAMObj.py:3544
+msgid "Rough"
+msgstr "Áspero"
+
+#: FlatCAMObj.py:3001
+msgid "Finish"
+msgstr "Terminar"
+
+#: FlatCAMObj.py:3298 flatcamGUI/FlatCAMGUI.py:530 flatcamGUI/FlatCAMGUI.py:729
+#: flatcamGUI/FlatCAMGUI.py:1634 flatcamGUI/FlatCAMGUI.py:1972
+#: flatcamGUI/ObjectUI.py:999
+msgid "Copy"
+msgstr "Dupdo"
+
+#: FlatCAMObj.py:3514
+msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format."
+msgstr ""
+"[ERROR_NOTCL] Por favor ingrese el diámetro deseado de la herramienta en "
+"formato Float."
+
+#: FlatCAMObj.py:3589
+msgid "[success] Tool added in Tool Table."
+msgstr "[success] Herramienta añadida en la tabla de herramientas."
+
+#: FlatCAMObj.py:3594
+msgid "[ERROR_NOTCL] Default Tool added. Wrong value format entered."
+msgstr ""
+"[ERROR_NOTCL] Herramienta predeterminada agregada. Se ha introducido un "
+"formato de valor incorrecto."
+
+#: FlatCAMObj.py:3624 FlatCAMObj.py:3634
+msgid "[WARNING_NOTCL] Failed. Select a tool to copy."
+msgstr "[WARNING_NOTCL] Ha fallado. Seleccione una herramienta para copiar."
+
+#: FlatCAMObj.py:3663
+msgid "[success] Tool was copied in Tool Table."
+msgstr "[success] La herramienta se copió en la tabla de herramientas."
+
+#: FlatCAMObj.py:3696
+msgid "[success] Tool was edited in Tool Table."
+msgstr "[success] La herramienta fue editada en la tabla de herramientas."
+
+#: FlatCAMObj.py:3727 FlatCAMObj.py:3737
+msgid "[WARNING_NOTCL] Failed. Select a tool to delete."
+msgstr "[WARNING_NOTCL] Ha fallado. Seleccione una herramienta para eliminar."
+
+#: FlatCAMObj.py:3761
+msgid "[success] Tool was deleted in Tool Table."
+msgstr "[success] La herramienta se eliminó en la tabla de herramientas."
+
+#: FlatCAMObj.py:4190
+#, python-format
+msgid ""
+"[WARNING_NOTCL] This Geometry can't be processed because it is %s geometry."
+msgstr ""
+"[WARNING_NOTCL] Esta geometría no se puede procesar porque es la geometría "
+"%s."
+
+#: FlatCAMObj.py:4207
+msgid "[ERROR_NOTCL] Wrong Tool Dia value format entered, use a number."
+msgstr ""
+"[ERROR_NOTCL] Se ingresó un formato de valor de Diámetro de herramienta "
+"incorrecta, use un número."
+
+#: FlatCAMObj.py:4234
+msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. Ninguna herramienta seleccionada en la tabla de "
+"herramientas ..."
+
+#: FlatCAMObj.py:4272
+#, python-format
+msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s"
+msgstr "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s"
+
+#: FlatCAMObj.py:4430 FlatCAMObj.py:4668
+msgid ""
+"[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n"
+"Add a Tool Offset or change the Offset Type."
+msgstr ""
+"[WARNING] La Herramienta de desplazamiento se selecciona en la Tabla de "
+"herramientas pero no se proporciona ningún valor.\n"
+"Agregue una Herramienta de compensación o cambie el Tipo de compensación."
+
+#: FlatCAMObj.py:4549 flatcamTools/ToolSolderPaste.py:1108
+#: flatcamTools/ToolSolderPaste.py:1164
+msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..."
+msgstr "[ERROR_NOTCL] Cancelado. Archivo vacío, no tiene geometría ..."
+
+#: FlatCAMObj.py:4918 FlatCAMObj.py:4928 camlib.py:3348 camlib.py:3357
+msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float."
+msgstr ""
+"[ERROR_NOTCL] El factor de escala tiene que ser un número: entero o Float."
+
+#: FlatCAMObj.py:4966
+msgid "[success] Geometry Scale done."
+msgstr "[success] Escala de geometría realizada."
+
+#: FlatCAMObj.py:4983 camlib.py:3426
+msgid ""
+"[ERROR_NOTCL] An (x,y) pair of values are needed. Probable you entered only "
+"one value in the Offset field."
+msgstr ""
+"[ERROR_NOTCL] Se necesita un par de valores (x, y). Probablemente haya "
+"ingresado un solo valor en el campo Desplazamiento."
+
+#: FlatCAMObj.py:5003
+msgid "[success] Geometry Offset done."
+msgstr "[success] Desplazamiento de geometría realizado."
+
+#: FlatCAMObj.py:5558 FlatCAMObj.py:5563 flatcamTools/ToolSolderPaste.py:1364
+msgid "Export Machine Code ..."
+msgstr "Exportar código de máquina ..."
+
+#: FlatCAMObj.py:5569 flatcamTools/ToolSolderPaste.py:1367
+msgid "[WARNING_NOTCL] Export Machine Code cancelled ..."
+msgstr "[WARNING_NOTCL] Exportar código de máquina cancelado ..."
+
+#: FlatCAMObj.py:5582
+#, python-format
+msgid "[success] Machine Code file saved to: %s"
+msgstr "[success] Archivo de código de máquina guardado en: %s"
+
+#: FlatCAMObj.py:5604
+#, python-format
+msgid "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s"
+msgstr "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s"
+
+#: FlatCAMObj.py:5721
+#, python-format
+msgid ""
+"[WARNING_NOTCL] This CNCJob object can't be processed because it is a %s "
+"CNCJob object."
+msgstr ""
+"[WARNING_NOTCL] Este objeto CNCJob no se puede procesar porque es un objeto "
+"%s CNCJob."
+
+#: FlatCAMObj.py:5774
+msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21"
+msgstr "[ERROR_NOTCL] El código G no tiene un código de unidades: G20 o G21"
+
+#: FlatCAMObj.py:5787
+msgid ""
+"[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's "
+"empty."
+msgstr ""
+"[ERROR_NOTCL] Cancelado. El código personalizado de Toolchange está "
+"habilitado pero está vacío."
+
+#: FlatCAMObj.py:5794
+msgid "[success] Toolchange G-code was replaced by a custom code."
+msgstr ""
+"[success] El código G de Toolchange fue reemplazado por un código "
+"personalizado."
+
+#: FlatCAMObj.py:5809 flatcamTools/ToolSolderPaste.py:1393
+msgid "[WARNING_NOTCL] No such file or directory"
+msgstr "[WARNING_NOTCL] El fichero o directorio no existe"
+
+#: FlatCAMObj.py:5829 FlatCAMObj.py:5841
+msgid ""
+"[WARNING_NOTCL] The used postprocessor file has to have in it's name: "
+"'toolchange_custom'"
+msgstr ""
+"[WARNING_NOTCL] El archivo de postprocesador usado debe tener su nombre: "
+"'toolchange_custom'"
+
+#: FlatCAMObj.py:5847
+msgid "[ERROR] There is no postprocessor file."
+msgstr "[ERROR] No hay archivo de postprocesador."
+
+#: FlatCAMTranslation.py:91
+msgid "The application will restart."
+msgstr "La aplicación se reiniciará."
+
+#: FlatCAMTranslation.py:92
+#, python-format
+msgid "Are you sure do you want to change the current language to %s?"
+msgstr "¿Está seguro de que desea cambiar el idioma actual a %s?"
+
+#: FlatCAMTranslation.py:94
+msgid "Apply Language ..."
+msgstr "Aplicar Idioma ..."
+
+#: ObjectCollection.py:420
+#, python-brace-format
+msgid "Object renamed from <b>{old}</b> to <b>{new}</b>"
+msgstr "Objeto renombrado de <b>{old}</b> a <b>{new}</b>"
+
+#: ObjectCollection.py:759
+#, python-format
+msgid "[ERROR] Cause of error: %s"
+msgstr "[ERROR] Causa del error: %s"
+
+#: camlib.py:197
+msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list."
+msgstr "[ERROR_NOTCL] self.solid_geometry no es ni BaseGeometry ni lista."
+
+#: camlib.py:1391
+msgid "[success] Object was mirrored ..."
+msgstr "[success] El objeto fue reflejado ..."
+
+#: camlib.py:1393
+msgid "[ERROR_NOTCL] Failed to mirror. No object selected"
+msgstr "[ERROR_NOTCL] No se pudo reflejar. Ningún objeto seleccionado"
+
+#: camlib.py:1429
+msgid "[success] Object was rotated ..."
+msgstr "[success] El objeto fue girado ..."
+
+#: camlib.py:1431
+msgid "[ERROR_NOTCL] Failed to rotate. No object selected"
+msgstr "[ERROR_NOTCL] No se pudo rotar. Ningún objeto seleccionado"
+
+#: camlib.py:1465
+msgid "[success] Object was skewed ..."
+msgstr "[success] El objeto fue sesgado ..."
+
+#: camlib.py:1467
+msgid "[ERROR_NOTCL] Failed to skew. No object selected"
+msgstr "[ERROR_NOTCL] Error al sesgar. Ningún objeto seleccionado"
+
+#: camlib.py:2728 camlib.py:2813
+#, python-format
+msgid "[WARNING] Coordinates missing, line ignored: %s"
+msgstr "[WARNING] Coordenadas faltantes, línea ignorada: %s"
+
+#: camlib.py:2729 camlib.py:2814
+msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!"
+msgstr ""
+"[WARNING_NOTCL] GERBER archivo podría ser CORRUPT. Revisa el archivo !!!"
+
+#: camlib.py:2778
+#, python-format
+msgid ""
+"[ERROR] Region does not have enough points. File will be processed but there "
+"are parser errors. Line number: %s"
+msgstr ""
+"[ERROR] Región no tiene suficientes puntos. El archivo será procesado pero "
+"hay errores del analizador. Línea de números: %s"
+
+#: camlib.py:3170
+#, python-format
+msgid ""
+"[ERROR]Gerber Parser ERROR.\n"
+"%s:"
+msgstr ""
+"[ERROR] Gerber Parser ERROR.\n"
+"%s:"
+
+#: camlib.py:3394
+msgid "[success] Gerber Scale done."
+msgstr "[success] Escala de Gerber hecha."
+
+#: camlib.py:3459
+msgid "[success] Gerber Offset done."
+msgstr "[success] Gerber Offset hecho."
+
+#: camlib.py:3513
+msgid "[success] Gerber Mirror done."
+msgstr "[success] Espejo Gerber hecho."
+
+#: camlib.py:3559
+msgid "[success] Gerber Skew done."
+msgstr "[success] Gerber Skew hecho."
+
+#: camlib.py:3597
+msgid "[success] Gerber Rotate done."
+msgstr "[success] Gerber Rotate hecho."
+
+#: camlib.py:3878
+#, python-format
+msgid "[ERROR_NOTCL] This is GCODE mark: %s"
+msgstr "[ERROR_NOTCL] Esta es la marca GCODE: %s"
+
+#: camlib.py:3993
+#, python-format
+msgid ""
+"[WARNING] No tool diameter info's. See shell.\n"
+"A tool change event: T%s was found but the Excellon file have no "
+"informations regarding the tool diameters therefore the application will try "
+"to load it by using some 'fake' diameters.\n"
+"The user needs to edit the resulting Excellon object and change the "
+"diameters to reflect the real diameters."
+msgstr ""
+"[WARNING] No hay información de herramientas de diámetro. Ver concha\n"
+"Un evento de cambio de herramienta: se encontró T%s, pero el archivo "
+"Excellon no tiene información sobre los diámetros de la herramienta, por lo "
+"que la aplicación intentará cargarlo utilizando algunos diámetros \"falsos"
+"\".\n"
+"El usuario debe editar el objeto Excellon resultante y cambiar los diámetros "
+"para reflejar los diámetros reales."
+
+#: camlib.py:4458
+#, python-brace-format
+msgid ""
+"[ERROR] Excellon Parser error.\n"
+"Parsing Failed. Line {l_nr}: {line}\n"
+msgstr ""
+"[ERROR] Error de Excel Parser.\n"
+"Error al analizar. Línea {l_nr}: {line}\n"
+
+#: camlib.py:4537
+msgid ""
+"[WARNING] Excellon.create_geometry() -> a drill location was skipped due of "
+"not having a tool associated.\n"
+"Check the resulting GCode."
+msgstr ""
+"[WARNING] Excellon.create_geometry() -> se omitió la ubicación de un taladro "
+"por no tener una herramienta asociada.\n"
+"Compruebe el GCode resultante."
+
+#: camlib.py:5076
+#, python-format
+msgid "[ERROR] There is no such parameter: %s"
+msgstr "[ERROR] No hay tal parámetro: %s"
+
+#: camlib.py:5146
+msgid ""
+"[WARNING] The Cut Z parameter has positive value. It is the depth value to "
+"drill into material.\n"
+"The Cut Z parameter needs to have a negative value, assuming it is a typo "
+"therefore the app will convert the value to negative. Check the resulting "
+"CNC code (Gcode etc)."
+msgstr ""
+"[WARNING] El parámetro Cut Z tiene un valor positivo. Es el valor de "
+"profundidad para perforar en el material.\n"
+"El parámetro Cut Z debe tener un valor negativo, asumiendo que es un error "
+"tipográfico, por lo tanto, la aplicación convertirá el valor a negativo. "
+"Compruebe el código CNC resultante (Gcode, etc.)."
+
+#: camlib.py:5153 camlib.py:5649 camlib.py:5912
+#, python-format
+msgid ""
+"[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file"
+msgstr ""
+"[WARNING] El parámetro Cut Z es cero. No habrá corte, saltando %s archivo"
+
+#: camlib.py:5382 camlib.py:5479 camlib.py:5537
+msgid "[ERROR_NOTCL] The loaded Excellon file has no drills ..."
+msgstr "[ERROR_NOTCL] El archivo Excellon cargado no tiene perforaciones ..."
+
+#: camlib.py:5484
+msgid "[ERROR_NOTCL] Wrong optimization type selected."
+msgstr "[ERROR_NOTCL] Tipo de optimización incorrecto seleccionado."
+
+#: camlib.py:5637 camlib.py:5900
+msgid ""
+"[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad "
+"combinations of other parameters."
+msgstr ""
+"[ERROR_NOTCL] El parámetro Cut_Z es Ninguno o cero. Lo más probable es una "
+"mala combinación de otros parámetros."
+
+#: camlib.py:5642 camlib.py:5905
+msgid ""
+"[WARNING] The Cut Z parameter has positive value. It is the depth value to "
+"cut into material.\n"
+"The Cut Z parameter needs to have a negative value, assuming it is a typo "
+"therefore the app will convert the value to negative.Check the resulting CNC "
+"code (Gcode etc)."
+msgstr ""
+"[WARNING] El parámetro Cut Z tiene un valor positivo. Es el valor de "
+"profundidad para cortar en material.\n"
+"El parámetro Cut Z debe tener un valor negativo, asumiendo que es un error "
+"tipográfico, por lo tanto, la aplicación convertirá el valor a negativo. "
+"Verifique el código CNC resultante (Gcode, etc.)."
+
+#: camlib.py:5654 camlib.py:5917
+msgid "[ERROR_NOTCL] Travel Z parameter is None or zero."
+msgstr "[ERROR_NOTCL] El parámetro Travel Z des Ninguno o cero."
+
+#: camlib.py:5658 camlib.py:5921
+msgid ""
+"[WARNING] The Travel Z parameter has negative value. It is the height value "
+"to travel between cuts.\n"
+"The Z Travel parameter needs to have a positive value, assuming it is a typo "
+"therefore the app will convert the value to positive.Check the resulting CNC "
+"code (Gcode etc)."
+msgstr ""
+"[WARNING] El parámetro Travel Z tiene un valor negativo. Es el valor de "
+"altura para viajar entre cortes.\n"
+"El parámetro Z Travel debe tener un valor positivo, asumiendo que es un "
+"error tipográfico, por lo tanto, la aplicación convertirá el valor a "
+"positivo. Verifique el código CNC resultante (Gcode, etc.)."
+
+#: camlib.py:5665 camlib.py:5928
+#, python-format
+msgid ""
+"[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file"
+msgstr ""
+"[WARNING] El parámetro Z Travel es cero. Esto es peligroso, saltando el "
+"archive %s"
+
+#: camlib.py:5795
+#, python-format
+msgid "[ERROR]Expected a Geometry, got %s"
+msgstr "[ERROR] Se esperaba una geometría, se obtuvo %s"
+
+#: camlib.py:5801
+msgid ""
+"[ERROR_NOTCL] Trying to generate a CNC Job from a Geometry object without "
+"solid_geometry."
+msgstr ""
+"[ERROR_NOTCL] Intentando generar un trabajo de CNC desde un objeto de "
+"geometría sin solid_geometry."
+
+#: camlib.py:5840
+msgid ""
+"[ERROR_NOTCL] The Tool Offset value is too negative to use for the "
+"current_geometry.\n"
+"Raise the value (in module) and try again."
+msgstr ""
+"[ERROR_NOTCL] El valor de Desfase de la herramienta es demasiado negativo "
+"para usarlo con la current_geometry.\n"
+"Aumente el valor (en el módulo) y vuelva a intentarlo."
+
+#: camlib.py:6052
+msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry."
+msgstr ""
+"[ERROR_NOTCL] No hay datos de herramientas en la geometría SolderPaste."
+
+#: flatcamEditors/FlatCAMExcEditor.py:37 flatcamEditors/FlatCAMExcEditor.py:143
+#: flatcamEditors/FlatCAMGrbEditor.py:229
+#: flatcamEditors/FlatCAMGrbEditor.py:234
+msgid "Click to place ..."
+msgstr "Haga clic para colocar ..."
+
+#: flatcamEditors/FlatCAMExcEditor.py:46
+msgid "[WARNING_NOTCL] To add a drill first select a tool"
+msgstr ""
+"[WARNING_NOTCL] Para agregar un taladro primero seleccione una herramienta"
+
+#: flatcamEditors/FlatCAMExcEditor.py:62 flatcamEditors/FlatCAMExcEditor.py:165
+#: flatcamEditors/FlatCAMExcEditor.py:450
+#: flatcamEditors/FlatCAMExcEditor.py:475
+#: flatcamEditors/FlatCAMGrbEditor.py:451
+#: flatcamEditors/FlatCAMGrbEditor.py:1818
+#: flatcamEditors/FlatCAMGrbEditor.py:1846
+msgid "Click on target location ..."
+msgstr "Haga clic en la ubicación de destino ..."
+
+#: flatcamEditors/FlatCAMExcEditor.py:108
+msgid "[success] Done. Drill added."
+msgstr "[success] Hecho. Taladro agregado."
+
+#: flatcamEditors/FlatCAMExcEditor.py:150
+msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table"
+msgstr ""
+"[WARNING_NOTCL] Para agregar una matriz de perforación, primero seleccione "
+"una herramienta en la Tabla de herramientas"
+
+#: flatcamEditors/FlatCAMExcEditor.py:182
+msgid "Click on the Drill Circular Array Start position"
+msgstr ""
+"Haga clic en la posición de inicio de la matriz circular de perforación."
+
+#: flatcamEditors/FlatCAMExcEditor.py:204
+#: flatcamEditors/FlatCAMGrbEditor.py:494
+msgid ""
+"[ERROR_NOTCL] The value is not Float. Check for comma instead of dot "
+"separator."
+msgstr ""
+"[ERROR_NOTCL] El valor no es Float. Compruebe si hay coma en lugar de "
+"separador de puntos."
+
+#: flatcamEditors/FlatCAMExcEditor.py:207
+#, python-format
+msgid "[ERROR_NOTCL] The value is mistyped. Check the value. %s"
+msgstr "[ERROR_NOTCL] El valor está mal escrito. Compruebe el valor. %s"
+
+#: flatcamEditors/FlatCAMExcEditor.py:305
+msgid "[WARNING_NOTCL] Too many drills for the selected spacing angle."
+msgstr ""
+"[WARNING_NOTCL] Demasiados taladros para el ángulo de separación "
+"seleccionado."
+
+#: flatcamEditors/FlatCAMExcEditor.py:322
+msgid "[success] Done. Drill Array added."
+msgstr "[success] Hecho. Drill Array agregado."
+
+#: flatcamEditors/FlatCAMExcEditor.py:333
+msgid "Click on the Drill(s) to resize ..."
+msgstr "Haga clic en el taladro(s) para cambiar el tamaño ..."
+
+#: flatcamEditors/FlatCAMExcEditor.py:354
+msgid ""
+"[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize."
+msgstr ""
+"[ERROR_NOTCL] Falló el tamaño de los taladros. Por favor, introduzca un "
+"diámetro para cambiar el tamaño."
+
+#: flatcamEditors/FlatCAMExcEditor.py:424
+msgid "[success] Done. Drill Resize completed."
+msgstr "[success] Hecho. Drill Resize completado."
+
+#: flatcamEditors/FlatCAMExcEditor.py:427
+msgid "[WARNING_NOTCL] Cancelled. No drills selected for resize ..."
+msgstr ""
+"[WARNING_NOTCL] Cancelado. No hay ejercicios seleccionados para cambiar el "
+"tamaño ..."
+
+#: flatcamEditors/FlatCAMExcEditor.py:452
+#: flatcamEditors/FlatCAMGrbEditor.py:1820
+msgid "Click on reference location ..."
+msgstr "Haga clic en la ubicación de referencia ..."
+
+#: flatcamEditors/FlatCAMExcEditor.py:507
+msgid "[success] Done. Drill(s) Move completed."
+msgstr "[success] Hecho. Taladro (s) Movimiento completado."
+
+#: flatcamEditors/FlatCAMExcEditor.py:592
+msgid "[success] Done. Drill(s) copied."
+msgstr "[success] Hecho. Taladro (s) copiado."
+
+#: flatcamEditors/FlatCAMExcEditor.py:792 flatcamGUI/FlatCAMGUI.py:5038
+msgid "Excellon Editor"
+msgstr "Excelente editor"
+
+#: flatcamEditors/FlatCAMExcEditor.py:799
+#: flatcamEditors/FlatCAMGrbEditor.py:2308
+msgid "Name:"
+msgstr "Nombre:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:805 flatcamTools/ToolNonCopperClear.py:72
+#: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70
+msgid "Tools Table"
+msgstr "Tabla de herramientas"
+
+#: flatcamEditors/FlatCAMExcEditor.py:807 flatcamGUI/ObjectUI.py:538
+msgid ""
+"Tools in this Excellon object\n"
+"when are used for drilling."
+msgstr ""
+"Herramientas en este objeto Excellon.\n"
+"Cuando se utilizan para la perforación."
+
+#: flatcamEditors/FlatCAMExcEditor.py:827
+msgid "Add/Delete Tool"
+msgstr "Añadir / Eliminar herramienta"
+
+#: flatcamEditors/FlatCAMExcEditor.py:829
+msgid ""
+"Add/Delete a tool to the tool list\n"
+"for this Excellon object."
+msgstr ""
+"Agregar / Eliminar una herramienta a la lista de herramientas\n"
+"para este objeto Excellon."
+
+#: flatcamEditors/FlatCAMExcEditor.py:837 flatcamTools/ToolCutOut.py:78
+msgid "Tool Dia:"
+msgstr "Dia de la herramienta:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:839 flatcamGUI/FlatCAMGUI.py:5067
+#: flatcamGUI/ObjectUI.py:978
+msgid "Diameter for the new tool"
+msgstr "Diámetro para la nueva herramienta."
+
+#: flatcamEditors/FlatCAMExcEditor.py:847
+msgid "Add Tool"
+msgstr "Añadir herramienta"
+
+#: flatcamEditors/FlatCAMExcEditor.py:849
+msgid ""
+"Add a new tool to the tool list\n"
+"with the diameter specified above."
+msgstr ""
+"Agregar una nueva herramienta a la lista de herramientas\n"
+"con el diámetro especificado anteriormente."
+
+#: flatcamEditors/FlatCAMExcEditor.py:861
+msgid "Delete Tool"
+msgstr "Eliminar herramienta"
+
+#: flatcamEditors/FlatCAMExcEditor.py:863
+msgid ""
+"Delete a tool in the tool list\n"
+"by selecting a row in the tool table."
+msgstr ""
+"Eliminar una herramienta en la lista de herramientas\n"
+"seleccionando una fila en la tabla de herramientas."
+
+#: flatcamEditors/FlatCAMExcEditor.py:881
+msgid "Resize Drill(s)"
+msgstr "Cambiar el tamaño de taladro (s)"
+
+#: flatcamEditors/FlatCAMExcEditor.py:883
+msgid "Resize a drill or a selection of drills."
+msgstr "Cambiar el tamaño de un ejercicio o una selección de ejercicios."
+
+#: flatcamEditors/FlatCAMExcEditor.py:890
+msgid "Resize Dia:"
+msgstr "Tamaño de Dia:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:892
+msgid "Diameter to resize to."
+msgstr "Diámetro para redimensionar a."
+
+#: flatcamEditors/FlatCAMExcEditor.py:900
+msgid "Resize"
+msgstr "Redimensionar"
+
+#: flatcamEditors/FlatCAMExcEditor.py:902
+msgid "Resize drill(s)"
+msgstr "Cambiar el tamaño de taladro"
+
+#: flatcamEditors/FlatCAMExcEditor.py:924 flatcamGUI/FlatCAMGUI.py:1631
+msgid "Add Drill Array"
+msgstr "Añadir Drill Array"
+
+#: flatcamEditors/FlatCAMExcEditor.py:926
+msgid "Add an array of drills (linear or circular array)"
+msgstr "Agregar una matriz de taladros (lineal o circular)"
+
+#: flatcamEditors/FlatCAMExcEditor.py:932
+msgid ""
+"Select the type of drills array to create.\n"
+"It can be Linear X(Y) or Circular"
+msgstr ""
+"Seleccione el tipo de matriz de taladros para crear.\n"
+"Puede ser lineal X (Y) o circular."
+
+#: flatcamEditors/FlatCAMExcEditor.py:935
+#: flatcamEditors/FlatCAMGrbEditor.py:2595
+msgid "Linear"
+msgstr "Lineal"
+
+#: flatcamEditors/FlatCAMExcEditor.py:936
+#: flatcamEditors/FlatCAMGrbEditor.py:2596
+msgid "Circular"
+msgstr "Circular"
+
+#: flatcamEditors/FlatCAMExcEditor.py:944 flatcamGUI/FlatCAMGUI.py:5077
+msgid "Nr of drills:"
+msgstr "Nu. de ejercicios:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:946 flatcamGUI/FlatCAMGUI.py:5079
+msgid "Specify how many drills to be in the array."
+msgstr "Especifique cuántos ejercicios debe estar en la matriz."
+
+#: flatcamEditors/FlatCAMExcEditor.py:964
+#: flatcamEditors/FlatCAMExcEditor.py:1010
+#: flatcamEditors/FlatCAMGrbEditor.py:2622
+#: flatcamEditors/FlatCAMGrbEditor.py:2667
+msgid "Direction:"
+msgstr "Dirección:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:966
+#: flatcamEditors/FlatCAMGrbEditor.py:2624 flatcamGUI/FlatCAMGUI.py:5094
+msgid ""
+"Direction on which the linear array is oriented:\n"
+"- 'X' - horizontal axis \n"
+"- 'Y' - vertical axis or \n"
+"- 'Angle' - a custom angle for the array inclination"
+msgstr ""
+"Dirección en la que se orienta la matriz lineal:\n"
+"- 'X' - eje horizontal\n"
+"- 'Y' - eje vertical o\n"
+"- 'Ángulo': un ángulo personalizado para la inclinación de la matriz"
+
+#: flatcamEditors/FlatCAMExcEditor.py:973
+#: flatcamEditors/FlatCAMGrbEditor.py:2631 flatcamGUI/FlatCAMGUI.py:5100
+msgid "X"
+msgstr "X"
+
+#: flatcamEditors/FlatCAMExcEditor.py:974
+#: flatcamEditors/FlatCAMGrbEditor.py:2632 flatcamGUI/FlatCAMGUI.py:5101
+msgid "Y"
+msgstr "Y"
+
+#: flatcamEditors/FlatCAMExcEditor.py:975
+#: flatcamEditors/FlatCAMGrbEditor.py:2633 flatcamGUI/FlatCAMGUI.py:5102
+msgid "Angle"
+msgstr "Ángulo"
+
+#: flatcamEditors/FlatCAMExcEditor.py:979
+#: flatcamEditors/FlatCAMGrbEditor.py:2637 flatcamGUI/FlatCAMGUI.py:5108
+msgid "Pitch:"
+msgstr "Paso:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:981
+#: flatcamEditors/FlatCAMGrbEditor.py:2639 flatcamGUI/FlatCAMGUI.py:5110
+msgid "Pitch = Distance between elements of the array."
+msgstr "Paso = Distancia entre elementos de la matriz."
+
+#: flatcamEditors/FlatCAMExcEditor.py:989
+#: flatcamEditors/FlatCAMExcEditor.py:1024
+#: flatcamEditors/FlatCAMGeoEditor.py:665
+#: flatcamEditors/FlatCAMGrbEditor.py:2646
+#: flatcamEditors/FlatCAMGrbEditor.py:2682
+#: flatcamEditors/FlatCAMGrbEditor.py:4743 flatcamGUI/FlatCAMGUI.py:5119
+#: flatcamTools/ToolTransform.py:68
+msgid "Angle:"
+msgstr "Ángulo:"
+
+#: flatcamEditors/FlatCAMExcEditor.py:991
+#: flatcamEditors/FlatCAMGrbEditor.py:2648
+msgid ""
+"Angle at which the linear array is placed.\n"
+"The precision is of max 2 decimals.\n"
+"Min value is: -359.99 degrees.\n"
+"Max value is:  360.00 degrees."
+msgstr ""
+"Ángulo en el que se coloca la matriz lineal.\n"
+"La precisión es de max 2 decimales.\n"
+"El valor mínimo es: -359.99 grados.\n"
+"El valor máximo es: 360.00 grados."
+
+#: flatcamEditors/FlatCAMExcEditor.py:1012
+#: flatcamEditors/FlatCAMGrbEditor.py:2669
+msgid ""
+"Direction for circular array.Can be CW = clockwise or CCW = counter "
+"clockwise."
+msgstr ""
+"Dirección de la matriz circular. Puede ser CW = en sentido horario o CCW = "
+"en sentido antihorario."
+
+#: flatcamEditors/FlatCAMExcEditor.py:1020
+#: flatcamEditors/FlatCAMGrbEditor.py:2677 flatcamGUI/FlatCAMGUI.py:4703
+#: flatcamGUI/FlatCAMGUI.py:5138 flatcamGUI/FlatCAMGUI.py:5327
+msgid "CW"
+msgstr "CW"
+
+#: flatcamEditors/FlatCAMExcEditor.py:1021
+#: flatcamEditors/FlatCAMGrbEditor.py:2678 flatcamGUI/FlatCAMGUI.py:4704
+#: flatcamGUI/FlatCAMGUI.py:5139 flatcamGUI/FlatCAMGUI.py:5328
+msgid "CCW"
+msgstr "CCW"
+
+#: flatcamEditors/FlatCAMExcEditor.py:1026
+#: flatcamEditors/FlatCAMGrbEditor.py:2684 flatcamGUI/FlatCAMGUI.py:5121
+#: flatcamGUI/FlatCAMGUI.py:5147
+msgid "Angle at which each element in circular array is placed."
+msgstr "Ángulo en el que se coloca cada elemento de la matriz circular."
+
+#: flatcamEditors/FlatCAMExcEditor.py:1487
+msgid ""
+"[WARNING_NOTCL] Tool already in the original or actual tool list.\n"
+"Save and reedit Excellon if you need to add this tool. "
+msgstr ""
+"[WARNING_NOTCL] Herramienta ya en la lista de herramientas original o real.\n"
+"Guarde y reedite Excellon si necesita agregar esta herramienta."
+
+#: flatcamEditors/FlatCAMExcEditor.py:1496 flatcamGUI/FlatCAMGUI.py:3027
+#, python-brace-format
+msgid "[success] Added new tool with dia: {dia} {units}"
+msgstr "[success] Nueva herramienta agregada con dia: {dia} {units}"
+
+#: flatcamEditors/FlatCAMExcEditor.py:1528
+msgid "[WARNING_NOTCL] Select a tool in Tool Table"
+msgstr "[WARNING_NOTCL] Seleccione una herramienta en la tabla de herramientas"
+
+#: flatcamEditors/FlatCAMExcEditor.py:1560
+#, python-brace-format
+msgid "[success] Deleted tool with dia: {del_dia} {units}"
+msgstr "[success] Herramienta eliminada con dia: {del_dia} {units}"
+
+#: flatcamEditors/FlatCAMExcEditor.py:2074
+msgid ""
+"[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon "
+"creation."
+msgstr ""
+"[ERROR_NOTCL] No hay definiciones de herramientas en el archivo. Anulando la "
+"creación de Excellon."
+
+#: flatcamEditors/FlatCAMExcEditor.py:2083
+msgid "Creating Excellon."
+msgstr "Creación de Excellon."
+
+#: flatcamEditors/FlatCAMExcEditor.py:2092
+msgid "[success] Excellon editing finished."
+msgstr "[success] Excelente edición terminada."
+
+#: flatcamEditors/FlatCAMExcEditor.py:2109
+msgid "[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected"
+msgstr "[WARNING_NOTCL] Cancelado. No hay herramienta / taladro seleccionado"
+
+#: flatcamEditors/FlatCAMExcEditor.py:2637
+msgid "[success] Done. Drill(s) deleted."
+msgstr "[success] Hecho. Ejercicio (s) eliminado (s)."
+
+#: flatcamEditors/FlatCAMExcEditor.py:2705
+#: flatcamEditors/FlatCAMGrbEditor.py:4461
+msgid "Click on the circular array Center position"
+msgstr "Haga clic en la posición del centro matriz circular"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:80
+#: flatcamEditors/FlatCAMGrbEditor.py:2460
+msgid "Buffer distance:"
+msgstr "Dist. de amortiguación:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:81
+#: flatcamEditors/FlatCAMGrbEditor.py:2461
+msgid "Buffer corner:"
+msgstr "Rincón del búfer:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:83
+msgid ""
+"There are 3 types of corners:\n"
+" - 'Round': the corner is rounded for exterior buffer.\n"
+" - 'Square:' the corner is met in a sharp angle for exterior buffer.\n"
+" - 'Beveled:' the corner is a line that directly connects the features "
+"meeting in the corner"
+msgstr ""
+"Hay 3 tipos de esquinas:\n"
+"  - 'Redondo': la esquina está redondeada para el búfer exterior.\n"
+"  - 'Cuadrado:' la esquina se encuentra en un ángulo agudo para el búfer "
+"exterior.\n"
+"  - 'Biselado:' la esquina es una línea que conecta directamente las "
+"funciones que se encuentran en la esquina"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:89
+#: flatcamEditors/FlatCAMGrbEditor.py:2469
+msgid "Round"
+msgstr "Redondo"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:90
+#: flatcamEditors/FlatCAMGrbEditor.py:2470
+msgid "Square"
+msgstr "Cuadrado"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:91
+#: flatcamEditors/FlatCAMGrbEditor.py:2471
+msgid "Beveled"
+msgstr "Biselado"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:98
+msgid "Buffer Interior"
+msgstr "Interior del amortiguador"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:100
+msgid "Buffer Exterior"
+msgstr "Amortiguador exterior"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:106
+msgid "Full Buffer"
+msgstr "Buffer lleno"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:127
+#: flatcamEditors/FlatCAMGeoEditor.py:2682
+msgid "Buffer Tool"
+msgstr "Herramienta Buffer"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:138
+#: flatcamEditors/FlatCAMGeoEditor.py:155
+#: flatcamEditors/FlatCAMGeoEditor.py:172
+#: flatcamEditors/FlatCAMGeoEditor.py:2700
+#: flatcamEditors/FlatCAMGeoEditor.py:2726
+#: flatcamEditors/FlatCAMGeoEditor.py:2752
+#: flatcamEditors/FlatCAMGrbEditor.py:4513
+msgid ""
+"[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and "
+"retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor de la distancia del búfer o el formato es "
+"incorrecto. Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:343
+msgid "Text Tool"
+msgstr "Herramienta de texto"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:401 flatcamGUI/FlatCAMGUI.py:810
+msgid "Tool"
+msgstr "Herramienta"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:432 flatcamGUI/FlatCAMGUI.py:4084
+#: flatcamGUI/FlatCAMGUI.py:5193 flatcamGUI/FlatCAMGUI.py:5627
+#: flatcamGUI/FlatCAMGUI.py:5904 flatcamGUI/FlatCAMGUI.py:6044
+#: flatcamGUI/ObjectUI.py:260
+msgid "Tool dia:"
+msgstr "Diá. de la herramienta:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:434 flatcamGUI/FlatCAMGUI.py:6046
+msgid ""
+"Diameter of the tool to\n"
+"be used in the operation."
+msgstr ""
+"Diámetro de la herramienta para\n"
+"ser utilizado en la operación."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:443 flatcamGUI/FlatCAMGUI.py:5810
+#: flatcamGUI/FlatCAMGUI.py:6055 flatcamTools/ToolNonCopperClear.py:165
+#: flatcamTools/ToolPaint.py:160
+msgid "Overlap Rate:"
+msgstr "Tasa de superpose.:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:445 flatcamTools/ToolPaint.py:162
+#, python-format
+msgid ""
+"How much (fraction) of the tool width to overlap each tool pass.\n"
+"Example:\n"
+"A value here of 0.25 means 25% from the tool diameter found above.\n"
+"\n"
+"Adjust the value starting with lower values\n"
+"and increasing it if areas that should be painted are still \n"
+"not painted.\n"
+"Lower values = faster processing, faster execution on PCB.\n"
+"Higher values = slow processing and slow execution on CNC\n"
+"due of too many paths."
+msgstr ""
+"Cuánta (fracción) del ancho de la herramienta se superponen con cada pasada "
+"de la herramienta.\n"
+"Ejemplo:\n"
+"Un valor de 0.25 aquí significa 25% del diámetro de la herramienta que se "
+"encuentra arriba.\n"
+"\n"
+"Ajuste el valor comenzando con valores más bajos\n"
+"y aumentándola si las áreas que deben ser pintadas son todavía\n"
+"no pintado\n"
+"Valores más bajos = procesamiento más rápido, ejecución más rápida en PCB.\n"
+"Valores más altos = procesamiento lento y ejecución lenta en CNC\n"
+"Debido a demasiados caminos."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:461 flatcamGUI/FlatCAMGUI.py:5826
+#: flatcamGUI/FlatCAMGUI.py:5912 flatcamGUI/FlatCAMGUI.py:6065
+#: flatcamTools/ToolCutOut.py:87 flatcamTools/ToolNonCopperClear.py:181
+#: flatcamTools/ToolPaint.py:177
+msgid "Margin:"
+msgstr "Margen:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:463 flatcamGUI/FlatCAMGUI.py:6067
+#: flatcamTools/ToolPaint.py:179
+msgid ""
+"Distance by which to avoid\n"
+"the edges of the polygon to\n"
+"be painted."
+msgstr ""
+"Distancia por la cual evitar\n"
+"los bordes del polígono a\n"
+"ser pintado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:472 flatcamGUI/FlatCAMGUI.py:5835
+#: flatcamGUI/FlatCAMGUI.py:6076 flatcamTools/ToolNonCopperClear.py:190
+#: flatcamTools/ToolPaint.py:188
+msgid "Method:"
+msgstr "Método:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:474 flatcamGUI/FlatCAMGUI.py:6078
+msgid ""
+"Algorithm to paint the polygon:<BR><B>Standard</B>: Fixed step inwards."
+"<BR><B>Seed-based</B>: Outwards from seed."
+msgstr ""
+"Algoritmo para pintar el polígono: <BR><B> Estándar </B>: Paso fijo hacia "
+"adentro. <BR><B> Basado en semillas </B>: Hacia afuera desde las semillas."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:480 flatcamGUI/FlatCAMGUI.py:5844
+#: flatcamGUI/FlatCAMGUI.py:6084 flatcamTools/ToolNonCopperClear.py:199
+#: flatcamTools/ToolPaint.py:197
+msgid "Standard"
+msgstr "Estándar"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:481 flatcamGUI/FlatCAMGUI.py:5845
+#: flatcamGUI/FlatCAMGUI.py:6085 flatcamTools/ToolNonCopperClear.py:200
+#: flatcamTools/ToolPaint.py:198
+msgid "Seed-based"
+msgstr "Semillas"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:482 flatcamGUI/FlatCAMGUI.py:5846
+#: flatcamGUI/FlatCAMGUI.py:6086 flatcamTools/ToolNonCopperClear.py:201
+#: flatcamTools/ToolPaint.py:199
+msgid "Straight lines"
+msgstr "Lineas rectas"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:487 flatcamGUI/FlatCAMGUI.py:5851
+#: flatcamGUI/FlatCAMGUI.py:6091 flatcamTools/ToolNonCopperClear.py:206
+#: flatcamTools/ToolPaint.py:204
+msgid "Connect:"
+msgstr "Conectar:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:489 flatcamGUI/FlatCAMGUI.py:5853
+#: flatcamGUI/FlatCAMGUI.py:6093 flatcamTools/ToolNonCopperClear.py:208
+#: flatcamTools/ToolPaint.py:206
+msgid ""
+"Draw lines between resulting\n"
+"segments to minimize tool lifts."
+msgstr ""
+"Dibuja líneas entre el resultado\n"
+"Segmentos para minimizar elevaciones de herramientas."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:496 flatcamGUI/FlatCAMGUI.py:5860
+#: flatcamGUI/FlatCAMGUI.py:6101 flatcamTools/ToolNonCopperClear.py:215
+#: flatcamTools/ToolPaint.py:213
+msgid "Contour:"
+msgstr "Contorno:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:498 flatcamGUI/FlatCAMGUI.py:5862
+#: flatcamGUI/FlatCAMGUI.py:6103 flatcamTools/ToolNonCopperClear.py:217
+#: flatcamTools/ToolPaint.py:215
+msgid ""
+"Cut around the perimeter of the polygon\n"
+"to trim rough edges."
+msgstr ""
+"Corta todo el perímetro del polígono.\n"
+"Para recortar los bordes ásperos."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:509
+msgid "Paint"
+msgstr "Pintar"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:527 flatcamGUI/FlatCAMGUI.py:647
+#: flatcamGUI/FlatCAMGUI.py:1885 flatcamGUI/ObjectUI.py:1314
+#: flatcamTools/ToolPaint.py:340
+msgid "Paint Tool"
+msgstr "Herramienta de pintura"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:563
+msgid "[WARNING_NOTCL] Paint cancelled. No shape selected."
+msgstr "[WARNING_NOTCL] Pintura cancelada. Ninguna forma seleccionada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:574 flatcamTools/ToolCutOut.py:356
+#: flatcamTools/ToolCutOut.py:525 flatcamTools/ToolCutOut.py:665
+#: flatcamTools/ToolCutOut.py:770 flatcamTools/ToolDblSided.py:362
+msgid ""
+"[WARNING_NOTCL] Tool diameter value is missing or wrong format. Add it and "
+"retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor del diámetro de la herramienta o el formato "
+"es incorrecto. Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:585
+msgid ""
+"[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor de superposición o el formato es incorrecto. "
+"Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:597
+msgid ""
+"[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and "
+"retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor de la distancia de margen o formato "
+"incorrecto. Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:606
+#: flatcamEditors/FlatCAMGeoEditor.py:2707
+#: flatcamEditors/FlatCAMGeoEditor.py:2733
+#: flatcamEditors/FlatCAMGeoEditor.py:2759
+#: flatcamTools/ToolNonCopperClear.py:817 flatcamTools/ToolProperties.py:104
+msgid "Tools"
+msgstr "Herramientas"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:617
+#: flatcamEditors/FlatCAMGeoEditor.py:990
+#: flatcamEditors/FlatCAMGrbEditor.py:4694
+#: flatcamEditors/FlatCAMGrbEditor.py:5079 flatcamGUI/FlatCAMGUI.py:658
+#: flatcamGUI/FlatCAMGUI.py:1898 flatcamTools/ToolTransform.py:397
+msgid "Transform Tool"
+msgstr "Herramienta de transformación"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:618
+#: flatcamEditors/FlatCAMGeoEditor.py:679
+#: flatcamEditors/FlatCAMGrbEditor.py:4695
+#: flatcamEditors/FlatCAMGrbEditor.py:4757 flatcamTools/ToolTransform.py:24
+#: flatcamTools/ToolTransform.py:82
+msgid "Rotate"
+msgstr "Girar"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:619
+#: flatcamEditors/FlatCAMGrbEditor.py:4696 flatcamTools/ToolTransform.py:25
+msgid "Skew/Shear"
+msgstr "Sesgo / cizalla"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:620
+#: flatcamEditors/FlatCAMGrbEditor.py:2516
+#: flatcamEditors/FlatCAMGrbEditor.py:4697 flatcamGUI/FlatCAMGUI.py:722
+#: flatcamGUI/FlatCAMGUI.py:1966 flatcamGUI/ObjectUI.py:100
+#: flatcamTools/ToolTransform.py:26
+msgid "Scale"
+msgstr "Escala"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:621
+#: flatcamEditors/FlatCAMGrbEditor.py:4698 flatcamTools/ToolTransform.py:27
+msgid "Mirror (Flip)"
+msgstr "Espejo (Flip)"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:622
+#: flatcamEditors/FlatCAMGrbEditor.py:4699 flatcamGUI/ObjectUI.py:127
+#: flatcamGUI/ObjectUI.py:891 flatcamGUI/ObjectUI.py:1465
+#: flatcamTools/ToolTransform.py:28
+msgid "Offset"
+msgstr "Compensar"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:633
+#: flatcamEditors/FlatCAMGrbEditor.py:4711
+#, python-format
+msgid "Editor %s"
+msgstr "Editor %s"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:667
+#: flatcamEditors/FlatCAMGrbEditor.py:4745 flatcamTools/ToolTransform.py:70
+msgid ""
+"Angle for Rotation action, in degrees.\n"
+"Float number between -360 and 359.\n"
+"Positive numbers for CW motion.\n"
+"Negative numbers for CCW motion."
+msgstr ""
+"Ángulo para la acción de rotación, en grados.\n"
+"Número de flotación entre -360 y 359.\n"
+"Números positivos para movimiento CW.\n"
+"Números negativos para movimiento CCW."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:681
+#: flatcamEditors/FlatCAMGrbEditor.py:4759
+msgid ""
+"Rotate the selected shape(s).\n"
+"The point of reference is the middle of\n"
+"the bounding box for all selected shapes."
+msgstr ""
+"Gire la (s) forma (s) seleccionada (s).\n"
+"El punto de referencia es el centro de\n"
+"El cuadro delimitador para todas las formas seleccionadas."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:704
+#: flatcamEditors/FlatCAMGrbEditor.py:4782 flatcamTools/ToolTransform.py:107
+msgid "Angle X:"
+msgstr "Ángulo X:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:706
+#: flatcamEditors/FlatCAMGeoEditor.py:724
+#: flatcamEditors/FlatCAMGrbEditor.py:4784
+#: flatcamEditors/FlatCAMGrbEditor.py:4802 flatcamTools/ToolTransform.py:109
+#: flatcamTools/ToolTransform.py:127
+msgid ""
+"Angle for Skew action, in degrees.\n"
+"Float number between -360 and 359."
+msgstr ""
+"Ángulo para sesgo de acción, en grados.\n"
+"Número de flotación entre -360 y 359."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:715
+#: flatcamEditors/FlatCAMGrbEditor.py:4793 flatcamTools/ToolTransform.py:118
+msgid "Skew X"
+msgstr "Sesgo x"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:717
+#: flatcamEditors/FlatCAMGeoEditor.py:735
+#: flatcamEditors/FlatCAMGrbEditor.py:4795
+#: flatcamEditors/FlatCAMGrbEditor.py:4813
+msgid ""
+"Skew/shear the selected shape(s).\n"
+"The point of reference is the middle of\n"
+"the bounding box for all selected shapes."
+msgstr ""
+"Sesgar / cortar la (s) forma (s) seleccionada (s).\n"
+"El punto de referencia es el centro de\n"
+"El cuadro delimitador para todas las formas seleccionadas."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:722
+#: flatcamEditors/FlatCAMGrbEditor.py:4800 flatcamTools/ToolTransform.py:125
+msgid "Angle Y:"
+msgstr "Ángulo Y:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:733
+#: flatcamEditors/FlatCAMGrbEditor.py:4811 flatcamTools/ToolTransform.py:136
+msgid "Skew Y"
+msgstr "Sesgo y"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:761
+#: flatcamEditors/FlatCAMGrbEditor.py:4839 flatcamTools/ToolTransform.py:164
+msgid "Factor X:"
+msgstr "Factor X:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:763
+#: flatcamEditors/FlatCAMGrbEditor.py:4841 flatcamTools/ToolTransform.py:166
+msgid "Factor for Scale action over X axis."
+msgstr "Factor para la acción de escala sobre el eje X"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:771
+#: flatcamEditors/FlatCAMGrbEditor.py:4849 flatcamTools/ToolTransform.py:174
+msgid "Scale X"
+msgstr "Escala x"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:773
+#: flatcamEditors/FlatCAMGeoEditor.py:790
+#: flatcamEditors/FlatCAMGrbEditor.py:4851
+#: flatcamEditors/FlatCAMGrbEditor.py:4868
+msgid ""
+"Scale the selected shape(s).\n"
+"The point of reference depends on \n"
+"the Scale reference checkbox state."
+msgstr ""
+"Escala las formas seleccionadas.\n"
+"El punto de referencia depende de\n"
+"El estado de la casilla de verificación Escala de referencia."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:778
+#: flatcamEditors/FlatCAMGrbEditor.py:4856 flatcamTools/ToolTransform.py:181
+msgid "Factor Y:"
+msgstr "Factor Y:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:780
+#: flatcamEditors/FlatCAMGrbEditor.py:4858 flatcamTools/ToolTransform.py:183
+msgid "Factor for Scale action over Y axis."
+msgstr "Factor de acción de escala sobre eje Y."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:788
+#: flatcamEditors/FlatCAMGrbEditor.py:4866 flatcamTools/ToolTransform.py:191
+msgid "Scale Y"
+msgstr "Escala Y"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:797
+#: flatcamEditors/FlatCAMGrbEditor.py:4875 flatcamGUI/FlatCAMGUI.py:6450
+#: flatcamTools/ToolTransform.py:200
+msgid "Link"
+msgstr "Enlazar"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:799
+#: flatcamEditors/FlatCAMGrbEditor.py:4877
+msgid ""
+"Scale the selected shape(s)\n"
+"using the Scale Factor X for both axis."
+msgstr ""
+"Escala las formas seleccionadas\n"
+"Utilizando el Scale Factor X para ambos ejes."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:805
+#: flatcamEditors/FlatCAMGrbEditor.py:4883 flatcamGUI/FlatCAMGUI.py:6458
+#: flatcamTools/ToolTransform.py:208
+msgid "Scale Reference"
+msgstr "Referencia de escala"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:807
+#: flatcamEditors/FlatCAMGrbEditor.py:4885
+msgid ""
+"Scale the selected shape(s)\n"
+"using the origin reference when checked,\n"
+"and the center of the biggest bounding box\n"
+"of the selected shapes when unchecked."
+msgstr ""
+"Escala las formas seleccionadas\n"
+"usando la referencia de origen cuando está marcada,\n"
+"y el centro del cuadro delimitador más grande.\n"
+"de las formas seleccionadas cuando no está marcada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:835
+#: flatcamEditors/FlatCAMGrbEditor.py:4914 flatcamTools/ToolTransform.py:238
+msgid "Value X:"
+msgstr "Valor X:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:837
+#: flatcamEditors/FlatCAMGrbEditor.py:4916 flatcamTools/ToolTransform.py:240
+msgid "Value for Offset action on X axis."
+msgstr "Valor para la acción Offset en el eje X."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:845
+#: flatcamEditors/FlatCAMGrbEditor.py:4924 flatcamTools/ToolTransform.py:248
+msgid "Offset X"
+msgstr "Offset X"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:847
+#: flatcamEditors/FlatCAMGeoEditor.py:865
+#: flatcamEditors/FlatCAMGrbEditor.py:4926
+#: flatcamEditors/FlatCAMGrbEditor.py:4944
+msgid ""
+"Offset the selected shape(s).\n"
+"The point of reference is the middle of\n"
+"the bounding box for all selected shapes.\n"
+msgstr ""
+"Desplazar las formas seleccionadas.\n"
+"El punto de referencia es el centro de\n"
+"El cuadro delimitador para todas las formas seleccionadas.\n"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:853
+#: flatcamEditors/FlatCAMGrbEditor.py:4932 flatcamTools/ToolTransform.py:255
+msgid "Value Y:"
+msgstr "Valor Y:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:855
+#: flatcamEditors/FlatCAMGrbEditor.py:4934 flatcamTools/ToolTransform.py:257
+msgid "Value for Offset action on Y axis."
+msgstr "Valor para la acción Offset en el eje Y."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:863
+#: flatcamEditors/FlatCAMGrbEditor.py:4942 flatcamTools/ToolTransform.py:265
+msgid "Offset Y"
+msgstr "Offset Y"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:894
+#: flatcamEditors/FlatCAMGrbEditor.py:4973 flatcamTools/ToolTransform.py:295
+msgid "Flip on X"
+msgstr "Voltear en X"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:896
+#: flatcamEditors/FlatCAMGeoEditor.py:904
+#: flatcamEditors/FlatCAMGrbEditor.py:4975
+#: flatcamEditors/FlatCAMGrbEditor.py:4983
+msgid ""
+"Flip the selected shape(s) over the X axis.\n"
+"Does not create a new shape."
+msgstr ""
+"Voltea la (s) forma (s) seleccionada (s) sobre el eje X.\n"
+"No crea una nueva forma."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:902
+#: flatcamEditors/FlatCAMGrbEditor.py:4981 flatcamTools/ToolTransform.py:303
+msgid "Flip on Y"
+msgstr "Voltear en Y"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:911
+#: flatcamEditors/FlatCAMGrbEditor.py:4990 flatcamTools/ToolTransform.py:312
+msgid "Ref Pt"
+msgstr "Punto de ref."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:913
+#: flatcamEditors/FlatCAMGrbEditor.py:4992
+msgid ""
+"Flip the selected shape(s)\n"
+"around the point in Point Entry Field.\n"
+"\n"
+"The point coordinates can be captured by\n"
+"left click on canvas together with pressing\n"
+"SHIFT key. \n"
+"Then click Add button to insert coordinates.\n"
+"Or enter the coords in format (x, y) in the\n"
+"Point Entry field and click Flip on X(Y)"
+msgstr ""
+"Voltear la (s) forma (s) seleccionada (s)\n"
+"alrededor del punto en el campo de entrada de puntos.\n"
+"\n"
+"Las coordenadas del punto pueden ser capturadas por\n"
+"Haga clic izquierdo en el lienzo junto con la presión\n"
+"Tecla Shift.\n"
+"Luego haga clic en el botón Agregar para insertar coordenadas.\n"
+"O ingrese las coords en formato (x, y) en el\n"
+"Campo de entrada de puntos y haga clic en Girar en X (Y)"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:925
+#: flatcamEditors/FlatCAMGrbEditor.py:5004 flatcamTools/ToolTransform.py:325
+msgid "Point:"
+msgstr "Punto:"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:927
+#: flatcamEditors/FlatCAMGrbEditor.py:5006
+msgid ""
+"Coordinates in format (x, y) used as reference for mirroring.\n"
+"The 'x' in (x, y) will be used when using Flip on X and\n"
+"the 'y' in (x, y) will be used when using Flip on Y."
+msgstr ""
+"Coordenadas en formato (x, y) utilizadas como referencia para la "
+"duplicación.\n"
+"La 'x' en (x, y) se usará cuando se usa Flip en X y\n"
+"la 'y' en (x, y) se usará cuando se use Flip en Y."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:939
+#: flatcamEditors/FlatCAMGrbEditor.py:5018 flatcamTools/ToolTransform.py:339
+msgid ""
+"The point coordinates can be captured by\n"
+"left click on canvas together with pressing\n"
+"SHIFT key. Then click Add button to insert."
+msgstr ""
+"Las coordenadas del punto pueden ser capturadas por\n"
+"Haga clic izquierdo en el lienzo junto con la presión\n"
+"Tecla Shift. Luego haga clic en el botón Agregar para insertar."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1054
+#: flatcamEditors/FlatCAMGrbEditor.py:5143
+msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected."
+msgstr "[WARNING_NOTCL] Transformación cancelada. Ninguna forma seleccionada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1075
+#: flatcamEditors/FlatCAMGrbEditor.py:5163 flatcamTools/ToolTransform.py:467
+msgid "[ERROR_NOTCL] Wrong value format entered for Rotate, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para Rotar, use un "
+"número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1112
+#: flatcamEditors/FlatCAMGrbEditor.py:5206 flatcamTools/ToolTransform.py:501
+msgid "[ERROR_NOTCL] Wrong value format entered for Skew X, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para el Sesgo X, use un "
+"número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1133
+#: flatcamEditors/FlatCAMGrbEditor.py:5233 flatcamTools/ToolTransform.py:519
+msgid "[ERROR_NOTCL] Wrong value format entered for Skew Y, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para Sesgar Y, use un "
+"número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1154
+#: flatcamEditors/FlatCAMGrbEditor.py:5260 flatcamTools/ToolTransform.py:537
+msgid "[ERROR_NOTCL] Wrong value format entered for Scale X, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para la Escala X, use un "
+"número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1191
+#: flatcamEditors/FlatCAMGrbEditor.py:5301 flatcamTools/ToolTransform.py:571
+msgid "[ERROR_NOTCL] Wrong value format entered for Scale Y, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para la Escala Y, use un "
+"número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1223
+#: flatcamEditors/FlatCAMGrbEditor.py:5339 flatcamTools/ToolTransform.py:600
+msgid "[ERROR_NOTCL] Wrong value format entered for Offset X, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para Offset X, use un "
+"número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1244
+#: flatcamEditors/FlatCAMGrbEditor.py:5365 flatcamTools/ToolTransform.py:618
+msgid "[ERROR_NOTCL] Wrong value format entered for Offset Y, use a number."
+msgstr ""
+"[ERROR_NOTCL] Formato de valor incorrecto ingresado para Desplazamiento Y, "
+"use un número."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1262
+#: flatcamEditors/FlatCAMGrbEditor.py:5388
+msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!"
+msgstr ""
+"[WARNING_NOTCL] Ninguna forma seleccionada. Por favor, seleccione una forma "
+"para rotar!"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1265
+#: flatcamEditors/FlatCAMGrbEditor.py:5391 flatcamTools/ToolTransform.py:639
+msgid "Appying Rotate"
+msgstr "Aplicando rotar"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1293
+#: flatcamEditors/FlatCAMGrbEditor.py:5424
+msgid "[success] Done. Rotate completed."
+msgstr "[success] Hecho. Rotación completada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1309
+#: flatcamEditors/FlatCAMGrbEditor.py:5443
+msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!"
+msgstr ""
+"[WARNING_NOTCL] Ninguna forma seleccionada. Por favor, seleccione una forma "
+"para voltear!"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1312
+#: flatcamEditors/FlatCAMGrbEditor.py:5446 flatcamTools/ToolTransform.py:690
+msgid "Applying Flip"
+msgstr "Aplicando Voltear"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1342
+#: flatcamEditors/FlatCAMGrbEditor.py:5485 flatcamTools/ToolTransform.py:732
+msgid "[success] Flip on the Y axis done ..."
+msgstr "[success] Voltear en el eje Y hecho ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1345
+#: flatcamEditors/FlatCAMGrbEditor.py:5493 flatcamTools/ToolTransform.py:741
+msgid "[success] Flip on the X axis done ..."
+msgstr "[success] Voltear en el eje X hecho ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1364
+#: flatcamEditors/FlatCAMGrbEditor.py:5513
+msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!"
+msgstr ""
+"[WARNING_NOTCL] Ninguna forma seleccionada. Por favor, seleccione una forma "
+"para esquilar / sesgar!"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1367
+#: flatcamEditors/FlatCAMGrbEditor.py:5516 flatcamTools/ToolTransform.py:759
+msgid "Applying Skew"
+msgstr "Aplicando Sesgo"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1392
+#: flatcamEditors/FlatCAMGrbEditor.py:5551 flatcamTools/ToolTransform.py:790
+#, python-format
+msgid "[success] Skew on the %s axis done ..."
+msgstr "[success] Sesgar en el eje %s hecho ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1396
+#: flatcamEditors/FlatCAMGrbEditor.py:5555 flatcamTools/ToolTransform.py:794
+#, python-format
+msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed."
+msgstr "[ERROR_NOTCL] Debido a %s, la acción de Sesgo no se ejecutó."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1407
+#: flatcamEditors/FlatCAMGrbEditor.py:5574
+msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!"
+msgstr ""
+"[WARNING_NOTCL] Ninguna forma seleccionada. Por favor, seleccione una forma "
+"a escala!"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1410
+#: flatcamEditors/FlatCAMGrbEditor.py:5577 flatcamTools/ToolTransform.py:808
+msgid "Applying Scale"
+msgstr "Aplicando la escala"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1443
+#: flatcamEditors/FlatCAMGrbEditor.py:5615 flatcamTools/ToolTransform.py:847
+#, python-format
+msgid "[success] Scale on the %s axis done ..."
+msgstr "[success] Escala en el eje %s hecho ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1446
+#: flatcamEditors/FlatCAMGrbEditor.py:5618 flatcamTools/ToolTransform.py:850
+#, python-format
+msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed."
+msgstr "[ERROR_NOTCL] Debido a %s, no se ejecutó la acción Escala."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1455
+#: flatcamEditors/FlatCAMGrbEditor.py:5631
+msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!"
+msgstr ""
+"[WARNING_NOTCL] Ninguna forma seleccionada. Por favor, seleccione una forma "
+"para compensar!"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1458
+#: flatcamEditors/FlatCAMGrbEditor.py:5634 flatcamTools/ToolTransform.py:860
+msgid "Applying Offset"
+msgstr "Aplicando Offset"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1469
+#: flatcamEditors/FlatCAMGrbEditor.py:5656 flatcamTools/ToolTransform.py:879
+#, python-format
+msgid "[success] Offset on the %s axis done ..."
+msgstr "[success] Desplazamiento en el eje %s hecho ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1473
+#: flatcamEditors/FlatCAMGrbEditor.py:5660 flatcamTools/ToolTransform.py:883
+#, python-format
+msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed."
+msgstr "[ERROR_NOTCL] Debido a %s, la acción de compensación no se ejecutó."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1477
+#: flatcamEditors/FlatCAMGrbEditor.py:5664
+msgid "Rotate ..."
+msgstr "Girar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1478
+#: flatcamEditors/FlatCAMGeoEditor.py:1535
+#: flatcamEditors/FlatCAMGeoEditor.py:1552
+#: flatcamEditors/FlatCAMGrbEditor.py:5665
+#: flatcamEditors/FlatCAMGrbEditor.py:5722
+#: flatcamEditors/FlatCAMGrbEditor.py:5739
+msgid "Enter an Angle Value (degrees):"
+msgstr "Introduzca un valor de ángulo (grados):"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1487
+#: flatcamEditors/FlatCAMGrbEditor.py:5674
+msgid "[success] Geometry shape rotate done..."
+msgstr "[success] Forma de geometría rotar hecho ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1492
+#: flatcamEditors/FlatCAMGrbEditor.py:5679
+msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..."
+msgstr "[WARNING_NOTCL] Forma de geometría rotar cancelada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1498
+#: flatcamEditors/FlatCAMGrbEditor.py:5685
+msgid "Offset on X axis ..."
+msgstr "Offset en el eje X ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1499
+#: flatcamEditors/FlatCAMGeoEditor.py:1518
+#: flatcamEditors/FlatCAMGrbEditor.py:5686
+#: flatcamEditors/FlatCAMGrbEditor.py:5705
+#, python-format
+msgid "Enter a distance Value (%s):"
+msgstr "Introduzca un valor de distancia (%s):"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1508
+#: flatcamEditors/FlatCAMGrbEditor.py:5695
+msgid "[success] Geometry shape offset on X axis done..."
+msgstr "[success] Forma de geometría offset en eje X realizado ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1512
+#: flatcamEditors/FlatCAMGrbEditor.py:5699
+msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..."
+msgstr "[WARNING_NOTCL] Forma de geometría offset X cancelada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1517
+#: flatcamEditors/FlatCAMGrbEditor.py:5704
+msgid "Offset on Y axis ..."
+msgstr "Offset en eje Y ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1527
+#: flatcamEditors/FlatCAMGrbEditor.py:5714
+msgid "[success] Geometry shape offset on Y axis done..."
+msgstr "[success] Forma de geometría offset en eje Y realizada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1531
+#: flatcamEditors/FlatCAMGrbEditor.py:5718
+msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..."
+msgstr "[WARNING_NOTCL] Forma de geometría offset y cancelada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1534
+#: flatcamEditors/FlatCAMGrbEditor.py:5721
+msgid "Skew on X axis ..."
+msgstr "Sesgar en el eje X ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1544
+#: flatcamEditors/FlatCAMGrbEditor.py:5731
+msgid "[success] Geometry shape skew on X axis done..."
+msgstr "[success] Forma de geometría oblicua en eje X realizada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1548
+#: flatcamEditors/FlatCAMGrbEditor.py:5735
+msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..."
+msgstr "[WARNING_NOTCL] Forma de geometría oblicua X cancelada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1551
+#: flatcamEditors/FlatCAMGrbEditor.py:5738
+msgid "Skew on Y axis ..."
+msgstr "Sesgar en el eje Y ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1561
+#: flatcamEditors/FlatCAMGrbEditor.py:5748
+msgid "[success] Geometry shape skew on Y axis done..."
+msgstr "[success] Forma de geometría sesgada en eje Y realizada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1565
+#: flatcamEditors/FlatCAMGrbEditor.py:5752
+msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..."
+msgstr "[WARNING_NOTCL] Forma de geometría oblicua Y cancelada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1929
+#: flatcamEditors/FlatCAMGeoEditor.py:1980
+#: flatcamEditors/FlatCAMGrbEditor.py:1361
+#: flatcamEditors/FlatCAMGrbEditor.py:1430
+msgid "Click on Center point ..."
+msgstr "Haga clic en el punto central ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1936
+#: flatcamEditors/FlatCAMGrbEditor.py:1369
+msgid "Click on Perimeter point to complete ..."
+msgstr "Haga clic en el punto del perímetro para completar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:1965
+msgid "[success] Done. Adding Circle completed."
+msgstr "[success] Hecho. Añadiendo círculo completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2000
+#: flatcamEditors/FlatCAMGrbEditor.py:1462
+msgid "Click on Start point ..."
+msgstr "Haga clic en el punto de inicio ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2002
+#: flatcamEditors/FlatCAMGrbEditor.py:1464
+msgid "Click on Point3 ..."
+msgstr "Haga clic en el punto 3 ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2004
+#: flatcamEditors/FlatCAMGrbEditor.py:1466
+msgid "Click on Stop point ..."
+msgstr "Haga clic en el punto de parada ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2009
+#: flatcamEditors/FlatCAMGrbEditor.py:1471
+msgid "Click on Stop point to complete ..."
+msgstr "Haga clic en el punto de parada para completar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2011
+#: flatcamEditors/FlatCAMGrbEditor.py:1473
+msgid "Click on Point2 to complete ..."
+msgstr "Haga clic en el punto 2 para completar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2013
+#: flatcamEditors/FlatCAMGrbEditor.py:1475
+msgid "Click on Center point to complete ..."
+msgstr "Haga clic en el punto central para completar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2025
+#: flatcamEditors/FlatCAMGrbEditor.py:1487
+#, python-format
+msgid "Direction: %s"
+msgstr "Direccion: %s"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2035
+#: flatcamEditors/FlatCAMGrbEditor.py:1497
+msgid "Mode: Start -> Stop -> Center. Click on Start point ..."
+msgstr "Modo: Inicio -> Detener -> Centro. Haga clic en el punto de inicio ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2038
+#: flatcamEditors/FlatCAMGrbEditor.py:1500
+msgid "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..."
+msgstr "Modo: Punto1 -> Punto3 -> Punto2. Haga clic en el punto 1 ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2041
+#: flatcamEditors/FlatCAMGrbEditor.py:1503
+msgid "Mode: Center -> Start -> Stop. Click on Center point ..."
+msgstr "Modo: Centro -> Iniciar -> Detener. Haga clic en el punto central ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2179
+msgid "[success] Done. Arc completed."
+msgstr "[success] Hecho. Arco completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2198
+#: flatcamEditors/FlatCAMGeoEditor.py:2251
+#: flatcamEditors/FlatCAMGeoEditor.py:2626
+msgid "Click on 1st corner ..."
+msgstr "Haga clic en la primera esquina ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2204
+msgid "Click on opposite corner to complete ..."
+msgstr "Haga clic en la esquina opuesta para completar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2232
+msgid "[success] Done. Rectangle completed."
+msgstr "[success] Hecho. Rectángulo completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2258
+msgid "Click on next Point or click right mouse button to complete ..."
+msgstr ""
+"Haga clic en el siguiente punto o haga clic con el botón derecho del ratón "
+"para completar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2286
+msgid "[success] Done. Polygon completed."
+msgstr "[success] Hecho. Polígono completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2296
+#: flatcamEditors/FlatCAMGeoEditor.py:2342
+#: flatcamEditors/FlatCAMGrbEditor.py:1058
+#: flatcamEditors/FlatCAMGrbEditor.py:1252
+msgid "Backtracked one point ..."
+msgstr "Retrocedido un punto ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2324
+msgid "[success] Done. Path completed."
+msgstr "[success] Hecho. Camino completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2447
+msgid "[WARNING_NOTCL] MOVE: No shape selected. Select a shape to move ..."
+msgstr ""
+"[WARNING_NOTCL] Mover: ninguna forma seleccionada. Seleccione una forma para "
+"mover ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2449
+#: flatcamEditors/FlatCAMGeoEditor.py:2461
+msgid " MOVE: Click on reference point ..."
+msgstr "Mover: Haga clic en el punto de referencia ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2452
+msgid " Click on destination point ..."
+msgstr "Haga clic en el punto de destino ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2486
+msgid "[success] Done. Geometry(s) Move completed."
+msgstr "[success] Hecho. Geometría (s) Movimiento completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2606
+msgid "[success] Done. Geometry(s) Copy completed."
+msgstr "[success] Hecho. Geometría (s) Copia completada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2640
+#, python-format
+msgid ""
+"[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are "
+"supported. Error: %s"
+msgstr ""
+"[ERROR] Fuente no soportada. Solo se admiten las versiones Regular, Bold, "
+"Italic y BoldItalic. Error: %s"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2650
+msgid "[success] Done. Adding Text completed."
+msgstr "[success] Hecho. Adición de texto completado."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2678
+msgid "Create buffer geometry ..."
+msgstr "Crear geometría de búfer ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2689
+#: flatcamEditors/FlatCAMGeoEditor.py:2715
+#: flatcamEditors/FlatCAMGeoEditor.py:2741
+msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected."
+msgstr "[WARNING_NOTCL] Buffer cancelado. Ninguna forma seleccionada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2711
+#: flatcamEditors/FlatCAMGrbEditor.py:4558
+msgid "[success] Done. Buffer Tool completed."
+msgstr "[success] Hecho. Herramienta de amortiguación completada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2737
+msgid "[success] Done. Buffer Int Tool completed."
+msgstr "[success] Hecho. Herramienta interna de búfer completada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2763
+msgid "[success] Done. Buffer Ext Tool completed."
+msgstr "[success] Hecho. Herramienta externa de búfer completada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2798
+#: flatcamEditors/FlatCAMGrbEditor.py:2025
+msgid "Select a shape to act as deletion area ..."
+msgstr "Seleccione una forma para que actúe como área de eliminación ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2800
+#: flatcamEditors/FlatCAMGeoEditor.py:2819
+#: flatcamEditors/FlatCAMGeoEditor.py:2825
+#: flatcamEditors/FlatCAMGrbEditor.py:2027
+msgid "Click to pick-up the erase shape..."
+msgstr "Haga clic para recoger la forma de borrar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2829
+#: flatcamEditors/FlatCAMGrbEditor.py:2084
+msgid "Click to erase ..."
+msgstr "Haga clic para borrar ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2858
+#: flatcamEditors/FlatCAMGrbEditor.py:2117
+msgid "[success] Done. Eraser tool action completed."
+msgstr ""
+"[success] Hecho. Se ha completado la acción de la herramienta de borrador."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2901
+msgid "Create Paint geometry ..."
+msgstr "Crear geometría de pintura ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:2915
+#: flatcamEditors/FlatCAMGrbEditor.py:2259
+msgid "Shape transformations ..."
+msgstr "Transformaciones de formas ..."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:3419
+#, python-brace-format
+msgid ""
+"[WARNING_NOTCL] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}"
+msgstr ""
+"[WARNING_NOTCL] Edición de Geometría MultiGeo, herramienta: {tool} con "
+"diámetro: {dia}"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:3796
+msgid "[WARNING_NOTCL] Copy cancelled. No shape selected."
+msgstr "[WARNING_NOTCL] Copia cancelada. Ninguna forma seleccionada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:3803 flatcamGUI/FlatCAMGUI.py:2757
+#: flatcamGUI/FlatCAMGUI.py:2803 flatcamGUI/FlatCAMGUI.py:2821
+#: flatcamGUI/FlatCAMGUI.py:2952 flatcamGUI/FlatCAMGUI.py:2964
+#: flatcamGUI/FlatCAMGUI.py:2998
+msgid "Click on target point."
+msgstr "Haga clic en el punto de destino."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4047
+#: flatcamEditors/FlatCAMGeoEditor.py:4082
+msgid ""
+"[WARNING_NOTCL] A selection of at least 2 geo items is required to do "
+"Intersection."
+msgstr ""
+"[WARNING_NOTCL] Se requiere una selección de al menos 2 elementos geo para "
+"hacer Intersección."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4166
+#: flatcamEditors/FlatCAMGeoEditor.py:4204
+#: flatcamEditors/FlatCAMGeoEditor.py:4280
+msgid ""
+"[ERROR_NOTCL] Negative buffer value is not accepted. Use Buffer interior to "
+"generate an 'inside' shape"
+msgstr ""
+"[ERROR_NOTCL] No se acepta el valor de búfer negativo. Usa el interior del "
+"amortiguador para generar una forma 'interior'"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4175
+#: flatcamEditors/FlatCAMGeoEditor.py:4213
+#: flatcamEditors/FlatCAMGeoEditor.py:4288
+msgid "[WARNING_NOTCL] Nothing selected for buffering."
+msgstr "[WARNING_NOTCL] Nada seleccionado para el almacenamiento en búfer."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4179
+#: flatcamEditors/FlatCAMGeoEditor.py:4217
+#: flatcamEditors/FlatCAMGeoEditor.py:4292
+msgid "[WARNING_NOTCL] Invalid distance for buffering."
+msgstr "[WARNING_NOTCL] Distancia no válida para el almacenamiento en búfer."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4189
+#: flatcamEditors/FlatCAMGeoEditor.py:4301
+msgid ""
+"[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value."
+msgstr ""
+"[ERROR_NOTCL] Falló, el resultado está vacío. Elija un valor de búfer "
+"diferente."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4197
+msgid "[success] Full buffer geometry created."
+msgstr "[success] Geometría de búfer completa creada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4227
+msgid ""
+"[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value."
+msgstr ""
+"[ERROR_NOTCL] Falló, el resultado está vacío. Elija un valor de búfer más "
+"pequeño."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4242
+msgid "[success] Interior buffer geometry created."
+msgstr "[success] Geometría de búfer interior creada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4313
+msgid "[success] Exterior buffer geometry created."
+msgstr "[success] Geometría de búfer exterior creada."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4377
+msgid "[WARNING_NOTCL] Nothing selected for painting."
+msgstr "[WARNING_NOTCL] Nada seleccionado para pintar."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4383
+msgid "[WARNING] Invalid value for {}"
+msgstr "[WARNING] Valor no válido para {}"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4389
+msgid ""
+"[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 "
+"(100%)."
+msgstr ""
+"[ERROR_NOTCL] No se pudo hacer pintura. El valor de superposición debe ser "
+"inferior a 1.00 (100%%)."
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4448
+#, python-format
+msgid ""
+"[ERROR] Could not do Paint. Try a different combination of parameters. Or a "
+"different method of Paint\n"
+"%s"
+msgstr ""
+"[ERROR] No se pudo hacer pintura. Intenta una combinación diferente de "
+"parámetros. O un método diferente de pintura.\n"
+"%s"
+
+#: flatcamEditors/FlatCAMGeoEditor.py:4459
+msgid "[success] Paint done."
+msgstr "[success] Pintura hecha"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:200
+msgid "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table"
+msgstr ""
+"[WARNING_NOTCL] Para agregar un Pad primero, seleccione una abertura en la "
+"Tabla de Aperture"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:206
+#: flatcamEditors/FlatCAMGrbEditor.py:398
+msgid ""
+"[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero."
+msgstr ""
+"[WARNING_NOTCL] El tamaño de la abertura es cero. Tiene que ser mayor que "
+"cero."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:357
+#: flatcamEditors/FlatCAMGrbEditor.py:662
+msgid ""
+"Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'."
+msgstr ""
+"Tipo de apertura incompatible. Seleccione una abertura con el tipo 'C', 'R' "
+"o 'O'."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:369
+msgid "[success] Done. Adding Pad completed."
+msgstr "[success] Hecho. Añadiendo Pad completado."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:391
+msgid ""
+"[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table"
+msgstr ""
+"[WARNING_NOTCL] Para agregar un Pad Array, primero seleccione una abertura "
+"en la Tabla de Aperturas"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:468
+msgid "Click on the Pad Circular Array Start position"
+msgstr "Haga clic en la posición de inicio Pad Array Circular"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:497
+msgid "[ERROR_NOTCL] The value is mistyped. Check the value."
+msgstr "[ERROR_NOTCL] El valor está mal escrito. Compruebe el valor."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:687
+msgid "[WARNING_NOTCL] Too many Pads for the selected spacing angle."
+msgstr ""
+"[WARNING_NOTCL] Demasiados pads para el ángulo de espaciado seleccionado."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:709
+msgid "[success] Done. Pad Array added."
+msgstr "[success] Hecho. Pad Array añadido."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:730
+msgid "Select shape(s) and then click ..."
+msgstr "Seleccione forma (s) y luego haga clic en ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:741
+msgid "[ERROR_NOTCL] Failed. Nothing selected."
+msgstr "[ERROR_NOTCL] Ha fallado. Nada seleccionado."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:756
+msgid ""
+"[WARNING_NOTCL] Failed. Poligonize works only on geometries belonging to the "
+"same aperture."
+msgstr ""
+"[WARNING_NOTCL] Ha fallado. Poligonize funciona solo en geometrías "
+"pertenecientes a la misma abertura."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:809
+msgid "[success] Done. Poligonize completed."
+msgstr "[success] Hecho. Poligonize completado."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:860
+#: flatcamEditors/FlatCAMGrbEditor.py:1075
+#: flatcamEditors/FlatCAMGrbEditor.py:1099
+msgid "Corner Mode 1: 45 degrees ..."
+msgstr "Modo esquina 1: 45 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:862
+msgid "Click on 1st point ..."
+msgstr "Haga clic en el primer punto ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:872
+#: flatcamEditors/FlatCAMGrbEditor.py:1170
+msgid "Click on next Point or click Right mouse button to complete ..."
+msgstr ""
+"Haga clic en el siguiente punto o haga clic con el botón derecho del mouse "
+"para completar ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1063
+#: flatcamEditors/FlatCAMGrbEditor.py:1096
+msgid "Corner Mode 2: Reverse 45 degrees ..."
+msgstr "Modo esquina 2: Invertir 45 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1066
+#: flatcamEditors/FlatCAMGrbEditor.py:1093
+msgid "Corner Mode 3: 90 degrees ..."
+msgstr "Modo esquina 3: 90 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1069
+#: flatcamEditors/FlatCAMGrbEditor.py:1090
+msgid "Corner Mode 4: Reverse 90 degrees ..."
+msgstr "Modo esquina 4: Invertir 90 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1072
+#: flatcamEditors/FlatCAMGrbEditor.py:1087
+msgid "Corner Mode 5: Free angle ..."
+msgstr "Modo esquina 5: ángulo libre ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1126
+#: flatcamEditors/FlatCAMGrbEditor.py:1284
+#: flatcamEditors/FlatCAMGrbEditor.py:1323
+msgid "Track Mode 1: 45 degrees ..."
+msgstr "Modo de pista 1: 45 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1264
+#: flatcamEditors/FlatCAMGrbEditor.py:1318
+msgid "Track Mode 2: Reverse 45 degrees ..."
+msgstr "Modo de pista 2: Invertir 45 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1269
+#: flatcamEditors/FlatCAMGrbEditor.py:1313
+msgid "Track Mode 3: 90 degrees ..."
+msgstr "Modo de pista 3: 90 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1274
+#: flatcamEditors/FlatCAMGrbEditor.py:1308
+msgid "Track Mode 4: Reverse 90 degrees ..."
+msgstr "Modo de pista 4: Invertir 90 grados ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1279
+#: flatcamEditors/FlatCAMGrbEditor.py:1303
+msgid "Track Mode 5: Free angle ..."
+msgstr "Modo de pista 5: ángulo libre ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1683
+msgid "Scale the selected Gerber apertures ..."
+msgstr "Escala las aperturas seleccionadas de Gerber ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1725
+msgid "Buffer the selected apertures ..."
+msgstr "Buffer de las aberturas seleccionadas ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1767
+msgid "Mark polygon areas in the edited Gerber ..."
+msgstr "Marcar áreas de polígono en el Gerber editado ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1811
+msgid "[WARNING_NOTCL] Nothing selected to move ..."
+msgstr "[WARNING_NOTCL] Nada seleccionado para mover ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:1934
+msgid "[success] Done. Apertures Move completed."
+msgstr "[success] Hecho. Movimiento de aperturas completado."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2010
+msgid "[success] Done. Apertures copied."
+msgstr "[success] Hecho. Aberturas copiadas."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2301 flatcamGUI/FlatCAMGUI.py:1623
+#: flatcamGUI/FlatCAMGUI.py:4353
+msgid "Gerber Editor"
+msgstr "Gerber Editor"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2321 flatcamGUI/ObjectUI.py:192
+msgid "<b>Apertures:</b>"
+msgstr "<b>Aperturas:</b>"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2323 flatcamGUI/ObjectUI.py:194
+msgid "Apertures Table for the Gerber Object."
+msgstr "Tabla de Aperturas para el Objeto Gerber."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2334
+#: flatcamEditors/FlatCAMGrbEditor.py:3712 flatcamGUI/ObjectUI.py:228
+msgid "Code"
+msgstr "Código"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2334
+#: flatcamEditors/FlatCAMGrbEditor.py:3712 flatcamGUI/ObjectUI.py:228
+#: flatcamGUI/ObjectUI.py:891 flatcamGUI/ObjectUI.py:1465
+msgid "Type"
+msgstr "Tipo"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2334
+#: flatcamEditors/FlatCAMGrbEditor.py:3712 flatcamGUI/ObjectUI.py:228
+msgid "Size"
+msgstr "Tamaño"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2334
+#: flatcamEditors/FlatCAMGrbEditor.py:3712 flatcamGUI/ObjectUI.py:228
+msgid "Dim"
+msgstr "Dim"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2338 flatcamGUI/ObjectUI.py:232
+msgid "Index"
+msgstr "Índice"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2340 flatcamGUI/ObjectUI.py:234
+msgid "Aperture Code"
+msgstr "Código de apertura"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2342 flatcamGUI/ObjectUI.py:236
+msgid "Type of aperture: circular, rectangle, macros etc"
+msgstr "Tipo de apertura: circular, rectangular, macros, etc."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2344
+#: flatcamEditors/FlatCAMGrbEditor.py:2377 flatcamGUI/ObjectUI.py:238
+msgid "Aperture Size:"
+msgstr "Tamaño de apertura:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2346 flatcamGUI/ObjectUI.py:240
+msgid ""
+"Aperture Dimensions:\n"
+" - (width, height) for R, O type.\n"
+" - (dia, nVertices) for P type"
+msgstr ""
+"Dimensiones de la abertura:\n"
+"  - (ancho, alto) para R, O tipo.\n"
+"  - (dia, nVertices) para tipo P"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2367
+msgid "Aperture Code:"
+msgstr "Código de Apertura:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2369
+msgid "Code for the new aperture"
+msgstr "Código para la nueva apertura."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2379
+msgid ""
+"Size for the new aperture.\n"
+"If aperture type is 'R' or 'O' then\n"
+"this value is automatically\n"
+"calculated as:\n"
+"sqrt(width**2 + height**2)"
+msgstr ""
+"Tamaño para la nueva apertura.\n"
+"Si el tipo de apertura es 'R' o 'O' entonces\n"
+"este valor es automáticamente\n"
+"calculado como:\n"
+"sqrt (ancho ** 2 + altura ** 2)"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2391
+msgid "Aperture Type:"
+msgstr "Tipo de apertura:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2393
+msgid ""
+"Select the type of new aperture. Can be:\n"
+"C = circular\n"
+"R = rectangular\n"
+"O = oblong"
+msgstr ""
+"Seleccione el tipo de apertura nueva. Puede ser:\n"
+"C = circular\n"
+"R = rectangular\n"
+"O = oblongo"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2404
+msgid "Aperture Dim:"
+msgstr "Apertura Dim:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2406
+msgid ""
+"Dimensions for the new aperture.\n"
+"Active only for rectangular apertures (type R).\n"
+"The format is (width, height)"
+msgstr ""
+"Dimensiones para la nueva apertura.\n"
+"Activo solo para aberturas rectangulares (tipo R).\n"
+"El formato es (ancho, alto)."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2415
+msgid "Add/Delete Aperture:"
+msgstr "Añadir / Eliminar Apertura:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2417
+msgid "Add/Delete an aperture in the aperture table"
+msgstr "Añadir / Eliminar una apertura en la tabla de aperturas"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2426
+msgid "Add a new aperture to the aperture list."
+msgstr "Agregar una nueva apertura a la lista de apertura."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2431
+msgid "Delete a aperture in the aperture list"
+msgstr "Eliminar una abertura en la lista de aperturas"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2448
+msgid "Buffer Aperture:"
+msgstr "Apertura del tampón:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2450
+msgid "Buffer a aperture in the aperture list"
+msgstr "Buffer de apertura en la lista de apertura"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2463
+msgid ""
+"There are 3 types of corners:\n"
+" - 'Round': the corner is rounded.\n"
+" - 'Square:' the corner is met in a sharp angle.\n"
+" - 'Beveled:' the corner is a line that directly connects the features "
+"meeting in the corner"
+msgstr ""
+"Hay 3 tipos de esquinas:\n"
+"  - 'Redondo': la esquina es redondeada.\n"
+"  - 'Cuadrado:' la esquina se encuentra en un ángulo agudo.\n"
+"  - 'Biselado:' la esquina es una línea que conecta directamente las "
+"funciones que se encuentran en la esquina"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2478 flatcamGUI/FlatCAMGUI.py:721
+#: flatcamGUI/FlatCAMGUI.py:1965
+msgid "Buffer"
+msgstr "Buffer"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2493
+msgid "Scale Aperture:"
+msgstr "Apertura de la escala:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2495
+msgid "Scale a aperture in the aperture list"
+msgstr "Escala una abertura en la lista de aperturas"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2503
+msgid "Scale factor:"
+msgstr "Factor de escala:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2505
+msgid ""
+"The factor by which to scale the selected aperture.\n"
+"Values can be between 0.0000 and 999.9999"
+msgstr ""
+"El factor por el cual escalar la apertura seleccionada.\n"
+"Los valores pueden estar entre 0.0000 y 999.9999."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2531
+msgid "Mark polygon areas:"
+msgstr "Marcar áreas de polígono:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2533
+msgid "Mark the polygon areas."
+msgstr "Marca las áreas del polígono."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2541
+msgid "Area UPPER threshold:"
+msgstr "Umbral SUPERIOR área:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2543
+msgid ""
+"The threshold value, all areas less than this are marked.\n"
+"Can have a value between 0.0000 and 9999.9999"
+msgstr ""
+"El valor de umbral, todas las áreas menos que esto están marcadas.\n"
+"Puede tener un valor entre 0.0000 y 9999.9999."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2549
+msgid "Area LOWER threshold:"
+msgstr "Umbral inferior de la zona:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2551
+msgid ""
+"The threshold value, all areas more than this are marked.\n"
+"Can have a value between 0.0000 and 9999.9999"
+msgstr ""
+"El valor de umbral, todas las áreas más que esto están marcadas.\n"
+"Puede tener un valor entre 0.0000 y 9999.9999."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2564
+msgid "Go"
+msgstr "Ir"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2584 flatcamGUI/FlatCAMGUI.py:711
+#: flatcamGUI/FlatCAMGUI.py:1955
+msgid "Add Pad Array"
+msgstr "Agregar matriz de pad"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2586
+msgid "Add an array of pads (linear or circular array)"
+msgstr "Añadir una matriz de pads (lineal o circular)"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2592
+msgid ""
+"Select the type of pads array to create.\n"
+"It can be Linear X(Y) or Circular"
+msgstr ""
+"Seleccione el tipo de matriz de pads para crear.\n"
+"Puede ser lineal X (Y) o circular."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2603
+msgid "Nr of pads:"
+msgstr "Nº de almohadillas:"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:2605
+msgid "Specify how many pads to be in the array."
+msgstr "Especifique cuántos pads estarán en la matriz."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3093
+#: flatcamEditors/FlatCAMGrbEditor.py:3097
+msgid ""
+"[WARNING_NOTCL] Aperture code value is missing or wrong format. Add it and "
+"retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor del código de apertura o el formato es "
+"incorrecto. Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3133
+msgid ""
+"[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. Add it "
+"in format (width, height) and retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor de las dimensiones de la abertura o el "
+"formato es incorrecto. Agréguelo en formato (ancho, alto) y vuelva a "
+"intentarlo."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3145
+msgid ""
+"[WARNING_NOTCL] Aperture size value is missing or wrong format. Add it and "
+"retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor del tamaño de la apertura o el formato es "
+"incorrecto. Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3156
+msgid "[WARNING_NOTCL] Aperture already in the aperture table."
+msgstr "[WARNING_NOTCL] Apertura ya en la mesa de apertura."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3163
+#, python-brace-format
+msgid "[success] Added new aperture with code: {apid}"
+msgstr "[success] Agregada nueva apertura con código: {apid}"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3191
+msgid "[WARNING_NOTCL] Select an aperture in Aperture Table"
+msgstr "[WARNING_NOTCL] Seleccione una abertura en la mesa de apertura"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3197
+#, python-format
+msgid "[WARNING_NOTCL] Select an aperture in Aperture Table --> %s"
+msgstr "[WARNING_NOTCL] Seleccione una abertura en la Tabla de Apertura ->%s"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3220
+#, python-brace-format
+msgid "[success] Deleted aperture with code: {del_dia}"
+msgstr "[success] Apertura eliminada con código: {del_dia}"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3641
+#, python-format
+msgid "Adding aperture: %s geo ..."
+msgstr "Añadiendo apertura: %s geo ..."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3829
+msgid ""
+"[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber "
+"creation."
+msgstr ""
+"[ERROR_NOTCL] No hay definiciones de Aperture en el archivo. Abortando la "
+"creación de Gerber."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3832
+msgid "[ERROR] An internal error has occurred. See shell.\n"
+msgstr "[ERROR] Ha ocurrido un error interno. Ver concha\n"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3837
+msgid "Creating Gerber."
+msgstr "Creación de Gerber."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3845
+msgid "[success] Gerber editing finished."
+msgstr "[success] La edición de gerber terminó."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:3861
+msgid "[WARNING_NOTCL] Cancelled. No aperture is selected"
+msgstr "[WARNING_NOTCL] Cancelado. No se selecciona ninguna apertura"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4391
+msgid "[ERROR_NOTCL] Failed. No aperture geometry is selected."
+msgstr ""
+"[ERROR_NOTCL] Ha fallado. No se selecciona ninguna geometría de apertura."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4399
+msgid "[success] Done. Apertures geometry deleted."
+msgstr "[success] Hecho. Geometría de las aberturas eliminadas."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4542
+msgid ""
+"[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try "
+"again."
+msgstr ""
+"[WARNING_NOTCL] No hay apertura para amortiguar. Seleccione al menos una "
+"abertura e intente de nuevo."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4555
+#, python-format
+msgid ""
+"[ERROR_NOTCL] Failed.\n"
+"%s"
+msgstr ""
+"[ERROR_NOTCL] Ha fallado.\n"
+"%s"
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4572
+msgid ""
+"[WARNING_NOTCL] Scale factor value is missing or wrong format. Add it and "
+"retry."
+msgstr ""
+"[WARNING_NOTCL] Falta el valor del factor de escala o el formato es "
+"incorrecto. Agrégalo y vuelve a intentarlo."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4605
+msgid ""
+"[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try "
+"again."
+msgstr ""
+"[WARNING_NOTCL] Sin apertura a escala. Seleccione al menos una abertura e "
+"intente de nuevo."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4621
+msgid "[success] Done. Scale Tool completed."
+msgstr "[success] Hecho. Herramienta de escala completada."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4658
+msgid "[success] Polygon areas marked."
+msgstr "[success] Zonas poligonales marcadas."
+
+#: flatcamEditors/FlatCAMGrbEditor.py:4660
+msgid "[WARNING_NOTCL] There are no polygons to mark area."
+msgstr "[WARNING_NOTCL] No hay polígonos para marcar el área."
+
+#: flatcamGUI/FlatCAMGUI.py:50
+msgid "&File"
+msgstr "&Archivo"
+
+#: flatcamGUI/FlatCAMGUI.py:55
+msgid "&New Project ...\tCTRL+N"
+msgstr "&Nuevo proyecto ...\tCTRL+N"
+
+#: flatcamGUI/FlatCAMGUI.py:57
+msgid "Will create a new, blank project"
+msgstr "Creará un nuevo proyecto en blanco."
+
+#: flatcamGUI/FlatCAMGUI.py:62
+msgid "&New"
+msgstr "&Nuevo"
+
+#: flatcamGUI/FlatCAMGUI.py:65
+msgid "Geometry\tN"
+msgstr "Geometría\tN"
+
+#: flatcamGUI/FlatCAMGUI.py:67
+msgid "Will create a new, empty Geometry Object."
+msgstr "Creará un nuevo objeto vacío de geometría."
+
+#: flatcamGUI/FlatCAMGUI.py:69
+msgid "Gerber\tB"
+msgstr "Gerber\tB"
+
+#: flatcamGUI/FlatCAMGUI.py:71
+msgid "Will create a new, empty Gerber Object."
+msgstr "Creará un nuevo objeto vacío de Gerber."
+
+#: flatcamGUI/FlatCAMGUI.py:73
+msgid "Excellon\tL"
+msgstr "Excellon\tL"
+
+#: flatcamGUI/FlatCAMGUI.py:75
+msgid "Will create a new, empty Excellon Object."
+msgstr "Creará un objeto Excellon nuevo y vacío."
+
+#: flatcamGUI/FlatCAMGUI.py:78 flatcamTools/ToolPcbWizard.py:62
+#: flatcamTools/ToolPcbWizard.py:69
+msgid "Open"
+msgstr "Abierto"
+
+#: flatcamGUI/FlatCAMGUI.py:83
+msgid "Open &Gerber ...\tCTRL+G"
+msgstr "Abierto &Gerber ...\tCTRL+G"
+
+#: flatcamGUI/FlatCAMGUI.py:90
+msgid "Open &Excellon ...\tCTRL+E"
+msgstr "Abierto &Excellon ...\tCTRL+E"
+
+#: flatcamGUI/FlatCAMGUI.py:95
+msgid "Open G-&Code ..."
+msgstr "Abierto G-&Code ..."
+
+#: flatcamGUI/FlatCAMGUI.py:99
+msgid "Open &Project ..."
+msgstr "Abierto &Project ..."
+
+#: flatcamGUI/FlatCAMGUI.py:105
+msgid "Open Config ..."
+msgstr "Abierto Config ..."
+
+#: flatcamGUI/FlatCAMGUI.py:109
+msgid "Recent files"
+msgstr "Archivos recientes"
+
+#: flatcamGUI/FlatCAMGUI.py:115
+msgid "Scripting"
+msgstr "Scripting"
+
+#: flatcamGUI/FlatCAMGUI.py:118
+msgid "New Script ..."
+msgstr "Nuevo Script ..."
+
+#: flatcamGUI/FlatCAMGUI.py:120
+msgid "Open Script ..."
+msgstr "Abrir Script ..."
+
+#: flatcamGUI/FlatCAMGUI.py:122
+msgid "Run Script ...\tSHIFT+S"
+msgstr "Ejecutar Script ...\tSHIFT+S"
+
+#: flatcamGUI/FlatCAMGUI.py:125
+msgid ""
+"Will run the opened Tcl Script thus\n"
+"enabling the automation of certain\n"
+"functions of FlatCAM."
+msgstr ""
+"Ejecutará el Script Tcl abierto así\n"
+"permitiendo la automatización de ciertos\n"
+"Funciones de FlatCAM."
+
+#: flatcamGUI/FlatCAMGUI.py:138
+msgid "Import"
+msgstr "Importar"
+
+#: flatcamGUI/FlatCAMGUI.py:140
+msgid "&SVG as Geometry Object ..."
+msgstr "&SVG como objeto de geometría ..."
+
+#: flatcamGUI/FlatCAMGUI.py:143
+msgid "&SVG as Gerber Object ..."
+msgstr "&SVG como objeto de Gerber ..."
+
+#: flatcamGUI/FlatCAMGUI.py:148
+msgid "&DXF as Geometry Object ..."
+msgstr "&DXF como objeto de geometría ..."
+
+#: flatcamGUI/FlatCAMGUI.py:151
+msgid "&DXF as Gerber Object ..."
+msgstr "&DXF como objeto de Gerber ..."
+
+#: flatcamGUI/FlatCAMGUI.py:156
+msgid "Export"
+msgstr "Exportar"
+
+#: flatcamGUI/FlatCAMGUI.py:159
+msgid "Export &SVG ..."
+msgstr "Exportar &SVG ..."
+
+#: flatcamGUI/FlatCAMGUI.py:162
+msgid "Export DXF ..."
+msgstr "Exportar DXF ..."
+
+#: flatcamGUI/FlatCAMGUI.py:167
+msgid "Export &PNG ..."
+msgstr "Exportar &PNG ..."
+
+#: flatcamGUI/FlatCAMGUI.py:169
+msgid ""
+"Will export an image in PNG format,\n"
+"the saved image will contain the visual \n"
+"information currently in FlatCAM Plot Area."
+msgstr ""
+"Exportará una imagen en formato PNG,\n"
+"La imagen guardada contendrá lo visual.\n"
+"Información actualmente en FlatCAM Plot Area."
+
+#: flatcamGUI/FlatCAMGUI.py:177
+msgid "Export &Excellon ..."
+msgstr "Exportación y Excellon ..."
+
+#: flatcamGUI/FlatCAMGUI.py:180
+msgid ""
+"Will export an Excellon Object as Excellon file,\n"
+"the coordinates format, the file units and zeros\n"
+"are set in Preferences -> Excellon Export."
+msgstr ""
+"Exportará un objeto de Excellon como archivo de Excellon,\n"
+"El formato de las coordenadas, las unidades de archivo y los ceros.\n"
+"se configuran en Preferencias -> Exportación de Excellon."
+
+#: flatcamGUI/FlatCAMGUI.py:186
+msgid "Export &Gerber ..."
+msgstr "Exportar &Gerber ..."
+
+#: flatcamGUI/FlatCAMGUI.py:189
+msgid ""
+"Will export an Gerber Object as Gerber file,\n"
+"the coordinates format, the file units and zeros\n"
+"are set in Preferences -> Gerber Export."
+msgstr ""
+"Exportará un objeto Gerber como archivo Gerber,\n"
+"El formato de las coordenadas, las unidades de archivo y los ceros.\n"
+"se establecen en Preferencias -> Exportar Gerber."
+
+#: flatcamGUI/FlatCAMGUI.py:199
+msgid "Save &Defaults"
+msgstr "Guardar y valores predeterminados"
+
+#: flatcamGUI/FlatCAMGUI.py:205 flatcamGUI/FlatCAMGUI.py:532
+msgid "Save"
+msgstr "Salvar"
+
+#: flatcamGUI/FlatCAMGUI.py:208
+msgid "&Save Project ..."
+msgstr "Salvar proyecto ..."
+
+#: flatcamGUI/FlatCAMGUI.py:213
+msgid "Save Project &As ...\tCTRL+S"
+msgstr "Guardar proyecto como...\tCTRL+S"
+
+#: flatcamGUI/FlatCAMGUI.py:217
+msgid "Save Project C&opy ..."
+msgstr "Guardar copia del proyecto ..."
+
+#: flatcamGUI/FlatCAMGUI.py:225
+msgid "E&xit"
+msgstr "Salida"
+
+#: flatcamGUI/FlatCAMGUI.py:231
+msgid "&Edit"
+msgstr "Editar"
+
+#: flatcamGUI/FlatCAMGUI.py:234
+msgid "Edit Object\tE"
+msgstr "Editar objeto\tE"
+
+#: flatcamGUI/FlatCAMGUI.py:235
+msgid "Close Editor\tCTRL+S"
+msgstr "Cerrar Editor\tCTRL+S"
+
+#: flatcamGUI/FlatCAMGUI.py:243
+msgid "Conversion"
+msgstr "Conversión"
+
+#: flatcamGUI/FlatCAMGUI.py:245
+msgid "&Join Geo/Gerber/Exc -> Geo"
+msgstr "Unirse Geo/Gerber/Exc -> Geo"
+
+#: flatcamGUI/FlatCAMGUI.py:247
+msgid ""
+"Merge a selection of objects, which can be of type:\n"
+"- Gerber\n"
+"- Excellon\n"
+"- Geometry\n"
+"into a new combo Geometry object."
+msgstr ""
+"Combine una selección de objetos, que pueden ser de tipo:\n"
+"- Gerber\n"
+"- Excellon\n"
+"- Geometría\n"
+"en un nuevo objeto de geometría combo."
+
+#: flatcamGUI/FlatCAMGUI.py:254
+msgid "Join Excellon(s) -> Excellon"
+msgstr "Únete a Excellon (s) -> Excellon"
+
+#: flatcamGUI/FlatCAMGUI.py:256
+msgid "Merge a selection of Excellon objects into a new combo Excellon object."
+msgstr ""
+"Combine una selección de objetos de Excellon en un nuevo objeto de Excellon "
+"combinado."
+
+#: flatcamGUI/FlatCAMGUI.py:259
+msgid "Join Gerber(s) -> Gerber"
+msgstr "Únete a Gerber (s) -> Gerber"
+
+#: flatcamGUI/FlatCAMGUI.py:261
+msgid "Merge a selection of Gerber objects into a new combo Gerber object."
+msgstr ""
+"Combine una selección de objetos Gerber en un nuevo objeto combo Gerber."
+
+#: flatcamGUI/FlatCAMGUI.py:266
+msgid "Convert Single to MultiGeo"
+msgstr "Convertir solo geo a multi geo"
+
+#: flatcamGUI/FlatCAMGUI.py:268
+msgid ""
+"Will convert a Geometry object from single_geometry type\n"
+"to a multi_geometry type."
+msgstr ""
+"Convertirá un objeto de geometría de un tipo de geometría única\n"
+"a un tipo de geometría múltiple."
+
+#: flatcamGUI/FlatCAMGUI.py:272
+msgid "Convert Multi to SingleGeo"
+msgstr "Convertir multi a solo Geo"
+
+#: flatcamGUI/FlatCAMGUI.py:274
+msgid ""
+"Will convert a Geometry object from multi_geometry type\n"
+"to a single_geometry type."
+msgstr ""
+"Convertirá un objeto de geometría de tipo de geometría múltiple\n"
+"a un solo tipo de geometría."
+
+#: flatcamGUI/FlatCAMGUI.py:280
+msgid "Convert Any to Geo"
+msgstr "Convertir cualquiera a Geo"
+
+#: flatcamGUI/FlatCAMGUI.py:282
+msgid "Convert Any to Gerber"
+msgstr "Convertir cualquiera a Gerber"
+
+#: flatcamGUI/FlatCAMGUI.py:287
+msgid "&Copy\tCTRL+C"
+msgstr "Dupdo\tCTRL+C"
+
+#: flatcamGUI/FlatCAMGUI.py:291
+msgid "&Delete\tDEL"
+msgstr "Borrar\tDEL"
+
+#: flatcamGUI/FlatCAMGUI.py:295
+msgid "Se&t Origin\tO"
+msgstr "Establecer origen\tO"
+
+#: flatcamGUI/FlatCAMGUI.py:296
+msgid "Jump to Location\tJ"
+msgstr "Ir a la ubicación\tJ"
+
+#: flatcamGUI/FlatCAMGUI.py:301
+msgid "Toggle Units\tQ"
+msgstr "Unidades de palanca\tQ"
+
+#: flatcamGUI/FlatCAMGUI.py:303
+msgid "&Select All\tCTRL+A"
+msgstr "Seleccionar todo\tCTRL+A"
+
+#: flatcamGUI/FlatCAMGUI.py:307
+msgid "&Preferences\tSHIFT+P"
+msgstr "Preferencias\tSHIFT+P"
+
+#: flatcamGUI/FlatCAMGUI.py:310
+msgid "&Options"
+msgstr "Opciones"
+
+#: flatcamGUI/FlatCAMGUI.py:325
+msgid "&Rotate Selection\tSHIFT+(R)"
+msgstr "Rotar selección\tSHIFT+(R)"
+
+#: flatcamGUI/FlatCAMGUI.py:330
+msgid "&Skew on X axis\tSHIFT+X"
+msgstr "Sesgo en el eje X\tSHIFT+X"
+
+#: flatcamGUI/FlatCAMGUI.py:332
+msgid "S&kew on Y axis\tSHIFT+Y"
+msgstr "Sesgo en el eje Y\tSHIFT+Y"
+
+#: flatcamGUI/FlatCAMGUI.py:337
+msgid "Flip on &X axis\tX"
+msgstr "Voltear en el eje X\tX"
+
+#: flatcamGUI/FlatCAMGUI.py:339
+msgid "Flip on &Y axis\tY"
+msgstr "Voltear en el ejeY\tY"
+
+#: flatcamGUI/FlatCAMGUI.py:344
+msgid "View source\tALT+S"
+msgstr "Ver fuente\tALT+S"
+
+#: flatcamGUI/FlatCAMGUI.py:349
+msgid "&View"
+msgstr "Ver"
+
+#: flatcamGUI/FlatCAMGUI.py:350
+msgid "Enable all plots\tALT+1"
+msgstr "Habilitar todas las parcelas\tALT+1"
+
+#: flatcamGUI/FlatCAMGUI.py:352
+msgid "Disable all plots\tALT+2"
+msgstr "Deshabilitar todas las parcelas\tALT+2"
+
+#: flatcamGUI/FlatCAMGUI.py:354
+msgid "Disable non-selected\tALT+3"
+msgstr "Deshabilitar no seleccionado\tALT+3"
+
+#: flatcamGUI/FlatCAMGUI.py:357
+msgid "&Zoom Fit\tV"
+msgstr "Ajuste de zoom\tV"
+
+#: flatcamGUI/FlatCAMGUI.py:358
+msgid "&Zoom In\t="
+msgstr "Acercarse\t="
+
+#: flatcamGUI/FlatCAMGUI.py:359
+msgid "&Zoom Out\t-"
+msgstr "Disminuir el zoom\t-"
+
+#: flatcamGUI/FlatCAMGUI.py:363
+msgid "Toggle Code Editor\tCTRL+E"
+msgstr "Alternar editor de código\tCTRL+E"
+
+#: flatcamGUI/FlatCAMGUI.py:366
+msgid "&Toggle FullScreen\tALT+F10"
+msgstr "Alternar pantalla completa\tALT+F10"
+
+#: flatcamGUI/FlatCAMGUI.py:368
+msgid "&Toggle Plot Area\tCTRL+F10"
+msgstr "Alternar área de la parcela\tCTRL+F10"
+
+#: flatcamGUI/FlatCAMGUI.py:370
+msgid "&Toggle Project/Sel/Tool\t`"
+msgstr "Palanca Proyecto / Sel / Tool\t`"
+
+#: flatcamGUI/FlatCAMGUI.py:373
+msgid "&Toggle Grid Snap\tG"
+msgstr "Activar cuadrícula\tG"
+
+#: flatcamGUI/FlatCAMGUI.py:375
+msgid "&Toggle Axis\tSHIFT+G"
+msgstr "Eje de palanca\tSHIFT+G"
+
+#: flatcamGUI/FlatCAMGUI.py:378
+msgid "Toggle Workspace\tSHIFT+W"
+msgstr "Alternar espacio de trabajo\tSHIFT+W"
+
+#: flatcamGUI/FlatCAMGUI.py:381
+msgid "&Tool"
+msgstr "Herramienta"
+
+#: flatcamGUI/FlatCAMGUI.py:383
+msgid "&Command Line\tS"
+msgstr "Línea de comando\tS"
+
+#: flatcamGUI/FlatCAMGUI.py:386
+msgid "&Help"
+msgstr "Ayuda"
+
+#: flatcamGUI/FlatCAMGUI.py:387
+msgid "Help\tF1"
+msgstr "Ayuda\tF1"
+
+#: flatcamGUI/FlatCAMGUI.py:388
+msgid "FlatCAM.org"
+msgstr "FlatCAM.org"
+
+#: flatcamGUI/FlatCAMGUI.py:391
+msgid "Shortcuts List\tF3"
+msgstr "Lista de accesos directos\tF3"
+
+#: flatcamGUI/FlatCAMGUI.py:392
+msgid "YouTube Channel\tF4"
+msgstr "Canal de Youtube\tF4"
+
+#: flatcamGUI/FlatCAMGUI.py:394
+msgid "About"
+msgstr "Acerca de"
+
+#: flatcamGUI/FlatCAMGUI.py:401
+msgid "Add Circle\tO"
+msgstr "Añadir círculo\tO"
+
+#: flatcamGUI/FlatCAMGUI.py:403
+msgid "Add Arc\tA"
+msgstr "Añadir arco\tA"
+
+#: flatcamGUI/FlatCAMGUI.py:406
+msgid "Add Rectangle\tR"
+msgstr "Añadir rectángulo\tR"
+
+#: flatcamGUI/FlatCAMGUI.py:409
+msgid "Add Polygon\tN"
+msgstr "Añadir polígono\tN"
+
+#: flatcamGUI/FlatCAMGUI.py:411
+msgid "Add Path\tP"
+msgstr "Añadir ruta\tP"
+
+#: flatcamGUI/FlatCAMGUI.py:413
+msgid "Add Text\tT"
+msgstr "Añadir texto\tT"
+
+#: flatcamGUI/FlatCAMGUI.py:416
+msgid "Polygon Union\tU"
+msgstr "Unión de polígonos\tU"
+
+#: flatcamGUI/FlatCAMGUI.py:418
+msgid "Polygon Intersection\tE"
+msgstr "Intersección de polígonos\tE"
+
+#: flatcamGUI/FlatCAMGUI.py:420
+msgid "Polygon Subtraction\tS"
+msgstr "Sustracción de polígonos\tS"
+
+#: flatcamGUI/FlatCAMGUI.py:424
+msgid "Cut Path\tX"
+msgstr "Camino de corte\tX"
+
+#: flatcamGUI/FlatCAMGUI.py:426
+msgid "Copy Geom\tC"
+msgstr "Copia Geo\tC"
+
+#: flatcamGUI/FlatCAMGUI.py:428
+msgid "Delete Shape\tDEL"
+msgstr "Eliminar forma\tDEL"
+
+#: flatcamGUI/FlatCAMGUI.py:431 flatcamGUI/FlatCAMGUI.py:507
+msgid "Move\tM"
+msgstr "Movimiento\tM"
+
+#: flatcamGUI/FlatCAMGUI.py:433
+msgid "Buffer Tool\tB"
+msgstr "Herramienta amortiguadora\tB"
+
+#: flatcamGUI/FlatCAMGUI.py:436
+msgid "Paint Tool\tI"
+msgstr "Herramienta de pintura\tI"
+
+#: flatcamGUI/FlatCAMGUI.py:439
+msgid "Transform Tool\tALT+R"
+msgstr "Herramienta de transformación\tALT+R"
+
+#: flatcamGUI/FlatCAMGUI.py:443
+msgid "Toggle Corner Snap\tK"
+msgstr "Alternar esquina esquina\tK"
+
+#: flatcamGUI/FlatCAMGUI.py:446
+msgid ">Excellon Editor<"
+msgstr ">Excellon Editor<"
+
+#: flatcamGUI/FlatCAMGUI.py:450
+msgid "Add Drill Array\tA"
+msgstr "Añadir matriz de perfor.\tA"
+
+#: flatcamGUI/FlatCAMGUI.py:452
+msgid "Add Drill\tD"
+msgstr "Añadir taladro\tD"
+
+#: flatcamGUI/FlatCAMGUI.py:456
+msgid "Resize Drill(S)\tR"
+msgstr "Cambiar el tamaño de taladro (s)\tR"
+
+#: flatcamGUI/FlatCAMGUI.py:458 flatcamGUI/FlatCAMGUI.py:500
+msgid "Copy\tC"
+msgstr "Dupdo\tC"
+
+#: flatcamGUI/FlatCAMGUI.py:460 flatcamGUI/FlatCAMGUI.py:502
+msgid "Delete\tDEL"
+msgstr "Borrar\tDEL"
+
+#: flatcamGUI/FlatCAMGUI.py:465
+msgid "Move Drill(s)\tM"
+msgstr "Mover taladro(s)\tM"
+
+#: flatcamGUI/FlatCAMGUI.py:468
+msgid ">Gerber Editor<"
+msgstr ">Gerber Editor<"
+
+#: flatcamGUI/FlatCAMGUI.py:472
+msgid "Add Pad\tP"
+msgstr "Añadir Pad\tP"
+
+#: flatcamGUI/FlatCAMGUI.py:474
+msgid "Add Pad Array\tA"
+msgstr "Agregar una matriz de pad\tA"
+
+#: flatcamGUI/FlatCAMGUI.py:476
+msgid "Add Track\tT"
+msgstr "Añadir pista\tT"
+
+#: flatcamGUI/FlatCAMGUI.py:478
+msgid "Add Region\tN"
+msgstr "Añadir región\tN"
+
+#: flatcamGUI/FlatCAMGUI.py:482
+msgid "Poligonize\tALT+N"
+msgstr "Poligonize\tALT+N"
+
+#: flatcamGUI/FlatCAMGUI.py:484
+msgid "Add SemiDisc\tE"
+msgstr "Añadir medio disco\tE"
+
+#: flatcamGUI/FlatCAMGUI.py:486
+msgid "Add Disc\tD"
+msgstr "Añadir disco\tD"
+
+#: flatcamGUI/FlatCAMGUI.py:488
+msgid "Buffer\tB"
+msgstr "Buffer\tB"
+
+#: flatcamGUI/FlatCAMGUI.py:490
+msgid "Scale\tS"
+msgstr "Escalar\tS"
+
+#: flatcamGUI/FlatCAMGUI.py:492
+msgid "Mark Area\tALT+A"
+msgstr "Marcar area\tALT+A"
+
+#: flatcamGUI/FlatCAMGUI.py:494
+msgid "Eraser\tCTRL+E"
+msgstr "Borrador\tCTRL+E"
+
+#: flatcamGUI/FlatCAMGUI.py:496
+msgid "Transform\tALT+R"
+msgstr "Transformar\tALT+R"
+
+#: flatcamGUI/FlatCAMGUI.py:523
+msgid "Enable Plot"
+msgstr "Habilitar Parcela"
+
+#: flatcamGUI/FlatCAMGUI.py:524 flatcamGUI/FlatCAMGUI.py:1596
+msgid "Disable Plot"
+msgstr "Desactivar parcela"
+
+#: flatcamGUI/FlatCAMGUI.py:526
+msgid "Generate CNC"
+msgstr "Generar CNC"
+
+#: flatcamGUI/FlatCAMGUI.py:527
+msgid "View Source"
+msgstr "Ver fuente"
+
+#: flatcamGUI/FlatCAMGUI.py:529 flatcamGUI/FlatCAMGUI.py:1636
+msgid "Edit"
+msgstr "Editar"
+
+#: flatcamGUI/FlatCAMGUI.py:535 flatcamGUI/FlatCAMGUI.py:1642
+#: flatcamTools/ToolProperties.py:25
+msgid "Properties"
+msgstr "EditProperties"
+
+#: flatcamGUI/FlatCAMGUI.py:564
+msgid "File Toolbar"
+msgstr "Barra de herramientas de archivo"
+
+#: flatcamGUI/FlatCAMGUI.py:568
+msgid "Edit Toolbar"
+msgstr "Barra de herramientas de edición"
+
+#: flatcamGUI/FlatCAMGUI.py:572
+msgid "View Toolbar"
+msgstr "Barra de herramientas de ver"
+
+#: flatcamGUI/FlatCAMGUI.py:576
+msgid "Shell Toolbar"
+msgstr "Barra de herramientas de Shell"
+
+#: flatcamGUI/FlatCAMGUI.py:580
+msgid "Tools Toolbar"
+msgstr "Barra de herramientas de Herramientas"
+
+#: flatcamGUI/FlatCAMGUI.py:584
+msgid "Excellon Editor Toolbar"
+msgstr "Barra de herramientas del editor de Excel"
+
+#: flatcamGUI/FlatCAMGUI.py:588
+msgid "Geometry Editor Toolbar"
+msgstr "Barra de herramientas del editor de geometría"
+
+#: flatcamGUI/FlatCAMGUI.py:592
+msgid "Gerber Editor Toolbar"
+msgstr "Barra de herramientas del editor Gerber"
+
+#: flatcamGUI/FlatCAMGUI.py:596
+msgid "Grid Toolbar"
+msgstr "Barra de herramientas de cuadrícula"
+
+#: flatcamGUI/FlatCAMGUI.py:615 flatcamGUI/FlatCAMGUI.py:1854
+msgid "Open project"
+msgstr "Proyecto abierto"
+
+#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1855
+msgid "Save project"
+msgstr "Guardar proyecto"
+
+#: flatcamGUI/FlatCAMGUI.py:619 flatcamGUI/FlatCAMGUI.py:1858
+msgid "New Blank Geometry"
+msgstr "Nueva geometría en blanco"
+
+#: flatcamGUI/FlatCAMGUI.py:620
+msgid "New Blank Gerber"
+msgstr "Nuevo Gerber en blanco"
+
+#: flatcamGUI/FlatCAMGUI.py:621 flatcamGUI/FlatCAMGUI.py:1859
+msgid "New Blank Excellon"
+msgstr "Nueva Excellon en blanco"
+
+#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1861
+msgid "Editor"
+msgstr "Editor"
+
+#: flatcamGUI/FlatCAMGUI.py:625 flatcamGUI/FlatCAMGUI.py:1863
+msgid "Save Object and close the Editor"
+msgstr "Guardar Objeto y cerrar el Editor"
+
+#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1867
+msgid "&Delete"
+msgstr "Borrar"
+
+#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1870
+msgid "&Replot"
+msgstr "Replantear"
+
+#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1871
+msgid "&Clear plot"
+msgstr "Trama clara"
+
+#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1872
+msgid "Zoom In"
+msgstr "Acercarse"
+
+#: flatcamGUI/FlatCAMGUI.py:635 flatcamGUI/FlatCAMGUI.py:1873
+msgid "Zoom Out"
+msgstr "Disminuir el zoom"
+
+#: flatcamGUI/FlatCAMGUI.py:636 flatcamGUI/FlatCAMGUI.py:1611
+#: flatcamGUI/FlatCAMGUI.py:1874
+msgid "Zoom Fit"
+msgstr "Ajuste de zoom"
+
+#: flatcamGUI/FlatCAMGUI.py:641 flatcamGUI/FlatCAMGUI.py:1879
+msgid "&Command Line"
+msgstr "Línea de comando"
+
+#: flatcamGUI/FlatCAMGUI.py:644 flatcamGUI/FlatCAMGUI.py:1882
+msgid "2Sided Tool"
+msgstr "Herramienta de 2 caras"
+
+#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1883
+msgid "&Cutout Tool"
+msgstr "Herramienta de recorte"
+
+#: flatcamGUI/FlatCAMGUI.py:646 flatcamGUI/FlatCAMGUI.py:1884
+#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:285
+msgid "NCC Tool"
+msgstr "Herramienta NCC"
+
+#: flatcamGUI/FlatCAMGUI.py:650 flatcamGUI/FlatCAMGUI.py:1888
+msgid "Panel Tool"
+msgstr "Herramienta de panel"
+
+#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1889
+#: flatcamTools/ToolFilm.py:204
+msgid "Film Tool"
+msgstr "Herramienta de película"
+
+#: flatcamGUI/FlatCAMGUI.py:652 flatcamGUI/FlatCAMGUI.py:1891
+#: flatcamTools/ToolSolderPaste.py:450
+msgid "SolderPaste Tool"
+msgstr "Herramienta de pasta de soldadura"
+
+#: flatcamGUI/FlatCAMGUI.py:653 flatcamGUI/FlatCAMGUI.py:1892
+#: flatcamTools/ToolSub.py:26
+msgid "Substract Tool"
+msgstr "Herramienta de resta"
+
+#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1897
+msgid "Calculators Tool"
+msgstr "Herramienta de calculadoras"
+
+#: flatcamGUI/FlatCAMGUI.py:661 flatcamGUI/FlatCAMGUI.py:675
+#: flatcamGUI/FlatCAMGUI.py:709 flatcamGUI/FlatCAMGUI.py:1901
+#: flatcamGUI/FlatCAMGUI.py:1953
+msgid "Select"
+msgstr "Seleccionar"
+
+#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1902
+msgid "Add Drill Hole"
+msgstr "Añadir taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:664 flatcamGUI/FlatCAMGUI.py:1904
+msgid "Add Drill Hole Array"
+msgstr "Añadir matriz de taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1905
+msgid "Resize Drill"
+msgstr "Redimensionar taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:668 flatcamGUI/FlatCAMGUI.py:1908
+msgid "Copy Drill"
+msgstr "Copia de taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:669 flatcamGUI/FlatCAMGUI.py:1910
+msgid "Delete Drill"
+msgstr "Eliminar taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1913
+msgid "Move Drill"
+msgstr "Mover taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:676 flatcamGUI/FlatCAMGUI.py:1917
+msgid "Add Circle"
+msgstr "Añadir Círculo"
+
+#: flatcamGUI/FlatCAMGUI.py:677 flatcamGUI/FlatCAMGUI.py:1918
+msgid "Add Arc"
+msgstr "Añadir Arco"
+
+#: flatcamGUI/FlatCAMGUI.py:679 flatcamGUI/FlatCAMGUI.py:1920
+msgid "Add Rectangle"
+msgstr "Añadir Rectángulo"
+
+#: flatcamGUI/FlatCAMGUI.py:682 flatcamGUI/FlatCAMGUI.py:1923
+msgid "Add Path"
+msgstr "Añadir Ruta"
+
+#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:1925
+msgid "Add Polygon"
+msgstr "Añadir Polígono"
+
+#: flatcamGUI/FlatCAMGUI.py:685 flatcamGUI/FlatCAMGUI.py:1927
+msgid "Add Text"
+msgstr "Añadir Texto"
+
+#: flatcamGUI/FlatCAMGUI.py:686 flatcamGUI/FlatCAMGUI.py:1929
+msgid "Add Buffer"
+msgstr "Añadir Buffer"
+
+#: flatcamGUI/FlatCAMGUI.py:687 flatcamGUI/FlatCAMGUI.py:1930
+msgid "Paint Shape"
+msgstr "Forma de pintura"
+
+#: flatcamGUI/FlatCAMGUI.py:688 flatcamGUI/FlatCAMGUI.py:726
+#: flatcamGUI/FlatCAMGUI.py:1931 flatcamGUI/FlatCAMGUI.py:1969
+msgid "Eraser"
+msgstr "Borrador"
+
+#: flatcamGUI/FlatCAMGUI.py:691 flatcamGUI/FlatCAMGUI.py:1935
+msgid "Polygon Union"
+msgstr "Unión de polígonos"
+
+#: flatcamGUI/FlatCAMGUI.py:693 flatcamGUI/FlatCAMGUI.py:1937
+msgid "Polygon Intersection"
+msgstr "Intersección de polígonos"
+
+#: flatcamGUI/FlatCAMGUI.py:695 flatcamGUI/FlatCAMGUI.py:1939
+msgid "Polygon Subtraction"
+msgstr "Sustracción de polígonos"
+
+#: flatcamGUI/FlatCAMGUI.py:698 flatcamGUI/FlatCAMGUI.py:1942
+msgid "Cut Path"
+msgstr "Camino de Corte"
+
+#: flatcamGUI/FlatCAMGUI.py:699
+msgid "Copy Shape(s)"
+msgstr "Copiar Forma (s)"
+
+#: flatcamGUI/FlatCAMGUI.py:702
+msgid "Delete Shape '-'"
+msgstr "Eliminar Forma '-'"
+
+#: flatcamGUI/FlatCAMGUI.py:704 flatcamGUI/FlatCAMGUI.py:733
+#: flatcamGUI/FlatCAMGUI.py:1947 flatcamGUI/FlatCAMGUI.py:1976
+msgid "Transformations"
+msgstr "Transformaciones"
+
+#: flatcamGUI/FlatCAMGUI.py:706
+msgid "Move Objects "
+msgstr "Mover objetos "
+
+#: flatcamGUI/FlatCAMGUI.py:710 flatcamGUI/FlatCAMGUI.py:1954
+msgid "Add Pad"
+msgstr "Añadir Pad"
+
+#: flatcamGUI/FlatCAMGUI.py:712 flatcamGUI/FlatCAMGUI.py:1956
+msgid "Add Track"
+msgstr "Añadir Pista"
+
+#: flatcamGUI/FlatCAMGUI.py:713 flatcamGUI/FlatCAMGUI.py:1957
+msgid "Add Region"
+msgstr "Añadir Región"
+
+#: flatcamGUI/FlatCAMGUI.py:715 flatcamGUI/FlatCAMGUI.py:1959
+msgid "Poligonize"
+msgstr "Poligonizar"
+
+#: flatcamGUI/FlatCAMGUI.py:717 flatcamGUI/FlatCAMGUI.py:1961
+msgid "SemiDisc"
+msgstr "Medio disco"
+
+#: flatcamGUI/FlatCAMGUI.py:718 flatcamGUI/FlatCAMGUI.py:1962
+msgid "Disc"
+msgstr "Disco"
+
+#: flatcamGUI/FlatCAMGUI.py:724 flatcamGUI/FlatCAMGUI.py:1968
+msgid "Mark Area"
+msgstr "Marcar area"
+
+#: flatcamGUI/FlatCAMGUI.py:735 flatcamGUI/FlatCAMGUI.py:1621
+#: flatcamGUI/FlatCAMGUI.py:1641 flatcamGUI/FlatCAMGUI.py:1978
+#: flatcamTools/ToolMove.py:26
+msgid "Move"
+msgstr "Movimiento"
+
+#: flatcamGUI/FlatCAMGUI.py:741 flatcamGUI/FlatCAMGUI.py:1984
+msgid "Snap to grid"
+msgstr "Encajar a la cuadricula"
+
+#: flatcamGUI/FlatCAMGUI.py:744 flatcamGUI/FlatCAMGUI.py:1987
+msgid "Grid X snapping distance"
+msgstr "Distancia de ajuste de la rejilla X"
+
+#: flatcamGUI/FlatCAMGUI.py:749 flatcamGUI/FlatCAMGUI.py:1992
+msgid "Grid Y snapping distance"
+msgstr "Distancia de ajuste de cuadrícula Y"
+
+#: flatcamGUI/FlatCAMGUI.py:755 flatcamGUI/FlatCAMGUI.py:1998
+msgid ""
+"When active, value on Grid_X\n"
+"is copied to the Grid_Y value."
+msgstr ""
+"Cuando está activo, el valor en Grid_X\n"
+"Se copia al valor Grid_Y."
+
+#: flatcamGUI/FlatCAMGUI.py:761 flatcamGUI/FlatCAMGUI.py:2004
+msgid "Snap to corner"
+msgstr "Ajustar a la esquina"
+
+#: flatcamGUI/FlatCAMGUI.py:765 flatcamGUI/FlatCAMGUI.py:2008
+#: flatcamGUI/FlatCAMGUI.py:3374
+msgid "Max. magnet distance"
+msgstr "Distancia máxima del imán"
+
+#: flatcamGUI/FlatCAMGUI.py:793 flatcamGUI/FlatCAMGUI.py:1605
+msgid "Project"
+msgstr "Proyecto"
+
+#: flatcamGUI/FlatCAMGUI.py:803
+msgid "Selected"
+msgstr "Seleccionado"
+
+#: flatcamGUI/FlatCAMGUI.py:822 flatcamGUI/FlatCAMGUI.py:830
+msgid "Plot Area"
+msgstr "Área de la parcela"
+
+#: flatcamGUI/FlatCAMGUI.py:854
+msgid "General"
+msgstr "General"
+
+#: flatcamGUI/FlatCAMGUI.py:863
+msgid "APP.  DEFAULTS"
+msgstr "Val. predeterm. de la aplic."
+
+#: flatcamGUI/FlatCAMGUI.py:864
+msgid "PROJ. OPTIONS "
+msgstr "Proyecto OPCIONES"
+
+#: flatcamGUI/FlatCAMGUI.py:875
+msgid "GERBER"
+msgstr "GERBER"
+
+#: flatcamGUI/FlatCAMGUI.py:884
+msgid "EXCELLON"
+msgstr "EXCELLON"
+
+#: flatcamGUI/FlatCAMGUI.py:893
+msgid "GEOMETRY"
+msgstr "GEOMETRÍA"
+
+#: flatcamGUI/FlatCAMGUI.py:903
+msgid "CNC-JOB"
+msgstr "CNC-JOB"
+
+#: flatcamGUI/FlatCAMGUI.py:912
+msgid "TOOLS"
+msgstr "HERRAMIENTAS"
+
+#: flatcamGUI/FlatCAMGUI.py:929
+msgid "Import Preferences"
+msgstr "Pref de importación"
+
+#: flatcamGUI/FlatCAMGUI.py:932
+msgid ""
+"Import a full set of FlatCAM settings from a file\n"
+"previously saved on HDD.\n"
+"\n"
+"FlatCAM automatically save a 'factory_defaults' file\n"
+"on the first start. Do not delete that file."
+msgstr ""
+"Importe un conjunto completo de configuraciones FlatCAM desde un archivo\n"
+"previamente guardado en el disco duro.\n"
+"\n"
+"FlatCAM guarda automáticamente un archivo 'factory_defaults'\n"
+"en el primer comienzo No borres ese archivo."
+
+#: flatcamGUI/FlatCAMGUI.py:939
+msgid "Export Preferences"
+msgstr "Pref. de exportación"
+
+#: flatcamGUI/FlatCAMGUI.py:942
+msgid ""
+"Export a full set of FlatCAM settings in a file\n"
+"that is saved on HDD."
+msgstr ""
+"Exportar un conjunto completo de configuraciones FlatCAM en un archivo\n"
+"que se guarda en el disco duro."
+
+#: flatcamGUI/FlatCAMGUI.py:947
+msgid "Open Pref Folder"
+msgstr "Abrir carpeta de pref."
+
+#: flatcamGUI/FlatCAMGUI.py:950
+msgid "Open the folder where FlatCAM save the preferences files."
+msgstr "Abra la carpeta donde FlatCAM guarda los archivos de preferencias."
+
+#: flatcamGUI/FlatCAMGUI.py:958
+msgid "Save Preferences"
+msgstr "Guardar Preferencias"
+
+#: flatcamGUI/FlatCAMGUI.py:961
+msgid ""
+"Save the current settings in the 'current_defaults' file\n"
+"which is the file storing the working default preferences."
+msgstr ""
+"Guarde la configuración actual en el archivo 'current_defaults'\n"
+"que es el archivo que almacena las preferencias predeterminadas de trabajo."
+
+#: flatcamGUI/FlatCAMGUI.py:987
+msgid ""
+"<b>General Shortcut list</b><br>\n"
+"            <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style="
+"\"width:283px\">\n"
+"                <tbody>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\" width=\"89\"><strong>F3</strong></"
+"td>\n"
+"                        <td width=\"194\"><span style=\"color:"
+"#006400\"><strong>&nbsp;SHOW SHORTCUT LIST</strong></span></td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>1</strong></td>\n"
+"                        <td>&nbsp;Switch to Project Tab</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>2</strong></td>\n"
+"                        <td>&nbsp;Switch to Selected Tab</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>3</strong></td>\n"
+"                        <td>&nbsp;Switch to Tool Tab</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>B</strong></td>\n"
+"                        <td>&nbsp;New Gerber</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>E</strong></td>\n"
+"                        <td>&nbsp;Edit Object (if selected)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>G</strong></td>\n"
+"                        <td>&nbsp;Grid On/Off</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>J</strong></td>\n"
+"                        <td>&nbsp;Jump to Coordinates</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>L</strong></td>\n"
+"                        <td>&nbsp;New Excellon</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>M</strong></td>\n"
+"                        <td>&nbsp;Move Obj</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>N</strong></td>\n"
+"                        <td>&nbsp;New Geometry</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>O</strong></td>\n"
+"                        <td>&nbsp;Set Origin</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Q</strong></td>\n"
+"                        <td>&nbsp;Change Units</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>P</strong></td>\n"
+"                        <td>&nbsp;Open Properties Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>R</strong></td>\n"
+"                        <td>&nbsp;Rotate by 90 degree CW</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>S</strong></td>\n"
+"                        <td>&nbsp;Shell Toggle</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>T</strong></td>\n"
+"                        <td>&nbsp;Add a Tool (when in Geometry Selected Tab "
+"or in Tools NCC or Tools Paint)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>V</strong></td>\n"
+"                        <td>&nbsp;Zoom Fit</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>X</strong></td>\n"
+"                        <td>&nbsp;Flip on X_axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Y</strong></td>\n"
+"                        <td>&nbsp;Flip on Y_axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>&#39;-&#39;</strong></td>\n"
+"                        <td>&nbsp;Zoom Out</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>&#39;=&#39;</strong></td>\n"
+"                        <td>&nbsp;Zoom In</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+A</strong></td>\n"
+"                        <td>&nbsp;Select All</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+C</strong></td>\n"
+"                        <td>&nbsp;Copy Obj</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+E</strong></td>\n"
+"                        <td>&nbsp;Open Excellon File</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+G</strong></td>\n"
+"                        <td>&nbsp;Open Gerber File</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+N</strong></td>\n"
+"                        <td>&nbsp;New Project</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+M</strong></td>\n"
+"                        <td>&nbsp;Measurement Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+O</strong></td>\n"
+"                        <td>&nbsp;Open Project</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+S</strong></td>\n"
+"                        <td>&nbsp;Save Project As</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+F10</strong></td>\n"
+"                        <td>&nbsp;Toggle Plot Area</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+C</strong></td>\n"
+"                        <td>&nbsp;Copy Obj_Name</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+E</strong></td>\n"
+"                        <td>&nbsp;Toggle Code Editor</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+G</strong></td>\n"
+"                        <td>&nbsp;Toggle the axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+P</strong></td>\n"
+"                        <td>&nbsp;Open Preferences Window</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+R</strong></td>\n"
+"                        <td>&nbsp;Rotate by 90 degree CCW</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+S</strong></td>\n"
+"                        <td>&nbsp;Run a Script</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+W</strong></td>\n"
+"                        <td>&nbsp;Toggle the workspace</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+X</strong></td>\n"
+"                        <td>&nbsp;Skew on X axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+Y</strong></td>\n"
+"                        <td>&nbsp;Skew on Y axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+C</strong></td>\n"
+"                        <td>&nbsp;Calculators Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+D</strong></td>\n"
+"                        <td>&nbsp;2-Sided PCB Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+K</strong></td>\n"
+"                        <td>&nbsp;Solder Paste Dispensing Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+L</strong></td>\n"
+"                        <td>&nbsp;Film PCB Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+N</strong></td>\n"
+"                        <td>&nbsp;Non-Copper Clearing Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+P</strong></td>\n"
+"                        <td>&nbsp;Paint Area Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+Q</strong></td>\n"
+"                        <td>&nbsp;PDF Import Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+R</strong></td>\n"
+"                        <td>&nbsp;Transformations Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+S</strong></td>\n"
+"                        <td>&nbsp;View File Source</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+U</strong></td>\n"
+"                        <td>&nbsp;Cutout PCB Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+1</strong></td>\n"
+"                        <td>&nbsp;Enable all Plots</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+2</strong></td>\n"
+"                        <td>&nbsp;Disable all Plots</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+3</strong></td>\n"
+"                        <td>&nbsp;Disable Non-selected Plots</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+F10</strong></td>\n"
+"                        <td>&nbsp;Toggle Full Screen</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>F1</strong></td>\n"
+"                        <td>&nbsp;Open Online Manual</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>F4</strong></td>\n"
+"                        <td>&nbsp;Open Online Tutorials</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Delete Object</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Alternate: Delete Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>'`'</strong></td>\n"
+"                        <td>&nbsp;(left to Key_1)Toogle Notebook Area (Left "
+"Side)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SPACE</strong></td>\n"
+"                        <td>&nbsp;En(Dis)able Obj Plot</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Escape</strong></td>\n"
+"                        <td>&nbsp;Deselects all objects</td>\n"
+"                    </tr>\n"
+"                </tbody>\n"
+"            </table>\n"
+"    \n"
+"            "
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:1272
+msgid ""
+"<b>Editor Shortcut list</b><br>\n"
+"            <br>\n"
+"            <strong><span style=\"color:#0000ff\">GEOMETRY EDITOR</span></"
+"strong><br>\n"
+"    \n"
+"            <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style="
+"\"width:283px\">\n"
+"                <tbody>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\" width=\"89\"><strong>A</strong></"
+"td>\n"
+"                        <td width=\"194\">&nbsp;Draw an Arc</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>B</strong></td>\n"
+"                        <td>&nbsp;Buffer Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>C</strong></td>\n"
+"                        <td>&nbsp;Copy Geo Item</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>D</strong></td>\n"
+"                        <td>&nbsp;Within Add Arc will toogle the ARC "
+"direction: CW or CCW</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>E</strong></td>\n"
+"                        <td>&nbsp;Polygon Intersection Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>I</strong></td>\n"
+"                        <td>&nbsp;Paint Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>J</strong></td>\n"
+"                        <td>&nbsp;Jump to Location (x, y)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>K</strong></td>\n"
+"                        <td>&nbsp;Toggle Corner Snap</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>M</strong></td>\n"
+"                        <td>&nbsp;Move Geo Item</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>M</strong></td>\n"
+"                        <td>&nbsp;Within Add Arc will cycle through the ARC "
+"modes</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>N</strong></td>\n"
+"                        <td>&nbsp;Draw a Polygon</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>O</strong></td>\n"
+"                        <td>&nbsp;Draw a Circle</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>P</strong></td>\n"
+"                        <td>&nbsp;Draw a Path</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>R</strong></td>\n"
+"                        <td>&nbsp;Draw Rectangle</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>S</strong></td>\n"
+"                        <td>&nbsp;Polygon Substraction Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>T</strong></td>\n"
+"                        <td>&nbsp;Add Text Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>U</strong></td>\n"
+"                        <td>&nbsp;Polygon Union Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>X</strong></td>\n"
+"                        <td>&nbsp;Flip shape on X axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Y</strong></td>\n"
+"                        <td>&nbsp;Flip shape on Y axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+X</strong></td>\n"
+"                        <td>&nbsp;Skew shape on X axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>SHIFT+Y</strong></td>\n"
+"                        <td>&nbsp;Skew shape on Y axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+R</strong></td>\n"
+"                        <td>&nbsp;Editor Transformation Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+X</strong></td>\n"
+"                        <td>&nbsp;Offset shape on X axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+Y</strong></td>\n"
+"                        <td>&nbsp;Offset shape on Y axis</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+M</strong></td>\n"
+"                        <td>&nbsp;Measurement Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+S</strong></td>\n"
+"                        <td>&nbsp;Save Object and Exit Editor</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+X</strong></td>\n"
+"                        <td>&nbsp;Polygon Cut Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Space</strong></td>\n"
+"                        <td>&nbsp;Rotate Geometry</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ENTER</strong></td>\n"
+"                        <td>&nbsp;Finish drawing for certain tools</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ESC</strong></td>\n"
+"                        <td>&nbsp;Abort and return to Select</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Delete Shape</td>\n"
+"                    </tr>\n"
+"                </tbody>\n"
+"            </table>\n"
+"            <br>\n"
+"            <br>\n"
+"            <strong><span style=\"color:#ff0000\">EXCELLON EDITOR</span></"
+"strong><br>\n"
+"            <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style="
+"\"width:283px\">\n"
+"                <tbody>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\" width=\"89\"><strong>A</strong></"
+"td>\n"
+"                        <td width=\"194\">&nbsp;Add Drill Array</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>C</strong></td>\n"
+"                        <td>&nbsp;Copy Drill(s)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>D</strong></td>\n"
+"                        <td>&nbsp;Add Drill</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>J</strong></td>\n"
+"                        <td>&nbsp;Jump to Location (x, y)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>M</strong></td>\n"
+"                        <td>&nbsp;Move Drill(s)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>R</strong></td>\n"
+"                        <td>&nbsp;Resize Drill(s)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>T</strong></td>\n"
+"                        <td>&nbsp;Add a new Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Delete Drill(s)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Alternate: Delete Tool(s)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ESC</strong></td>\n"
+"                        <td>&nbsp;Abort and return to Select</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+S</strong></td>\n"
+"                        <td>&nbsp;Save Object and Exit Editor</td>\n"
+"                    </tr>\n"
+"                </tbody>\n"
+"            </table>\n"
+"            <br>\n"
+"            <br>\n"
+"            <strong><span style=\"color:#00ff00\">GERBER EDITOR</span></"
+"strong><br>\n"
+"            <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style="
+"\"width:283px\">\n"
+"                <tbody>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\" width=\"89\"><strong>A</strong></"
+"td>\n"
+"                        <td width=\"194\">&nbsp;Add Pad Array</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>B</strong></td>\n"
+"                        <td>&nbsp;Buffer</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>C</strong></td>\n"
+"                        <td>&nbsp;Copy</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>D</strong></td>\n"
+"                        <td>&nbsp;Add Disc</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>E</strong></td>\n"
+"                        <td>&nbsp;Add SemiDisc</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>J</strong></td>\n"
+"                        <td>&nbsp;Jump to Location (x, y)</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>M</strong></td>\n"
+"                        <td>&nbsp;Move</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>N</strong></td>\n"
+"                        <td>&nbsp;Add Region</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>P</strong></td>\n"
+"                        <td>&nbsp;Add Pad</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>R</strong></td>\n"
+"                        <td>&nbsp;Within Track & Region Tools will cycle in "
+"REVERSE the bend modes</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>S</strong></td>\n"
+"                        <td>&nbsp;Scale</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>T</strong></td>\n"
+"                        <td>&nbsp;Add Track</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>T</strong></td>\n"
+"                        <td>&nbsp;Within Track & Region Tools will cycle "
+"FORWARD the bend modes</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Delete</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>Del</strong></td>\n"
+"                        <td>&nbsp;Alternate: Delete Apertures</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ESC</strong></td>\n"
+"                        <td>&nbsp;Abort and return to Select</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+E</strong></td>\n"
+"                        <td>&nbsp;Eraser Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>CTRL+S</strong></td>\n"
+"                        <td>&nbsp;Save Object and Exit Editor</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\">&nbsp;</td>\n"
+"                        <td>&nbsp;</td>\n"
+"                    </tr>\n"
+"                     <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+A</strong></td>\n"
+"                        <td>&nbsp;Mark Area Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+N</strong></td>\n"
+"                        <td>&nbsp;Poligonize Tool</td>\n"
+"                    </tr>\n"
+"                    <tr height=\"20\">\n"
+"                        <td height=\"20\"><strong>ALT+R</strong></td>\n"
+"                        <td>&nbsp;Transformation Tool</td>\n"
+"                    </tr>\n"
+"                </tbody>\n"
+"            </table>\n"
+"                    "
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:1597
+msgid "Toggle Panel"
+msgstr "Panel de palanca"
+
+#: flatcamGUI/FlatCAMGUI.py:1600
+msgid "New"
+msgstr "Nueva"
+
+#: flatcamGUI/FlatCAMGUI.py:1601
+msgid "Geometry"
+msgstr "Geometría"
+
+#: flatcamGUI/FlatCAMGUI.py:1603
+msgid "Excellon"
+msgstr "Excellon"
+
+#: flatcamGUI/FlatCAMGUI.py:1608
+msgid "Grids"
+msgstr "Rejillas"
+
+#: flatcamGUI/FlatCAMGUI.py:1610
+msgid "View"
+msgstr "Ver"
+
+#: flatcamGUI/FlatCAMGUI.py:1612
+msgid "Clear Plot"
+msgstr "Parcela clara"
+
+#: flatcamGUI/FlatCAMGUI.py:1613
+msgid "Replot"
+msgstr "Replantear"
+
+#: flatcamGUI/FlatCAMGUI.py:1616
+msgid "Geo Editor"
+msgstr "Geo Editor"
+
+#: flatcamGUI/FlatCAMGUI.py:1617
+msgid "Line"
+msgstr "Línea"
+
+#: flatcamGUI/FlatCAMGUI.py:1618
+msgid "Rectangle"
+msgstr "Rectángulo"
+
+#: flatcamGUI/FlatCAMGUI.py:1619 flatcamGUI/FlatCAMGUI.py:5562
+#: flatcamGUI/ObjectUI.py:1366
+msgid "Cut"
+msgstr "Cortar"
+
+#: flatcamGUI/FlatCAMGUI.py:1624
+msgid "Pad"
+msgstr "Pad"
+
+#: flatcamGUI/FlatCAMGUI.py:1625
+msgid "Pad Array"
+msgstr "Matriz de Pad"
+
+#: flatcamGUI/FlatCAMGUI.py:1626
+msgid "Track"
+msgstr "Pista"
+
+#: flatcamGUI/FlatCAMGUI.py:1627
+msgid "Region"
+msgstr "Región"
+
+#: flatcamGUI/FlatCAMGUI.py:1629
+msgid "Exc Editor"
+msgstr "Exc Editor"
+
+#: flatcamGUI/FlatCAMGUI.py:1630
+msgid "Add Drill"
+msgstr "Añadir taladro"
+
+#: flatcamGUI/FlatCAMGUI.py:1662
+msgid "Print Preview"
+msgstr "Vista previa de impres."
+
+#: flatcamGUI/FlatCAMGUI.py:1663
+msgid "Print Code"
+msgstr "Imprimir código"
+
+#: flatcamGUI/FlatCAMGUI.py:1664
+msgid "Find in Code"
+msgstr "Encontr. en codigo"
+
+#: flatcamGUI/FlatCAMGUI.py:1669
+msgid "Replace With"
+msgstr "Reemplazar con"
+
+#: flatcamGUI/FlatCAMGUI.py:1673 flatcamGUI/FlatCAMGUI.py:5560
+#: flatcamGUI/FlatCAMGUI.py:6118 flatcamGUI/ObjectUI.py:1364
+#: flatcamTools/ToolPaint.py:248
+msgid "All"
+msgstr "Todos"
+
+#: flatcamGUI/FlatCAMGUI.py:1675
+msgid ""
+"When checked it will replace all instances in the 'Find' box\n"
+"with the text in the 'Replace' box.."
+msgstr ""
+"Cuando está marcado, reemplazará todas las instancias en el cuadro 'Buscar'\n"
+"con el texto en el cuadro 'Reemplazar' .."
+
+#: flatcamGUI/FlatCAMGUI.py:1678
+msgid "Open Code"
+msgstr "Código abierto"
+
+#: flatcamGUI/FlatCAMGUI.py:1679
+msgid "Save Code"
+msgstr "Guardar código"
+
+#: flatcamGUI/FlatCAMGUI.py:1714
+msgid ""
+"Relative neasurement.\n"
+"Reference is last click position"
+msgstr ""
+"Medida relativa.\n"
+"La referencia es la posición del último clic."
+
+#: flatcamGUI/FlatCAMGUI.py:1720
+msgid ""
+"Absolute neasurement.\n"
+"Reference is (X=0, Y= 0) position"
+msgstr ""
+"Medida absoluta.\n"
+"La referencia es (X = 0, Y = 0) posición"
+
+#: flatcamGUI/FlatCAMGUI.py:1916
+msgid "Select 'Esc'"
+msgstr "Selecciona 'Esc'"
+
+#: flatcamGUI/FlatCAMGUI.py:1943
+msgid "Copy Objects"
+msgstr "Copiar objetos"
+
+#: flatcamGUI/FlatCAMGUI.py:1945
+msgid "Delete Shape"
+msgstr "Eliminar Forma"
+
+#: flatcamGUI/FlatCAMGUI.py:1950
+msgid "Move Objects"
+msgstr "Mover objetos"
+
+#: flatcamGUI/FlatCAMGUI.py:2381
+msgid ""
+"Please first select a geometry item to be cutted\n"
+"then select the geometry item that will be cutted\n"
+"out of the first item. In the end press ~X~ key or\n"
+"the toolbar button."
+msgstr ""
+"Por favor, primero seleccione un elemento de geometría para ser cortado\n"
+"a continuación, seleccione el elemento de geometría que se cortará\n"
+"fuera del primer artículo. Al final presione la tecla ~ X ~ o\n"
+"el botón de la barra de herramientas."
+
+#: flatcamGUI/FlatCAMGUI.py:2388 flatcamGUI/FlatCAMGUI.py:2525
+#: flatcamGUI/FlatCAMGUI.py:2584 flatcamGUI/FlatCAMGUI.py:2604
+msgid "Warning"
+msgstr "Advertencia"
+
+#: flatcamGUI/FlatCAMGUI.py:2455 flatcamGUI/FlatCAMGUI.py:2663
+#: flatcamGUI/FlatCAMGUI.py:2874
+msgid "[WARNING_NOTCL] Cancelled."
+msgstr "[WARNING_NOTCL] Cancelado."
+
+#: flatcamGUI/FlatCAMGUI.py:2520
+msgid ""
+"Please select geometry items \n"
+"on which to perform Intersection Tool."
+msgstr ""
+"Por favor seleccione elementos de geometría\n"
+"en el que realizar Herramienta de Intersección."
+
+#: flatcamGUI/FlatCAMGUI.py:2579
+msgid ""
+"Please select geometry items \n"
+"on which to perform Substraction Tool."
+msgstr ""
+"Por favor seleccione elementos de geometría\n"
+"en el que realizar la Herramienta de Substracción."
+
+#: flatcamGUI/FlatCAMGUI.py:2599
+msgid ""
+"Please select geometry items \n"
+"on which to perform union."
+msgstr ""
+"Por favor seleccione elementos de geometría\n"
+"en el que realizar la Unión."
+
+#: flatcamGUI/FlatCAMGUI.py:2679 flatcamGUI/FlatCAMGUI.py:2891
+msgid "[WARNING_NOTCL] Cancelled. Nothing selected to delete."
+msgstr "[WARNING_NOTCL] Cancelado. Nada seleccionado para eliminar."
+
+#: flatcamGUI/FlatCAMGUI.py:2763 flatcamGUI/FlatCAMGUI.py:2958
+msgid "[WARNING_NOTCL] Cancelled. Nothing selected to copy."
+msgstr "[WARNING_NOTCL] Cancelado. Nada seleccionado para copiar."
+
+#: flatcamGUI/FlatCAMGUI.py:2809 flatcamGUI/FlatCAMGUI.py:3004
+msgid "[WARNING_NOTCL] Cancelled. Nothing selected to move."
+msgstr "[WARNING_NOTCL] Cancelado. Nada seleccionado para moverse."
+
+#: flatcamGUI/FlatCAMGUI.py:3018
+msgid "New Tool ..."
+msgstr "Nueva herramienta ..."
+
+#: flatcamGUI/FlatCAMGUI.py:3019
+msgid "Enter a Tool Diameter:"
+msgstr "Introduzca un diá. de herra.:"
+
+#: flatcamGUI/FlatCAMGUI.py:3062
+msgid "Measurement Tool exit..."
+msgstr "Herramienta de medición de salida ..."
+
+#: flatcamGUI/FlatCAMGUI.py:3353
+msgid "GUI Preferences"
+msgstr "Preferencias de GUI"
+
+#: flatcamGUI/FlatCAMGUI.py:3359
+msgid "Grid X value:"
+msgstr "Valor de la cuadríc. X:"
+
+#: flatcamGUI/FlatCAMGUI.py:3361
+msgid "This is the Grid snap value on X axis."
+msgstr "Este es el valor de ajuste de cuadrícula en el eje X."
+
+#: flatcamGUI/FlatCAMGUI.py:3366
+msgid "Grid Y value:"
+msgstr "Valor de la cuadríc. Y:"
+
+#: flatcamGUI/FlatCAMGUI.py:3368
+msgid "This is the Grid snap value on Y axis."
+msgstr "Este es el valor de ajuste de cuadrícula en el eje Y."
+
+#: flatcamGUI/FlatCAMGUI.py:3373
+msgid "Snap Max:"
+msgstr "Máx. de ajuste:"
+
+#: flatcamGUI/FlatCAMGUI.py:3378
+msgid "Workspace:"
+msgstr "Espacio de trabajo:"
+
+#: flatcamGUI/FlatCAMGUI.py:3380
+msgid ""
+"Draw a delimiting rectangle on canvas.\n"
+"The purpose is to illustrate the limits for our work."
+msgstr ""
+"Dibuja un rectángulo delimitador en el lienzo.\n"
+"El propósito es ilustrar los límites de nuestro trabajo."
+
+#: flatcamGUI/FlatCAMGUI.py:3383
+msgid "Wk. format:"
+msgstr "Formato de ET:"
+
+#: flatcamGUI/FlatCAMGUI.py:3385
+msgid ""
+"Select the type of rectangle to be used on canvas,\n"
+"as valid workspace."
+msgstr ""
+"Seleccione el tipo de rectángulo a utilizar en el lienzo,\n"
+"como espacio de trabajo válido."
+
+#: flatcamGUI/FlatCAMGUI.py:3398
+msgid "Plot Fill:"
+msgstr "Relleno de la par.:"
+
+#: flatcamGUI/FlatCAMGUI.py:3400
+msgid ""
+"Set the fill color for plotted objects.\n"
+"First 6 digits are the color and the last 2\n"
+"digits are for alpha (transparency) level."
+msgstr ""
+"Establecer el color de relleno para los objetos trazados.\n"
+"Los primeros 6 dígitos son el color y los 2 últimos.\n"
+"Los dígitos son para el nivel alfa (transparencia)."
+
+#: flatcamGUI/FlatCAMGUI.py:3414 flatcamGUI/FlatCAMGUI.py:3464
+#: flatcamGUI/FlatCAMGUI.py:3514
+msgid "Alpha Level:"
+msgstr "Nivel Alfa:"
+
+#: flatcamGUI/FlatCAMGUI.py:3416
+msgid "Set the fill transparency for plotted objects."
+msgstr "Establecer la transparencia de relleno para los objetos trazados."
+
+#: flatcamGUI/FlatCAMGUI.py:3433
+msgid "Plot Line:"
+msgstr "Trama:"
+
+#: flatcamGUI/FlatCAMGUI.py:3435
+msgid "Set the line color for plotted objects."
+msgstr "Establecer el color de la línea para los objetos trazados."
+
+#: flatcamGUI/FlatCAMGUI.py:3447
+msgid "Sel. Fill:"
+msgstr "Relleno de sel.:"
+
+#: flatcamGUI/FlatCAMGUI.py:3449
+msgid ""
+"Set the fill color for the selection box\n"
+"in case that the selection is done from left to right.\n"
+"First 6 digits are the color and the last 2\n"
+"digits are for alpha (transparency) level."
+msgstr ""
+"Establecer el color de relleno para el cuadro de selección\n"
+"En caso de que la selección se realice de izquierda a derecha.\n"
+"Los primeros 6 dígitos son el color y los 2 últimos.\n"
+"Los dígitos son para el nivel alfa (transparencia)."
+
+#: flatcamGUI/FlatCAMGUI.py:3466
+msgid "Set the fill transparency for the 'left to right' selection box."
+msgstr ""
+"Establezca la transparencia de relleno para el cuadro de selección 'de "
+"izquierda a derecha'."
+
+#: flatcamGUI/FlatCAMGUI.py:3483
+msgid "Sel. Line:"
+msgstr "Línea de sel.:"
+
+#: flatcamGUI/FlatCAMGUI.py:3485
+msgid "Set the line color for the 'left to right' selection box."
+msgstr ""
+"Establezca el color de línea para el cuadro de selección 'de izquierda a "
+"derecha'."
+
+#: flatcamGUI/FlatCAMGUI.py:3497
+msgid "Sel2. Fill:"
+msgstr "Relleno de sel.2:"
+
+#: flatcamGUI/FlatCAMGUI.py:3499
+msgid ""
+"Set the fill color for the selection box\n"
+"in case that the selection is done from right to left.\n"
+"First 6 digits are the color and the last 2\n"
+"digits are for alpha (transparency) level."
+msgstr ""
+"Establecer el color de relleno para el cuadro de selección\n"
+"En caso de que la selección se realice de derecha a izquierda.\n"
+"Los primeros 6 dígitos son el color y los 2 últimos.\n"
+"Los dígitos son para el nivel alfa (transparencia)."
+
+#: flatcamGUI/FlatCAMGUI.py:3516
+msgid "Set the fill transparency for selection 'right to left' box."
+msgstr ""
+"Establezca la transparencia de relleno para el cuadro de selección \"de "
+"derecha a izquierda\"."
+
+#: flatcamGUI/FlatCAMGUI.py:3533
+msgid "Sel2. Line:"
+msgstr "Línea de sel.2:"
+
+#: flatcamGUI/FlatCAMGUI.py:3535
+msgid "Set the line color for the 'right to left' selection box."
+msgstr ""
+"Establezca el color de línea para el cuadro de selección 'de derecha a "
+"izquierda'."
+
+#: flatcamGUI/FlatCAMGUI.py:3547
+msgid "Editor Draw:"
+msgstr "Sorteo del editor:"
+
+#: flatcamGUI/FlatCAMGUI.py:3549
+msgid "Set the color for the shape."
+msgstr "Establecer el color de la forma."
+
+#: flatcamGUI/FlatCAMGUI.py:3561
+msgid "Editor Draw Sel.:"
+msgstr "Editor de sel. de sorteo:"
+
+#: flatcamGUI/FlatCAMGUI.py:3563
+msgid "Set the color of the shape when selected."
+msgstr "Establecer el color de la forma cuando se selecciona."
+
+#: flatcamGUI/FlatCAMGUI.py:3575
+msgid "Project Items:"
+msgstr "Elementos del proyecto:"
+
+#: flatcamGUI/FlatCAMGUI.py:3577
+msgid "Set the color of the items in Project Tab Tree."
+msgstr ""
+"Establecer el color de los elementos en el árbol de pestañas del proyecto."
+
+#: flatcamGUI/FlatCAMGUI.py:3588
+msgid "Proj. Dis. Items:"
+msgstr "Proyectos deshabilitados:"
+
+#: flatcamGUI/FlatCAMGUI.py:3590
+msgid ""
+"Set the color of the items in Project Tab Tree,\n"
+"for the case when the items are disabled."
+msgstr ""
+"Establecer el color de los elementos en el árbol de pestañas del proyecto,\n"
+"para el caso cuando los elementos están deshabilitados."
+
+#: flatcamGUI/FlatCAMGUI.py:3641
+msgid "GUI Settings"
+msgstr "Configuraciones GUI"
+
+#: flatcamGUI/FlatCAMGUI.py:3647
+msgid "Layout:"
+msgstr "Diseño:"
+
+#: flatcamGUI/FlatCAMGUI.py:3649
+msgid ""
+"Select an layout for FlatCAM.\n"
+"It is applied immediately."
+msgstr ""
+"Seleccione un diseño para FlatCAM.\n"
+"Se aplica de inmediato."
+
+#: flatcamGUI/FlatCAMGUI.py:3665
+msgid "Style:"
+msgstr "Estilo:"
+
+#: flatcamGUI/FlatCAMGUI.py:3667
+msgid ""
+"Select an style for FlatCAM.\n"
+"It will be applied at the next app start."
+msgstr ""
+"Seleccione un estilo para FlatCAM.\n"
+"Se aplicará en el próximo inicio de la aplicación."
+
+#: flatcamGUI/FlatCAMGUI.py:3678
+msgid "HDPI Support:"
+msgstr "Soporte HDPI:"
+
+#: flatcamGUI/FlatCAMGUI.py:3680
+msgid ""
+"Enable High DPI support for FlatCAM.\n"
+"It will be applied at the next app start."
+msgstr ""
+"Habilitar el soporte de alta DPI para FlatCAM.\n"
+"Se aplicará en el próximo inicio de la aplicación."
+
+#: flatcamGUI/FlatCAMGUI.py:3693
+msgid "Clear GUI Settings:"
+msgstr "Borrar la configuración de la GUI:"
+
+#: flatcamGUI/FlatCAMGUI.py:3695
+msgid ""
+"Clear the GUI settings for FlatCAM,\n"
+"such as: layout, gui state, style, hdpi support etc."
+msgstr ""
+"Borrar la configuración de la GUI para FlatCAM,\n"
+"tales como: diseño, estado gui, estilo, soporte hdpi etc."
+
+#: flatcamGUI/FlatCAMGUI.py:3698
+msgid "Clear"
+msgstr "Limpiar"
+
+#: flatcamGUI/FlatCAMGUI.py:3702
+msgid "Hover Shape:"
+msgstr "Forma flotante:"
+
+#: flatcamGUI/FlatCAMGUI.py:3704
+msgid ""
+"Enable display of a hover shape for FlatCAM objects.\n"
+"It is displayed whenever the mouse cursor is hovering\n"
+"over any kind of not-selected object."
+msgstr ""
+"Habilitar la visualización de una forma flotante para objetos FlatCAM.\n"
+"Se muestra cada vez que el cursor del mouse se desplaza\n"
+"sobre cualquier tipo de objeto no seleccionado."
+
+#: flatcamGUI/FlatCAMGUI.py:3711
+msgid "Sel. Shape:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3713
+msgid ""
+"Enable the display of a selection shape for FlatCAM objects.\n"
+"It is displayed whenever the mouse selects an object\n"
+"either by clicking or dragging mouse from left to right or\n"
+"right to left."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3755
+msgid "Are you sure you want to delete the GUI Settings? \n"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3758
+msgid "Clear GUI Settings"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3779
+msgid "App Preferences"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3785
+msgid "<b>Units:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3786
+msgid ""
+"The default value for FlatCAM units.\n"
+"Whatever is selected here is set every time\n"
+"FLatCAM is started."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3789
+msgid "IN"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3790 flatcamGUI/FlatCAMGUI.py:4279
+#: flatcamGUI/FlatCAMGUI.py:4540 flatcamGUI/FlatCAMGUI.py:4931
+#: flatcamTools/ToolCalculators.py:61 flatcamTools/ToolPcbWizard.py:126
+msgid "MM"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3793
+msgid "<b>APP. LEVEL:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3794
+msgid ""
+"Choose the default level of usage for FlatCAM.\n"
+"BASIC level -> reduced functionality, best for beginner's.\n"
+"ADVANCED level -> full functionality.\n"
+"\n"
+"The choice here will influence the parameters in\n"
+"the Selected Tab for all kinds of FlatCAM objects."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3799 flatcamGUI/FlatCAMGUI.py:4567
+msgid "Basic"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3800
+msgid "Advanced"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3803
+msgid "<b>Languages:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3804
+msgid "Set the language used throughout FlatCAM."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3807
+msgid "Apply Language"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3808
+msgid ""
+"Set the language used throughout FlatCAM.\n"
+"The app will restart after click.Windows: When FlatCAM is installed in "
+"Program Files\n"
+"directory, it is possible that the app will not\n"
+"restart after the button is clicked due of Windows\n"
+"security features. In this case the language will be\n"
+"applied at the next app start."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3817
+msgid "Shell at StartUp:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3819 flatcamGUI/FlatCAMGUI.py:3824
+msgid ""
+"Check this box if you want the shell to\n"
+"start automatically at startup."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3829
+msgid "Version Check:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3831 flatcamGUI/FlatCAMGUI.py:3836
+msgid ""
+"Check this box if you want to check\n"
+"for a new version automatically at startup."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3841
+msgid "Send Stats:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3843 flatcamGUI/FlatCAMGUI.py:3848
+msgid ""
+"Check this box if you agree to send anonymous\n"
+"stats automatically at startup, to help improve FlatCAM."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3855
+msgid "<b>Pan Button:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3856
+msgid ""
+"Select the mouse button to use for panning:\n"
+"- MMB --> Middle Mouse Button\n"
+"- RMB --> Right Mouse Button"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3859
+msgid "MMB"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3860
+msgid "RMB"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3863
+msgid "<b>Multiple Sel:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3864
+msgid "Select the key used for multiple selection."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3869
+msgid "Project at StartUp:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3871 flatcamGUI/FlatCAMGUI.py:3876
+msgid ""
+"Check this box if you want the project/selected/tool tab area to\n"
+"to be shown automatically at startup."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3881
+msgid "Project AutoHide:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:3889
+msgid ""
+"Check this box if you want the project/selected/tool tab area to\n"
+"hide automatically when there are no objects loaded and\n"
+"to show whenever a new object is created."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3895
+msgid "<b>Enable ToolTips:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3897 flatcamGUI/FlatCAMGUI.py:3902
+msgid ""
+"Check this box if you want to have toolTips displayed\n"
+"when hovering with mouse over items throughout the App."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3905
+msgid "Workers number:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3907 flatcamGUI/FlatCAMGUI.py:3916
+msgid ""
+"The number of Qthreads made available to the App.\n"
+"A bigger number may finish the jobs more quickly but\n"
+"depending on your computer speed, may make the App\n"
+"unresponsive. Can have a value between 2 and 16.\n"
+"Default value is 2.\n"
+"After change, it will be applied at next App start."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3926
+msgid "Geo Tolerance:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3928 flatcamGUI/FlatCAMGUI.py:3937
+msgid ""
+"This value can counter the effect of the Circle Steps\n"
+"parameter. Default value is 0.01.\n"
+"A lower value will increase the detail both in image\n"
+"and in Gcode for the circles, with a higher cost in\n"
+"performance. Higher value will provide more\n"
+"performance at the expense of level of detail."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3973
+msgid "\"Open\" behavior"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3975
+msgid ""
+"When checked the path for the last saved file is used when saving files,\n"
+"and the path for the last opened file is used when opening files.\n"
+"\n"
+"When unchecked the path for opening files is the one used last: either the\n"
+"path for saving files or the path for opening files."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3984
+msgid "Save Compressed Project"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3986
+msgid ""
+"Whether to save a compressed or uncompressed project.\n"
+"When checked it will save a compressed FlatCAM project."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3997
+msgid "Compression Level:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:3999
+msgid ""
+"The level of compression used when saving\n"
+"a FlatCAM project. Higher value means better compression\n"
+"but require more RAM usage and more processing time."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4022
+msgid "Gerber General"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4025 flatcamGUI/FlatCAMGUI.py:4391
+#: flatcamGUI/FlatCAMGUI.py:5165 flatcamGUI/FlatCAMGUI.py:5534
+#: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:505
+#: flatcamGUI/ObjectUI.py:833 flatcamGUI/ObjectUI.py:1350
+msgid "<b>Plot Options:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4032 flatcamGUI/FlatCAMGUI.py:4403
+#: flatcamGUI/ObjectUI.py:156 flatcamGUI/ObjectUI.py:506
+msgid "Solid"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4034 flatcamGUI/ObjectUI.py:158
+msgid "Solid color polygons."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4039 flatcamGUI/ObjectUI.py:164
+msgid "M-Color"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4041 flatcamGUI/ObjectUI.py:166
+msgid "Draw polygons in different colors."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4046 flatcamGUI/FlatCAMGUI.py:4397
+#: flatcamGUI/FlatCAMGUI.py:5169 flatcamGUI/ObjectUI.py:172
+msgid "Plot"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4048 flatcamGUI/FlatCAMGUI.py:5171
+#: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:546
+#: flatcamGUI/ObjectUI.py:879 flatcamGUI/ObjectUI.py:1450
+msgid "Plot (show) this object."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4053 flatcamGUI/FlatCAMGUI.py:5179
+#: flatcamGUI/FlatCAMGUI.py:5617
+msgid "Circle Steps:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4055
+msgid ""
+"The number of circle steps for Gerber \n"
+"circular aperture linear approximation."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4070
+msgid "Gerber Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4073 flatcamGUI/ObjectUI.py:251
+msgid "<b>Isolation Routing:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4075 flatcamGUI/ObjectUI.py:253
+msgid ""
+"Create a Geometry object with\n"
+"toolpaths to cut outside polygons."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4086 flatcamGUI/FlatCAMGUI.py:4765
+#: flatcamGUI/FlatCAMGUI.py:5906 flatcamGUI/ObjectUI.py:788
+#: flatcamGUI/ObjectUI.py:804
+msgid "Diameter of the cutting tool."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4093
+msgid "Width (# passes):"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4095 flatcamGUI/ObjectUI.py:275
+msgid ""
+"Width of the isolation gap in\n"
+"number (integer) of tool widths."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4103 flatcamGUI/ObjectUI.py:283
+msgid "Pass overlap:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4105 flatcamGUI/ObjectUI.py:285
+#, python-format
+msgid ""
+"How much (fraction) of the tool width to overlap each tool pass.\n"
+"Example:\n"
+"A value here of 0.25 means an overlap of 25% from the tool diameter found "
+"above."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4113 flatcamGUI/ObjectUI.py:295
+msgid "Milling Type:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4115 flatcamGUI/ObjectUI.py:297
+msgid ""
+"Milling type:\n"
+"- climb / best for precision milling and to reduce tool usage\n"
+"- conventional / useful when there is no backlash compensation"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4120 flatcamGUI/ObjectUI.py:302
+msgid "Climb"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4121 flatcamGUI/ObjectUI.py:303
+msgid "Conv."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4125
+msgid "Combine Passes"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4127 flatcamGUI/ObjectUI.py:309
+msgid "Combine all passes into one object"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4132
+msgid "<b>Clear non-copper:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4134 flatcamGUI/FlatCAMGUI.py:5794
+#: flatcamGUI/ObjectUI.py:386
+msgid ""
+"Create a Geometry object with\n"
+"toolpaths to cut all non-copper regions."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4143 flatcamGUI/FlatCAMGUI.py:4169
+#: flatcamGUI/ObjectUI.py:430 flatcamGUI/ObjectUI.py:464
+msgid "Boundary Margin:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4145 flatcamGUI/ObjectUI.py:432
+msgid ""
+"Specify the edge of the PCB\n"
+"by drawing a box around all\n"
+"objects with this minimum\n"
+"distance."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4155 flatcamGUI/FlatCAMGUI.py:4178
+msgid "Rounded corners"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4157
+msgid ""
+"Creates a Geometry objects with polygons\n"
+"covering the copper-free areas of the PCB."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4163 flatcamGUI/ObjectUI.py:454
+msgid "<b>Bounding Box:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4171 flatcamGUI/ObjectUI.py:466
+msgid ""
+"Distance of the edges of the box\n"
+"to the nearest polygon."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4180 flatcamGUI/ObjectUI.py:476
+msgid ""
+"If the bounding box is \n"
+"to have rounded corners\n"
+"their radius is equal to\n"
+"the margin."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4194
+msgid "Gerber Adv. Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4197
+msgid "<b>Advanced Param.:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4199
+msgid ""
+"A list of Gerber advanced parameters.\n"
+"Those parameters are available only for\n"
+"Advanced App. Level."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4209 flatcamGUI/ObjectUI.py:314
+msgid "\"Follow\""
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4211 flatcamGUI/ObjectUI.py:316
+msgid ""
+"Generate a 'Follow' geometry.\n"
+"This means that it will cut through\n"
+"the middle of the trace."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4218
+msgid "Table Show/Hide"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4220
+msgid ""
+"Toggle the display of the Gerber Apertures Table.\n"
+"Also, on hide, it will delete all mark shapes\n"
+"that are drawn on canvas."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4259
+msgid "Gerber Export"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4262 flatcamGUI/FlatCAMGUI.py:4914
+msgid "<b>Export Options:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4264
+msgid ""
+"The parameters set here are used in the file exported\n"
+"when using the File -> Export -> Export Gerber menu entry."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4273 flatcamGUI/FlatCAMGUI.py:4925
+msgid "<b>Units</b>:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4275 flatcamGUI/FlatCAMGUI.py:4281
+msgid "The units used in the Gerber file."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4278 flatcamGUI/FlatCAMGUI.py:4539
+#: flatcamGUI/FlatCAMGUI.py:4930 flatcamTools/ToolCalculators.py:60
+#: flatcamTools/ToolPcbWizard.py:125
+msgid "INCH"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4287 flatcamGUI/FlatCAMGUI.py:4939
+msgid "<b>Int/Decimals:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4289
+msgid ""
+"The number of digits in the whole part of the number\n"
+"and in the fractional part of the number."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4300
+msgid ""
+"This numbers signify the number of digits in\n"
+"the whole part of Gerber coordinates."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4314
+msgid ""
+"This numbers signify the number of digits in\n"
+"the decimal part of Gerber coordinates."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4323 flatcamGUI/FlatCAMGUI.py:5000
+msgid "<b>Zeros</b>:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4326 flatcamGUI/FlatCAMGUI.py:4336
+msgid ""
+"This sets the type of Gerber zeros.\n"
+"If LZ then Leading Zeros are removed and\n"
+"Trailing Zeros are kept.\n"
+"If TZ is checked then Trailing Zeros are removed\n"
+"and Leading Zeros are kept."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4333 flatcamGUI/FlatCAMGUI.py:4515
+#: flatcamGUI/FlatCAMGUI.py:5010 flatcamTools/ToolPcbWizard.py:111
+msgid "LZ"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4334 flatcamGUI/FlatCAMGUI.py:4516
+#: flatcamGUI/FlatCAMGUI.py:5011 flatcamTools/ToolPcbWizard.py:112
+msgid "TZ"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4356 flatcamGUI/FlatCAMGUI.py:5041
+#: flatcamGUI/FlatCAMGUI.py:5500 flatcamGUI/FlatCAMGUI.py:5792
+#: flatcamGUI/FlatCAMGUI.py:5893 flatcamGUI/FlatCAMGUI.py:5972
+#: flatcamGUI/FlatCAMGUI.py:6031 flatcamGUI/FlatCAMGUI.py:6134
+#: flatcamGUI/FlatCAMGUI.py:6195 flatcamGUI/FlatCAMGUI.py:6394
+#: flatcamGUI/FlatCAMGUI.py:6521
+msgid "<b>Parameters:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4358
+msgid "A list of Gerber Editor parameters."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/FlatCAMGUI.py:5051
+#: flatcamGUI/FlatCAMGUI.py:5510
+msgid "Selection limit:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4368
+msgid ""
+"Set the number of selected Gerber geometry\n"
+"items above which the utility geometry\n"
+"becomes just a selection rectangle.\n"
+"Increases the performance when moving a\n"
+"large number of geometric elements."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4388
+msgid "Excellon General"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4410
+msgid "<b>Excellon Format:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4412
+msgid ""
+"The NC drill files, usually named Excellon files\n"
+"are files that can be found in different formats.\n"
+"Here we set the format used when the provided\n"
+"coordinates are not using period.\n"
+"\n"
+"Possible presets:\n"
+"\n"
+"PROTEUS 3:3 MM LZ\n"
+"DipTrace 5:2 MM TZ\n"
+"DipTrace 4:3 MM LZ\n"
+"\n"
+"EAGLE 3:3 MM TZ\n"
+"EAGLE 4:3 MM TZ\n"
+"EAGLE 2:5 INCH TZ\n"
+"EAGLE 3:5 INCH TZ\n"
+"\n"
+"ALTIUM 2:4 INCH LZ\n"
+"Sprint Layout 2:4 INCH LZ\n"
+"KiCAD 3:5 INCH TZ"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4437
+msgid "INCH:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4440
+msgid "Default values for INCH are 2:4"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4448 flatcamGUI/FlatCAMGUI.py:4481
+#: flatcamGUI/FlatCAMGUI.py:4954
+msgid ""
+"This numbers signify the number of digits in\n"
+"the whole part of Excellon coordinates."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4462 flatcamGUI/FlatCAMGUI.py:4495
+#: flatcamGUI/FlatCAMGUI.py:4968
+msgid ""
+"This numbers signify the number of digits in\n"
+"the decimal part of Excellon coordinates."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4470
+msgid "METRIC:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4473
+msgid "Default values for METRIC are 3:3"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4504
+msgid "Default <b>Zeros</b>:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4507 flatcamGUI/FlatCAMGUI.py:5003
+msgid ""
+"This sets the type of Excellon zeros.\n"
+"If LZ then Leading Zeros are kept and\n"
+"Trailing Zeros are removed.\n"
+"If TZ is checked then Trailing Zeros are kept\n"
+"and Leading Zeros are removed."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4518
+msgid ""
+"This sets the default type of Excellon zeros.\n"
+"If it is not detected in the parsed file the value here\n"
+"will be used.If LZ then Leading Zeros are kept and\n"
+"Trailing Zeros are removed.\n"
+"If TZ is checked then Trailing Zeros are kept\n"
+"and Leading Zeros are removed."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4528
+msgid "Default <b>Units</b>:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4531
+msgid ""
+"This sets the default units of Excellon files.\n"
+"If it is not detected in the parsed file the value here\n"
+"will be used.Some Excellon files don't have an header\n"
+"therefore this parameter will be used."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4542
+msgid ""
+"This sets the units of Excellon files.\n"
+"Some Excellon files don't have an header\n"
+"therefore this parameter will be used."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4550
+msgid "<b>Excellon Optimization:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4553
+msgid "Algorithm:   "
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4555 flatcamGUI/FlatCAMGUI.py:4569
+msgid ""
+"This sets the optimization type for the Excellon drill path.\n"
+"If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n"
+"Guided Local Path is used. Default search time is 3sec.\n"
+"Use set_sys excellon_search_time value Tcl Command to set other values.\n"
+"If Basic is checked then Google OR-Tools Basic algorithm is used.\n"
+"\n"
+"If DISABLED, then FlatCAM works in 32bit mode and it uses \n"
+"Travelling Salesman algorithm for path optimization."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4566
+msgid "MH"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4580
+msgid "Optimization Time:   "
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4583
+msgid ""
+"When OR-Tools Metaheuristic (MH) is enabled there is a\n"
+"maximum threshold for how much time is spent doing the\n"
+"path optimization. This max duration is set here.\n"
+"In seconds."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4626
+msgid "Excellon Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4629 flatcamGUI/ObjectUI.py:584
+msgid "<b>Create CNC Job</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4631
+msgid ""
+"Parameters used to create a CNC Job object\n"
+"for this drill object."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4639 flatcamGUI/FlatCAMGUI.py:5226
+#: flatcamGUI/FlatCAMGUI.py:6330 flatcamGUI/ObjectUI.py:595
+#: flatcamGUI/ObjectUI.py:1062 flatcamTools/ToolCalculators.py:106
+msgid "Cut Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4641 flatcamGUI/ObjectUI.py:597
+msgid ""
+"Drill depth (negative)\n"
+"below the copper surface."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4648 flatcamGUI/FlatCAMGUI.py:5259
+#: flatcamGUI/ObjectUI.py:605 flatcamGUI/ObjectUI.py:1098
+msgid "Travel Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4650 flatcamGUI/ObjectUI.py:607
+msgid ""
+"Tool height when travelling\n"
+"across the XY plane."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4658 flatcamGUI/FlatCAMGUI.py:5269
+msgid "Tool change:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4660 flatcamGUI/FlatCAMGUI.py:5271
+#: flatcamGUI/ObjectUI.py:617
+msgid ""
+"Include tool-change sequence\n"
+"in G-Code (Pause for tool change)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4667 flatcamGUI/FlatCAMGUI.py:5279
+msgid "Toolchange Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/FlatCAMGUI.py:5281
+msgid "Toolchange Z position."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4675
+msgid "Feedrate:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4677
+msgid ""
+"Tool speed while drilling\n"
+"(in units per minute)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4685
+msgid "Spindle Speed:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4687 flatcamGUI/FlatCAMGUI.py:5311
+#: flatcamGUI/ObjectUI.py:684
+msgid ""
+"Speed of the spindle\n"
+"in RPM (optional)"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4695 flatcamGUI/FlatCAMGUI.py:5319
+msgid "Spindle dir.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4697 flatcamGUI/FlatCAMGUI.py:5321
+msgid ""
+"This sets the direction that the spindle is rotating.\n"
+"It can be either:\n"
+"- CW = clockwise or\n"
+"- CCW = counter clockwise"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4709 flatcamGUI/FlatCAMGUI.py:5333
+#: flatcamGUI/ObjectUI.py:692 flatcamGUI/ObjectUI.py:1224
+msgid "Dwell:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4711 flatcamGUI/FlatCAMGUI.py:5335
+#: flatcamGUI/ObjectUI.py:694 flatcamGUI/ObjectUI.py:1227
+msgid ""
+"Pause to allow the spindle to reach its\n"
+"speed before cutting."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4714 flatcamGUI/FlatCAMGUI.py:5338
+msgid "Duration:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4716 flatcamGUI/FlatCAMGUI.py:5340
+#: flatcamGUI/ObjectUI.py:699 flatcamGUI/ObjectUI.py:1234
+msgid "Number of milliseconds for spindle to dwell."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4728 flatcamGUI/FlatCAMGUI.py:5350
+#: flatcamGUI/ObjectUI.py:707
+msgid "Postprocessor:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4730
+msgid ""
+"The postprocessor file that dictates\n"
+"gcode output."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4739
+msgid "<b>Gcode:    </b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4741
+msgid ""
+"Choose what to use for GCode generation:\n"
+"'Drills', 'Slots' or 'Both'.\n"
+"When choosing 'Slots' or 'Both', slots will be\n"
+"converted to drills."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4757 flatcamGUI/ObjectUI.py:772
+msgid "<b>Mill Holes</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4759 flatcamGUI/ObjectUI.py:774
+msgid "Create Geometry for milling holes."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4763
+msgid "Drill Tool dia:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4770
+msgid "Slot Tool dia:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4772
+msgid ""
+"Diameter of the cutting tool\n"
+"when milling slots."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4784
+msgid "Defaults"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4797
+msgid "Excellon Adv. Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4803 flatcamGUI/FlatCAMGUI.py:5373
+msgid "<b>Advanced Options:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4805
+msgid ""
+"Parameters used to create a CNC Job object\n"
+"for this drill object that are shown when App Level is Advanced."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4813
+msgid "Offset Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4815 flatcamGUI/ObjectUI.py:574
+msgid ""
+"Some drill bits (the larger ones) need to drill deeper\n"
+"to create the desired exit hole diameter due of the tip shape.\n"
+"The value here can compensate the Cut Z parameter."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4822 flatcamGUI/FlatCAMGUI.py:5384
+msgid "Toolchange X,Y:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4824 flatcamGUI/FlatCAMGUI.py:5386
+msgid "Toolchange X,Y position."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4830 flatcamGUI/FlatCAMGUI.py:5393
+#: flatcamGUI/ObjectUI.py:634
+msgid "Start move Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4832
+msgid ""
+"Height of the tool just after start.\n"
+"Delete the value if you don't need this feature."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4839 flatcamGUI/FlatCAMGUI.py:5403
+#: flatcamGUI/ObjectUI.py:644 flatcamGUI/ObjectUI.py:1144
+msgid "End move Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4841 flatcamGUI/FlatCAMGUI.py:5405
+msgid ""
+"Height of the tool after\n"
+"the last move at the end of the job."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4848 flatcamGUI/FlatCAMGUI.py:5413
+#: flatcamGUI/ObjectUI.py:665
+msgid "Feedrate Rapids:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4850 flatcamGUI/ObjectUI.py:667
+msgid ""
+"Tool speed while drilling\n"
+"(in units per minute).\n"
+"This is for the rapid move G00.\n"
+"It is useful only for Marlin,\n"
+"ignore for any other cases."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4861 flatcamGUI/FlatCAMGUI.py:5437
+#: flatcamGUI/ObjectUI.py:718 flatcamGUI/ObjectUI.py:1256
+msgid "Probe Z depth:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4863 flatcamGUI/FlatCAMGUI.py:5439
+#: flatcamGUI/ObjectUI.py:720 flatcamGUI/ObjectUI.py:1259
+msgid ""
+"The maximum depth that the probe is allowed\n"
+"to probe. Negative value, in current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4871 flatcamGUI/FlatCAMGUI.py:5447
+#: flatcamGUI/ObjectUI.py:730 flatcamGUI/ObjectUI.py:1270
+msgid "Feedrate Probe:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4873 flatcamGUI/FlatCAMGUI.py:5449
+#: flatcamGUI/ObjectUI.py:732 flatcamGUI/ObjectUI.py:1273
+msgid "The feedrate used while the probe is probing."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4879 flatcamGUI/FlatCAMGUI.py:5456
+msgid "Fast Plunge:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4881 flatcamGUI/FlatCAMGUI.py:5458
+msgid ""
+"By checking this, the vertical move from\n"
+"Z_Toolchange to Z_move is done with G0,\n"
+"meaning the fastest speed available.\n"
+"WARNING: the move is done at Toolchange X,Y coords."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4890
+msgid "Fast Retract:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4892
+msgid ""
+"Exit hole strategy.\n"
+" - When uncheked, while exiting the drilled hole the drill bit\n"
+"will travel slow, with set feedrate (G1), up to zero depth and then\n"
+"travel as fast as possible (G0) to the Z Move (travel height).\n"
+" - When checked the travel from Z cut (cut depth) to Z_move\n"
+"(travel height) is done as fast as possible (G0) in one move."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4911
+msgid "Excellon Export"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4916
+msgid ""
+"The parameters set here are used in the file exported\n"
+"when using the File -> Export -> Export Excellon menu entry."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4927 flatcamGUI/FlatCAMGUI.py:4933
+msgid "The units used in the Excellon file."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4941
+msgid ""
+"The NC drill files, usually named Excellon files\n"
+"are files that can be found in different formats.\n"
+"Here we set the format used when the provided\n"
+"coordinates are not using period."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4977
+msgid "<b>Format:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4979 flatcamGUI/FlatCAMGUI.py:4989
+msgid ""
+"Select the kind of coordinates format used.\n"
+"Coordinates can be saved with decimal point or without.\n"
+"When there is no decimal point, it is required to specify\n"
+"the number of digits for integer part and the number of decimals.\n"
+"Also it will have to be specified if LZ = leading zeros are kept\n"
+"or TZ = trailing zeros are kept."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4986
+msgid "Decimal"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:4987
+msgid "No-Decimal"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5013
+msgid ""
+"This sets the default type of Excellon zeros.\n"
+"If LZ then Leading Zeros are kept and\n"
+"Trailing Zeros are removed.\n"
+"If TZ is checked then Trailing Zeros are kept\n"
+"and Leading Zeros are removed."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5043
+msgid "A list of Excellon Editor parameters."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5053
+msgid ""
+"Set the number of selected Excellon geometry\n"
+"items above which the utility geometry\n"
+"becomes just a selection rectangle.\n"
+"Increases the performance when moving a\n"
+"large number of geometric elements."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5065
+msgid "New Tool Dia:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5088
+msgid "<b>Linear Drill Array:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5092
+msgid "Linear Dir.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5128
+msgid "<b>Circular Drill Array:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5132
+msgid "Circular Dir.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5134
+msgid ""
+"Direction for circular array.\n"
+"Can be CW = clockwise or CCW = counter clockwise."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5145
+msgid "Circ. Angle:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5162
+msgid "Geometry General"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5181
+msgid ""
+"The number of circle steps for <b>Geometry</b> \n"
+"circle and arc shapes linear approximation."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5189
+msgid "<b>Tools:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5195 flatcamGUI/FlatCAMGUI.py:5804
+msgid "Diameters of the cutting tools, separated by ','"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5209
+msgid "Geometry Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5214
+msgid "<b>Create CNC Job:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5216
+msgid ""
+"Create a CNC Job object\n"
+"tracing the contours of this\n"
+"Geometry object."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5228 flatcamGUI/ObjectUI.py:1065
+msgid ""
+"Cutting depth (negative)\n"
+"below the copper surface."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5236
+msgid "Multidepth"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5238
+msgid "Multidepth usage: True or False."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5243
+msgid "Depth/Pass:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5245
+msgid ""
+"The depth to cut on each pass,\n"
+"when multidepth is enabled.\n"
+"It has positive value although\n"
+"it is a fraction from the depth\n"
+"which has negative value."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5261 flatcamGUI/ObjectUI.py:1101
+msgid ""
+"Height of the tool when\n"
+"moving without cutting."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5288 flatcamGUI/ObjectUI.py:1156
+msgid "Feed Rate X-Y:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5290 flatcamGUI/ObjectUI.py:1159
+msgid ""
+"Cutting speed in the XY\n"
+"plane in units per minute"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5298
+msgid "Feed Rate Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5300
+msgid ""
+"Cutting speed in the XY\n"
+"plane in units per minute.\n"
+"It is called also Plunge."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5309 flatcamGUI/ObjectUI.py:682
+#: flatcamGUI/ObjectUI.py:1211
+msgid "Spindle speed:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5352
+msgid ""
+"The postprocessor file that dictates\n"
+"Machine Code output."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5368
+msgid "Geometry Adv. Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5375
+msgid ""
+"Parameters to create a CNC Job object\n"
+"tracing the contours of a Geometry object."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5395
+msgid ""
+"Height of the tool just after starting the work.\n"
+"Delete the value if you don't need this feature."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5415
+msgid ""
+"Cutting speed in the XY plane\n"
+"(in units per minute).\n"
+"This is for the rapid move G00.\n"
+"It is useful only for Marlin,\n"
+"ignore for any other cases."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5427
+msgid "Re-cut 1st pt."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5429 flatcamGUI/ObjectUI.py:1202
+msgid ""
+"In order to remove possible\n"
+"copper leftovers where first cut\n"
+"meet with last cut, we generate an\n"
+"extended cut over the first cut section."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5468
+msgid "Seg. X size:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5470
+msgid ""
+"The size of the trace segment on the X axis.\n"
+"Useful for auto-leveling.\n"
+"A value of 0 means no segmentation on the X axis."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5479
+msgid "Seg. Y size:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5481
+msgid ""
+"The size of the trace segment on the Y axis.\n"
+"Useful for auto-leveling.\n"
+"A value of 0 means no segmentation on the Y axis."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5497
+msgid "Geometry Editor"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5502
+msgid "A list of Geometry Editor parameters."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5512
+msgid ""
+"Set the number of selected geometry\n"
+"items above which the utility geometry\n"
+"becomes just a selection rectangle.\n"
+"Increases the performance when moving a\n"
+"large number of geometric elements."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5531
+msgid "CNC Job General"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5544 flatcamGUI/ObjectUI.py:544
+#: flatcamGUI/ObjectUI.py:877 flatcamGUI/ObjectUI.py:1447
+msgid "Plot Object"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5551
+msgid "Plot kind:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5553 flatcamGUI/ObjectUI.py:1356
+msgid ""
+"This selects the kind of geometries on the canvas to plot.\n"
+"Those can be either of type 'Travel' which means the moves\n"
+"above the work piece or it can be of type 'Cut',\n"
+"which means the moves that cut into the material."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5561 flatcamGUI/ObjectUI.py:1365
+msgid "Travel"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5570
+msgid "Display Annotation:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5572 flatcamGUI/ObjectUI.py:1372
+msgid ""
+"This selects if to display text annotation on the plot.\n"
+"When checked it will display numbers in order for each end\n"
+"of a travel line."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5584
+msgid "Annotation Size:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5586
+msgid "The font size of the annotation text. In pixels."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5594
+msgid "Annotation Color:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5596
+msgid "Set the font color for the annotation texts."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5619
+msgid ""
+"The number of circle steps for <b>GCode</b> \n"
+"circle and arc shapes linear approximation."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5629
+msgid ""
+"Diameter of the tool to be\n"
+"rendered in the plot."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5637
+msgid "Coords dec.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5639
+msgid ""
+"The number of decimals to be used for \n"
+"the X, Y, Z coordinates in CNC code (GCODE, etc.)"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5647
+msgid "Feedrate dec.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5649
+msgid ""
+"The number of decimals to be used for \n"
+"the Feedrate parameter in CNC code (GCODE, etc.)"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5664
+msgid "CNC Job Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5667 flatcamGUI/FlatCAMGUI.py:5708
+msgid "<b>Export G-Code:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5669 flatcamGUI/FlatCAMGUI.py:5710
+#: flatcamGUI/ObjectUI.py:1483
+msgid ""
+"Export and save G-Code to\n"
+"make this object to a file."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5675
+msgid "Prepend to G-Code:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5677
+msgid ""
+"Type here any G-Code commands you would\n"
+"like to add at the beginning of the G-Code file."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5686
+msgid "Append to G-Code:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5688 flatcamGUI/ObjectUI.py:1505
+msgid ""
+"Type here any G-Code commands you would\n"
+"like to append to the generated file.\n"
+"I.e.: M2 (End of program)"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5705
+msgid "CNC Job Adv. Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5716 flatcamGUI/ObjectUI.py:1523
+msgid "Toolchange G-Code:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5718
+msgid ""
+"Type here any G-Code commands you would\n"
+"like to be executed when Toolchange event is encountered.\n"
+"This will constitute a Custom Toolchange GCode,\n"
+"or a Toolchange Macro."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5732 flatcamGUI/ObjectUI.py:1545
+msgid "Use Toolchange Macro"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5734 flatcamGUI/ObjectUI.py:1548
+msgid ""
+"Check this box if you want to use\n"
+"a Custom Toolchange GCode (macro)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5746 flatcamGUI/ObjectUI.py:1557
+msgid ""
+"A list of the FlatCAM variables that can be used\n"
+"in the Toolchange event.\n"
+"They have to be surrounded by the '%' symbol"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5753 flatcamGUI/ObjectUI.py:1564
+msgid "Parameters"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5756 flatcamGUI/ObjectUI.py:1567
+msgid "FlatCAM CNC parameters"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5757 flatcamGUI/ObjectUI.py:1568
+msgid "tool = tool number"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5758 flatcamGUI/ObjectUI.py:1569
+msgid "tooldia = tool diameter"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5759 flatcamGUI/ObjectUI.py:1570
+msgid "t_drills = for Excellon, total number of drills"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5760 flatcamGUI/ObjectUI.py:1571
+msgid "x_toolchange = X coord for Toolchange"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5761 flatcamGUI/ObjectUI.py:1572
+msgid "y_toolchange = Y coord for Toolchange"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5762 flatcamGUI/ObjectUI.py:1573
+msgid "z_toolchange = Z coord for Toolchange"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5763
+msgid "z_cut = Z depth for the cut"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5764
+msgid "z_move = Z height for travel"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5765 flatcamGUI/ObjectUI.py:1576
+msgid "z_depthpercut = the step value for multidepth cut"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5766 flatcamGUI/ObjectUI.py:1577
+msgid "spindlesspeed = the value for the spindle speed"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5768 flatcamGUI/ObjectUI.py:1578
+msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5789
+msgid "NCC Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5802 flatcamGUI/FlatCAMGUI.py:6532
+msgid "Tools dia:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5812 flatcamTools/ToolNonCopperClear.py:167
+#, python-format
+msgid ""
+"How much (fraction) of the tool width to overlap each tool pass.\n"
+"Example:\n"
+"A value here of 0.25 means 25% from the tool diameter found above.\n"
+"\n"
+"Adjust the value starting with lower values\n"
+"and increasing it if areas that should be cleared are still \n"
+"not cleared.\n"
+"Lower values = faster processing, faster execution on PCB.\n"
+"Higher values = slow processing and slow execution on CNC\n"
+"due of too many paths."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5828 flatcamTools/ToolNonCopperClear.py:183
+msgid "Bounding box margin."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5837 flatcamTools/ToolNonCopperClear.py:192
+#: flatcamTools/ToolPaint.py:190
+msgid ""
+"Algorithm for non-copper clearing:<BR><B>Standard</B>: Fixed step inwards."
+"<BR><B>Seed-based</B>: Outwards from seed.<BR><B>Line-based</B>: Parallel "
+"lines."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5869 flatcamTools/ToolNonCopperClear.py:224
+#: flatcamTools/ToolPaint.py:222
+msgid "Rest M.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5871
+msgid ""
+"If checked, use 'rest machining'.\n"
+"Basically it will clear copper outside PCB features,\n"
+"using the biggest tool and continue with the next tools,\n"
+"from bigger to smaller, to clear areas of copper that\n"
+"could not be cleared by previous tool.\n"
+"If not checked, use the standard algorithm."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5890
+msgid "Cutout Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5895 flatcamGUI/ObjectUI.py:402
+msgid ""
+"Create toolpaths to cut around\n"
+"the PCB and separate it from\n"
+"the original board."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5914
+msgid ""
+"Distance from objects at which\n"
+"to draw the cutout."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5921 flatcamTools/ToolCutOut.py:97
+msgid "Gap size:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5923
+msgid ""
+"Size of the gaps in the toolpath\n"
+"that will remain to hold the\n"
+"board in place."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5931 flatcamTools/ToolCutOut.py:135
+msgid "Gaps:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5933
+msgid ""
+"Number of bridge gaps used for the cutout.\n"
+"There can be maximum 8 bridges/gaps.\n"
+"The choices are:\n"
+"- lr    - left + right\n"
+"- tb    - top + bottom\n"
+"- 4     - left + right +top + bottom\n"
+"- 2lr   - 2*left + 2*right\n"
+"- 2tb  - 2*top + 2*bottom\n"
+"- 8     - 2*left + 2*right +2*top + 2*bottom"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5954 flatcamTools/ToolCutOut.py:116
+msgid "Convex Sh.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5956
+msgid "Create a convex shape surrounding the entire PCB."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5969
+msgid "2Sided Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5974
+msgid ""
+"A tool to help in creating a double sided\n"
+"PCB using alignment holes."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5984 flatcamTools/ToolDblSided.py:234
+msgid "Drill diam.:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5986 flatcamTools/ToolDblSided.py:225
+#: flatcamTools/ToolDblSided.py:236
+msgid "Diameter of the drill for the alignment holes."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5995 flatcamTools/ToolDblSided.py:120
+msgid "Mirror Axis:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:5997 flatcamTools/ToolDblSided.py:122
+msgid "Mirror vertically (X) or horizontally (Y)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6006 flatcamTools/ToolDblSided.py:131
+#, fuzzy
+#| msgid "Point:"
+msgid "Point"
+msgstr "Punto:"
+
+#: flatcamGUI/FlatCAMGUI.py:6007 flatcamTools/ToolDblSided.py:132
+msgid "Box"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6008 flatcamTools/ToolDblSided.py:133
+msgid "Axis Ref:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6010
+msgid ""
+"The axis should pass through a <b>point</b> or cut\n"
+" a specified <b>box</b> (in a Geometry object) in \n"
+"the middle."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6026
+msgid "Paint Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6033 flatcamGUI/ObjectUI.py:1305
+msgid ""
+"Creates tool paths to cover the\n"
+"whole area of a polygon (remove\n"
+"all copper). You will be asked\n"
+"to click on the desired polygon."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6057
+msgid ""
+"How much (fraction) of the tool\n"
+"width to overlap each tool pass."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6111 flatcamTools/ToolPaint.py:237
+msgid "Selection:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6113
+msgid "How to select the polygons to paint."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6117 flatcamTools/ToolPaint.py:247
+#, fuzzy
+#| msgid "Angle:"
+msgid "Single"
+msgstr "Ángulo:"
+
+#: flatcamGUI/FlatCAMGUI.py:6131
+msgid "Film Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6136
+msgid ""
+"Create a PCB film from a Gerber or Geometry\n"
+"FlatCAM object.\n"
+"The file is saved in SVG format."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6147 flatcamTools/ToolFilm.py:116
+msgid "Film Type:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6149 flatcamTools/ToolFilm.py:118
+msgid ""
+"Generate a Positive black film or a Negative film.\n"
+"Positive means that it will print the features\n"
+"with black on a white canvas.\n"
+"Negative means that it will print the features\n"
+"with white on a black canvas.\n"
+"The Film format is SVG."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6160 flatcamTools/ToolFilm.py:130
+msgid "Border:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6162 flatcamTools/ToolFilm.py:132
+msgid ""
+"Specify a border around the object.\n"
+"Only for negative film.\n"
+"It helps if we use as a Box Object the same \n"
+"object as in Film Object. It will create a thick\n"
+"black bar around the actual print allowing for a\n"
+"better delimitation of the outline features which are of\n"
+"white color like the rest and which may confound with the\n"
+"surroundings if not for this border."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6175 flatcamTools/ToolFilm.py:144
+msgid "Scale Stroke:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6177 flatcamTools/ToolFilm.py:146
+msgid ""
+"Scale the line stroke thickness of each feature in the SVG file.\n"
+"It means that the line that envelope each SVG feature will be thicker or "
+"thinner,\n"
+"therefore the fine features may be more affected by this parameter."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6192
+msgid "Panelize Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6197
+msgid ""
+"Create an object that contains an array of (x, y) elements,\n"
+"each element is a copy of the source object spaced\n"
+"at a X distance, Y distance of each other."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6208 flatcamTools/ToolPanelize.py:147
+msgid "Spacing cols:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6210 flatcamTools/ToolPanelize.py:149
+msgid ""
+"Spacing between columns of the desired panel.\n"
+"In current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6218 flatcamTools/ToolPanelize.py:156
+msgid "Spacing rows:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6220 flatcamTools/ToolPanelize.py:158
+msgid ""
+"Spacing between rows of the desired panel.\n"
+"In current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6228 flatcamTools/ToolPanelize.py:165
+msgid "Columns:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6230 flatcamTools/ToolPanelize.py:167
+msgid "Number of columns of the desired panel"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6237 flatcamTools/ToolPanelize.py:173
+msgid "Rows:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6239 flatcamTools/ToolPanelize.py:175
+msgid "Number of rows of the desired panel"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6245 flatcamTools/ToolPanelize.py:181
+#, fuzzy
+#| msgid "Gerber\tB"
+msgid "Gerber"
+msgstr "Gerber\tB"
+
+#: flatcamGUI/FlatCAMGUI.py:6246 flatcamTools/ToolPanelize.py:182
+msgid "Geo"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6247
+msgid "Panel Type:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6249
+msgid ""
+"Choose the type of object for the panel object:\n"
+"- Gerber\n"
+"- Geometry"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6258
+msgid "Constrain within:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6260 flatcamTools/ToolPanelize.py:195
+msgid ""
+"Area define by DX and DY within to constrain the panel.\n"
+"DX and DY values are in current units.\n"
+"Regardless of how many columns and rows are desired,\n"
+"the final panel will have as many columns and rows as\n"
+"they fit completely within selected area."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6269 flatcamTools/ToolPanelize.py:204
+msgid "Width (DX):"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6271 flatcamTools/ToolPanelize.py:206
+msgid ""
+"The width (DX) within which the panel must fit.\n"
+"In current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6278 flatcamTools/ToolPanelize.py:212
+msgid "Height (DY):"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6280 flatcamTools/ToolPanelize.py:214
+msgid ""
+"The height (DY)within which the panel must fit.\n"
+"In current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6294
+msgid "Calculators Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6297
+msgid "<b>V-Shape Tool Calculator:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6299
+msgid ""
+"Calculate the tool diameter for a given V-shape tool,\n"
+"having the tip diameter, tip angle and\n"
+"depth-of-cut as parameters."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6310 flatcamTools/ToolCalculators.py:92
+msgid "Tip Diameter:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6312
+msgid ""
+"This is the tool tip diameter.\n"
+"It is specified by manufacturer."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6320
+msgid "Tip angle:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6322
+msgid ""
+"This is the angle on the tip of the tool.\n"
+"It is specified by manufacturer."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6332
+msgid ""
+"This is depth to cut into material.\n"
+"In the CNCJob object it is the CutZ parameter."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6339
+msgid "<b>ElectroPlating Calculator:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6341 flatcamTools/ToolCalculators.py:148
+msgid ""
+"This calculator is useful for those who plate the via/pad/drill holes,\n"
+"using a method like grahite ink or calcium hypophosphite ink or palladium "
+"chloride."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6351 flatcamTools/ToolCalculators.py:157
+msgid "Board Length:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6353 flatcamTools/ToolCalculators.py:161
+msgid "This is the board length. In centimeters."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6359 flatcamTools/ToolCalculators.py:163
+msgid "Board Width:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6361 flatcamTools/ToolCalculators.py:167
+msgid "This is the board width.In centimeters."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6366 flatcamTools/ToolCalculators.py:169
+msgid "Current Density:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6369 flatcamTools/ToolCalculators.py:173
+msgid ""
+"Current density to pass through the board. \n"
+"In Amps per Square Feet ASF."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6375 flatcamTools/ToolCalculators.py:176
+msgid "Copper Growth:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6378 flatcamTools/ToolCalculators.py:180
+msgid ""
+"How thick the copper growth is intended to be.\n"
+"In microns."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6391
+msgid "Transform Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6396
+msgid ""
+"Various transformations that can be applied\n"
+"on a FlatCAM object."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6406
+msgid "Rotate Angle:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6408
+msgid "Angle for rotation. In degrees."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6415
+msgid "Skew_X angle:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6417
+msgid "Angle for Skew/Shear on X axis. In degrees."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6424
+msgid "Skew_Y angle:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6426
+msgid "Angle for Skew/Shear on Y axis. In degrees."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6433
+msgid "Scale_X factor:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6435
+msgid "Factor for scaling on X axis."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6442
+msgid "Scale_Y factor:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6444
+msgid "Factor for scaling on Y axis."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6452
+msgid ""
+"Scale the selected object(s)\n"
+"using the Scale_X factor for both axis."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6460 flatcamTools/ToolTransform.py:210
+msgid ""
+"Scale the selected object(s)\n"
+"using the origin reference when checked,\n"
+"and the center of the biggest bounding box\n"
+"of the selected objects when unchecked."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6469
+msgid "Offset_X val:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6471
+msgid "Distance to offset on X axis. In current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6478
+msgid "Offset_Y val:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6480
+msgid "Distance to offset on Y axis. In current units."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6486
+msgid "Mirror Reference"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6488 flatcamTools/ToolTransform.py:314
+msgid ""
+"Flip the selected object(s)\n"
+"around the point in Point Entry Field.\n"
+"\n"
+"The point coordinates can be captured by\n"
+"left click on canvas together with pressing\n"
+"SHIFT key. \n"
+"Then click Add button to insert coordinates.\n"
+"Or enter the coords in format (x, y) in the\n"
+"Point Entry field and click Flip on X(Y)"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6499
+msgid " Mirror Ref. Point:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6501 flatcamTools/ToolTransform.py:327
+msgid ""
+"Coordinates in format (x, y) used as reference for mirroring.\n"
+"The 'x' in (x, y) will be used when using Flip on X and\n"
+"the 'y' in (x, y) will be used when using Flip on Y and"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6518
+msgid "SolderPaste Tool Options"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6523
+msgid ""
+"A tool to create GCode for dispensing\n"
+"solder paste onto a PCB."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6534
+msgid "Diameters of nozzle tools, separated by ','"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6541
+msgid "<b>New Nozzle Dia:</b>"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6543 flatcamTools/ToolSolderPaste.py:103
+msgid "Diameter for the new Nozzle tool to add in the Tool Table"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6551 flatcamTools/ToolSolderPaste.py:166
+msgid "Z Dispense Start:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6553 flatcamTools/ToolSolderPaste.py:168
+msgid "The height (Z) when solder paste dispensing starts."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6560 flatcamTools/ToolSolderPaste.py:174
+msgid "Z Dispense:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6562 flatcamTools/ToolSolderPaste.py:176
+msgid "The height (Z) when doing solder paste dispensing."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6569 flatcamTools/ToolSolderPaste.py:182
+msgid "Z Dispense Stop:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6571 flatcamTools/ToolSolderPaste.py:184
+msgid "The height (Z) when solder paste dispensing stops."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6578 flatcamTools/ToolSolderPaste.py:190
+msgid "Z Travel:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6580 flatcamTools/ToolSolderPaste.py:192
+msgid ""
+"The height (Z) for travel between pads\n"
+"(without dispensing solder paste)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6588 flatcamTools/ToolSolderPaste.py:199
+msgid "Z Toolchange:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6590 flatcamTools/ToolSolderPaste.py:201
+msgid "The height (Z) for tool (nozzle) change."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6597 flatcamTools/ToolSolderPaste.py:207
+msgid "XY Toolchange:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6599 flatcamTools/ToolSolderPaste.py:209
+msgid ""
+"The X,Y location for tool (nozzle) change.\n"
+"The format is (x, y) where x and y are real numbers."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6607 flatcamTools/ToolSolderPaste.py:216
+msgid "Feedrate X-Y:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6609 flatcamTools/ToolSolderPaste.py:218
+msgid "Feedrate (speed) while moving on the X-Y plane."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6616 flatcamTools/ToolSolderPaste.py:224
+msgid "Feedrate Z:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6618 flatcamTools/ToolSolderPaste.py:226
+msgid ""
+"Feedrate (speed) while moving vertically\n"
+"(on Z plane)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6626 flatcamTools/ToolSolderPaste.py:233
+msgid "Feedrate Z Dispense:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6628
+msgid ""
+"Feedrate (speed) while moving up vertically\n"
+"to Dispense position (on Z plane)."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6636 flatcamTools/ToolSolderPaste.py:242
+msgid "Spindle Speed FWD:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6638 flatcamTools/ToolSolderPaste.py:244
+msgid ""
+"The dispenser speed while pushing solder paste\n"
+"through the dispenser nozzle."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6646 flatcamTools/ToolSolderPaste.py:251
+msgid "Dwell FWD:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6648 flatcamTools/ToolSolderPaste.py:253
+msgid "Pause after solder dispensing."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6655 flatcamTools/ToolSolderPaste.py:259
+msgid "Spindle Speed REV:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6657 flatcamTools/ToolSolderPaste.py:261
+msgid ""
+"The dispenser speed while retracting solder paste\n"
+"through the dispenser nozzle."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6665 flatcamTools/ToolSolderPaste.py:268
+msgid "Dwell REV:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6667 flatcamTools/ToolSolderPaste.py:270
+msgid ""
+"Pause after solder paste dispenser retracted,\n"
+"to allow pressure equilibrium."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6674 flatcamTools/ToolSolderPaste.py:276
+msgid "PostProcessors:"
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6676 flatcamTools/ToolSolderPaste.py:278
+msgid "Files that control the GCode generation."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6706 flatcamGUI/FlatCAMGUI.py:6712
+msgid "Idle."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6736
+msgid "Application started ..."
+msgstr ""
+
+#: flatcamGUI/FlatCAMGUI.py:6737
+msgid "Hello!"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:33
+msgid "FlatCAM Object"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:58
+msgid ""
+"BASIC is suitable for a beginner. Many parameters\n"
+"are hidden from the user in this mode.\n"
+"ADVANCED mode will make available all parameters.\n"
+"\n"
+"To change the application LEVEL, go to:\n"
+"Edit -> Preferences -> General and check:\n"
+"'APP. LEVEL' radio button."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:79
+msgid "<b>Scale:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:81
+msgid "Change the size of the object."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:89
+msgid "Factor:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:91
+msgid ""
+"Factor by which to multiply\n"
+"geometric features of this object."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:102
+msgid "Perform scaling operation."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:108
+msgid "<b>Offset:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:110
+msgid "Change the position of this object."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:117
+msgid "Vector:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:119
+msgid ""
+"Amount by which to move the object\n"
+"in the x and y axes in (x, y) format."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:129
+msgid "Perform the offset operation."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:143
+msgid "Gerber Object"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:182 flatcamGUI/ObjectUI.py:517
+#: flatcamGUI/ObjectUI.py:839 flatcamGUI/ObjectUI.py:1382
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:203
+msgid ""
+"Toggle the display of the Gerber Apertures Table.\n"
+"When unchecked, it will delete all mark shapes\n"
+"that are drawn on canvas."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:214
+msgid "Mark All"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:216
+msgid ""
+"When checked it will display all the apertures.\n"
+"When unchecked, it will delete all mark shapes\n"
+"that are drawn on canvas."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:244
+msgid "Mark the aperture instances on canvas."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:262
+msgid ""
+"Diameter of the cutting tool.\n"
+"If you want to have an isolation path\n"
+"inside the actual shape of the Gerber\n"
+"feature, use a negative value for\n"
+"this parameter."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:273
+msgid "Passes:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:307
+msgid "Combine"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:323
+msgid "<b>Generate Isolation Geometry:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:325
+msgid ""
+"Create a Geometry object with toolpaths to cut \n"
+"isolation outside, inside or on both sides of the\n"
+"object. For a Gerber object outside means outside\n"
+"of the Gerber feature and inside means inside of\n"
+"the Gerber feature, if possible at all. This means\n"
+"that only if the Gerber feature has openings inside, they\n"
+"will be isolated. If what is wanted is to cut isolation\n"
+"inside the actual Gerber feature, use a negative tool\n"
+"diameter above."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:344
+msgid "FULL Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:346
+msgid ""
+"Create the Geometry Object\n"
+"for isolation routing. It contains both\n"
+"the interiors and exteriors geometry."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:355
+msgid "Ext Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:357
+msgid ""
+"Create the Geometry Object\n"
+"for isolation routing containing\n"
+"only the exteriors geometry."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:364
+msgid "Int Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:366
+msgid ""
+"Create the Geometry Object\n"
+"for isolation routing containing\n"
+"only the interiors geometry."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:384
+msgid "<b>Clear N-copper:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:394 flatcamTools/ToolNonCopperClear.py:240
+msgid ""
+"Create the Geometry Object\n"
+"for non-copper routing."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:400
+msgid "<b>Board cutout:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:408 flatcamTools/ToolCutOut.py:314
+msgid "Cutout Tool"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:410
+msgid ""
+"Generate the geometry for\n"
+"the board cutout."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:416
+msgid "<b>Non-copper regions:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:418
+msgid ""
+"Create polygons covering the\n"
+"areas without copper on the PCB.\n"
+"Equivalent to the inverse of this\n"
+"object. Can be used to remove all\n"
+"copper from a specified region."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:443 flatcamGUI/ObjectUI.py:474
+msgid "Rounded Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:445
+msgid "Resulting geometry will have rounded corners."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:450 flatcamGUI/ObjectUI.py:484
+#: flatcamTools/ToolCutOut.py:169 flatcamTools/ToolCutOut.py:189
+#: flatcamTools/ToolCutOut.py:240 flatcamTools/ToolSolderPaste.py:127
+msgid "Generate Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:456
+msgid ""
+"Create a geometry surrounding the Gerber object.\n"
+"Square shape."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:486
+msgid "Generate the Geometry object."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:497
+msgid "Excellon Object"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:508
+msgid "Solid circles."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:536 flatcamGUI/ObjectUI.py:858
+msgid "<b>Tools Table</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:556
+msgid "Drills"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:556
+msgid "Slots"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:557
+msgid "Offset Z"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:561
+msgid ""
+"This is the Tool Number.\n"
+"When ToolChange is checked, on toolchange event this value\n"
+"will be showed as a T1, T2 ... Tn in the Machine Code."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:565 flatcamGUI/ObjectUI.py:904
+#: flatcamTools/ToolNonCopperClear.py:97 flatcamTools/ToolPaint.py:94
+msgid ""
+"Tool Diameter. It's value (in current FlatCAM units) \n"
+"is the cut width into the material."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:568
+msgid ""
+"The number of Drill holes. Holes that are drilled with\n"
+"a drill bit."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:571
+msgid ""
+"The number of Slot holes. Holes that are created by\n"
+"milling them with an endmill bit."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:578
+msgid "Toggle display of the drills for the current tool."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:586
+msgid ""
+"Create a CNC Job object\n"
+"for this drill object."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:615 flatcamGUI/ObjectUI.py:1118
+msgid "Tool change"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:623 flatcamGUI/ObjectUI.py:1111
+msgid "Tool change Z:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:625 flatcamGUI/ObjectUI.py:1114
+msgid ""
+"Z-axis position (height) for\n"
+"tool change."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:636
+msgid ""
+"Tool height just before starting the work.\n"
+"Delete the value if you don't need this feature."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:646
+msgid ""
+"Z-axis position (height) for\n"
+"the last move."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:654
+msgid "Feedrate (Plunge):"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:656
+msgid ""
+"Tool speed while drilling\n"
+"(in units per minute).\n"
+"This is for linear move G01."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:709
+msgid ""
+"The json file that dictates\n"
+"gcode output."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:741
+msgid ""
+"Select from the Tools Table above\n"
+"the tools you want to include."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:748
+msgid "<b>Type:    </b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:750
+msgid ""
+"Choose what to use for GCode generation:\n"
+"'Drills', 'Slots' or 'Both'.\n"
+"When choosing 'Slots' or 'Both', slots will be\n"
+"converted to a series of drills."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:765
+msgid "Create GCode"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:767
+msgid "Generate the CNC Job."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:779
+msgid ""
+"Select from the Tools Table above\n"
+" the hole dias that are to be milled."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:786
+msgid "Drills Tool dia:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:793
+msgid "Mill Drills Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:795
+msgid ""
+"Create the Geometry Object\n"
+"for milling DRILLS toolpaths."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:802
+msgid "Slots Tool dia:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:809
+msgid "Mill Slots Geo"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:811
+msgid ""
+"Create the Geometry Object\n"
+"for milling SLOTS toolpaths."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:829
+msgid "Geometry Object"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:860
+msgid ""
+"Tools in this Geometry object used for cutting.\n"
+"The 'Offset' entry will set an offset for the cut.\n"
+"'Offset' can be inside, outside, on path (none) and custom.\n"
+"'Type' entry is only informative and it allow to know the \n"
+"intent of using the current tool. \n"
+"It can be Rough(ing), Finish(ing) or Iso(lation).\n"
+"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n"
+"ball(B), or V-Shaped(V). \n"
+"When V-shaped is selected the 'Type' entry is automatically \n"
+"set to Isolation, the CutZ parameter in the UI form is\n"
+"grayed out and Cut Z is automatically calculated from the newly \n"
+"showed UI form entries named V-Tip Dia and V-Tip Angle."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:891 flatcamGUI/ObjectUI.py:1465
+msgid "Dia"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:891 flatcamGUI/ObjectUI.py:1465
+msgid "TT"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:898
+msgid ""
+"This is the Tool Number.\n"
+"When ToolChange is checked, on toolchange event this value\n"
+"will be showed as a T1, T2 ... Tn"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:909
+msgid ""
+"The value for the Offset can be:\n"
+"- Path -> There is no offset, the tool cut will be done through the geometry "
+"line.\n"
+"- In(side) -> The tool cut will follow the geometry inside. It will create a "
+"'pocket'.\n"
+"- Out(side) -> The tool cut will follow the geometry line on the outside."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:916
+msgid ""
+"The (Operation) Type has only informative value. Usually the UI form "
+"values \n"
+"are choosed based on the operation type and this will serve as a reminder.\n"
+"Can be 'Roughing', 'Finishing' or 'Isolation'.\n"
+"For Roughing we may choose a lower Feedrate and multiDepth cut.\n"
+"For Finishing we may choose a higher Feedrate, without multiDepth.\n"
+"For Isolation we need a lower Feedrate as it use a milling bit with a fine "
+"tip."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:925
+msgid ""
+"The Tool Type (TT) can be:\n"
+"- Circular with 1 ... 4 teeth -> it is informative only. Being circular the "
+"cut width in material\n"
+"is exactly the tool diameter.\n"
+"- Ball -> informative only and make reference to the Ball type endmill.\n"
+"- V-Shape -> it will disable de Z-Cut parameter in the UI form and enable "
+"two additional UI form\n"
+"fields: V-Tip Dia and V-Tip Angle. Adjusting those two values will adjust "
+"the Z-Cut parameter such\n"
+"as the cut width into material will be equal with the value in the Tool "
+"Diameter column of this table.\n"
+"Choosing the V-Shape Tool Type automatically will select the Operation Type "
+"as Isolation."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:936
+msgid ""
+"Plot column. It is visible only for MultiGeo geometries, meaning geometries "
+"that holds the geometry\n"
+"data into the tools. For those geometries, deleting the tool will delete the "
+"geometry data also,\n"
+"so be WARNED. From the checkboxes on each row it can be enabled/disabled the "
+"plot on canvas\n"
+"for the corresponding tool."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:949
+msgid "Tool Offset:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:952
+msgid ""
+"The value to offset the cut when \n"
+"the Offset type selected is 'Offset'.\n"
+"The value can be positive for 'outside'\n"
+"cut and negative for 'inside' cut."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:975
+msgid "<b>Tool Dia:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:994 flatcamTools/ToolNonCopperClear.py:136
+#: flatcamTools/ToolPaint.py:133
+msgid ""
+"Add a new tool to the Tool Table\n"
+"with the diameter specified above."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1002
+msgid ""
+"Copy a selection of tools in the Tool Table\n"
+"by first selecting a row in the Tool Table."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1010
+msgid ""
+"Delete a selection of tools in the Tool Table\n"
+"by first selecting a row in the Tool Table."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1026
+msgid "<b>Tool Data</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1029
+msgid ""
+"The data used for creating GCode.\n"
+"Each tool store it's own set of such data."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1039
+msgid "V-Tip Dia:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1042
+msgid "The tip diameter for V-Shape Tool"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1050
+msgid "V-Tip Angle:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1053
+msgid ""
+"The tip angle for V-Shape Tool.\n"
+"In degree."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1074
+msgid "Multi-Depth:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1077
+msgid ""
+"Use multiple passes to limit\n"
+"the cut depth in each pass. Will\n"
+"cut multiple times until Cut Z is\n"
+"reached.\n"
+"To the right, input the depth of \n"
+"each pass (positive value)."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1090
+msgid "Depth of each pass (positive)."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1121
+msgid ""
+"Include tool-change sequence\n"
+"in the Machine Code (Pause for tool change)."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1147
+msgid ""
+"This is the height (Z) at which the CNC\n"
+"will go as the last move."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1168
+msgid "Feed Rate Z (Plunge):"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1171
+msgid ""
+"Cutting speed in the Z\n"
+"plane in units per minute"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1180
+msgid "Feed Rate Rapids:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1183
+msgid ""
+"Cutting speed in the XY\n"
+"plane in units per minute\n"
+"(in units per minute).\n"
+"This is for the rapid move G00.\n"
+"It is useful only for Marlin,\n"
+"ignore for any other cases."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1199
+msgid "Cut over 1st pt"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1214
+msgid ""
+"Speed of the spindle in RPM (optional).\n"
+"If LASER postprocessor is used,\n"
+"this value is the power of laser."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1243
+msgid "PostProcessor:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1246
+msgid ""
+"The Postprocessor file that dictates\n"
+"the Machine Code (like GCode, RML, HPGL) output."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1284
+msgid ""
+"Add at least one tool in the tool-table.\n"
+"Click the header to select all, or Ctrl + LMB\n"
+"for custom selection of tools."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1291
+msgid "Generate"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1294
+msgid "Generate the CNC Job object."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1302
+msgid "<b>Paint Area:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1317
+msgid "Launch Paint Tool in Tools Tab."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1334
+msgid "CNC Job Object"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1353
+msgid "<b>Plot kind:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1369
+msgid "<b>Display Annotation:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1388
+msgid "<b>Travelled dist.:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1391 flatcamGUI/ObjectUI.py:1398
+msgid ""
+"This is the total travelled distance on X-Y plane.\n"
+"In current units."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1429
+msgid "<b>CNC Tools Table</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1432
+msgid ""
+"Tools in this CNCJob object used for cutting.\n"
+"The tool diameter is used for plotting on canvas.\n"
+"The 'Offset' entry will set an offset for the cut.\n"
+"'Offset' can be inside, outside, on path (none) and custom.\n"
+"'Type' entry is only informative and it allow to know the \n"
+"intent of using the current tool. \n"
+"It can be Rough(ing), Finish(ing) or Iso(lation).\n"
+"The 'Tool type'(TT) can be circular with 1 to 4 teeths(C1..C4),\n"
+"ball(B), or V-Shaped(V)."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1466
+msgid "P"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1472
+msgid "Update Plot"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1474
+msgid "Update the plot."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1481
+msgid "<b>Export CNC Code:</b>"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1489
+msgid "Prepend to CNC Code:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1492
+msgid ""
+"Type here any G-Code commands you would\n"
+"like to add to the beginning of the generated file."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1502
+msgid "Append to CNC Code:"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1526
+msgid ""
+"Type here any G-Code commands you would\n"
+"like to be executed when Toolchange event is encountered.\n"
+"This will constitute a Custom Toolchange GCode,\n"
+"or a Toolchange Macro.\n"
+"The FlatCAM variables are surrounded by '%' symbol.\n"
+"\n"
+"WARNING: it can be used only with a postprocessor file\n"
+"that has 'toolchange_custom' in it's name and this is built\n"
+"having as template the 'Toolchange Custom' posprocessor file."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1574
+msgid "z_cut = depth where to cut"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1575
+msgid "z_move = height where to travel"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1593
+msgid "View CNC Code"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1596
+msgid ""
+"Opens TAB to view/modify/print G-Code\n"
+"file."
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1602
+msgid "Save CNC Code"
+msgstr ""
+
+#: flatcamGUI/ObjectUI.py:1605
+msgid ""
+"Opens dialog to save G-Code\n"
+"file."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:24
+msgid "Calculators"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:25
+msgid "V-Shape Tool Calculator"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:26
+msgid "Units Calculator"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:27
+msgid "ElectroPlating Calculator"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:68
+msgid "Here you enter the value to be converted from INCH to MM"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:73
+msgid "Here you enter the value to be converted from MM to INCH"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:96
+msgid ""
+"This is the diameter of the tool tip.\n"
+"The manufacturer specifies it."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:99
+msgid "Tip Angle:"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:103
+msgid ""
+"This is the angle of the tip of the tool.\n"
+"It is specified by manufacturer."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:110
+msgid ""
+"This is the depth to cut into the material.\n"
+"In the CNCJob is the CutZ parameter."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:113
+msgid "Tool Diameter:"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:117
+msgid ""
+"This is the tool diameter to be entered into\n"
+"FlatCAM Gerber section.\n"
+"In the CNCJob section it is called >Tool dia<."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:128 flatcamTools/ToolCalculators.py:209
+msgid "Calculate"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:131
+msgid ""
+"Calculate either the Cut Z or the effective tool diameter,\n"
+"  depending on which is desired and which is known. "
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:185
+msgid "Current Value:"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:189
+msgid ""
+"This is the current intensity value\n"
+"to be set on the Power Supply. In Amps."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:193
+msgid "Time:"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:197
+msgid ""
+"This is the calculated time required for the procedure.\n"
+"In minutes."
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:212
+msgid ""
+"Calculate the current intensity value and the procedure time,\n"
+"depending on the parameters above"
+msgstr ""
+
+#: flatcamTools/ToolCalculators.py:256
+#, fuzzy
+#| msgid "Paint Tool"
+msgid "Calc. Tool"
+msgstr "Herramienta de pintura"
+
+#: flatcamTools/ToolCutOut.py:18
+msgid "Cutout PCB"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:54
+msgid "Obj Type:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:56
+msgid ""
+"Specify the type of object to be cutout.\n"
+"It can be of type: Gerber or Geometry.\n"
+"What is selected here will dictate the kind\n"
+"of objects that will populate the 'Object' combobox."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:70 flatcamTools/ToolPanelize.py:71
+msgid "Object:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:72
+msgid "Object to be cutout.                        "
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:80
+msgid ""
+"Diameter of the tool used to cutout\n"
+"the PCB shape out of the surrounding material."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:89
+msgid ""
+"Margin over bounds. A positive value here\n"
+"will make the cutout of the PCB further from\n"
+"the actual PCB border"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:99
+msgid ""
+"The size of the bridge gaps in the cutout\n"
+"used to keep the board connected to\n"
+"the surrounding material (the one \n"
+"from which the PCB is cutout)."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:118
+msgid ""
+"Create a convex shape surrounding the entire PCB.\n"
+"Used only if the source object type is Gerber."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:124
+msgid "A. Automatic Bridge Gaps"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:126
+msgid "This section handle creation of automatic bridge gaps."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:137
+msgid ""
+"Number of gaps used for the Automatic cutout.\n"
+"There can be maximum 8 bridges/gaps.\n"
+"The choices are:\n"
+"- lr    - left + right\n"
+"- tb    - top + bottom\n"
+"- 4     - left + right +top + bottom\n"
+"- 2lr   - 2*left + 2*right\n"
+"- 2tb  - 2*top + 2*bottom\n"
+"- 8     - 2*left + 2*right +2*top + 2*bottom"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:160
+msgid "FreeForm:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:162
+msgid ""
+"The cutout shape can be of ny shape.\n"
+"Useful when the PCB has a non-rectangular shape."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:171
+msgid ""
+"Cutout the selected object.\n"
+"The cutout shape can be of any shape.\n"
+"Useful when the PCB has a non-rectangular shape."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:180
+msgid "Rectangular:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:182
+msgid ""
+"The resulting cutout shape is\n"
+"always a rectangle shape and it will be\n"
+"the bounding box of the Object."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:191
+msgid ""
+"Cutout the selected object.\n"
+"The resulting cutout shape is\n"
+"always a rectangle shape and it will be\n"
+"the bounding box of the Object."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:199
+msgid "B. Manual Bridge Gaps"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:201
+msgid ""
+"This section handle creation of manual bridge gaps.\n"
+"This is done by mouse clicking on the perimeter of the\n"
+"Geometry object that is used as a cutout object. "
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:217
+msgid "Geo Obj:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:219
+msgid "Geometry object used to create the manual cutout."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:230
+msgid "Manual Geo:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:232 flatcamTools/ToolCutOut.py:242
+msgid ""
+"If the object to be cutout is a Gerber\n"
+"first create a Geometry that surrounds it,\n"
+"to be used as the cutout, if one doesn't exist yet.\n"
+"Select the source Gerber file in the top object combobox."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:252
+msgid "Manual Add Bridge Gaps:"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:254
+msgid ""
+"Use the left mouse button (LMB) click\n"
+"to create a bridge gap to separate the PCB from\n"
+"the surrounding material."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:261
+msgid "Generate Gap"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:263
+msgid ""
+"Use the left mouse button (LMB) click\n"
+"to create a bridge gap to separate the PCB from\n"
+"the surrounding material.\n"
+"The LMB click has to be done on the perimeter of\n"
+"the Geometry object used as a cutout geometry."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:342 flatcamTools/ToolCutOut.py:512
+#: flatcamTools/ToolNonCopperClear.py:669 flatcamTools/ToolPaint.py:768
+#: flatcamTools/ToolPanelize.py:352 flatcamTools/ToolPanelize.py:366
+#: flatcamTools/ToolSub.py:239 flatcamTools/ToolSub.py:252
+#: flatcamTools/ToolSub.py:432 flatcamTools/ToolSub.py:445
+#, python-format
+msgid "[ERROR_NOTCL] Could not retrieve object: %s"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:346
+msgid ""
+"[ERROR_NOTCL] There is no object selected for Cutout.\n"
+"Select one and try again."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:361
+msgid ""
+"[WARNING_NOTCL] Tool Diameter is zero value. Change it to a positive real "
+"number."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:371 flatcamTools/ToolCutOut.py:540
+#: flatcamTools/ToolCutOut.py:785
+msgid ""
+"[WARNING_NOTCL] Margin value is missing or wrong format. Add it and retry."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:382 flatcamTools/ToolCutOut.py:551
+#: flatcamTools/ToolCutOut.py:680
+msgid ""
+"[WARNING_NOTCL] Gap size value is missing or wrong format. Add it and retry."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:389 flatcamTools/ToolCutOut.py:558
+msgid "[WARNING_NOTCL] Number of gaps value is missing. Add it and retry."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:393 flatcamTools/ToolCutOut.py:562
+msgid ""
+"[WARNING_NOTCL] Gaps value can be only one of: 'lr', 'tb', '2lr', '2tb', 4 "
+"or 8. Fill in a correct value and retry. "
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:398 flatcamTools/ToolCutOut.py:567
+msgid ""
+"[ERROR]Cutout operation cannot be done on a multi-geo Geometry.\n"
+"Optionally, this Multi-geo Geometry can be converted to Single-geo "
+"Geometry,\n"
+"and after that perform Cutout."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:496 flatcamTools/ToolCutOut.py:650
+msgid "[success] Any form CutOut operation finished."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:516 flatcamTools/ToolPaint.py:772
+#: flatcamTools/ToolPanelize.py:358
+#, python-format
+msgid "[ERROR_NOTCL] Object not found: %s"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:530 flatcamTools/ToolCutOut.py:670
+#: flatcamTools/ToolCutOut.py:775
+msgid ""
+"[ERROR_NOTCL] Tool Diameter is zero value. Change it to a positive real "
+"number."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:655
+msgid ""
+"Click on the selected geometry object perimeter to create a bridge gap ..."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:696
+msgid "Making manual bridge gap..."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:719
+#, python-format
+msgid "[ERROR_NOTCL] Could not retrieve Geometry object: %s"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:723
+#, python-format
+msgid "[ERROR_NOTCL] Geometry object for manual cutout not found: %s"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:733
+msgid "[success] Added manual Bridge Gap."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:750
+#, python-format
+msgid "[ERROR_NOTCL] Could not retrieve Gerber object: %s"
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:754
+msgid ""
+"[ERROR_NOTCL] There is no Gerber object selected for Cutout.\n"
+"Select one and try again."
+msgstr ""
+
+#: flatcamTools/ToolCutOut.py:759
+msgid ""
+"[ERROR_NOTCL] The selected object has to be of Gerber type.\n"
+"Select a Gerber file and try again."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:18
+msgid "2-Sided PCB"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:47
+msgid "<b>GERBER:</b>"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:52 flatcamTools/ToolDblSided.py:76
+#: flatcamTools/ToolDblSided.py:100
+msgid "Mirror"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:54 flatcamTools/ToolDblSided.py:78
+#: flatcamTools/ToolDblSided.py:102
+msgid ""
+"Mirrors (flips) the specified object around \n"
+"the specified axis. Does not create a new \n"
+"object, but modifies it."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:71
+msgid "<b>EXCELLON:</b>"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:73
+msgid "Excellon Object to be mirrored."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:95
+msgid "<b>GEOMETRY</b>:"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:97
+msgid "Geometry Obj to be mirrored."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:135
+msgid ""
+"The axis should pass through a <b>point</b> or cut\n"
+" a specified <b>box</b> (in a FlatCAM object) through \n"
+"the center."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:152
+msgid "Point/Box Reference:"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:154
+msgid ""
+"If 'Point' is selected above it store the coordinates (x, y) through which\n"
+"the mirroring axis passes.\n"
+"If 'Box' is selected above, select here a FlatCAM object (Gerber, Exc or "
+"Geo).\n"
+"Through the center of this object pass the mirroring axis selected above."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:162
+msgid ""
+"Add the coordinates in format <b>(x, y)</b> through which the mirroring "
+"axis \n"
+" selected in 'MIRROR AXIS' pass.\n"
+"The (x, y) coordinates are captured by pressing SHIFT key\n"
+"and left mouse button click on canvas or you can enter the coords manually."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:182
+msgid "Gerber   Reference Box Object"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:183
+msgid "Excellon Reference Box Object"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:184
+msgid "Geometry Reference Box Object"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:192
+msgid "Alignment Drill Coordinates:"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:194
+msgid ""
+"Alignment holes (x1, y1), (x2, y2), ... on one side of the mirror axis. For "
+"each set of (x, y) coordinates\n"
+"entered here, a pair of drills will be created:\n"
+"\n"
+"- one drill at the coordinates from the field\n"
+"- one drill in mirror position over the axis selected above in the 'Mirror "
+"Axis'."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:209
+msgid ""
+"Add alignment drill holes coords in the format: (x1, y1), (x2, y2), ... \n"
+"on one side of the mirror axis.\n"
+"\n"
+"The coordinates set can be obtained:\n"
+"- press SHIFT key and left mouse clicking on canvas. Then click Add.\n"
+"- press SHIFT key and left mouse clicking on canvas. Then CTRL+V in the "
+"field.\n"
+"- press SHIFT key and left mouse clicking on canvas. Then RMB click in the "
+"field and click Paste.\n"
+"- by entering the coords manually in the format: (x1, y1), (x2, y2), ..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:223
+msgid "Alignment Drill Diameter"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:246
+msgid "Create Excellon Object"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:248
+msgid ""
+"Creates an Excellon Object containing the\n"
+"specified alignment holes and their mirror\n"
+"images."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:254
+msgid "Reset"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:256
+msgid "Resets all the fields."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:301
+msgid "2-Sided Tool"
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:326
+msgid ""
+"[WARNING_NOTCL] 'Point' reference is selected and 'Point' coordinates are "
+"missing. Add them and retry."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:345
+msgid ""
+"[WARNING_NOTCL] There is no Box reference object loaded. Load one and retry."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:367
+msgid ""
+"[WARNING_NOTCL] No value or wrong format in Drill Dia entry. Add it and "
+"retry."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:374
+msgid ""
+"[WARNING_NOTCL] There are no Alignment Drill Coordinates to use. Add them "
+"and retry."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:397
+msgid "[success] Excellon object with alignment drills created..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:406
+msgid "[WARNING_NOTCL] There is no Gerber object loaded ..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:410 flatcamTools/ToolDblSided.py:453
+#: flatcamTools/ToolDblSided.py:497
+msgid ""
+"[ERROR_NOTCL] Only Gerber, Excellon and Geometry objects can be mirrored."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:420
+msgid ""
+"[WARNING_NOTCL] 'Point' coordinates missing. Using Origin (0, 0) as "
+"mirroring reference."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:430 flatcamTools/ToolDblSided.py:474
+#: flatcamTools/ToolDblSided.py:511
+msgid "[WARNING_NOTCL] There is no Box object loaded ..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:440
+#, python-format
+msgid "[success] Gerber %s was mirrored..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:449
+msgid "[WARNING_NOTCL] There is no Excellon object loaded ..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:464
+msgid ""
+"[WARNING_NOTCL] There are no Point coordinates in the Point field. Add "
+"coords and try again ..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:484
+#, python-format
+msgid "[success] Excellon %s was mirrored..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:493
+msgid "[WARNING_NOTCL] There is no Geometry object loaded ..."
+msgstr ""
+
+#: flatcamTools/ToolDblSided.py:521
+#, python-format
+msgid "[success] Geometry %s was mirrored..."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:25
+msgid "Film PCB"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:56 flatcamTools/ToolImage.py:53
+#: flatcamTools/ToolPanelize.py:56
+msgid "Object Type:"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:58
+msgid ""
+"Specify the type of object for which to create the film.\n"
+"The object can be of type: Gerber or Geometry.\n"
+"The selection here decide the type of objects that will be\n"
+"in the Film Object combobox."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:71
+msgid "Film Object:"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:73
+msgid "Object for which to create the film."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:89 flatcamTools/ToolPanelize.py:111
+msgid "Box Type:"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:91
+msgid ""
+"Specify the type of object to be used as an container for\n"
+"film creation. It can be: Gerber or Geometry type.The selection here decide "
+"the type of objects that will be\n"
+"in the Box Object combobox."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:104 flatcamTools/ToolPanelize.py:126
+msgid "Box Object:"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:106
+msgid ""
+"The actual object that is used a container for the\n"
+" selected object for which we create the film.\n"
+"Usually it is the PCB outline but it can be also the\n"
+"same object for which the film is created."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:114
+msgid "Positive"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:115
+msgid "Negative"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:157
+msgid "Save Film"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:159
+msgid ""
+"Create a Film for the selected object, within\n"
+"the specified box. Does not create a new \n"
+" FlatCAM object, but directly save it in SVG format\n"
+"which can be opened with Inkscape."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:225
+msgid ""
+"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Film and retry."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:231
+msgid ""
+"[ERROR_NOTCL] No FlatCAM object selected. Load an object for Box and retry."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:255
+msgid "Generating Film ..."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:260 flatcamTools/ToolFilm.py:264
+msgid "Export SVG positive"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:269
+msgid "[WARNING_NOTCL] Export SVG positive cancelled."
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:276 flatcamTools/ToolFilm.py:280
+msgid "Export SVG negative"
+msgstr ""
+
+#: flatcamTools/ToolFilm.py:285
+msgid "[WARNING_NOTCL] Export SVG negative cancelled."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:25
+msgid "Image as Object"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:31
+msgid "Image to PCB"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:55
+msgid ""
+"Specify the type of object to create from the image.\n"
+"It can be of type: Gerber or Geometry."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:63
+msgid "DPI value:"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:65
+msgid "Specify a DPI value for the image."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:72
+msgid "Level of detail"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:81
+msgid "Image type"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:83
+msgid ""
+"Choose a method for the image interpretation.\n"
+"B/W means a black & white image. Color means a colored image."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:90 flatcamTools/ToolImage.py:103
+#: flatcamTools/ToolImage.py:114 flatcamTools/ToolImage.py:125
+msgid "Mask value"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:92
+msgid ""
+"Mask for monochrome image.\n"
+"Takes values between [0 ... 255].\n"
+"Decides the level of details to include\n"
+"in the resulting geometry.\n"
+"0 means no detail and 255 means everything \n"
+"(which is totally black)."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:105
+msgid ""
+"Mask for RED color.\n"
+"Takes values between [0 ... 255].\n"
+"Decides the level of details to include\n"
+"in the resulting geometry."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:116
+msgid ""
+"Mask for GREEN color.\n"
+"Takes values between [0 ... 255].\n"
+"Decides the level of details to include\n"
+"in the resulting geometry."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:127
+msgid ""
+"Mask for BLUE color.\n"
+"Takes values between [0 ... 255].\n"
+"Decides the level of details to include\n"
+"in the resulting geometry."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:139
+msgid "Import image"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:141
+msgid "Open a image of raster type and then import it in FlatCAM."
+msgstr ""
+
+#: flatcamTools/ToolImage.py:170
+msgid "Image Tool"
+msgstr ""
+
+#: flatcamTools/ToolImage.py:200 flatcamTools/ToolImage.py:203
+msgid "Import IMAGE"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:26
+msgid "Measurement"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:43
+msgid "Units:"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:44
+msgid "Those are the units in which the distance is measured."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:45
+msgid "METRIC (mm)"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:45
+msgid "INCH (in)"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:48
+msgid "Start"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:48 flatcamTools/ToolMeasurement.py:51
+msgid "Coords"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:49 flatcamTools/ToolMeasurement.py:65
+msgid "This is measuring Start point coordinates."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:51
+msgid "Stop"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:52 flatcamTools/ToolMeasurement.py:69
+msgid "This is the measuring Stop point coordinates."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:54
+msgid "Dx:"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:55 flatcamTools/ToolMeasurement.py:73
+msgid "This is the distance measured over the X axis."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:57
+msgid "Dy:"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:58 flatcamTools/ToolMeasurement.py:77
+msgid "This is the distance measured over the Y axis."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:60
+msgid "DISTANCE"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:61 flatcamTools/ToolMeasurement.py:81
+msgid "This is the point to point Euclidian distance."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:83
+msgid "Measure"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:131
+msgid "Meas. Tool"
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:176
+msgid "MEASURING: Click on the Start point ..."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:269
+msgid "MEASURING: Click on the Destination point ..."
+msgstr ""
+
+#: flatcamTools/ToolMeasurement.py:277
+#, python-brace-format
+msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}"
+msgstr ""
+
+#: flatcamTools/ToolMove.py:81
+msgid "MOVE: Click on the Start point ..."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:88
+msgid "[WARNING_NOTCL] MOVE action cancelled. No object(s) to move."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:110
+msgid "MOVE: Click on the Destination point ..."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:128
+msgid "Moving ..."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:135
+msgid "[WARNING_NOTCL] No object(s) selected."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:158
+#, python-format
+msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> %s"
+msgstr ""
+
+#: flatcamTools/ToolMove.py:164
+#, python-format
+msgid "[success] %s object was moved ..."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:174
+msgid "[ERROR_NOTCL] ToolMove.on_left_click() --> Error when mouse left click."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:202
+msgid "[WARNING_NOTCL] Move action cancelled."
+msgstr ""
+
+#: flatcamTools/ToolMove.py:214
+msgid "[WARNING_NOTCL] Object(s) not selected"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:26
+msgid "Non-Copper Clearing"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:64
+msgid "Gerber object to be cleared of excess copper.                        "
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:74
+msgid ""
+"Tools pool from which the algorithm\n"
+"will pick the ones used for copper clearing."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:89
+msgid ""
+"This is the Tool Number.\n"
+"Non copper clearing will start with the tool with the biggest \n"
+"diameter, continuing until there are no more tools.\n"
+"Only tools that create NCC clearing geometry will still be present\n"
+"in the resulting geometry. This is because with some tools\n"
+"this function will not be able to create painting geometry."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:101 flatcamTools/ToolPaint.py:98
+msgid ""
+"The Tool Type (TT) can be:<BR>- <B>Circular</B> with 1 ... 4 teeth -> it is "
+"informative only. Being circular, <BR>the cut width in material is exactly "
+"the tool diameter.<BR>- <B>Ball</B> -> informative only and make reference "
+"to the Ball type endmill.<BR>- <B>V-Shape</B> -> it will disable de Z-Cut "
+"parameter in the resulting geometry UI form and enable two additional UI "
+"form fields in the resulting geometry: V-Tip Dia and V-Tip Angle. Adjusting "
+"those two values will adjust the Z-Cut parameter such as the cut width into "
+"material will be equal with the value in the Tool Diameter column of this "
+"table.<BR>Choosing the <B>V-Shape</B> Tool Type automatically will select "
+"the Operation Type in the resulting geometry as Isolation."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:120 flatcamTools/ToolPaint.py:117
+msgid "Tool Dia"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:122
+msgid "Diameter for the new tool to add in the Tool Table"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:148 flatcamTools/ToolPaint.py:145
+#: flatcamTools/ToolSolderPaste.py:123
+msgid ""
+"Delete a selection of tools in the Tool Table\n"
+"by first selecting a row(s) in the Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:226
+msgid ""
+"If checked, use 'rest machining'.\n"
+"Basically it will clear copper outside PCB features,\n"
+"using the biggest tool and continue with the next tools,\n"
+"from bigger to smaller, to clear areas of copper that\n"
+"could not be cleared by previous tool, until there is\n"
+"no more copper to clear or there are no more tools.\n"
+"If not checked, use the standard algorithm."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:238
+msgid "Generate Geometry"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:486 flatcamTools/ToolPaint.py:543
+#: flatcamTools/ToolSolderPaste.py:759
+msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:515 flatcamTools/ToolPaint.py:567
+msgid "[WARNING_NOTCL] Adding tool cancelled. Tool already in Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:520 flatcamTools/ToolPaint.py:572
+msgid "[success] New tool added to Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:562 flatcamTools/ToolPaint.py:617
+msgid "[success] Tool from Tool Table was edited."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:573 flatcamTools/ToolPaint.py:628
+#: flatcamTools/ToolSolderPaste.py:846
+msgid ""
+"[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool "
+"Table."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:613 flatcamTools/ToolPaint.py:727
+msgid "[WARNING_NOTCL] Delete failed. Select a tool to delete."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:618 flatcamTools/ToolPaint.py:732
+msgid "[success] Tool(s) deleted from Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:636 flatcamTools/ToolPaint.py:751
+msgid ""
+"[ERROR_NOTCL] Overlap value must be between 0 (inclusive) and 1 (exclusive), "
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:677
+msgid "[ERROR_NOTCL] No Gerber file available."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:715
+#: flatcamTools/ToolNonCopperClear.py:837
+msgid "Clearing Non-Copper areas."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:733
+#, python-format
+msgid "[success] Non-Copper Clearing with ToolDia = %s started."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:802
+#, python-format
+msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:807
+msgid "[success] NCC Tool finished."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:809
+msgid ""
+"[WARNING_NOTCL] NCC Tool finished but some PCB features could not be "
+"cleared. Check the result."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:855
+#, python-format
+msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started."
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:953
+#, python-format
+msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s"
+msgstr ""
+
+#: flatcamTools/ToolNonCopperClear.py:961
+msgid ""
+"[ERROR_NOTCL] NCC Tool finished but could not clear the object with current "
+"settings."
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:38
+msgid "PDF Import Tool"
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:152 flatcamTools/ToolPDF.py:156
+msgid "Open PDF"
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:159
+msgid "[WARNING_NOTCL] Open PDF cancelled."
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:186
+msgid "Parsing PDF file ..."
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:265 flatcamTools/ToolPDF.py:338
+#, python-format
+msgid "Rendering PDF layer #%d ..."
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:269 flatcamTools/ToolPDF.py:342
+msgid "[ERROR_NOTCL] Open PDF file failed."
+msgstr ""
+
+#: flatcamTools/ToolPDF.py:274 flatcamTools/ToolPDF.py:347
+#, python-format
+msgid "[success] Rendered: %s"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:24
+msgid "Paint Area"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:60
+msgid "Geometry:"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:62
+msgid "Geometry object to be painted.                        "
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:71
+msgid ""
+"Tools pool from which the algorithm\n"
+"will pick the ones used for painting."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:86
+msgid ""
+"This is the Tool Number.\n"
+"Painting will start with the tool with the biggest diameter,\n"
+"continuing until there are no more tools.\n"
+"Only tools that create painting geometry will still be present\n"
+"in the resulting geometry. This is because with some tools\n"
+"this function will not be able to create painting geometry."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:119
+msgid "Diameter for the new tool."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:224
+msgid ""
+"If checked, use 'rest machining'.\n"
+"Basically it will clear copper outside PCB features,\n"
+"using the biggest tool and continue with the next tools,\n"
+"from bigger to smaller, to clear areas of copper that\n"
+"could not be cleared by previous tool, until there is\n"
+"no more copper to clear or there are no more tools.\n"
+"\n"
+"If not checked, use the standard algorithm."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:239
+msgid ""
+"How to select the polygons to paint.<BR>Options:<BR>- <B>Single</B>: left "
+"mouse click on the polygon to be painted.<BR>- <B>All</B>: paint all "
+"polygons."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:254
+msgid "Create Paint Geometry"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:256
+msgid ""
+"After clicking here, click inside<BR>the polygon you wish to be painted if "
+"<B>Single</B> is selected.<BR>If <B>All</B>  is selected then the Paint will "
+"start after click.<BR>A new Geometry object with the tool<BR>paths will be "
+"created."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:736
+msgid "geometry_on_paint_button"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:755 flatcamTools/ToolPaint.py:791
+msgid "[WARNING_NOTCL] Click inside the desired polygon."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:778
+msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:800 flatcamTools/ToolPaint.py:1004
+msgid "Painting polygon..."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:853
+msgid "[WARNING] No polygon found."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:856
+msgid "Painting polygon."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:898
+msgid "[ERROR_NOTCL] Geometry could not be painted completely"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:924
+#, python-format
+msgid ""
+"[ERROR] Could not do Paint. Try a different combination of parameters. Or a "
+"different strategy of paint\n"
+"%s"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:966
+#, python-format
+msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:972 flatcamTools/ToolPaint.py:1271
+msgid "Polygon Paint started ..."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:1125 flatcamTools/ToolPaint.py:1216
+#, python-format
+msgid ""
+"[ERROR] Could not do Paint All. Try a different combination of parameters. "
+"Or a different Method of paint\n"
+"%s"
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:1149
+msgid ""
+"[ERROR] There is no Painting Geometry in the file.\n"
+"Usually it means that the tool diameter is too big for the painted "
+"geometry.\n"
+"Change the painting parameters and try again."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:1158
+msgid "[success] Paint All Done."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:1246
+msgid ""
+"[ERROR_NOTCL] There is no Painting Geometry in the file.\n"
+"Usually it means that the tool diameter is too big for the painted "
+"geometry.\n"
+"Change the painting parameters and try again."
+msgstr ""
+
+#: flatcamTools/ToolPaint.py:1255
+msgid "[success] Paint All with Rest-Machining done."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:25
+msgid "Panelize PCB"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:58
+msgid ""
+"Specify the type of object to be panelized\n"
+"It can be of type: Gerber, Excellon or Geometry.\n"
+"The selection here decide the type of objects that will be\n"
+"in the Object combobox."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:73
+msgid ""
+"Object to be panelized. This means that it will\n"
+"be duplicated in an array of rows and columns."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:84
+msgid "Object"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:85
+msgid "Bounding Box"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:86
+msgid "<b>Penelization Reference:</b>"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:88
+msgid ""
+"Choose the reference for panelization:\n"
+"- Object = the bounding box of a different object\n"
+"- Bounding Box = the bounding box of the object to be panelized\n"
+"\n"
+"The reference is useful when doing panelization for more than one\n"
+"object. The spacings (really offsets) will be applied in reference\n"
+"to this reference object therefore maintaining the panelized\n"
+"objects in sync."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:113
+msgid ""
+"Specify the type of object to be used as an container for\n"
+"panelization. It can be: Gerber or Geometry type.\n"
+"The selection here decide the type of objects that will be\n"
+"in the Box Object combobox."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:128
+msgid ""
+"The actual object that is used a container for the\n"
+" selected object that is to be panelized."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:134
+msgid "<b>Panel Data:</b>"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:136
+msgid ""
+"This informations will shape the resulting panel.\n"
+"The number of rows and columns will set how many\n"
+"duplicates of the original geometry will be generated.\n"
+"\n"
+"The spacings will set the distance between any two\n"
+"elements of the panel array."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:183
+msgid "<b>Panel Type:</b>"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:185
+msgid ""
+"Choose the type of object for the panel object:\n"
+"- Geometry\n"
+"- Gerber"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:193
+msgid "Constrain panel within:"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:227
+msgid "Panelize Object"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:229
+msgid ""
+"Panelize the specified object around the specified box.\n"
+"In other words it creates multiple copies of the source object,\n"
+"arranged in a 2D array of rows and columns."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:272
+#, fuzzy
+#| msgid "Paint Tool"
+msgid "Panel. Tool"
+msgstr "Herramienta de pintura"
+
+#: flatcamTools/ToolPanelize.py:370
+#, python-format
+msgid "[WARNING_NOTCL]No object Box. Using instead %s"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:453
+msgid ""
+"[ERROR_NOTCL] Columns or Rows are zero value. Change them to a positive "
+"integer."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:478 flatcamTools/ToolPanelize.py:635
+msgid "Generating panel ... Please wait."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:628
+msgid "[success] Panel done..."
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:631
+#, python-brace-format
+msgid ""
+"[WARNING] Too big for the constrain area. Final panel has {col} columns and "
+"{row} rows"
+msgstr ""
+
+#: flatcamTools/ToolPanelize.py:640
+msgid "[success] Panel created successfully."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:32
+msgid "PcbWizard Import Tool"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:40
+msgid "Import 2-file Excellon"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:57
+msgid "Excellon file:"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:59
+msgid ""
+"Load the Excellon file.\n"
+"Usually it has a .DRL extension"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:65
+msgid "INF file:"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:67
+msgid "Load the INF file."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:79
+msgid "Tool Number"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:81
+msgid "Tool diameter in file units."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:95
+msgid "Int. digits:"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:97
+msgid "The number of digits for the integral part of the coordinates."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:104
+msgid "Frac. digits:"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:106
+msgid "The number of digits for the fractional part of the coordinates."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:113
+msgid "No Suppression"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:114
+msgid "Zeros supp.:"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:116
+msgid ""
+"The type of zeros suppression used.\n"
+"Can be of type:\n"
+"- LZ = leading zeros are kept\n"
+"- TZ = trailing zeros are kept\n"
+"- No Suppression = no zero suppression"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:127
+msgid "Units"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:129
+msgid ""
+"The type of units that the coordinates and tool\n"
+"diameters are using. Can be INCH or MM."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:136
+msgid "Import Excellon"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:138
+msgid ""
+"Import in FlatCAM an Excellon file\n"
+"that store it's information's in 2 files.\n"
+"One usually has .DRL extension while\n"
+"the other has .INF extension."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:192
+msgid "PCBWizard Tool"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:286 flatcamTools/ToolPcbWizard.py:290
+msgid "Load PcbWizard Excellon file"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:309 flatcamTools/ToolPcbWizard.py:313
+msgid "Load PcbWizard INF file"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:360
+msgid ""
+"[ERROR] The INF file does not contain the tool table.\n"
+"Try to open the Excellon file from File -> Open -> Excellon\n"
+"and edit the drill diameters manually."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:380
+msgid "[success] PcbWizard .INF file loaded."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:384
+msgid "[success] Main PcbWizard Excellon file loaded."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:421
+#, python-format
+msgid "[ERROR_NOTCL] Cannot parse file: %s"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:445
+msgid "Importing Excellon."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:452
+msgid "[ERROR_NOTCL] Import Excellon file failed."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:459
+#, python-format
+msgid "[success] Imported: %s"
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:462
+msgid "[WARNING_NOTCL] Excellon merging is in progress. Please wait..."
+msgstr ""
+
+#: flatcamTools/ToolPcbWizard.py:464
+msgid "[ERROR_NOTCL] The imported Excellon file is None."
+msgstr ""
+
+#: flatcamTools/ToolProperties.py:103
+msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected."
+msgstr ""
+
+#: flatcamTools/ToolProperties.py:110
+msgid "[success] Object Properties are displayed."
+msgstr ""
+
+#: flatcamTools/ToolProperties.py:111
+msgid "Properties Tool"
+msgstr ""
+
+#: flatcamTools/ToolShell.py:69
+msgid "...proccessing..."
+msgstr ""
+
+#: flatcamTools/ToolShell.py:71
+#, python-format
+msgid "...proccessing... [%s]"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:37
+msgid "Solder Paste Tool"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:65
+msgid "Gerber Solder paste object.                        "
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:72
+msgid ""
+"Tools pool from which the algorithm\n"
+"will pick the ones used for dispensing solder paste."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:87
+msgid ""
+"This is the Tool Number.\n"
+"The solder dispensing will start with the tool with the biggest \n"
+"diameter, continuing until there are no more Nozzle tools.\n"
+"If there are no longer tools but there are still pads not covered\n"
+" with solder paste, the app will issue a warning message box."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:94
+msgid ""
+"Nozzle tool Diameter. It's value (in current FlatCAM units)\n"
+"is the width of the solder paste dispensed."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:101
+msgid "New Nozzle Tool"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:117
+msgid ""
+"Add a new nozzle tool to the Tool Table\n"
+"with the diameter specified above."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:129
+msgid "Generate solder paste dispensing geometry."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:142
+msgid "STEP 1:"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:144
+msgid ""
+"First step is to select a number of nozzle tools for usage\n"
+"and then optionally modify the GCode parameters bellow."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:147
+msgid ""
+"Select tools.\n"
+"Modify parameters."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:235
+msgid ""
+"Feedrate (speed) while moving up vertically\n"
+" to Dispense position (on Z plane)."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:289
+msgid "Generate GCode"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:291
+msgid ""
+"Generate GCode for Solder Paste dispensing\n"
+"on PCB pads."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:306
+msgid "STEP 2:"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:308
+msgid ""
+"Second step is to create a solder paste dispensing\n"
+"geometry out of an Solder Paste Mask Gerber file."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:324
+msgid "Geo Result:"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:326
+msgid ""
+"Geometry Solder Paste object.\n"
+"The name of the object has to end in:\n"
+"'_solderpaste' as a protection."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:335
+msgid "STEP 3:"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:337
+msgid ""
+"Third step is to select a solder paste dispensing geometry,\n"
+"and then generate a CNCJob object.\n"
+"\n"
+"REMEMBER: if you want to create a CNCJob with new parameters,\n"
+"first you need to generate a geometry with those new params,\n"
+"and only after that you can generate an updated CNCJob."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:357
+msgid "CNC Result:"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:359
+msgid ""
+"CNCJob Solder paste object.\n"
+"In order to enable the GCode save section,\n"
+"the name of the object has to end in:\n"
+"'_solderpaste' as a protection."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:369
+msgid "View GCode"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:371
+msgid ""
+"View the generated GCode for Solder Paste dispensing\n"
+"on PCB pads."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:375
+msgid "Save GCode"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:377
+msgid ""
+"Save the generated GCode for Solder Paste dispensing\n"
+"on PCB pads, to a file."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:381
+msgid "STEP 4:"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:383
+msgid ""
+"Fourth step (and last) is to select a CNCJob made from \n"
+"a solder paste dispensing geometry, and then view/save it's GCode."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:412
+msgid "Delete Object"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:788
+msgid ""
+"[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:793
+msgid "[success] New Nozzle tool added to Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:835
+msgid "[success] Nozzle tool from Tool Table was edited."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:892
+msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:897
+msgid "[success] Nozzle tool(s) deleted from Tool Table."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:952
+msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:970
+msgid "Creating Solder Paste dispensing geometry."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:982
+msgid "[WARNING_NOTCL] No Nozzle tools in the tool table."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1111
+msgid "[success] Solder Paste geometry generated successfully..."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1117
+msgid ""
+"[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle "
+"diameters..."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1131
+msgid "Generating Solder Paste dispensing geometry..."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1151
+msgid "[WARNING_NOTCL] There is no Geometry object available."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1155
+msgid ""
+"[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool "
+"geometry."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1261
+#, python-format
+msgid "[success] ToolSolderPaste CNCjob created: %s"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1293 flatcamTools/ToolSolderPaste.py:1297
+#: flatcamTools/ToolSolderPaste.py:1349
+msgid ""
+"[WARNING_NOTCL] This CNCJob object can't be processed. NOT a "
+"solder_paste_tool CNCJob object."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1321
+msgid "[ERROR_NOTCL] No Gcode in the object..."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1330
+#, python-format
+msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s"
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1359
+msgid "Export GCode ..."
+msgstr ""
+
+#: flatcamTools/ToolSolderPaste.py:1399
+#, python-format
+msgid "[success] Solder paste dispenser GCode file saved to: %s"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:55
+msgid "<b>Gerber Objects</b>"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:64 flatcamTools/ToolSub.py:110
+msgid "Target:"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:66
+msgid ""
+"Gerber object from which to substract\n"
+"the substractor Gerber object."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:78 flatcamTools/ToolSub.py:124
+msgid "Substractor:"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:80
+msgid ""
+"Gerber object that will be substracted\n"
+"from the target Gerber object."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:87
+msgid "Substract Gerber"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:89
+msgid ""
+"Will remove the area occupied by the substractor\n"
+"Gerber from the Target Gerber.\n"
+"Can be used to remove the overlapping silkscreen\n"
+"over the soldermask."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:101
+msgid "<b>Geometry Objects</b>"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:112
+msgid ""
+"Geometry object from which to substract\n"
+"the substractor Geometry object."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:126
+msgid ""
+"Geometry object that will be substracted\n"
+"from the target Geometry object."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:133
+msgid "Substract Geometry"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:135
+msgid ""
+"Will remove the area occupied by the substractor\n"
+"Geometry from the Target Geometry."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:216
+msgid "Sub Tool"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:231 flatcamTools/ToolSub.py:424
+msgid "[ERROR_NOTCL] No Target object loaded."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:244 flatcamTools/ToolSub.py:437
+msgid "[ERROR_NOTCL] No Substractor object loaded."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:297
+#, python-format
+msgid "Parsing aperture %s geometry ..."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:399 flatcamTools/ToolSub.py:544
+msgid "Generating new object ..."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:402 flatcamTools/ToolSub.py:547
+msgid "[ERROR_NOTCL] Generating new object failed."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:406 flatcamTools/ToolSub.py:552
+#, python-format
+msgid "[success] Created: %s"
+msgstr ""
+
+#: flatcamTools/ToolSub.py:449
+msgid ""
+"[ERROR_NOTCL] Currently, the Substractor geometry cannot be of type Multigeo."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:494
+msgid "Parsing solid_geometry ..."
+msgstr ""
+
+#: flatcamTools/ToolSub.py:496
+#, python-format
+msgid "Parsing tool %s geometry ..."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:23
+msgid "Object Transform"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:84
+msgid ""
+"Rotate the selected object(s).\n"
+"The point of reference is the middle of\n"
+"the bounding box for all selected objects."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:120 flatcamTools/ToolTransform.py:138
+msgid ""
+"Skew/shear the selected object(s).\n"
+"The point of reference is the middle of\n"
+"the bounding box for all selected objects."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:176 flatcamTools/ToolTransform.py:193
+msgid ""
+"Scale the selected object(s).\n"
+"The point of reference depends on \n"
+"the Scale reference checkbox state."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:202
+msgid ""
+"Scale the selected object(s)\n"
+"using the Scale Factor X for both axis."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:250 flatcamTools/ToolTransform.py:267
+msgid ""
+"Offset the selected object(s).\n"
+"The point of reference is the middle of\n"
+"the bounding box for all selected objects.\n"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:297 flatcamTools/ToolTransform.py:305
+msgid ""
+"Flip the selected object(s) over the X axis.\n"
+"Does not create a new object.\n"
+" "
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:636
+msgid "[WARNING_NOTCL] No object selected. Please Select an object to rotate!"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:664
+msgid "CNCJob objects can't be rotated."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:672
+msgid "[success] Rotate done ..."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:687
+msgid "[WARNING_NOTCL] No object selected. Please Select an object to flip!"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:722
+msgid "CNCJob objects can't be mirrored/flipped."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:756
+msgid ""
+"[WARNING_NOTCL] No object selected. Please Select an object to shear/skew!"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:778
+msgid "CNCJob objects can't be skewed."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:805
+msgid "[WARNING_NOTCL] No object selected. Please Select an object to scale!"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:838
+msgid "CNCJob objects can't be scaled."
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:857
+msgid "[WARNING_NOTCL] No object selected. Please Select an object to offset!"
+msgstr ""
+
+#: flatcamTools/ToolTransform.py:866
+msgid "CNCJob objects can't be offseted."
+msgstr ""
+
+#~ msgid ""
+#~ "How much (fraction) of the tool width to overlap each tool pass.\n"
+#~ "Example:\n"
+#~ "A value here of 0.25 means 25\\% from the tool diameter found above.\n"
+#~ "\n"
+#~ "Adjust the value starting with lower values\n"
+#~ "and increasing it if areas that should be painted are still \n"
+#~ "not painted.\n"
+#~ "Lower values = faster processing, faster execution on PCB.\n"
+#~ "Higher values = slow processing and slow execution on CNC\n"
+#~ "due of too many paths."
+#~ msgstr ""
+#~ "How much (fraction) of the tool width to overlap each tool pass.\n"
+#~ "Example:\n"
+#~ "A value here of 0.25 means 25\\% from the tool diameter found above.\n"
+#~ "\n"
+#~ "Adjust the value starting with lower values\n"
+#~ "and increasing it if areas that should be painted are still \n"
+#~ "not painted.\n"
+#~ "Lower values = faster processing, faster execution on PCB.\n"
+#~ "Higher values = slow processing and slow execution on CNC\n"
+#~ "due of too many paths."
+
+#~ msgid "z_cut = Z coord for Toolchange"
+#~ msgstr "z_cut = Z coord for Toolchange"
+
+#~ msgid "z_move = Z coord for Toolchange"
+#~ msgstr "z_move = Z coord for Toolchange"
+
+#~ msgid "%s/Project_%s"
+#~ msgstr "%s/Project_%s"
+
+#~ msgid "tool_tab"
+#~ msgstr "tool_tab"

BIN
locale/pt_BR/LC_MESSAGES/strings.mo


File diff suppressed because it is too large
+ 391 - 225
locale/pt_BR/LC_MESSAGES/strings.po


BIN
locale/ro/LC_MESSAGES/strings.mo


File diff suppressed because it is too large
+ 217 - 187
locale/ro/LC_MESSAGES/strings.po


BIN
locale/ru/LC_MESSAGES/strings.mo


File diff suppressed because it is too large
+ 220 - 191
locale/ru/LC_MESSAGES/strings.po


File diff suppressed because it is too large
+ 230 - 209
locale_template/strings.pot


+ 3 - 3
postprocessors/Paste_1.py

@@ -16,7 +16,7 @@ class Paste_1(FlatCAMPostProc_Tools):
 
 
     def start_code(self, p):
     def start_code(self, p):
         units = ' ' + str(p['units']).lower()
         units = ' ' + str(p['units']).lower()
-        coords_xy = [float(eval(a)) for a in p['xy_toolchange'].split(",")]
+        coords_xy = [float(eval(a)) for a in p['xy_toolchange'].split(",") if a != '']
 
 
         gcode = ''
         gcode = ''
 
 
@@ -68,7 +68,7 @@ class Paste_1(FlatCAMPostProc_Tools):
 
 
     def toolchange_code(self, p):
     def toolchange_code(self, p):
         z_toolchange = float(p['z_toolchange'])
         z_toolchange = float(p['z_toolchange'])
-        toolchangexy = [float(eval(a)) for a in p['xy_toolchange'].split(",")]
+        toolchangexy = [float(eval(a)) for a in p['xy_toolchange'].split(",") if a != '']
         gcode = ''
         gcode = ''
 
 
         if toolchangexy is not None:
         if toolchangexy is not None:
@@ -119,7 +119,7 @@ M0
         return ('G01 ' + self.position_code(p)).format(**p)
         return ('G01 ' + self.position_code(p)).format(**p)
 
 
     def end_code(self, p):
     def end_code(self, p):
-        coords_xy = [float(eval(a)) for a in p['xy_toolchange'].split(",")]
+        coords_xy = [float(eval(a)) for a in p['xy_toolchange'].split(",") if a != '']
         gcode = ('G00 Z' + self.feedrate_format %(p.fr_decimals, float(p['z_toolchange'])) + "\n")
         gcode = ('G00 Z' + self.feedrate_format %(p.fr_decimals, float(p['z_toolchange'])) + "\n")
 
 
         if coords_xy is not None:
         if coords_xy is not None:

+ 0 - 1
setup_ubuntu.sh

@@ -14,7 +14,6 @@ apt-get install python3-tk
 apt-get install libspatialindex-dev
 apt-get install libspatialindex-dev
 apt-get install python3-gdal
 apt-get install python3-gdal
 apt-get install python3-lxml
 apt-get install python3-lxml
-easy_install3 -U distribute
 pip3 install --upgrade dill
 pip3 install --upgrade dill
 pip3 install --upgrade Shapely
 pip3 install --upgrade Shapely
 pip3 install --upgrade vispy
 pip3 install --upgrade vispy

BIN
share/markarea32.png


+ 5 - 2
tclCommands/TclCommandCutout.py

@@ -1,5 +1,7 @@
 from ObjectCollection import *
 from ObjectCollection import *
 from tclCommands.TclCommand import TclCommand
 from tclCommands.TclCommand import TclCommand
+from shapely.ops import cascaded_union
+from shapely.geometry import LineString
 
 
 
 
 class TclCommandCutout(TclCommand):
 class TclCommandCutout(TclCommand):
@@ -81,11 +83,12 @@ class TclCommandCutout(TclCommand):
 
 
         try:
         try:
             obj = self.app.collection.get_by_name(str(name))
             obj = self.app.collection.get_by_name(str(name))
-        except:
+        except Exception as e:
+            log.debug("TclCommandCutout.execute() --> %s" % str(e))
             return "Could not retrieve object: %s" % name
             return "Could not retrieve object: %s" % name
 
 
         def geo_init_me(geo_obj, app_obj):
         def geo_init_me(geo_obj, app_obj):
-            margin =  margin_par + dia_par / 2
+            margin = margin_par + dia_par / 2
             gap_size = dia_par + gapsize_par
             gap_size = dia_par + gapsize_par
 
 
             minx, miny, maxx, maxy = obj.bounds()
             minx, miny, maxx, maxy = obj.bounds()

+ 8 - 4
tclCommands/TclCommandGeoCutout.py

@@ -1,11 +1,15 @@
 from ObjectCollection import *
 from ObjectCollection import *
 from tclCommands.TclCommand import TclCommandSignaled
 from tclCommands.TclCommand import TclCommandSignaled
 from copy import deepcopy
 from copy import deepcopy
+from shapely.ops import cascaded_union
+from shapely.geometry import Polygon, LineString, LinearRing
 
 
 
 
 class TclCommandGeoCutout(TclCommandSignaled):
 class TclCommandGeoCutout(TclCommandSignaled):
     """
     """
-        Tcl shell command to create a board cutout geometry. Allow cutout for any shape. Cuts holding gaps from geometry.
+        Tcl shell command to create a board cutout geometry.
+        Allow cutout for any shape.
+        Cuts holding gaps from geometry.
 
 
         example:
         example:
 
 
@@ -66,9 +70,9 @@ class TclCommandGeoCutout(TclCommandSignaled):
         :return:
         :return:
         """
         """
 
 
-        def subtract_rectangle(obj_, x0, y0, x1, y1):
-            pts = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]
-            obj_.subtract_polygon(pts)
+        # def subtract_rectangle(obj_, x0, y0, x1, y1):
+        #     pts = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]
+        #     obj_.subtract_polygon(pts)
 
 
         def substract_rectangle_geo(geo, x0, y0, x1, y1):
         def substract_rectangle_geo(geo, x0, y0, x1, y1):
             pts = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]
             pts = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]

Some files were not shown because too many files changed in this diff