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

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

Beta
Marius Stanciu 6 лет назад
Родитель
Сommit
c98adef9a7
52 измененных файлов с 13475 добавлено и 2122 удалено
  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)
 
     # Version
-    version = 8.919
-    version_date = "2019/06/23"
+    version = 8.920
+    version_date = "2019/07/14"
     beta = True
 
     # current date now
@@ -272,9 +272,9 @@ class App(QtCore.QObject):
         # variable to store mouse coordinates
         self.mouse = [0, 0]
 
-        # ################# ##
-        # # Initialize GUI # ##
-        # ################# ##
+        # ###################
+        # # Initialize GUI ##
+        # ###################
 
         # FlatCAM colors used in plotting
         self.FC_light_green = '#BBF268BF'
@@ -285,15 +285,12 @@ class App(QtCore.QObject):
         QtCore.QObject.__init__(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.final_save.connect(self.final_save)
 
-        # ########### ##
-        # # ## Data ## ##
-        # ########### ##
+        # #############
+        # ### Data ####
+        # #############
         self.recent = []
         self.clipboard = QtWidgets.QApplication.clipboard()
         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)
 
@@ -600,9 +597,9 @@ class App(QtCore.QObject):
 
             self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
 
-        # ########################## ##
-        # # ## LOAD LANGUAGES ## ##
-        # ########################## ##
+        # ############################
+        # ### LOAD LANGUAGES      ####
+        # ############################
 
         self.languages = fcTranslate.load_languages()
         for name in sorted(self.languages.values()):
@@ -908,16 +905,16 @@ class App(QtCore.QObject):
             "tools_solderpaste_pp": 'Paste_1'
         })
 
-        # ############################ ##
-        # # ## Load defaults from file # ##
-        # ############################ ##
+        # ##############################
+        # ## Load defaults from file ###
+        # ##############################
 
         if user_defaults:
             self.load_defaults(filename='current_defaults')
 
-        # ######################### ##
-        # #### APPLY APP LANGUAGE # ##
-        # ######################### ##
+        # ###########################
+        # #### APPLY APP LANGUAGE ###
+        # ###########################
 
         ret_val = fcTranslate.apply_language('strings')
 
@@ -1198,10 +1195,10 @@ class App(QtCore.QObject):
         self.tools_form = None
         self.on_options_combo_change(0)  # Will show the initial form
 
-        # # ## Define OBJECT COLLECTION # ##
+        # ### Define OBJECT COLLECTION ###
         self.collection = ObjectCollection(self)
         self.ui.project_tab_layout.addWidget(self.collection.view)
-        # ###
+        # ################################
 
         self.log.debug("Finished creating Object Collection.")
 
@@ -1274,9 +1271,9 @@ class App(QtCore.QObject):
             self.defaults['cncjob_annotation_fontcolor'])
         self.ui.cncjob_defaults_form.cncjob_gen_group.annotation_fontcolor_button.setStyleSheet(
             "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
         self.plotcanvas = PlotCanvas(self.ui.right_layout, self)
 
@@ -1303,27 +1300,27 @@ class App(QtCore.QObject):
         end_plot_time = time.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.exc_editor = FlatCAMExcEditor(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.ui.options_scroll_area.verticalScrollBar().sizeHint().width())
         self.collection.view.setMinimumWidth(290)
 
         self.log.debug("Finished adding FlatCAM Editor's.")
 
-        # # ## Worker ## ##
+        # ### Worker ####
         if self.defaults["global_worker_number"]:
             self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"]))
         else:
             self.workers = WorkerStack(workers_number=2)
         self.worker_task.connect(self.workers.add_task)
 
-        # # ## Signal handling # ##
-        # # ## Custom signals
+        # ### Signal handling ###
+        # ### Custom signals  ###
         self.inform.connect(self.info)
         self.app_quit.connect(self.quit_application)
         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_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.menufilenewgeo.triggered.connect(self.new_geometry_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_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_defaults_form.general_app_group.language_apply_btn.clicked.connect(
             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(
             lambda: self.on_toggle_units(no_pref=False))
 
-        # ############################ ##
-        # # ## GUI PREFERENCES SIGNALS # ##
-        # ############################ ##
+        # ##############################
+        # ### GUI PREFERENCES SIGNALS ##
+        # ##############################
 
         # Setting plot colors signals
         self.ui.general_defaults_form.general_gui_group.pf_color_entry.editingFinished.connect(
@@ -1602,21 +1599,21 @@ class App(QtCore.QObject):
         else:
             self.ui.splitter.setSizes([0, 1])
 
-        # ################# ##
-        # # ## Other setups # ##
-        # ################# ##
+        # ###################
+        # ### Other setups ##
+        # ###################
         # Sets up FlatCAMObj, FCProcess and FCProcessContainer.
         self.setup_obj_classes()
-
         self.setup_recent_items()
         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',
                                   'aligndrill', 'clear',
                                   'aligndrillgrid', 'cncjob', 'cutout', 'delete', 'drillcncjob',
@@ -1852,9 +1849,9 @@ class App(QtCore.QObject):
         else:
             self.ui.shell_dock.hide()
 
-        # ###################### ##
-        # # ## Tools and Plugins # ##
-        # ###################### ##
+        # ########################
+        # ### Tools and Plugins ##
+        # ########################
 
         self.dblsidedtool = 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
         self.install_tools()
 
-        # # ## System Font Parsing # ##
+        # ### System Font Parsing ###
         # self.f_parse = ParseFont(self)
         # self.parse_system_fonts()
 
@@ -1890,9 +1887,9 @@ class App(QtCore.QObject):
                 print("ERROR: ", ext)
                 sys.exit(2)
 
-        # ######################## ##
-        # # ## Check for updates ## ##
-        # ######################## ##
+        # ##########################
+        # ### Check for updates ####
+        # ##########################
 
         # Separate thread (Not worker)
         # 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': []})
             self.thr2.start(QtCore.QThread.LowPriority)
 
-        # ################################# ##
-        # # ## Variables for global usage ## ##
-        # ################################# ##
+        # ###################################
+        # ### Variables for global usage ####
+        # ###################################
 
         # coordinates for relative position display
         self.rel_point1 = (0, 0)
@@ -1979,8 +1976,10 @@ class App(QtCore.QObject):
         self.isHovering = False
         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')
         fac_def_from_file = factory_file.read()
         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
             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)
+
         factory_file.close()
 
         # 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):
             for dim in dimensions:
                 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[1] *= sfactor
                     self.options['excellon_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1])
                 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[1] *= sfactor
                     self.options['geometry_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1])
@@ -3725,38 +3727,48 @@ class App(QtCore.QObject):
                         sptools[t] *= sfactor
                         self.options['tools_solderpaste_tools'] += "%f," % sptools[t]
                 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[1] *= sfactor
                     self.options['tools_solderpaste_xy_toolchange'] = "%f, %f" % (sp_coords[0], sp_coords[1])
                 elif dim == 'global_gridx' or dim == 'global_gridy':
                     if new_units == 'IN':
+                        val = 0.1
                         try:
                             val = float(self.defaults[dim]) * sfactor
-                            self.options[dim] = float('%.6f' % val)
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.options[dim] = float('%.6f' % val)
                     else:
+                        val = 0.1
                         try:
                             val = float(self.defaults[dim]) * sfactor
-                            self.options[dim] = float('%.4f' % val)
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.options[dim] = float('%.4f' % val)
                 else:
+                    val = 0.1
                     try:
-                        self.options[dim] = float(self.options[dim]) * sfactor
+                        val = float(self.options[dim]) * sfactor
                     except Exception as e:
                         log.debug('App.on_toggle_units().scale_options() --> %s' % str(e))
 
+                    self.options[dim] = val
+
         def scale_defaults(sfactor):
             for dim in dimensions:
                 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[1] *= sfactor
                     self.defaults['excellon_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1])
                 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[1] *= sfactor
                     self.defaults['geometry_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1])
@@ -3797,29 +3809,37 @@ class App(QtCore.QObject):
                         sptools[t] *= sfactor
                         self.defaults['tools_solderpaste_tools'] += "%.4f," % sptools[t]
                 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[1] *= sfactor
                     self.defaults['tools_solderpaste_xy_toolchange'] = "%.4f, %.4f" % (sp_coords[0], sp_coords[1])
                 elif dim == 'global_gridx' or dim == 'global_gridy':
                     if new_units == 'IN':
+                        val = 0.1
                         try:
                             val = float(self.defaults[dim]) * sfactor
-                            self.defaults[dim] = float('%.6f' % val)
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.defaults[dim] = float('%.6f' % val)
                     else:
+                        val = 0.1
                         try:
                             val = float(self.defaults[dim]) * sfactor
-                            self.defaults[dim] = float('%.4f' % val)
                         except Exception as e:
                             log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
+
+                        self.defaults[dim] = float('%.4f' % val)
                 else:
+                    val = 0.1
                     try:
-                        self.defaults[dim] = float(self.defaults[dim]) * sfactor
+                        val = float(self.defaults[dim]) * sfactor
                     except Exception as e:
                         log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e))
 
+                    self.defaults[dim] = val
+
         # The scaling factor depending on choice of units.
         factor = 1/25.4
         if new_units == 'MM':
@@ -3827,11 +3847,11 @@ class App(QtCore.QObject):
 
         # Changing project units. Warn user.
         msgbox = QtWidgets.QMessageBox()
-        msgbox.setWindowTitle("Toggle Units")
+        msgbox.setWindowTitle(_("Toggle Units"))
         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_cancel = msgbox.addButton(_('Cancel'), QtWidgets.QMessageBox.RejectRole)
 
@@ -5447,7 +5467,7 @@ class App(QtCore.QObject):
         self.report_usage("on_shortcut_list()")
 
         # 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
         self.ui.position_label.setText("")

+ 0 - 1
FlatCAMCommon.py

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

+ 79 - 92
FlatCAMObj.py

@@ -35,9 +35,9 @@ class ValidationError(Exception):
 
         self.errors = errors
 
-# ##################################### ##
-# #            FlatCAMObj              # ##
-# ##################################### ##
+# #######################################
+# #            FlatCAMObj              ##
+# #######################################
 
 
 class FlatCAMObj(QtCore.QObject):
@@ -581,7 +581,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         try:
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             self.ui.apertures_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
             pass
 
         self.apertures_row = 0
@@ -903,7 +903,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 geo_obj.options["cnctooldia"] = str(self.options["isotooldia"])
                 geo_obj.solid_geometry = []
                 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 == 'cl':
@@ -929,6 +929,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                         break
                     else:
                         empty_cnt += 1
+
                 if empty_cnt == len(geo_obj.solid_geometry):
                     raise ValidationError("Empty Geometry", None)
                 geo_obj.multigeo = False
@@ -938,7 +939,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         else:
             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 self.iso_type == 0:
                         iso_name = self.options["name"] + "_ext_iso" + str(i + 1)
@@ -1215,7 +1216,11 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             cw_row = 0
 
         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():
             self.marked_rows.append(True)
@@ -1641,7 +1646,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
                 if option is not 'name':
                     try:
                         exc_final.options[option] = exc.options[option]
-                    except:
+                    except Exception as e:
                         exc.app.log.warning("Failed to copy option.", option)
 
             for drill in exc.drills:
@@ -1785,7 +1790,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
         try:
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             self.ui.tools_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
             pass
 
         n = len(self.tools)
@@ -2070,12 +2075,12 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
         for row in range(self.ui.tools_table.rowCount()):
             try:
                 self.ui.tools_table.cellWidget(row, 5).clicked.disconnect()
-            except:
+            except Exception as e:
                 pass
 
         try:
             self.ui.plot_cb.stateChanged.disconnect()
-        except:
+        except Exception as e:
             pass
 
     def on_tool_offset_edit(self):
@@ -2957,7 +2962,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         })
 
         if "cnctooldia" not in self.options:
-            self.options["cnctooldia"] =  self.app.defaults["geometry_cnctooldia"]
+            self.options["cnctooldia"] = self.app.defaults["geometry_cnctooldia"]
             # try:
             #     self.options["cnctooldia"] = [
             #         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)
 
         try:
+            temp_tools = self.options["cnctooldia"].split(",")
             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:
             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.tooluid: {
                         'tooldia': float(toold),
-                        'offset': ('Path'),
+                        'offset': 'Path',
                         'offset_value': 0.0,
                         'type': _('Rough'),
                         'tool_type': 'C1',
@@ -3335,7 +3341,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             tool_offset = self.ui.geo_tools_table.cellWidget(current_row, 2)
             if tool_offset is not None:
                 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_lbl.show()
                 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
         try:
             self.ser_attrs.remove('tools')
-        except:
+        except Exception as e:
             pass
         self.ser_attrs.append('tools')
 
@@ -3684,7 +3690,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         try:
             self.ser_attrs.remove('tools')
             self.ser_attrs.append('tools')
-        except:
+        except Exception as e:
             pass
 
         self.app.inform.emit(_(
@@ -3718,9 +3724,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                         self.tools = deepcopy(temp_tools)
                         temp_tools.clear()
                     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()
                         return
                     except Exception as e:
@@ -3728,9 +3732,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 # deselect the table
                 # self.ui.geo_tools_table.clearSelection()
             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()
                 return
         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
         try:
             self.ser_attrs.remove('tools')
-        except:
+        except Exception as e:
             pass
         self.ser_attrs.append('tools')
 
         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()
         # 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['xmax'] = xmax
                 obj_active.options['ymax'] = ymax
-            except:
+            except Exception as e:
                 obj_active.options['xmin'] = 0
                 obj_active.options['ymin'] = 0
                 obj_active.options['xmax'] = 0
@@ -3788,7 +3788,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         if row is None:
             try:
                 current_row = self.ui.geo_tools_table.currentRow()
-            except:
+            except Exception as e:
                 current_row = 0
         else:
             current_row = row
@@ -3884,7 +3884,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 ))
                 return
 
-
         row = self.ui.geo_tools_table.currentRow()
         tool_uid = int(self.ui.geo_tools_table.item(row, 5).text())
 
@@ -3911,7 +3910,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 cb_txt = cw.currentText()
                 if cw_col == 2:
                     tooluid_value['offset'] = cb_txt
-                    if cb_txt == ('Custom'):
+                    if cb_txt == 'Custom':
                         self.ui.tool_offset_entry.show()
                         self.ui.tool_offset_lbl.show()
                     else:
@@ -3957,7 +3956,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         widget_changed = self.sender()
         try:
             widget_idx = self.ui.grid3.indexOf(widget_changed)
-        except:
+        except Exception as e:
             return
 
         # 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:
             # try to convert comma to decimal point. if it's still not working error message and return
             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:
                 self.app.inform.emit(_(
                     "[ERROR_NOTCL] Wrong value format entered, "
@@ -4085,7 +4083,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 for tool in self.tools:
                     multigeo_solid_geometry += self.tools[tool]['solid_geometry']
             else:
-                    multigeo_solid_geometry = self.solid_geometry
+                multigeo_solid_geometry = self.solid_geometry
 
             for geo in multigeo_solid_geometry:
                 if type(geo) == list:
@@ -4125,7 +4123,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                         txt = self.ui.geo_tools_table.item(x.row(), column).text()
                     except AttributeError:
                         txt = self.ui.geo_tools_table.cellWidget(x.row(), column).currentText()
-                    except:
+                    except Exception as e:
                         pass
                     r.append(txt)
                 table_tools_items.append(r)
@@ -4360,7 +4358,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                 endz = data_value
 
                             if data_key == "toolchangez":
-                                toolchangez =data_value
+                                toolchangez = data_value
                             if data_key == "toolchangexy":
                                 toolchangexy = data_value
                             if data_key == "toolchange":
@@ -4393,13 +4391,13 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                             diadict_key: datadict
                         })
 
-                if dia_cnc_dict['offset'] == ('in'):
+                if dia_cnc_dict['offset'] == 'in':
                     tool_offset = -dia_cnc_dict['tooldia'] / 2
                     offset_str = 'inside'
-                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'
-                elif dia_cnc_dict['offset'].lower() == ('path'):
+                elif dia_cnc_dict['offset'].lower() == 'path':
                     offset_str = 'onpath'
                     tool_offset = 0.0
                 else:
@@ -4409,8 +4407,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                     except ValueError:
                         # try to convert comma to decimal point. if it's still not working error message and return
                         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:
                             self.app.inform.emit(_(
                                 "[ERROR_NOTCL] Wrong value format entered, "
@@ -4585,7 +4582,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
 
                     if diadict_key == 'data':
                         for data_key, data_value in diadict_value.items():
-                            if data_key ==  "multidepth":
+                            if data_key == "multidepth":
                                 multidepth = data_value
                             if data_key == "depthperpass":
                                 depthpercut = data_value
@@ -4598,7 +4595,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                                 endz = data_value
 
                             if data_key == "toolchangez":
-                                toolchangez =data_value
+                                toolchangez = data_value
                             if data_key == "toolchangexy":
                                 toolchangexy = data_value
                             if data_key == "toolchange":
@@ -4631,13 +4628,13 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                             diadict_key: datadict
                         })
 
-                if dia_cnc_dict['offset'] == ('in'):
+                if dia_cnc_dict['offset'] == 'in':
                     tool_offset = -dia_cnc_dict['tooldia'] / 2
                     offset_str = 'inside'
-                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'
-                elif dia_cnc_dict['offset'].lower() == ('path'):
+                elif dia_cnc_dict['offset'].lower() == 'path':
                     offset_str = 'onpath'
                     tool_offset = 0.0
                 else:
@@ -4647,23 +4644,17 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                     except ValueError:
                         # try to convert comma to decimal point. if it's still not working error message and return
                         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:
-                            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
                     if offset_value:
                         tool_offset = float(offset_value)
                     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
                 dia_cnc_dict.update({
                     'offset_value': tool_offset
@@ -4908,7 +4899,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
 
         try:
             xfactor = float(xfactor)
-        except:
+        except Exception as e:
             self.app.inform.emit(_(
                 "[ERROR_NOTCL] Scale factor has to be a number: integer or float."))
             return
@@ -4918,10 +4909,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         else:
             try:
                 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
 
         if point is None:
@@ -4943,19 +4932,19 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         # self.app.inform.emit("[success] Geometry Scale done.")
 
         def scale_recursion(geom):
-            if type(geom) == list:
-                geoms=list()
+            if type(geom) is list:
+                geoms = list()
                 for local_geom in geom:
                     geoms.append(scale_recursion(local_geom))
                 return geoms
             else:
-                return  affinity.scale(geom, xfactor, yfactor, origin=(px, py))
+                return affinity.scale(geom, xfactor, yfactor, origin=(px, py))
 
         if self.multigeo is True:
             for tool in self.tools:
                 self.tools[tool]['solid_geometry'] = scale_recursion(self.tools[tool]['solid_geometry'])
         else:
-            self.solid_geometry=scale_recursion(self.solid_geometry)
+            self.solid_geometry = scale_recursion(self.solid_geometry)
 
         self.app.inform.emit(_(
             "[success] Geometry Scale done."
@@ -4981,22 +4970,20 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             return
 
         def translate_recursion(geom):
-            if type(geom) == list:
-                geoms=list()
+            if type(geom) is list:
+                geoms = list()
                 for local_geom in geom:
                     geoms.append(translate_recursion(local_geom))
                 return geoms
             else:
-                return  affinity.translate(geom, xoff=dx, yoff=dy)
+                return affinity.translate(geom, xoff=dx, yoff=dy)
 
         if self.multigeo is True:
             for tool in self.tools:
                 self.tools[tool]['solid_geometry'] = translate_recursion(self.tools[tool]['solid_geometry'])
         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):
         self.ui_disconnect()
@@ -5060,8 +5047,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                         except ValueError:
                             # try to convert comma to decimal point. if it's still not working error message and return
                             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:
                                 self.app.inform.emit(_(
                                     "[ERROR_NOTCL] Wrong value format entered, "
@@ -5142,7 +5128,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         try:
             # plot solid geometries found as members of self.tools attribute dict
             # 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:
                     solid_geometry = self.tools[tooluid_key]['solid_geometry']
                     self.plot_element(solid_geometry, visible=visible)
@@ -5176,9 +5162,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
     def on_plot_cb_click_table(self):
         # self.ui.cnc_tools_table.cellWidget(row, 2).widget().setCheckState(QtCore.Qt.Unchecked)
         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
 
         self.shapes.clear(update=True)
@@ -5254,7 +5240,8 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                            'tool_type': 'C1',
                            'data': {} # a dict to hold the parameters
                            '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': []
                            },
                            ...
@@ -5516,7 +5503,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
             self.ui.cnc_tools_table.cellWidget(row, 6).clicked.disconnect(self.on_plot_cb_click_table)
         try:
             self.ui.plot_cb.stateChanged.disconnect(self.on_plot_cb_click)
-        except:
+        except Exception as e:
             pass
 
     def on_updateplot_button_click(self, *args):
@@ -5728,13 +5715,13 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                 if self.cnc_tools[key]['data']['ppname_g'] == 'hpgl':
                     hpgl = True
                     break
-        except:
+        except Exception as e:
             try:
                 for key in self.cnc_tools:
                     if self.cnc_tools[key]['data']['ppname_e'] == 'Roland_MDX_20':
                         roland = True
                         break
-            except:
+            except Exception as e:
                 pass
 
         # 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=''):
-        #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
 
     def get_svg(self):
@@ -5870,9 +5857,9 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
     def on_plot_cb_click_table(self):
         # self.ui.cnc_tools_table.cellWidget(row, 2).widget().setCheckState(QtCore.Qt.Unchecked)
         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()
 
@@ -5915,7 +5902,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
         visible = visible if visible else self.options['plot']
 
         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)
             else:
                 # multiple tools usage

+ 3 - 0
FlatCAMPool.py

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

+ 14 - 14
FlatCAMPostProc.py

@@ -1,10 +1,10 @@
-# ########################################################## ##
+# ##########################################################
 # FlatCAM: 2D Post-processing for Manufacturing            #
 # http://flatcam.org                                       #
 # File Author: Matthieu Berthomé                           #
 # Date: 5/26/2017                                          #
 # MIT Licence                                              #
-# ########################################################## ##
+# ##########################################################
 
 from importlib.machinery import SourceFileLoader
 import os
@@ -12,19 +12,19 @@ from abc import ABCMeta, abstractmethod
 from datetime import datetime
 import math
 
-#module-root dictionary of postprocessors
+# module-root dictionary of postprocessors
 import FlatCAMApp
 
 postprocessors = {}
 
 
 class ABCPostProcRegister(ABCMeta):
-    #handles postprocessors registration on instantation
+    # handles postprocessors registration on instantation
     def __new__(cls, clsname, bases, attrs):
         newclass = super(ABCPostProcRegister, cls).__new__(cls, clsname, bases, attrs)
         if object not in bases:
             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
         return newclass
 
@@ -67,11 +67,11 @@ class FlatCAMPostProc(object, metaclass=ABCPostProcRegister):
         pass
 
     @abstractmethod
-    def spindle_code(self,p):
+    def spindle_code(self, p):
         pass
 
     @abstractmethod
-    def spindle_stop_code(self,p):
+    def spindle_stop_code(self, p):
         pass
 
 
@@ -121,32 +121,32 @@ class FlatCAMPostProc_Tools(object, metaclass=ABCPostProcRegister):
         pass
 
     @abstractmethod
-    def feedrate_z_dispense_code(self,p):
+    def feedrate_z_dispense_code(self, p):
         pass
 
     @abstractmethod
-    def spindle_fwd_code(self,p):
+    def spindle_fwd_code(self, p):
         pass
 
     @abstractmethod
-    def spindle_rev_code(self,p):
+    def spindle_rev_code(self, p):
         pass
 
     @abstractmethod
-    def spindle_off_code(self,p):
+    def spindle_off_code(self, p):
         pass
 
     @abstractmethod
-    def dwell_fwd_code(self,p):
+    def dwell_fwd_code(self, p):
         pass
 
     @abstractmethod
-    def dwell_rev_code(self,p):
+    def dwell_rev_code(self, p):
         pass
 
 
 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')]
     import glob
     for path_search in postprocessors_path_search:

+ 3 - 3
FlatCAMProcess.py

@@ -1,10 +1,10 @@
-# ########################################################## ##
+# ##########################################################
 # FlatCAM: 2D Post-processing for Manufacturing            #
 # http://flatcam.org                                       #
 # Author: Juan Pablo Caram (c)                             #
 # Date: 2/5/2014                                           #
 # MIT Licence                                              #
-# ########################################################## ##
+# ##########################################################
 
 from flatcamGUI.FlatCAMGUI import FlatCAMActivityView
 from PyQt5 import QtCore
@@ -153,4 +153,4 @@ class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer):
             self.view.set_busy(self.procs[0]().status_msg())
 
         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.show()
-

+ 11 - 7
FlatCAMTranslation.py

@@ -16,6 +16,11 @@ from PyQt5.QtCore import QSettings
 from flatcamGUI.GUIElements import log
 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
 languages_dict = {
     'zh': 'Chinese',
@@ -83,12 +88,13 @@ def on_language_apply_click(app, restart=False):
 
     if restart:
         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'))
-        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.exec_()
@@ -156,5 +162,3 @@ def restart_program(app):
     app.save_defaults()
     python = sys.executable
     os.execl(python, python, *sys.argv)
-
-

+ 1 - 1
FlatCAMWorker.py

@@ -36,7 +36,7 @@ class Worker(QtCore.QObject):
                 import pydevd
                 pydevd.settrace(suspend=False, trace_only_current_thread=True)
             except ImportError:
-                self.pydevd_failed=True
+                self.pydevd_failed = True
 
     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
 
 - 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):
     return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)
 
+
 def distance_euclidian(x1, y1, x2, y2):
     return sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
 
@@ -7792,7 +7793,7 @@ class FlatCAMRTreeStorage(FlatCAMRTree):
         # super(FlatCAMRTreeStorage, self).insert(idx, obj)
         super().insert(idx, obj)
 
-    #@profile
+    # @profile
     def remove(self, obj):
         # See note about self.indexes in insert().
         # 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_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)
 
         # Linear Drill Array pitch distance
@@ -1017,8 +1017,8 @@ class FlatCAMExcEditor(QtCore.QObject):
         self.circular_form = QtWidgets.QFormLayout()
         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.drill_angle_label = QtWidgets.QLabel(_('Angle:'))

+ 3 - 3
flatcamEditors/FlatCAMGeoEditor.py

@@ -477,9 +477,9 @@ class PaintOptionsTool(FlatCAMTool):
         )
         grid.addWidget(methodlabel, 3, 0)
         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)
         grid.addWidget(self.paintmethod_combo, 3, 1)
 

+ 179 - 24
flatcamEditors/FlatCAMGrbEditor.py

@@ -1755,6 +1755,48 @@ class FCBuffer(FCShapeTool):
         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):
     def __init__(self, draw_app):
         DrawTool.__init__(self, draw_app)
@@ -2273,8 +2315,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.custom_box = QtWidgets.QVBoxLayout()
         layout.addLayout(self.custom_box)
 
-
-        # # ## Gerber Apertures ## ##
+        # #########################
+        # ### Gerber Apertures ####
+        # #########################
         self.apertures_table_label = QtWidgets.QLabel(_('<b>Apertures:</b>'))
         self.apertures_table_label.setToolTip(
             _("Apertures Table for the Gerber Object.")
@@ -2390,8 +2433,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         hlay_ad.addWidget(self.addaperture_btn)
         hlay_ad.addWidget(self.delaperture_btn)
 
-        # # ## BUFFER TOOL # ##
-
+        # ###################
+        # ### BUFFER TOOL ###
+        # ###################
         self.buffer_tool_frame = QtWidgets.QFrame()
         self.buffer_tool_frame.setContentsMargins(0, 0, 0, 0)
         self.custom_box.addWidget(self.buffer_tool_frame)
@@ -2434,8 +2478,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.buffer_button = QtWidgets.QPushButton(_("Buffer"))
         hlay_buf.addWidget(self.buffer_button)
 
-        # # ## SCALE TOOL # ##
-
+        # ##################
+        # ### SCALE TOOL ###
+        # ##################
         self.scale_tool_frame = QtWidgets.QFrame()
         self.scale_tool_frame.setContentsMargins(0, 0, 0, 0)
         self.custom_box.addWidget(self.scale_tool_frame)
@@ -2471,6 +2516,58 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.scale_button = QtWidgets.QPushButton(_("Scale"))
         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
         # all the add Pad array  widgets
         # 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_frame.setLayout(self.array_box)
 
-        # # ## Add Pad Array ## ##
         self.emptyarray_label = QtWidgets.QLabel('')
         self.array_box.addWidget(self.emptyarray_label)
 
@@ -2532,9 +2628,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
         )
         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.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_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.circular_form.addRow(self.pad_direction_label, self.pad_direction_radio)
 
@@ -2623,6 +2719,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                        "constructor": FCBuffer},
             "scale": {"button": self.app.ui.aperture_scale_btn,
                       "constructor": FCScale},
+            "markarea": {"button": self.app.ui.aperture_markarea_btn,
+                      "constructor": FCMarkArea},
             "eraser": {"button": self.app.ui.aperture_eraser_btn,
                       "constructor": FCEraser},
             "copy": {"button": self.app.ui.aperture_copy_btn,
@@ -2670,12 +2768,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.gerber_obj = None
         self.gerber_obj_options = dict()
 
-        self.buffer_distance_entry.set_value(0.01)
-        self.scale_factor_entry.set_value(1.0)
-
         # VisPy Visuals
         self.shapes = 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)
 
         # 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_buffer_menuitem.triggered.connect(self.on_buffer)
         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_copy_menuitem.triggered.connect(self.on_copy_button)
@@ -2810,12 +2910,19 @@ class FlatCAMGrbEditor(QtCore.QObject):
             tt_aperture = self.sorted_apid[i]
             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)
+        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_pitch_entry.set_value(2.54)
         self.pad_angle_entry.set_value(12)
@@ -2827,12 +2934,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
         try:
             # if connected, disconnect the signal from the slot on item_changed as it creates issues
             self.apertures_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
             pass
 
         try:
             self.apertures_table.cellPressed.disconnect()
-        except:
+        except Exception as e:
             pass
 
         # updated units
@@ -3426,6 +3533,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
 
         self.shapes.clear(update=True)
         self.tool_shape.clear(update=True)
+        self.ma_annotation.clear(update=True)
 
     def edit_fcgerber(self, orig_grb_obj):
         """
@@ -3561,9 +3669,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.set_ui()
 
         # 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
             self.build_ui(first_run=True)
             # and add the first aperture to have something to play with
@@ -4509,6 +4620,48 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.plot_all()
         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):
         if type(self.active_tool) == FCTransform:
             self.select_tool('select')
@@ -4526,6 +4679,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 self.buffer_tool_frame.hide()
             if tool_name == 'scale' or tool_name == 'all':
                 self.scale_tool_frame.hide()
+            if tool_name == 'markarea' or tool_name == 'all':
+                self.ma_tool_frame.hide()
         except Exception as e:
             log.debug("FlatCAMGrbEditor.hide_tool() --> %s" % str(e))
         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'))
         self.grb_add_scale_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/scale32.png'),
                                                                      _('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(
             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_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.grb_edit_toolbar.addSeparator()
@@ -1546,6 +1553,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                         <td height="20"><strong>ESC</strong></td>
                         <td>&nbsp;Abort and return to Select</td>
                     </tr>
+                    <tr height="20">
+                        <td height="20"><strong>CTRL+E</strong></td>
+                        <td>&nbsp;Eraser Tool</td>
+                    </tr>
                     <tr height="20">
                         <td height="20"><strong>CTRL+S</strong></td>
                         <td>&nbsp;Save Object and Exit Editor</td>
@@ -1553,6 +1564,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                     <tr height="20">
                         <td height="20">&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 height="20">
                         <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_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.grb_edit_toolbar.addSeparator()
@@ -2604,6 +2625,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                     self.app.on_shortcut_list()
         elif self.app.call_source == 'grb_editor':
             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
                 if key == QtCore.Qt.Key_S or key == 'S':
                     self.app.editor2object()
@@ -2617,11 +2643,15 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
             elif modifiers == QtCore.Qt.ShiftModifier:
                 pass
             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
                 if key == QtCore.Qt.Key_N or key == 'N':
                     self.app.grb_editor.on_poligonize()
                     return
-
                 # Transformation Tool
                 if key == QtCore.Qt.Key_R or key == 'R':
                     self.app.grb_editor.on_transform()
@@ -3756,8 +3786,8 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         self.unitslabel.setToolTip(_("The default value for FlatCAM units.\n"
                                      "Whatever is selected here is set every time\n"
                                      "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
         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"
                                          "- MMB --> Middle Mouse Button\n"
                                          "- 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
         self.mselectlabel = QtWidgets.QLabel(_('<b>Multiple Sel:</b>'))
@@ -3893,7 +3923,7 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         self.worker_number_sb.set_range(2, 16)
 
         # Geometric tolerance
-        tol_label = QtWidgets.QLabel("Geo Tolerance:")
+        tol_label = QtWidgets.QLabel(_("Geo Tolerance:"))
         tol_label.setToolTip(_(
             "This value can counter the effect of the Circle Steps\n"
             "parameter. Default value is 0.01.\n"
@@ -4087,8 +4117,8 @@ class GerberOptPrefGroupUI(OptionsGroupUI):
               "- conventional / useful when there is no backlash compensation")
         )
         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)
 
         # Combine passes
@@ -4245,8 +4275,8 @@ class GerberExpPrefGroupUI(OptionsGroupUI):
             _("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(
             _("The units used in the Gerber file.")
         )
@@ -4300,8 +4330,8 @@ class GerberExpPrefGroupUI(OptionsGroupUI):
               "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(
             _("This sets the type of Gerber zeros.\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)
 
-        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(
             _("This sets the default type of Excellon zeros.\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)
 
-        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(
             _("This sets the units of Excellon files.\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)
 
-        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(
             _("This sets the optimization type for the Excellon drill path.\n"
               "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n"
@@ -4670,8 +4700,8 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
               "- 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(self.spindledir_radio, 6, 1)
 
@@ -4897,8 +4927,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
             _("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(
             _("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"
               "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(
             _("Select the kind of coordinates format used.\n"
               "Coordinates can be saved with decimal point or without.\n"
@@ -4977,8 +5007,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
               "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(
             _("This sets the default type of Excellon zeros.\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")
         )
         # 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_radio, 4, 1)
@@ -5105,8 +5135,8 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
               "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_dir_radio, 8, 1)
@@ -5294,8 +5324,8 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
               "- 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(self.spindledir_radio, 9, 1)
 
@@ -5527,9 +5557,9 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI):
         )
 
         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)
 
         grid0.addWidget(self.cncplot_method_label, 1, 0)
@@ -5811,9 +5841,9 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
         )
         grid0.addWidget(methodlabel, 3, 0)
         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)
         grid0.addWidget(self.ncc_method_radio, 3, 1)
 
@@ -5973,8 +6003,8 @@ class Tools2sidedPrefGroupUI(OptionsGroupUI):
         grid0.addWidget(self.mirror_axis_radio, 2, 1)
 
         # ## 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.setToolTip(
             _("The axis should pass through a <b>point</b> or cut\n "
@@ -6051,9 +6081,9 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
         )
         grid0.addWidget(methodlabel, 3, 0)
         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)
         grid0.addWidget(self.paintmethod_combo, 3, 1)
 
@@ -6084,8 +6114,8 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
         )
         grid0.addWidget(selectlabel, 6, 0)
         self.selectmethod_combo = RadioSet([
-            {"label": "Single", "value": "single"},
-            {"label": "All", "value": "all"},
+            {"label": _("Single"), "value": "single"},
+            {"label": _("All"), "value": "all"},
             # {"label": "Rectangle", "value": "rectangle"}
         ])
         grid0.addWidget(self.selectmethod_combo, 6, 1)
@@ -6212,8 +6242,8 @@ class ToolsPanelizePrefGroupUI(OptionsGroupUI):
         grid0.addWidget(self.prows, 3, 1)
 
         # ## 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.setToolTip(
            _( "Choose the type of object for the panel object:\n"

+ 14 - 16
flatcamGUI/GUIElements.py

@@ -242,9 +242,9 @@ class FloatEntry(QtWidgets.QLineEdit):
 
         try:
             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 float(evaled)
@@ -285,9 +285,9 @@ class FloatEntry2(QtWidgets.QLineEdit):
         evaled = 0.0
         try:
             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 float(evaled)
@@ -458,9 +458,9 @@ class EvalEntry(QtWidgets.QLineEdit):
         evaled = 0.0
         try:
             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 evaled
 
@@ -497,9 +497,9 @@ class EvalEntry2(QtWidgets.QLineEdit):
         evaled = 0.0
         try:
             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 evaled
 
@@ -785,7 +785,7 @@ class FCInputDialog(QtWidgets.QInputDialog):
 
     def get_value(self):
         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]
 
     # "Transform", "Enter the Angle value:"
@@ -1449,7 +1449,7 @@ class FCTable(QtWidgets.QTableWidget):
             width += self.columnWidth(i)
         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):
         for j in range(self.columnCount()):
             self.item(rowIndex, j).setBackground(color)
@@ -1625,7 +1625,6 @@ class Dialog_box(QtWidgets.QWidget):
         self.readyToEdit = True
 
 
-
 class _BrowserTextEdit(QTextEdit):
 
     def __init__(self, version):
@@ -1641,7 +1640,6 @@ class _BrowserTextEdit(QTextEdit):
         clear_action.triggered.connect(self.clear)
         self.menu.exec_(event.globalPos())
 
-
     def clear(self):
         QTextEdit.clear(self)
         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")
         )
         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)
 
         # combine all passes CB
@@ -1361,9 +1361,9 @@ class CNCObjectUI(ObjectUI):
         )
 
         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)
 
         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)
 
-        #################### ##
-        # ## Units Calculator # ##
-        #################### ##
+        # #####################
+        # ## Units Calculator #
+        # #####################
 
         self.unists_spacer_label = QtWidgets.QLabel(" ")
         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)
         self.layout.addWidget(units_label)
 
-        #Grid Layout
+        # Grid Layout
         grid_units_layout = QtWidgets.QGridLayout()
         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( inch_label, 0, 1)
+        grid_units_layout.addWidget(inch_label, 0, 1)
 
         self.inch_entry = FCEntry()
         # 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.inch_entry, 1, 1)
 
-
-        ########################## ##
-        # ## V-shape Tool Calculator # ##
-        ########################## ##
-
+        # ##############################
+        # ## V-shape Tool Calculator ###
+        # ##############################
         self.v_shape_spacer_label = QtWidgets.QLabel(" ")
         self.layout.addWidget(self.v_shape_spacer_label)
 
@@ -96,32 +94,31 @@ class ToolCalculator(FlatCAMTool):
         # self.tipDia_entry.setFixedWidth(70)
         self.tipDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         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_entry = FCEntry()
         # self.tipAngle_entry.setFixedWidth(70)
         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"
-                                       "It is specified by manufacturer."))
+                                         "It is specified by manufacturer."))
 
         self.cutDepth_label = QtWidgets.QLabel(_("Cut Z:"))
         self.cutDepth_entry = FCEntry()
         # self.cutDepth_entry.setFixedWidth(70)
         self.cutDepth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         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_entry = FCEntry()
         # self.effectiveToolDia_entry.setFixedWidth(70)
         self.effectiveToolDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         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)
 
-
         form_layout.addRow(self.tipDia_label, self.tipDia_entry)
         form_layout.addRow(self.tipAngle_label, self.tipAngle_entry)
         form_layout.addRow(self.cutDepth_label, self.cutDepth_entry)
@@ -132,16 +129,15 @@ class ToolCalculator(FlatCAMTool):
         # self.calculate_button.setFixedWidth(70)
         self.calculate_vshape_button.setToolTip(
             _("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(" ")
 
         form_layout.addRow(self.empty_label, self.calculate_vshape_button)
 
-
-        ################################## ##
-        # ## ElectroPlating Tool Calculator # ##
-        ################################## ##
+        # ####################################
+        # ## ElectroPlating Tool Calculator ##
+        # ####################################
 
         self.plate_spacer_label = QtWidgets.QLabel(" ")
         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.setToolTip(
             _("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)
 
@@ -175,15 +171,14 @@ class ToolCalculator(FlatCAMTool):
         # self.cdensity_entry.setFixedWidth(70)
         self.cdensity_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         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_entry = FCEntry()
         # self.growth_entry.setFixedWidth(70)
         self.growth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.growth_label.setToolTip(_("How thick the copper growth is intended to be.\n"
-                                     "In microns."))
+                                       "In microns."))
 
         # self.growth_entry.setEnabled(False)
 
@@ -192,7 +187,7 @@ class ToolCalculator(FlatCAMTool):
         # self.cvaluelabel.setFixedWidth(70)
         self.cvalue_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         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.timelabel = QtWidgets.QLabel(_("Time:"))
@@ -200,7 +195,7 @@ class ToolCalculator(FlatCAMTool):
         # self.timelabel.setFixedWidth(70)
         self.time_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         self.timelabel.setToolTip(_('This is the calculated time required for the procedure.\n'
-                                  'In minutes.'))
+                                    'In minutes.'))
         self.time_entry.setDisabled(True)
 
         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_button.setFixedWidth(70)
         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(" ")
 
@@ -223,6 +218,8 @@ class ToolCalculator(FlatCAMTool):
 
         self.layout.addStretch()
 
+        self.units = ''
+
         # ## Signals
         self.cutDepth_entry.textChanged.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.app.ui.notebook.setTabText(2, "Calc. Tool")
+        self.app.ui.notebook.setTabText(2, _("Calc. Tool"))
 
     def install(self, icon=None, separator=None, **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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         try:
@@ -316,7 +313,7 @@ class ToolCalculator(FlatCAMTool):
                 half_tip_angle = float(self.tipAngle_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
         half_tip_angle /= 2
 
@@ -328,7 +325,7 @@ class ToolCalculator(FlatCAMTool):
                 cut_depth = float(self.cutDepth_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
         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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
         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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         try:
@@ -381,7 +378,7 @@ class ToolCalculator(FlatCAMTool):
                 width = float(self.pcbwidth_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         try:
@@ -392,7 +389,7 @@ class ToolCalculator(FlatCAMTool):
                 density = float(self.cdensity_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         try:
@@ -403,7 +400,7 @@ class ToolCalculator(FlatCAMTool):
                 copper = float(self.growth_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         calculated_current = (length * width * density) * 0.0021527820833419
@@ -412,4 +409,4 @@ class ToolCalculator(FlatCAMTool):
         self.cvalue_entry.set_value('%.2f' % calculated_current)
         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 FlatCAMApp import *
 from shapely.geometry import box
+from shapely.ops import cascaded_union, unary_union
 
 import gettext
 import FlatCAMTranslation as fcTranslate
@@ -353,7 +354,7 @@ class CutOut(FlatCAMTool):
                 dia = float(self.dia.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         if 0 in {dia}:
@@ -368,7 +369,7 @@ class CutOut(FlatCAMTool):
                 margin = float(self.margin.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         try:
@@ -379,7 +380,7 @@ class CutOut(FlatCAMTool):
                 gapsize = float(self.gapsize.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         try:
@@ -390,7 +391,7 @@ class CutOut(FlatCAMTool):
 
         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. "
-                                 "Fill in a correct value and retry. "))
+                                   "Fill in a correct value and retry. "))
             return
 
         if cutout_obj.multigeo is True:
@@ -414,66 +415,71 @@ class CutOut(FlatCAMTool):
             else:
                 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)
             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['xmax'] = xmax
             geo_obj.options['ymax'] = ymax
+            geo_obj.options['cnctooldia'] = str(dia)
 
         outname = cutout_obj.options["name"] + "_cutout"
         self.app.new_object('geometry', outname, geo_init)
@@ -516,7 +523,7 @@ class CutOut(FlatCAMTool):
                 dia = float(self.dia.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         if 0 in {dia}:
@@ -531,7 +538,7 @@ class CutOut(FlatCAMTool):
                 margin = float(self.margin.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Margin value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         try:
@@ -542,7 +549,7 @@ class CutOut(FlatCAMTool):
                 gapsize = float(self.gapsize.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Gap size value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         try:
@@ -553,13 +560,13 @@ class CutOut(FlatCAMTool):
 
         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. "
-                                 "Fill in a correct value and retry. "))
+                                   "Fill in a correct value and retry. "))
             return
 
         if cutout_obj.multigeo is True:
             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
 
         # 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:
                 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.options['cnctooldia'] = str(dia)
 
         outname = cutout_obj.options["name"] + "_cutout"
         self.app.new_object('geometry', outname, geo_init)
@@ -781,11 +789,13 @@ class CutOut(FlatCAMTool):
         convex_box = self.convex_box.get_value()
 
         def geo_init(geo_obj, app_obj):
+            geo_union = unary_union(cutout_obj.solid_geometry)
+
             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))
             else:
-                geo = cutout_obj.solid_geometry
+                geo = geo_union
                 geo = geo.buffer(margin + abs(dia / 2))
                 if isinstance(geo, Polygon):
                     geo_obj.solid_geometry = geo.exterior
@@ -794,6 +804,7 @@ class CutOut(FlatCAMTool):
                     for poly in geo:
                         solid_geo.append(poly.exterior)
                     geo_obj.solid_geometry = deepcopy(solid_geo)
+            geo_obj.options['cnctooldia'] = str(dia)
 
         outname = cutout_obj.options["name"] + "_cutout"
         self.app.new_object('geometry', outname, geo_init)

+ 41 - 45
flatcamTools/ToolDblSided.py

@@ -6,9 +6,9 @@ from PyQt5 import QtCore
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = 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.setCurrentIndex(1)
 
-        self.botlay_label = QtWidgets.QLabel("<b>GERBER:</b>")
+        self.botlay_label = QtWidgets.QLabel(_("<b>GERBER:</b>"))
         self.botlay_label.setToolTip(
             "Gerber  to be mirrored."
         )
@@ -52,8 +52,8 @@ class DblSidedTool(FlatCAMTool):
         self.mirror_gerber_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_gerber_button.setToolTip(
             _("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)
 
@@ -68,7 +68,7 @@ class DblSidedTool(FlatCAMTool):
         self.exc_object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex()))
         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(
             _("Excellon Object to be mirrored.")
         )
@@ -76,8 +76,8 @@ class DblSidedTool(FlatCAMTool):
         self.mirror_exc_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_exc_button.setToolTip(
             _("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)
 
@@ -92,7 +92,7 @@ class DblSidedTool(FlatCAMTool):
         self.geo_object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
         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(
             _("Geometry Obj to be mirrored.")
         )
@@ -100,8 +100,8 @@ class DblSidedTool(FlatCAMTool):
         self.mirror_geo_button = QtWidgets.QPushButton(_("Mirror"))
         self.mirror_geo_button.setToolTip(
             _("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)
 
@@ -128,13 +128,13 @@ class DblSidedTool(FlatCAMTool):
         grid_lay1.addWidget(self.mirror_axis, 7, 1)
 
         # ## 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.setToolTip(
             _("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_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.setToolTip(
             _("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.setToolTip(
             _("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)
 
@@ -188,15 +188,14 @@ class DblSidedTool(FlatCAMTool):
         self.box_combo.hide()
         self.box_combo_type.hide()
 
-
         # ## Alignment holes
         self.ah_label = QtWidgets.QLabel("<b>%s</b>" % _('Alignment Drill Coordinates:'))
         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)
 
@@ -208,12 +207,12 @@ class DblSidedTool(FlatCAMTool):
         self.add_drill_point_button = QtWidgets.QPushButton(_("Add"))
         self.add_drill_point_button.setToolTip(
             _("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)
 
@@ -224,7 +223,7 @@ class DblSidedTool(FlatCAMTool):
         self.dt_label = QtWidgets.QLabel("<b>%s</b>:" % _('Alignment Drill Diameter'))
         self.dt_label.setToolTip(
             _("Diameter of the drill for the "
-            "alignment holes.")
+              "alignment holes.")
         )
         self.layout.addWidget(self.dt_label)
 
@@ -235,7 +234,7 @@ class DblSidedTool(FlatCAMTool):
         self.dd_label = QtWidgets.QLabel(_("Drill diam.:"))
         self.dd_label.setToolTip(
             _("Diameter of the drill for the "
-            "alignment holes.")
+              "alignment holes.")
         )
         hlay.addWidget(self.dd_label)
         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.setToolTip(
             _("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)
 
@@ -325,7 +324,7 @@ class DblSidedTool(FlatCAMTool):
                 px, py = self.point_entry.get_value()
             except TypeError:
                 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
         else:
             selection_index = self.box_combo.currentIndex()
@@ -361,7 +360,7 @@ class DblSidedTool(FlatCAMTool):
                 self.drill_dia.set_value(dia)
             except ValueError:
                 self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                     "Add it and retry."))
+                                       "Add it and retry."))
                 return
 
         if dia is '':
@@ -372,7 +371,8 @@ class DblSidedTool(FlatCAMTool):
         # holes = self.alignment_holes.get_value()
         holes = eval('[{}]'.format(self.alignment_holes.text()))
         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
 
         drills = []
@@ -418,7 +418,7 @@ class DblSidedTool(FlatCAMTool):
                 px, py = self.point_entry.get_value()
             except TypeError:
                 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)
 
         else:
@@ -462,7 +462,7 @@ class DblSidedTool(FlatCAMTool):
             except Exception as 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. "
-                                     "Add coords and try again ..."))
+                                       "Add coords and try again ..."))
                 return
         else:
             selection_index_box = self.box_combo.currentIndex()
@@ -553,8 +553,4 @@ class DblSidedTool(FlatCAMTool):
         self.box_combo.setCurrentIndex(0)
         self.box_combo_type.setCurrentIndex(0)
 
-
         self.drill_values = ""
-
-
-

+ 31 - 31
flatcamTools/ToolFilm.py

@@ -13,9 +13,9 @@ from PyQt5 import QtGui, QtCore, QtWidgets
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = 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.setToolTip(
             _("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)
 
@@ -89,9 +89,9 @@ class Film(FlatCAMTool):
         self.tf_type_box_combo_label = QtWidgets.QLabel(_("Box Type:"))
         self.tf_type_box_combo_label.setToolTip(
             _("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)
 
@@ -104,23 +104,23 @@ class Film(FlatCAMTool):
         self.tf_box_combo_label = QtWidgets.QLabel(_("Box Object:"))
         self.tf_box_combo_label.setToolTip(
             _("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)
 
         # 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.setToolTip(
             _("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)
 
@@ -130,13 +130,13 @@ class Film(FlatCAMTool):
         self.boundary_label = QtWidgets.QLabel(_("Border:"))
         self.boundary_label.setToolTip(
             _("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)
 
@@ -144,8 +144,8 @@ class Film(FlatCAMTool):
         self.film_scale_label = QtWidgets.QLabel(_("Scale Stroke:"))
         self.film_scale_label.setToolTip(
             _("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)
 
@@ -157,9 +157,9 @@ class Film(FlatCAMTool):
         self.film_object_button = QtWidgets.QPushButton(_("Save Film"))
         self.film_object_button.setToolTip(
             _("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)
 
@@ -221,13 +221,13 @@ class Film(FlatCAMTool):
     def on_film_creation(self):
         try:
             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."))
             return
 
         try:
             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."))
             return
 

+ 29 - 29
flatcamTools/ToolImage.py

@@ -13,9 +13,9 @@ from PyQt5 import QtGui, QtWidgets
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = 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.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)
@@ -62,7 +62,7 @@ class ToolImage(FlatCAMTool):
         self.dpi_entry = IntEntry()
         self.dpi_label = QtWidgets.QLabel(_("DPI value:"))
         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)
 
@@ -77,11 +77,11 @@ class ToolImage(FlatCAMTool):
 
         # Type of image interpretation
         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.setToolTip(
             _("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)
 
@@ -90,11 +90,11 @@ class ToolImage(FlatCAMTool):
         self.mask_bw_label = QtWidgets.QLabel("%s <b>B/W</b>:" % _('Mask value'))
         self.mask_bw_label.setToolTip(
             _("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)
 
@@ -103,9 +103,9 @@ class ToolImage(FlatCAMTool):
         self.mask_r_label = QtWidgets.QLabel("%s <b>R:</b>" % _('Mask value'))
         self.mask_r_label.setToolTip(
             _("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)
 
@@ -114,9 +114,9 @@ class ToolImage(FlatCAMTool):
         self.mask_g_label = QtWidgets.QLabel("%s <b>G:</b>" % _('Mask value'))
         self.mask_g_label.setToolTip(
             _("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)
 
@@ -125,9 +125,9 @@ class ToolImage(FlatCAMTool):
         self.mask_b_label = QtWidgets.QLabel("%s <b>B:</b>" % _('Mask value'))
         self.mask_b_label.setToolTip(
             _("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)
 
@@ -191,27 +191,27 @@ class ToolImage(FlatCAMTool):
         mask = []
         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:
             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:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Import IMAGE"), filter=filter)
 
         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()
         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()]
 
         if filename == "":
             self.app.inform.emit(_("Open cancelled."))
         else:
             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")

+ 5 - 6
flatcamTools/ToolMeasurement.py

@@ -14,9 +14,9 @@ from math import sqrt
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -40,10 +40,9 @@ class Measurement(FlatCAMTool):
         form_layout = QtWidgets.QFormLayout()
         self.layout.addLayout(form_layout)
 
-
         self.units_label = QtWidgets.QLabel(_("Units:"))
         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.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.setToolTip(_("This is the distance measured over the X axis."))
 
-
         self.distance_y_entry = FCEntry()
         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.total_distance_entry = FCEntry()
         self.total_distance_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
         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.active = False
+        self.clicked_meas = None
+        self.meas_line = None
 
         self.original_call_source = 'app'
 
@@ -312,7 +311,7 @@ class Measurement(FlatCAMTool):
             # update utility geometry
             if len(self.points) == 1:
                 self.utility_geometry(pos=pos)
-        except:
+        except Exception as e:
             self.app.ui.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 FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -97,7 +97,7 @@ class ToolMove(FlatCAMTool):
                 pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos)
 
                 # 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])
                 else:
                     pos = pos_canvas
@@ -117,7 +117,7 @@ class ToolMove(FlatCAMTool):
                     self.delete_shape()
 
                     # 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])
                     else:
                         pos = pos_canvas
@@ -143,11 +143,11 @@ class ToolMove(FlatCAMTool):
 
                                     try:
                                         sel_obj.replotApertures.emit()
-                                    except:
+                                    except Exception as e:
                                         pass
 
                                     # 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['ymin'] = b
                                     sel_obj.options['xmax'] = c
@@ -181,7 +181,7 @@ class ToolMove(FlatCAMTool):
         pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos)
 
         # 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])
         else:
             pos = pos_canvas

+ 65 - 62
flatcamTools/ToolNonCopperClear.py

@@ -7,16 +7,16 @@
 # ########################################################## ##
 
 from FlatCAMTool import FlatCAMTool
-from copy import copy,deepcopy
+from copy import copy, deepcopy
 from ObjectCollection import *
 import time
 
 import gettext
 import FlatCAMTranslation as fcTranslate
 from shapely.geometry import base
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = 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.setToolTip(
             _("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)
 
@@ -87,33 +87,33 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
         self.tools_table.horizontalHeaderItem(0).setToolTip(
             _("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(
             _("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(
             _("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.tools_box.addWidget(self.empty_label)
 
-        #### Add a new Tool ## ##
+        # ### Add a new Tool ####
         hlay = QtWidgets.QHBoxLayout()
         self.tools_box.addLayout(hlay)
 
@@ -134,7 +134,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn.setToolTip(
             _("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')
@@ -146,12 +146,12 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn.setToolTip(
             _("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.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.tools_box.addWidget(self.empty_label_0)
@@ -165,14 +165,14 @@ class NonCopperClear(FlatCAMTool, Gerber):
         nccoverlabel = QtWidgets.QLabel(_('Overlap Rate:'))
         nccoverlabel.setToolTip(
             _("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)
         self.ncc_overlap_entry = FCEntry()
@@ -190,9 +190,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
         methodlabel = QtWidgets.QLabel(_('Method:'))
         methodlabel.setToolTip(
             _("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)
         self.ncc_method_radio = RadioSet([
@@ -206,7 +206,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         pathconnectlabel = QtWidgets.QLabel(_("Connect:"))
         pathconnectlabel.setToolTip(
             _("Draw lines between resulting\n"
-            "segments to minimize tool lifts.")
+              "segments to minimize tool lifts.")
         )
         grid3.addWidget(pathconnectlabel, 4, 0)
         self.ncc_connect_cb = FCCheckBox()
@@ -215,7 +215,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         contourlabel = QtWidgets.QLabel(_("Contour:"))
         contourlabel.setToolTip(
             _("Cut around the perimeter of the polygon\n"
-            "to trim rough edges.")
+              "to trim rough edges.")
         )
         grid3.addWidget(contourlabel, 5, 0)
         self.ncc_contour_cb = FCCheckBox()
@@ -224,12 +224,12 @@ class NonCopperClear(FlatCAMTool, Gerber):
         restlabel = QtWidgets.QLabel(_("Rest M.:"))
         restlabel.setToolTip(
             _("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)
         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.setToolTip(
             _("Create the Geometry Object\n"
-            "for non-copper routing.")
+              "for non-copper routing.")
         )
         self.tools_box.addWidget(self.generate_ncc_button)
 
@@ -344,8 +344,9 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
         try:
             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
 
         self.tooluid = 0
@@ -393,10 +394,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
             for tooluid_key, tooluid_value in self.ncc_tools.items():
                 if float('%.4f' % tooluid_value['tooldia']) == tool_sorted:
                     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
-                    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
                     # 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(',', '.'))
                 except ValueError:
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number."))
+                                           "use a number."))
                     return
             if tool_dia is None:
                 self.build_ui()
@@ -486,7 +487,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 return
 
         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
 
         # construct a list of all 'tooluid' in the self.tools
@@ -568,7 +570,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                         break
                 restore_dia_item = self.tools_table.item(row, 1)
                 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()
 
     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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
         over = over if over else self.app.defaults["tools_nccoverlap"]
 
         if over >= 1 or over < 0:
             self.app.inform.emit(_("[ERROR_NOTCL] Overlap value must be between "
-                                  "0 (inclusive) and 1 (exclusive), "))
+                                   "0 (inclusive) and 1 (exclusive), "))
             return
 
         try:
@@ -642,7 +645,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 margin = float(self.ncc_margin_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
         margin = margin if margin else self.app.defaults["tools_nccmargin"]
 
@@ -662,13 +665,14 @@ class NonCopperClear(FlatCAMTool, Gerber):
         # Get source object.
         try:
             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)
             return "Could not retrieve object: %s" % self.obj_name
 
         # Prepare non-copper polygons
         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:
             self.app.inform.emit(_("[ERROR_NOTCL] No Gerber file available."))
             return
@@ -679,7 +683,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
             empty = MultiPolygon([empty])
 
         # clear non copper using standard algorithm
-        if clearing_method == False:
+        if clearing_method is False:
             self.clear_non_copper(
                 empty=empty,
                 over=over,
@@ -736,7 +740,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 area = empty.buffer(-offset)
                 try:
                     area = area.difference(cleared)
-                except:
+                except Exception as e:
                     continue
 
                 # Transform area to MultiPolygon
@@ -758,8 +762,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                                                              overlap=over, contour=contour, connect=connect)
                                 if cp:
                                     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
                                 continue
 
@@ -850,7 +854,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 tool = sorted_tools.pop(0)
                 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[:] = []
 
                 # Area to clear
@@ -973,4 +977,3 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
     def reset_fields(self):
         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:
                 self.parsing_promises.remove(short_name)
                 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)
 
     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)):
 
-            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.'))
                 return
             # Register recent file
@@ -300,7 +300,7 @@ class ToolPDF(FlatCAMTool):
                             global_clear_geo.append(geo_el['clear'])
 
                 if global_clear_geo:
-                    solid= []
+                    solid = []
                     for apid in grb_obj.apertures:
                         if 'geometry' in grb_obj.apertures[apid]:
                             for elem in grb_obj.apertures[apid]['geometry']:
@@ -360,7 +360,7 @@ class ToolPDF(FlatCAMTool):
 
         try:
             self.check_thread.stop()
-        except:
+        except Exception as e:
             pass
 
         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
         # 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
         flag_clear_geo = False
@@ -681,10 +681,8 @@ class ToolPDF(FlatCAMTool):
                 current_subpath = 'rectangle'
                 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]
-                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)
                 pt2 = (x+width, y)
                 pt3 = (x+width, y+height)
@@ -758,7 +756,8 @@ class ToolPDF(FlatCAMTool):
                         for subp in path['lines']:
                             geo = copy(subp)
                             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)
                             except ValueError:
                                 pass

+ 108 - 104
flatcamTools/ToolPaint.py

@@ -7,14 +7,14 @@
 # ########################################################## ##
 
 from FlatCAMTool import FlatCAMTool
-from copy import copy,deepcopy
+from copy import copy, deepcopy
 from ObjectCollection import *
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -65,11 +65,11 @@ class ToolPaint(FlatCAMTool, Gerber):
         form_layout.addRow(self.object_label, self.object_combo)
         form_layout.addRow(e_lab_0)
 
-        #### Tools ## ##
+        # ### Tools ## ##
         self.tools_table_label = QtWidgets.QLabel('<b>%s</b>' % _('Tools Table'))
         self.tools_table_label.setToolTip(
             _("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)
 
@@ -84,33 +84,33 @@ class ToolPaint(FlatCAMTool, Gerber):
 
         self.tools_table.horizontalHeaderItem(0).setToolTip(
             _("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(
             _("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(
             _("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.tools_box.addWidget(self.empty_label)
 
-        #### Add a new Tool ## ##
+        # ### Add a new Tool ## ##
         hlay = QtWidgets.QHBoxLayout()
         self.tools_box.addLayout(hlay)
 
@@ -131,7 +131,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn.setToolTip(
             _("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')
@@ -143,12 +143,12 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
         self.deltool_btn.setToolTip(
             _("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.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.tools_box.addWidget(self.empty_label_0)
@@ -177,8 +177,8 @@ class ToolPaint(FlatCAMTool, Gerber):
         marginlabel = QtWidgets.QLabel(_('Margin:'))
         marginlabel.setToolTip(
             _("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)
         self.paintmargin_entry = FCEntry()
@@ -188,15 +188,15 @@ class ToolPaint(FlatCAMTool, Gerber):
         methodlabel = QtWidgets.QLabel(_('Method:'))
         methodlabel.setToolTip(
             _("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)
         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)
         grid3.addWidget(self.paintmethod_combo, 3, 1)
 
@@ -204,7 +204,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         pathconnectlabel = QtWidgets.QLabel(_("Connect:"))
         pathconnectlabel.setToolTip(
             _("Draw lines between resulting\n"
-            "segments to minimize tool lifts.")
+              "segments to minimize tool lifts.")
         )
         grid3.addWidget(pathconnectlabel, 4, 0)
         self.pathconnect_cb = FCCheckBox()
@@ -213,7 +213,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         contourlabel = QtWidgets.QLabel(_("Contour:"))
         contourlabel.setToolTip(
             _("Cut around the perimeter of the polygon\n"
-            "to trim rough edges.")
+              "to trim rough edges.")
         )
         grid3.addWidget(contourlabel, 5, 0)
         self.paintcontour_cb = FCCheckBox()
@@ -222,12 +222,12 @@ class ToolPaint(FlatCAMTool, Gerber):
         restlabel = QtWidgets.QLabel(_("Rest M.:"))
         restlabel.setToolTip(
             _("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)
         self.rest_cb = FCCheckBox()
@@ -237,15 +237,15 @@ class ToolPaint(FlatCAMTool, Gerber):
         selectlabel = QtWidgets.QLabel(_('Selection:'))
         selectlabel.setToolTip(
             _("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 = QtWidgets.QGridLayout()
         self.selectmethod_combo = RadioSet([
-            {"label": "Single", "value": "single"},
-            {"label": "All", "value": "all"},
+            {"label": _("Single"), "value": "single"},
+            {"label": _("All"), "value": "all"},
             # {"label": "Rectangle", "value": "rectangle"}
         ])
         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.setToolTip(
             _("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)
 
@@ -314,7 +314,6 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.generate_paint_button.clicked.connect(self.on_paint_button_click)
         self.selectmethod_combo.activated_custom.connect(self.on_radio_selection)
 
-
     def install(self, icon=None, separator=None, **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)
 
         # 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)
 
     def build_ui(self):
@@ -522,8 +521,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
         try:
             self.tools_table.itemChanged.disconnect()
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolPaint.on_tool_add() --> %s" % str(e))
 
         if dia:
             tool_dia = dia
@@ -586,10 +585,12 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.build_ui()
 
     def on_tool_edit(self):
+        old_tool_dia = ''
+
         try:
             self.tools_table.itemChanged.disconnect()
-        except:
-            pass
+        except Exception as e:
+            log.debug("ToolPaint.on_tool_edit() --> %s" % str(e))
 
         tool_dias = []
         for k, v in self.paint_tools.items():
@@ -624,7 +625,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                         break
                 restore_dia_item = self.tools_table.item(row, 1)
                 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()
 
     # 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):
         try:
             self.tools_table.itemChanged.disconnect()
-        except:
+        except Exception as e:
+            log.debug("ToolPaint.on_tool_delete() --> %s" % str(e))
             pass
 
         deleted_tools_list = []
@@ -741,12 +744,12 @@ class ToolPaint(FlatCAMTool, Gerber):
                 overlap = float(self.paintoverlap_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         if overlap >= 1 or overlap < 0:
             self.app.inform.emit(_("[ERROR_NOTCL] Overlap value must be between "
-                                  "0 (inclusive) and 1 (exclusive), "))
+                                   "0 (inclusive) and 1 (exclusive), "))
             return
 
         self.app.inform.emit(_("[WARNING_NOTCL] Click inside the desired polygon."))
@@ -760,7 +763,8 @@ class ToolPaint(FlatCAMTool, Gerber):
         # Get source object.
         try:
             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)
             return
 
@@ -774,7 +778,7 @@ class ToolPaint(FlatCAMTool, Gerber):
             self.app.inform.emit(_("[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..."))
             return 'Fail'
 
-        o_name = '%s_multitool_paint' % (self.obj_name)
+        o_name = '%s_multitool_paint' % self.obj_name
 
         if select_method == "all":
             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_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.
 
         Note:
             * The margin is taken directly from the form.
-
+        :param obj: painted object
         :param inside_pt: [x, y]
         :param tooldia: Diameter of the painting tool
         :param overlap: Overlap of the tool between passes.
@@ -864,34 +866,34 @@ class ToolPaint(FlatCAMTool, Gerber):
             def paint_p(polyg):
                 if paint_method == "seed":
                     # 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":
                     # 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:
                     # 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:
                     self.app.inform.emit(_('[ERROR_NOTCL] Geometry could not be painted completely'))
                     return None
@@ -975,12 +977,11 @@ class ToolPaint(FlatCAMTool, Gerber):
         # Background
         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.
 
-        :param tooldia:
+        :param obj: painted object
         :param overlap:
         :param outname:
         :param connect: Connect lines to avoid tool lifts.
@@ -1055,6 +1056,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         def gen_paintarea(geo_obj, app_obj):
             assert isinstance(geo_obj, FlatCAMGeometry), \
                 "Initializer expected a FlatCAMGeometry, got %s" % type(geo_obj)
+            tool_dia = None
 
             sorted_tools = []
             for row in range(self.tools_table.rowCount()):
@@ -1083,7 +1085,7 @@ class ToolPaint(FlatCAMTool, Gerber):
 
                 for geo in recurse(obj.solid_geometry):
                     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):
                             continue
                         poly_buf = geo.buffer(-paint_margin)
@@ -1109,11 +1111,11 @@ class ToolPaint(FlatCAMTool, Gerber):
                         else:
                             # Type(cp) == FlatCAMRTreeStorage | None
                             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:
                             total_geometry += list(cp.get_objects())
@@ -1121,7 +1123,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                         log.debug("Could not Paint the polygons. %s" % str(e))
                         self.app.inform.emit(
                             _("[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
 
                 # 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), \
                 "Initializer expected a FlatCAMGeometry, got %s" % type(geo_obj)
 
+            tool_dia = None
             sorted_tools = []
             for row in range(self.tools_table.rowCount()):
                 sorted_tools.append(float(self.tools_table.item(row, 1).text()))
@@ -1184,12 +1187,13 @@ class ToolPaint(FlatCAMTool, Gerber):
                     try:
                         geo = Polygon(geo) if not isinstance(geo, Polygon) else geo
                         poly_buf = geo.buffer(-paint_margin)
+                        cp = None
 
                         if paint_method == "standard":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             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":
                             # Type(cp) == FlatCAMRTreeStorage | None
@@ -1200,8 +1204,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                         elif paint_method == "lines":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             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:
                             cleared_geo += list(cp.get_objects())
@@ -1210,7 +1214,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                         log.debug("Could not Paint the polygons. %s" % str(e))
                         self.app.inform.emit(
                             _("[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
 
                 # 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
             if has_solid_geo == 0:
                 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
 
             # Experimental...

+ 5 - 5
flatcamTools/ToolPanelize.py

@@ -81,8 +81,8 @@ class Panelize(FlatCAMTool):
         self.layout.addLayout(form_layout)
 
         # 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.setToolTip(
             _("Choose the reference for panelization:\n"
@@ -178,8 +178,8 @@ class Panelize(FlatCAMTool):
         form_layout.addRow(QtWidgets.QLabel(""))
 
         # 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.setToolTip(
             _("Choose the type of object for the panel object:\n"
@@ -269,7 +269,7 @@ class Panelize(FlatCAMTool):
         FlatCAMTool.run(self)
         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):
         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 FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -56,9 +56,8 @@ class PcbWizard(FlatCAMTool):
 
         self.excellon_label = QtWidgets.QLabel(_("Excellon file:"))
         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"))
         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.setToolTip(
             _("Load the INF file.")
-
         )
         self.inf_btn = FCButton(_("Open"))
         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_label = QtWidgets.QLabel(_("Int. digits:"))
         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)
 
@@ -110,9 +108,9 @@ class PcbWizard(FlatCAMTool):
         form_layout1.addRow(self.frac_label, self.frac_entry)
 
         # 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.setToolTip(
             _("The type of zeros suppression used.\n"
@@ -124,8 +122,8 @@ class PcbWizard(FlatCAMTool):
         form_layout1.addRow(self.zeros_label, self.zeros_radio)
 
         # 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.setToolTip(
             _("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()")
 
-        filter = "Excellon Files(*.DRL *.DRD *.TXT);;All Files (*.*)"
+        _filter = "Excellon Files(*.DRL *.DRD *.TXT);;All Files (*.*)"
         try:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"),
                                                                  directory=self.app.get_last_folder(),
-                                                                 filter=filter)
+                                                                 filter=_filter)
         except TypeError:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"),
-                                                                 filter=filter)
+                                                                 filter=_filter)
 
         filename = str(filename)
 
-
         if filename == "":
             self.app.inform.emit(_("Open cancelled."))
         else:
@@ -307,14 +304,14 @@ class PcbWizard(FlatCAMTool):
                 """
         self.app.log.debug("on_load_inf_click()")
 
-        filter = "INF Files(*.INF);;All Files (*.*)"
+        _filter = "INF Files(*.INF);;All Files (*.*)"
         try:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"),
                                                                  directory=self.app.get_last_folder(),
-                                                                 filter=filter)
+                                                                 filter=_filter)
         except TypeError:
             filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"),
-                                                                 filter=filter)
+                                                                 filter=_filter)
 
         filename = str(filename)
 
@@ -338,7 +335,7 @@ class PcbWizard(FlatCAMTool):
 
             match = tool_re.search(eline)
             if match:
-                tool =int( match.group(1))
+                tool = int(match.group(1))
                 dia = float(match.group(2))
                 # if dia < 0.1:
                 #     # most likely the file is in INCH
@@ -396,7 +393,7 @@ class PcbWizard(FlatCAMTool):
                               (str(self.app.version), str(self.app.version_date))
                     header += ';Created on : %s' % time_str + '\n'
                     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)
                     for k, v in self.tools_from_inf.items():
                         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.progress.emit(0)
                 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 += app_obj.traceback.format_exc()
                 app_obj.inform.emit(msg)
@@ -449,8 +447,8 @@ class PcbWizard(FlatCAMTool):
                     # Object name
                     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.'))
                         return
 

+ 14 - 6
flatcamTools/ToolProperties.py

@@ -13,9 +13,9 @@ from FlatCAMObj import *
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -49,7 +49,7 @@ class Properties(FlatCAMTool):
         self.properties_box.addWidget(title_label)
 
         # 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()
 
@@ -62,7 +62,7 @@ class Properties(FlatCAMTool):
         self.treeWidget.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Expanding)
 
         self.vlay.addWidget(self.treeWidget)
-        self.vlay.setStretch(0,0)
+        self.vlay.setStretch(0, 0)
 
     def run(self, toggle=True):
         self.app.report_usage("ToolProperties()")
@@ -130,9 +130,14 @@ class Properties(FlatCAMTool):
 
         self.addChild(obj_type, ['Object Type:', ('%s' % (obj.kind.capitalize()))], True)
         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:
-            pass
+            log.debug("Properties.addItems() --> %s" % str(e))
 
         self.addChild(obj_name, [obj.options['name']])
 
@@ -163,7 +168,10 @@ class Properties(FlatCAMTool):
                            'in': 'Inch',
                            '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:
             if option is 'name':

+ 1 - 1
flatcamTools/ToolShell.py

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

+ 67 - 64
flatcamTools/ToolSolderPaste.py

@@ -26,9 +26,9 @@ from io import StringIO
 
 import gettext
 import FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -66,11 +66,11 @@ class SolderPaste(FlatCAMTool):
         )
         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.setToolTip(
             _("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)
 
@@ -85,16 +85,16 @@ class SolderPaste(FlatCAMTool):
 
         self.tools_table.horizontalHeaderItem(0).setToolTip(
             _("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(
-           _( "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()
         self.layout.addLayout(hlay_tools)
 
@@ -115,13 +115,13 @@ class SolderPaste(FlatCAMTool):
         self.addtool_btn = QtWidgets.QPushButton(_('Add'))
         self.addtool_btn.setToolTip(
             _("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.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"))
@@ -142,10 +142,10 @@ class SolderPaste(FlatCAMTool):
         step1_lbl = QtWidgets.QLabel("<b>%s:</b>" % _('STEP 1:'))
         step1_lbl.setToolTip(
             _("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"
-                                                 "Modify parameters."))
+                                                   "Modify parameters."))
 
         grid0_1.addWidget(step1_lbl, 0, 0, alignment=Qt.AlignTop)
         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.setToolTip(
             _("The height (Z) when doing solder paste dispensing.")
-
         )
         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_label = QtWidgets.QLabel(_("Z Travel:"))
         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)
 
@@ -199,7 +198,7 @@ class SolderPaste(FlatCAMTool):
         self.z_toolchange_entry = FCEntry()
         self.z_toolchange_label = QtWidgets.QLabel(_("Z Toolchange:"))
         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)
 
@@ -208,7 +207,7 @@ class SolderPaste(FlatCAMTool):
         self.xy_toolchange_label = QtWidgets.QLabel(_("XY Toolchange:"))
         self.xy_toolchange_label.setToolTip(
             _("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)
 
@@ -216,7 +215,7 @@ class SolderPaste(FlatCAMTool):
         self.frxy_entry = FCEntry()
         self.frxy_label = QtWidgets.QLabel(_("Feedrate X-Y:"))
         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)
 
@@ -225,7 +224,7 @@ class SolderPaste(FlatCAMTool):
         self.frz_label = QtWidgets.QLabel(_("Feedrate Z:"))
         self.frz_label.setToolTip(
             _("Feedrate (speed) while moving vertically\n"
-            "(on Z plane).")
+              "(on Z plane).")
         )
         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_label = QtWidgets.QLabel(_("Feedrate Z Dispense:"))
         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)
 
@@ -242,8 +241,8 @@ class SolderPaste(FlatCAMTool):
         self.speedfwd_entry = FCEntry()
         self.speedfwd_label = QtWidgets.QLabel(_("Spindle Speed FWD:"))
         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)
 
@@ -259,8 +258,8 @@ class SolderPaste(FlatCAMTool):
         self.speedrev_entry = FCEntry()
         self.speedrev_label = QtWidgets.QLabel(_("Spindle Speed REV:"))
         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)
 
@@ -269,7 +268,7 @@ class SolderPaste(FlatCAMTool):
         self.dwellrev_label = QtWidgets.QLabel(_("Dwell REV:"))
         self.dwellrev_label.setToolTip(
             _("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)
 
@@ -289,8 +288,8 @@ class SolderPaste(FlatCAMTool):
 
         self.solder_gcode_btn = QtWidgets.QPushButton(_("Generate GCode"))
         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()
@@ -300,7 +299,6 @@ class SolderPaste(FlatCAMTool):
         self.generation_box.setContentsMargins(0, 0, 0, 0)
         self.generation_frame.setLayout(self.generation_box)
 
-
         # ## Buttons
         grid2 = QtWidgets.QGridLayout()
         self.generation_box.addLayout(grid2)
@@ -308,7 +306,7 @@ class SolderPaste(FlatCAMTool):
         step2_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 2:'))
         step2_lbl.setToolTip(
             _("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(self.soldergeo_btn, 0, 2)
@@ -325,9 +323,9 @@ class SolderPaste(FlatCAMTool):
 
         self.geo_object_label = QtWidgets.QLabel(_("Geo Result:"))
         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)
 
@@ -336,11 +334,11 @@ class SolderPaste(FlatCAMTool):
 
         step3_lbl = QtWidgets.QLabel("<b>%s</b>" % _('STEP 3:'))
         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)
@@ -358,10 +356,10 @@ class SolderPaste(FlatCAMTool):
 
         self.cnc_object_label = QtWidgets.QLabel(_("CNC Result:"))
         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)
 
@@ -371,19 +369,19 @@ class SolderPaste(FlatCAMTool):
         self.solder_gcode_view_btn = QtWidgets.QPushButton(_("View GCode"))
         self.solder_gcode_view_btn.setToolTip(
             _("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.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.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)
@@ -402,6 +400,7 @@ class SolderPaste(FlatCAMTool):
         self.form_fields = {}
 
         self.units = ''
+        self.name = ""
 
         # this will be used in the combobox context menu, for delete entry
         self.obj_to_be_deleted_name = ''
@@ -607,7 +606,6 @@ class SolderPaste(FlatCAMTool):
         if current_row < 0:
             current_row = 0
 
-
         # populate the form with the data from the tool associated with the row parameter
         try:
             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(',', '.'))
                 except ValueError:
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number."))
+                                           "use a number."))
                     return
             if tool_dia is None:
                 self.build_ui()
@@ -762,7 +760,8 @@ class SolderPaste(FlatCAMTool):
                 return
 
         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
 
         # 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(',', '.'))
                 except ValueError:
                     self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number."))
+                                           "use a number."))
                     return
 
             tooluid = int(self.tools_table.item(row, 2).text())
@@ -844,7 +843,8 @@ class SolderPaste(FlatCAMTool):
                         break
                 restore_dia_item = self.tools_table.item(row, 1)
                 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()
 
     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 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
         """
         proc = self.app.proc_container.new(_("Creating Solder Paste dispensing geometry."))
@@ -1030,8 +1031,8 @@ class SolderPaste(FlatCAMTool):
 
             for tool in sorted_tools:
                 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)
                         break
 
@@ -1064,19 +1065,19 @@ class SolderPaste(FlatCAMTool):
                         round_diag_2 = round(diag_2_intersect.length, 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))
 
-                        if offset >= l / 2 or offset >= h / 2:
+                        if offset >= length / 2 or offset >= h / 2:
                             pass
                         else:
-                            if l > h:
+                            if length > h:
                                 h_half = h / 2
                                 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])
                             else:
-                                l_half = l / 2
+                                l_half = length / 2
                                 start = [(x_min + l_half), y_min]
                                 stop = [(x_min + l_half), (y_min + h)]
                                 geo = LineString([start, stop])
@@ -1151,7 +1152,8 @@ class SolderPaste(FlatCAMTool):
             return 'fail'
 
         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'
 
         a = 0
@@ -1314,7 +1316,8 @@ class SolderPaste(FlatCAMTool):
         # then append the text from GCode to the text editor
         try:
             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..."))
             return
 

+ 19 - 13
flatcamTools/ToolSub.py

@@ -155,7 +155,6 @@ class ToolSub(FlatCAMTool):
         self.sub_follow_union = None
         self.sub_clear_union = None
 
-
         self.sub_grb_obj = None
         self.sub_grb_obj_name = None
         self.target_grb_obj = None
@@ -172,16 +171,18 @@ class ToolSub(FlatCAMTool):
         # store here the options from target_obj
         self.target_options = {}
 
+        self.sub_union = []
+
         try:
             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)
 
         try:
             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)
 
     def install(self, icon=None, separator=None, **kwargs):
@@ -233,7 +234,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         try:
             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)
             return "Could not retrieve object: %s" % self.target_grb_obj_name
 
@@ -245,7 +247,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         try:
             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)
             return "Could not retrieve object: %s" % self.sub_grb_obj_name
 
@@ -424,7 +427,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         try:
             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)
             return "Could not retrieve object: %s" % self.target_grb_obj_name
 
@@ -436,7 +440,8 @@ class ToolSub(FlatCAMTool):
         # Get source object.
         try:
             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)
             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)
                     for tool in geo_obj.tools:
                         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 ...")):
             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))
 
-
         try:
             if not self.promises:
                 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.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 FlatCAMTranslation as fcTranslate
+import builtins
 
 fcTranslate.apply_language('strings')
-import builtins
 if '_' not in builtins.__dict__:
     _ = gettext.gettext
 
@@ -68,9 +68,9 @@ class ToolTransform(FlatCAMTool):
         self.rotate_label = QtWidgets.QLabel(_("Angle:"))
         self.rotate_label.setToolTip(
             _("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)
 
@@ -82,8 +82,8 @@ class ToolTransform(FlatCAMTool):
         self.rotate_button.set_value(_("Rotate"))
         self.rotate_button.setToolTip(
             _("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)
 
@@ -107,7 +107,7 @@ class ToolTransform(FlatCAMTool):
         self.skewx_label = QtWidgets.QLabel(_("Angle X:"))
         self.skewx_label.setToolTip(
             _("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_entry = FCEntry()
@@ -118,14 +118,14 @@ class ToolTransform(FlatCAMTool):
         self.skewx_button.set_value(_("Skew X"))
         self.skewx_button.setToolTip(
             _("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.skewy_label = QtWidgets.QLabel(_("Angle Y:"))
         self.skewy_label.setToolTip(
             _("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_entry = FCEntry()
@@ -136,8 +136,8 @@ class ToolTransform(FlatCAMTool):
         self.skewy_button.set_value(_("Skew Y"))
         self.skewy_button.setToolTip(
             _("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)
 
         form1_child_1.addWidget(self.skewx_entry)
@@ -174,8 +174,8 @@ class ToolTransform(FlatCAMTool):
         self.scalex_button.set_value(_("Scale X"))
         self.scalex_button.setToolTip(
             _("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.scaley_label = QtWidgets.QLabel(_("Factor Y:"))
@@ -191,8 +191,8 @@ class ToolTransform(FlatCAMTool):
         self.scaley_button.set_value(_("Scale Y"))
         self.scaley_button.setToolTip(
             _("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.scale_link_cb = FCCheckBox()
@@ -200,7 +200,7 @@ class ToolTransform(FlatCAMTool):
         self.scale_link_cb.setText(_("Link"))
         self.scale_link_cb.setToolTip(
             _("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_zero_ref_cb = FCCheckBox()
@@ -208,9 +208,9 @@ class ToolTransform(FlatCAMTool):
         self.scale_zero_ref_cb.setText(_("Scale Reference"))
         self.scale_zero_ref_cb.setToolTip(
             _("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_button)
@@ -248,8 +248,8 @@ class ToolTransform(FlatCAMTool):
         self.offx_button.set_value(_("Offset X"))
         self.offx_button.setToolTip(
             _("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.offy_label = QtWidgets.QLabel(_("Value Y:"))
@@ -265,8 +265,8 @@ class ToolTransform(FlatCAMTool):
         self.offy_button.set_value(_("Offset Y"))
         self.offy_button.setToolTip(
             _("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)
 
         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.setToolTip(
             _("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)
 
@@ -303,7 +303,7 @@ class ToolTransform(FlatCAMTool):
         self.flipy_button.set_value(_("Flip on Y"))
         self.flipy_button.setToolTip(
             _("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)
 
@@ -312,21 +312,21 @@ class ToolTransform(FlatCAMTool):
         self.flip_ref_cb.setText(_("Ref Pt"))
         self.flip_ref_cb.setToolTip(
             _("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_label = QtWidgets.QLabel(_("Point:"))
         self.flip_ref_label.setToolTip(
             _("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_entry = EvalEntry2("(0, 0)")
@@ -337,8 +337,8 @@ class ToolTransform(FlatCAMTool):
         self.flip_ref_button.set_value(_("Add"))
         self.flip_ref_button.setToolTip(
             _("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)
 
         form4_child_hlay.addStretch()
@@ -350,8 +350,7 @@ class ToolTransform(FlatCAMTool):
 
         form4_layout.addRow(self.flip_ref_cb)
         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()
 
@@ -455,7 +454,7 @@ class ToolTransform(FlatCAMTool):
         if self.app.defaults["tools_transform_mirror_point"]:
             self.flip_ref_entry.set_value(self.app.defaults["tools_transform_mirror_point"])
         else:
-            self.flip_ref_entry.set_value((0,0))
+            self.flip_ref_entry.set_value((0, 0))
 
     def on_rotate(self):
         try:
@@ -466,10 +465,10 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.rotate_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
-                                     "use a number."))
+                                       "use a number."))
                 return
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
-                                       'params': [value]})
+                                   'params': [value]})
         # self.on_rotate_action(value)
         return
 
@@ -500,7 +499,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.skewx_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         # self.on_skew("X", value)
@@ -518,7 +517,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.skewy_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         # self.on_skew("Y", value)
@@ -536,7 +535,7 @@ class ToolTransform(FlatCAMTool):
                 xvalue = float(self.scalex_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale X, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         # 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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale Y, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         # 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(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         # self.on_offset("X", value)
@@ -617,7 +616,7 @@ class ToolTransform(FlatCAMTool):
                 value = float(self.offy_entry.get_value().replace(',', '.'))
             except ValueError:
                 self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
-                                     "use a number."))
+                                       "use a number."))
                 return
 
         # self.on_offset("Y", value)

BIN
locale/de/LC_MESSAGES/strings.mo


Разница между файлами не показана из-за своего большого размера
+ 215 - 185
locale/de/LC_MESSAGES/strings.po


BIN
locale/en/LC_MESSAGES/strings.mo


Разница между файлами не показана из-за своего большого размера
+ 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


Разница между файлами не показана из-за своего большого размера
+ 391 - 225
locale/pt_BR/LC_MESSAGES/strings.po


BIN
locale/ro/LC_MESSAGES/strings.mo


Разница между файлами не показана из-за своего большого размера
+ 217 - 187
locale/ro/LC_MESSAGES/strings.po


BIN
locale/ru/LC_MESSAGES/strings.mo


Разница между файлами не показана из-за своего большого размера
+ 220 - 191
locale/ru/LC_MESSAGES/strings.po


Разница между файлами не показана из-за своего большого размера
+ 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):
         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 = ''
 
@@ -68,7 +68,7 @@ class Paste_1(FlatCAMPostProc_Tools):
 
     def toolchange_code(self, p):
         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 = ''
 
         if toolchangexy is not None:
@@ -119,7 +119,7 @@ M0
         return ('G01 ' + self.position_code(p)).format(**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")
 
         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 python3-gdal
 apt-get install python3-lxml
-easy_install3 -U distribute
 pip3 install --upgrade dill
 pip3 install --upgrade Shapely
 pip3 install --upgrade vispy

BIN
share/markarea32.png


+ 5 - 2
tclCommands/TclCommandCutout.py

@@ -1,5 +1,7 @@
 from ObjectCollection import *
 from tclCommands.TclCommand import TclCommand
+from shapely.ops import cascaded_union
+from shapely.geometry import LineString
 
 
 class TclCommandCutout(TclCommand):
@@ -81,11 +83,12 @@ class TclCommandCutout(TclCommand):
 
         try:
             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
 
         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
 
             minx, miny, maxx, maxy = obj.bounds()

+ 8 - 4
tclCommands/TclCommandGeoCutout.py

@@ -1,11 +1,15 @@
 from ObjectCollection import *
 from tclCommands.TclCommand import TclCommandSignaled
 from copy import deepcopy
+from shapely.ops import cascaded_union
+from shapely.geometry import Polygon, LineString, LinearRing
 
 
 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:
 
@@ -66,9 +70,9 @@ class TclCommandGeoCutout(TclCommandSignaled):
         :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):
             pts = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]

Некоторые файлы не были показаны из-за большого количества измененных файлов