From 84f3166e2f759a51e454fe39a70378c0b8752d7f Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 13 Apr 2019 22:56:46 +0300 Subject: [PATCH 01/42] - Gerber Editor: Remade the processing of 'clear_geometry' (geometry generated by polygons made with Gerber LPC command) to work if more than one such polygon exists --- FlatCAMApp.py | 4 ++-- README.md | 4 ++++ camlib.py | 16 +++++++++------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 123dc481..2787a485 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -94,8 +94,8 @@ class App(QtCore.QObject): log.addHandler(handler) # Version - version = 8.913 - version_date = "2019/04/13" + version = 8.914 + version_date = "2019/04/20" beta = True # current date now diff --git a/README.md b/README.md index f99f17da..0787fea9 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +14.04.2019 + +- Gerber Editor: Remade the processing of 'clear_geometry' (geometry generated by polygons made with Gerber LPC command) to work if more than one such polygon exists + 13.04.2019 - updating the German translation diff --git a/camlib.py b/camlib.py index 16eddd60..c732b8a1 100644 --- a/camlib.py +++ b/camlib.py @@ -3183,16 +3183,18 @@ class Gerber (Geometry): temp_geo = [] for apid in self.apertures: if 'clear_geometry' in self.apertures[apid]: - for clear_geo in self.apertures[apid]['clear_geometry']: - for solid_geo in self.apertures[apid]['solid_geometry']: - if solid_geo.intersects(clear_geo): - res_geo = clear_geo.symmetric_difference(solid_geo) - temp_geo.append(res_geo) - else: - temp_geo.append(solid_geo) + clear_geo = cascaded_union(self.apertures[apid]['clear_geometry']) + for solid_geo in self.apertures[apid]['solid_geometry']: + if clear_geo.intersects(solid_geo): + res_geo = clear_geo.symmetric_difference(solid_geo) + temp_geo.append(res_geo) + else: + temp_geo.append(solid_geo) self.apertures[apid]['solid_geometry'] = deepcopy(temp_geo) self.apertures[apid].pop('clear_geometry', None) + + # --- Apply buffer --- # this treats the case when we are storing geometry as paths self.follow_geometry = follow_buffer From 0fdd2e4f7c9bd156c5381026717e155c88be7251 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 13 Apr 2019 23:47:02 +0300 Subject: [PATCH 02/42] - Gerber Editor: a disabled/enabled sequence for the VisPy cursor on Gerber edit make the graphics better --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0787fea9..778459f5 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 14.04.2019 - Gerber Editor: Remade the processing of 'clear_geometry' (geometry generated by polygons made with Gerber LPC command) to work if more than one such polygon exists +- Gerber Editor: a disabled/enabled sequence for the VisPy cursor on Gerber edit make the graphics better 13.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 7ec59756..6e384223 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -2572,10 +2572,15 @@ class FlatCAMGrbEditor(QtCore.QObject): self.plot_thread.stop() self.set_ui() - # now that we hava data, create the GUI interface and add it to the Tool Tab + # now that we have data, create the GUI interface and add it to the Tool Tab self.build_ui() - self.plot_all() + + # HACK: enabling/disabling the cursor seams to somehow update the shapes making them more 'solid' + # - perhaps is a bug in VisPy implementation + self.app.app_cursor.enabled = False + self.app.app_cursor.enabled = True + log.debug("FlatCAMGrbEditor --> delayed_plot finished") except Exception: traceback.print_exc() From 4100e98ebef835b6d61e484efdd85134c8f11136 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 14 Apr 2019 01:03:42 +0300 Subject: [PATCH 03/42] - Gerber Editor: some more changes in processing LPC polygons --- camlib.py | 4 ++-- flatcamEditors/FlatCAMGrbEditor.py | 34 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/camlib.py b/camlib.py index c732b8a1..b3dffb83 100644 --- a/camlib.py +++ b/camlib.py @@ -3183,10 +3183,10 @@ class Gerber (Geometry): temp_geo = [] for apid in self.apertures: if 'clear_geometry' in self.apertures[apid]: - clear_geo = cascaded_union(self.apertures[apid]['clear_geometry']) + clear_geo = MultiPolygon(self.apertures[apid]['clear_geometry']) for solid_geo in self.apertures[apid]['solid_geometry']: if clear_geo.intersects(solid_geo): - res_geo = clear_geo.symmetric_difference(solid_geo) + res_geo = solid_geo.difference(clear_geo) temp_geo.append(res_geo) else: temp_geo.append(solid_geo) diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 6e384223..63dcc31d 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -1292,6 +1292,9 @@ class FlatCAMGrbEditor(QtCore.QObject): # this var will store the state of the toolbar before starting the editor self.toolbar_old_state = False + # holds flattened geometry + self.flat_geometry = [] + # Init GUI self.apdim_lbl.hide() self.apdim_entry.hide() @@ -1927,6 +1930,37 @@ class FlatCAMGrbEditor(QtCore.QObject): self.shapes.clear(update=True) self.tool_shape.clear(update=True) + def flatten(self, geometry=None, reset=True, pathonly=False): + """ + Creates a list of non-iterable linear geometry objects. + Polygons are expanded into its exterior pathonly param if specified. + + Results are placed in flat_geometry + + :param geometry: Shapely type or list or list of list of such. + :param reset: Clears the contents of self.flat_geometry. + :param pathonly: Expands polygons into linear elements from the exterior attribute. + """ + + if reset: + self.flat_geometry = [] + ## If iterable, expand recursively. + try: + for geo in geometry: + if geo is not None: + self.flatten(geometry=geo, reset=False, pathonly=pathonly) + + ## Not iterable, do the actual indexing and add. + except TypeError: + if pathonly and type(geometry) == Polygon: + self.flat_geometry.append(geometry.exterior) + self.flatten(geometry=geometry.interiors, + reset=False, + pathonly=True) + else: + self.flat_geometry.append(geometry) + return self.flat_geometry + def edit_fcgerber(self, orig_grb_obj): """ Imports the geometry found in self.apertures from the given FlatCAM Gerber object From 081231aca47f7464a4d3678ac3ac4f4fb5acc05a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 14 Apr 2019 02:10:31 +0300 Subject: [PATCH 04/42] - Editors: activated an old function that was no longer active: each tool can have it's own set of shortcut keys, the Editor general shortcut keys that are letters are overridden - Gerber and Geometry editors, when using the Backspace keys for certain tools, they will backtrack one point but now the utility geometry is immediately updated --- README.md | 2 + flatcamEditors/FlatCAMGeoEditor.py | 22 +- flatcamEditors/FlatCAMGrbEditor.py | 14 +- flatcamGUI/FlatCAMGUI.py | 466 +++++++++++++++-------------- 4 files changed, 264 insertions(+), 240 deletions(-) diff --git a/README.md b/README.md index 778459f5..4bba0199 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: Remade the processing of 'clear_geometry' (geometry generated by polygons made with Gerber LPC command) to work if more than one such polygon exists - Gerber Editor: a disabled/enabled sequence for the VisPy cursor on Gerber edit make the graphics better +- Editors: activated an old function that was no longer active: each tool can have it's own set of shortcut keys, the Editor general shortcut keys that are letters are overridden +- Gerber and Geometry editors, when using the Backspace keys for certain tools, they will backtrack one point but now the utility geometry is immediately updated 13.04.2019 diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index a3d26f0d..987c22a9 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -2003,18 +2003,18 @@ class FCArc(FCShapeTool): return "" def on_key(self, key): - if key == 'o': + if key == 'D' or key == QtCore.Qt.Key_D: self.direction = 'cw' if self.direction == 'ccw' else 'ccw' - return 'Direction: ' + self.direction.upper() + return _('Direction: %s') % self.direction.upper() - if key == 'p': + if key == 'M' or key == QtCore.Qt.Key_M: if self.mode == 'c12': self.mode = '12c' elif self.mode == '12c': self.mode = '132' else: self.mode = 'c12' - return 'Mode: ' + self.mode + return _('Mode: %s') % self.mode def utility_geometry(self, data=None): if len(self.points) == 1: # Show the radius @@ -2233,9 +2233,14 @@ class FCPolygon(FCShapeTool): self.draw_app.app.inform.emit(_("[success] Done. Polygon completed.")) def on_key(self, key): - if key == 'backspace': + if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: self.points = self.points[0:-1] + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + return _("Backtracked one point ...") class FCPath(FCPolygon): @@ -2260,9 +2265,14 @@ class FCPath(FCPolygon): return None def on_key(self, key): - if key == 'backspace': + if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: self.points = self.points[0:-1] + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + return _("Backtracked one point ...") class FCSelect(DrawTool): diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 63dcc31d..58d78d3a 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -527,9 +527,14 @@ class FCRegion(FCShapeTool): self.draw_app.plot_all() def on_key(self, key): - if key == 'backspace': + if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: self.points = self.points[0:-1] + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + return _("Backtracked one point ...") class FCTrack(FCRegion): @@ -560,9 +565,14 @@ class FCTrack(FCRegion): return None def on_key(self, key): - if key == 'backspace': + if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: self.points = self.points[0:-1] + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + return _("Backtracked one point ...") class FCScale(FCShapeTool): diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 9ad13b1b..8e4c038d 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -1952,6 +1952,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # events from Vispy are of type KeyEvent else: key = event.key + + # Propagate to tool + response = None + if self.app.call_source == 'app': if modifiers == QtCore.Qt.ControlModifier: if key == QtCore.Qt.Key_A: @@ -2380,132 +2384,130 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_3 or key == '3': self.app.on_select_tab('tool') - # Arc Tool - if key == QtCore.Qt.Key_A or key == 'A': - self.app.geo_editor.select_tool('arc') - - # Buffer - if key == QtCore.Qt.Key_B or key == 'B': - self.app.geo_editor.select_tool('buffer') - - # Copy - if key == QtCore.Qt.Key_C or key == 'C': - self.app.geo_editor.on_copy_click() - - # Substract Tool - if key == QtCore.Qt.Key_E or key == 'E': - if self.app.geo_editor.get_selected() is not None: - self.app.geo_editor.intersection() - else: - msg = _("Please select geometry items \n" \ - "on which to perform Intersection Tool.") - - messagebox = QtWidgets.QMessageBox() - messagebox.setText(msg) - messagebox.setWindowTitle(_("Warning")) - messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) - messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) - messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) - messagebox.exec_() - - # Grid Snap - if key == QtCore.Qt.Key_G or key == 'G': - self.app.ui.grid_snap_btn.trigger() - - # make sure that the cursor shape is enabled/disabled, too - if self.app.geo_editor.options['grid_snap'] is True: - self.app.app_cursor.enabled = True - else: - self.app.app_cursor.enabled = False - - # Paint - if key == QtCore.Qt.Key_I or key == 'I': - self.app.geo_editor.select_tool('paint') - - # Jump to coords - if key == QtCore.Qt.Key_J or key == 'J': - self.app.on_jump_to() - - # Corner Snap - if key == QtCore.Qt.Key_K or key == 'K': - self.app.geo_editor.on_corner_snap() - - # Move - if key == QtCore.Qt.Key_M or key == 'M': - self.app.geo_editor.on_move_click() - - # Polygon Tool - if key == QtCore.Qt.Key_N or key == 'N': - self.app.geo_editor.select_tool('polygon') - - # Circle Tool - if key == QtCore.Qt.Key_O or key == 'O': - self.app.geo_editor.select_tool('circle') - - # Path Tool - if key == QtCore.Qt.Key_P or key == 'P': - self.app.geo_editor.select_tool('path') - - # Rectangle Tool - if key == QtCore.Qt.Key_R or key == 'R': - self.app.geo_editor.select_tool('rectangle') - - # Substract Tool - if key == QtCore.Qt.Key_S or key == 'S': - if self.app.geo_editor.get_selected() is not None: - self.app.geo_editor.subtract() - else: - msg = _( - "Please select geometry items \n" - "on which to perform Substraction Tool.") - - messagebox = QtWidgets.QMessageBox() - messagebox.setText(msg) - messagebox.setWindowTitle(_("Warning")) - messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) - messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) - messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) - messagebox.exec_() - - # Add Text Tool - if key == QtCore.Qt.Key_T or key == 'T': - self.app.geo_editor.select_tool('text') - - # Substract Tool - if key == QtCore.Qt.Key_U or key == 'U': - if self.app.geo_editor.get_selected() is not None: - self.app.geo_editor.union() - else: - msg = _("Please select geometry items \n" - "on which to perform union.") - - messagebox = QtWidgets.QMessageBox() - messagebox.setText(msg) - messagebox.setWindowTitle(_("Warning")) - messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) - messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) - messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) - messagebox.exec_() - - if key == QtCore.Qt.Key_V or key == 'V': - self.app.on_zoom_fit(None) - - # Flip on X axis - if key == QtCore.Qt.Key_X or key == 'X': - self.app.geo_editor.transform_tool.on_flipx() - return - - # Flip on Y axis - if key == QtCore.Qt.Key_Y or key == 'Y': - self.app.geo_editor.transform_tool.on_flipy() - return - - # Propagate to tool - response = None - if self.app.geo_editor.active_tool is not None: + if self.app.geo_editor.active_tool is not None and self.geo_select_btn.isChecked() == False: response = self.app.geo_editor.active_tool.on_key(key=key) - if response is not None: - self.app.inform.emit(response) + if response is not None: + self.app.inform.emit(response) + else: + # Arc Tool + if key == QtCore.Qt.Key_A or key == 'A': + self.app.geo_editor.select_tool('arc') + + # Buffer + if key == QtCore.Qt.Key_B or key == 'B': + self.app.geo_editor.select_tool('buffer') + + # Copy + if key == QtCore.Qt.Key_C or key == 'C': + self.app.geo_editor.on_copy_click() + + # Substract Tool + if key == QtCore.Qt.Key_E or key == 'E': + if self.app.geo_editor.get_selected() is not None: + self.app.geo_editor.intersection() + else: + msg = _("Please select geometry items \n" \ + "on which to perform Intersection Tool.") + + messagebox = QtWidgets.QMessageBox() + messagebox.setText(msg) + messagebox.setWindowTitle(_("Warning")) + messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) + messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) + messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) + messagebox.exec_() + + # Grid Snap + if key == QtCore.Qt.Key_G or key == 'G': + self.app.ui.grid_snap_btn.trigger() + + # make sure that the cursor shape is enabled/disabled, too + if self.app.geo_editor.options['grid_snap'] is True: + self.app.app_cursor.enabled = True + else: + self.app.app_cursor.enabled = False + + # Paint + if key == QtCore.Qt.Key_I or key == 'I': + self.app.geo_editor.select_tool('paint') + + # Jump to coords + if key == QtCore.Qt.Key_J or key == 'J': + self.app.on_jump_to() + + # Corner Snap + if key == QtCore.Qt.Key_K or key == 'K': + self.app.geo_editor.on_corner_snap() + + # Move + if key == QtCore.Qt.Key_M or key == 'M': + self.app.geo_editor.on_move_click() + + # Polygon Tool + if key == QtCore.Qt.Key_N or key == 'N': + self.app.geo_editor.select_tool('polygon') + + # Circle Tool + if key == QtCore.Qt.Key_O or key == 'O': + self.app.geo_editor.select_tool('circle') + + # Path Tool + if key == QtCore.Qt.Key_P or key == 'P': + self.app.geo_editor.select_tool('path') + + # Rectangle Tool + if key == QtCore.Qt.Key_R or key == 'R': + self.app.geo_editor.select_tool('rectangle') + + # Substract Tool + if key == QtCore.Qt.Key_S or key == 'S': + if self.app.geo_editor.get_selected() is not None: + self.app.geo_editor.subtract() + else: + msg = _( + "Please select geometry items \n" + "on which to perform Substraction Tool.") + + messagebox = QtWidgets.QMessageBox() + messagebox.setText(msg) + messagebox.setWindowTitle(_("Warning")) + messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) + messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) + messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) + messagebox.exec_() + + # Add Text Tool + if key == QtCore.Qt.Key_T or key == 'T': + self.app.geo_editor.select_tool('text') + + # Substract Tool + if key == QtCore.Qt.Key_U or key == 'U': + if self.app.geo_editor.get_selected() is not None: + self.app.geo_editor.union() + else: + msg = _("Please select geometry items \n" + "on which to perform union.") + + messagebox = QtWidgets.QMessageBox() + messagebox.setText(msg) + messagebox.setWindowTitle(_("Warning")) + messagebox.setWindowIcon(QtGui.QIcon('share/warning.png')) + messagebox.setStandardButtons(QtWidgets.QMessageBox.Ok) + messagebox.setDefaultButton(QtWidgets.QMessageBox.Ok) + messagebox.exec_() + + if key == QtCore.Qt.Key_V or key == 'V': + self.app.on_zoom_fit(None) + + # Flip on X axis + if key == QtCore.Qt.Key_X or key == 'X': + self.app.geo_editor.transform_tool.on_flipx() + return + + # Flip on Y axis + if key == QtCore.Qt.Key_Y or key == 'Y': + self.app.geo_editor.transform_tool.on_flipy() + return # Show Shortcut list if key == 'F3': @@ -2599,114 +2601,114 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.on_select_tab('tool') return - # Add Array of pads - if key == QtCore.Qt.Key_A or key == 'A': - self.app.grb_editor.launched_from_shortcuts = True - self.app.inform.emit("Click on target point.") - self.app.ui.add_pad_ar_btn.setChecked(True) - - self.app.grb_editor.x = self.app.mouse[0] - self.app.grb_editor.y = self.app.mouse[1] - - self.app.grb_editor.select_tool('array') - return - - # Scale Tool - if key == QtCore.Qt.Key_B or key == 'B': - self.app.grb_editor.launched_from_shortcuts = True - self.app.grb_editor.select_tool('buffer') - return - - # Copy - if key == QtCore.Qt.Key_C or key == 'C': - self.app.grb_editor.launched_from_shortcuts = True - if self.app.grb_editor.selected: - self.app.inform.emit(_("Click on target point.")) - self.app.ui.aperture_copy_btn.setChecked(True) - self.app.grb_editor.on_tool_select('copy') - self.app.grb_editor.active_tool.set_origin( - (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) - else: - self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to copy.")) - return - - # Grid Snap - if key == QtCore.Qt.Key_G or key == 'G': - self.app.grb_editor.launched_from_shortcuts = True - # make sure that the cursor shape is enabled/disabled, too - if self.app.grb_editor.options['grid_snap'] is True: - self.app.app_cursor.enabled = False - else: - self.app.app_cursor.enabled = True - self.app.ui.grid_snap_btn.trigger() - return - - # Jump to coords - if key == QtCore.Qt.Key_J or key == 'J': - self.app.on_jump_to() - - # Corner Snap - if key == QtCore.Qt.Key_K or key == 'K': - self.app.grb_editor.launched_from_shortcuts = True - self.app.ui.corner_snap_btn.trigger() - return - - # Move - if key == QtCore.Qt.Key_M or key == 'M': - self.app.grb_editor.launched_from_shortcuts = True - if self.app.grb_editor.selected: - self.app.inform.emit(_("Click on target point.")) - self.app.ui.aperture_move_btn.setChecked(True) - self.app.grb_editor.on_tool_select('move') - self.app.grb_editor.active_tool.set_origin( - (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) - else: - self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to move.")) - return - - # Add Region Tool - if key == QtCore.Qt.Key_N or key == 'N': - self.app.grb_editor.launched_from_shortcuts = True - self.app.grb_editor.select_tool('region') - return - - # Add Pad Tool - if key == QtCore.Qt.Key_P or key == 'P': - self.app.grb_editor.launched_from_shortcuts = True - self.app.inform.emit(_("Click on target point.")) - self.app.ui.add_pad_ar_btn.setChecked(True) - - self.app.grb_editor.x = self.app.mouse[0] - self.app.grb_editor.y = self.app.mouse[1] - - self.app.grb_editor.select_tool('pad') - return - - # Scale Tool - if key == QtCore.Qt.Key_S or key == 'S': - self.app.grb_editor.launched_from_shortcuts = True - self.app.grb_editor.select_tool('scale') - return - - # Add Track - if key == QtCore.Qt.Key_T or key == 'T': - self.app.grb_editor.launched_from_shortcuts = True - ## Current application units in Upper Case - self.app.grb_editor.select_tool('track') - return - - # Zoom Fit - if key == QtCore.Qt.Key_V or key == 'V': - self.app.grb_editor.launched_from_shortcuts = True - self.app.on_zoom_fit(None) - return - - # Propagate to tool - response = None - if self.app.grb_editor.active_tool is not None: + # we do this so we can reuse the following keys while inside a Tool + # the above keys are general enough so were left outside + if self.app.grb_editor.active_tool is not None and self.grb_select_btn.isChecked() == False: response = self.app.grb_editor.active_tool.on_key(key=key) - if response is not None: - self.app.inform.emit(response) + if response is not None: + self.app.inform.emit(response) + else: + # Add Array of pads + if key == QtCore.Qt.Key_A or key == 'A': + self.app.grb_editor.launched_from_shortcuts = True + self.app.inform.emit("Click on target point.") + self.app.ui.add_pad_ar_btn.setChecked(True) + + self.app.grb_editor.x = self.app.mouse[0] + self.app.grb_editor.y = self.app.mouse[1] + + self.app.grb_editor.select_tool('array') + return + + # Scale Tool + if key == QtCore.Qt.Key_B or key == 'B': + self.app.grb_editor.launched_from_shortcuts = True + self.app.grb_editor.select_tool('buffer') + return + + # Copy + if key == QtCore.Qt.Key_C or key == 'C': + self.app.grb_editor.launched_from_shortcuts = True + if self.app.grb_editor.selected: + self.app.inform.emit(_("Click on target point.")) + self.app.ui.aperture_copy_btn.setChecked(True) + self.app.grb_editor.on_tool_select('copy') + self.app.grb_editor.active_tool.set_origin( + (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) + else: + self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to copy.")) + return + + # Grid Snap + if key == QtCore.Qt.Key_G or key == 'G': + self.app.grb_editor.launched_from_shortcuts = True + # make sure that the cursor shape is enabled/disabled, too + if self.app.grb_editor.options['grid_snap'] is True: + self.app.app_cursor.enabled = False + else: + self.app.app_cursor.enabled = True + self.app.ui.grid_snap_btn.trigger() + return + + # Jump to coords + if key == QtCore.Qt.Key_J or key == 'J': + self.app.on_jump_to() + + # Corner Snap + if key == QtCore.Qt.Key_K or key == 'K': + self.app.grb_editor.launched_from_shortcuts = True + self.app.ui.corner_snap_btn.trigger() + return + + # Move + if key == QtCore.Qt.Key_M or key == 'M': + self.app.grb_editor.launched_from_shortcuts = True + if self.app.grb_editor.selected: + self.app.inform.emit(_("Click on target point.")) + self.app.ui.aperture_move_btn.setChecked(True) + self.app.grb_editor.on_tool_select('move') + self.app.grb_editor.active_tool.set_origin( + (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) + else: + self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to move.")) + return + + # Add Region Tool + if key == QtCore.Qt.Key_N or key == 'N': + self.app.grb_editor.launched_from_shortcuts = True + self.app.grb_editor.select_tool('region') + return + + # Add Pad Tool + if key == QtCore.Qt.Key_P or key == 'P': + self.app.grb_editor.launched_from_shortcuts = True + self.app.inform.emit(_("Click on target point.")) + self.app.ui.add_pad_ar_btn.setChecked(True) + + self.app.grb_editor.x = self.app.mouse[0] + self.app.grb_editor.y = self.app.mouse[1] + + self.app.grb_editor.select_tool('pad') + return + + # Scale Tool + if key == QtCore.Qt.Key_S or key == 'S': + self.app.grb_editor.launched_from_shortcuts = True + self.app.grb_editor.select_tool('scale') + return + + # Add Track + if key == QtCore.Qt.Key_T or key == 'T': + self.app.grb_editor.launched_from_shortcuts = True + ## Current application units in Upper Case + self.app.grb_editor.select_tool('track') + return + + # Zoom Fit + if key == QtCore.Qt.Key_V or key == 'V': + self.app.grb_editor.launched_from_shortcuts = True + self.app.on_zoom_fit(None) + return # Show Shortcut list if key == QtCore.Qt.Key_F3 or key == 'F3': From e92cab2e96030a5465cb9905aa689e15c8563908 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 14 Apr 2019 02:46:55 +0300 Subject: [PATCH 05/42] - In Geometry Editor I fixed bug in Arc modes. Arc mode shortcut key is now key 'M' and arc direction change shortcut key is 'D' --- README.md | 1 + camlib.py | 2 +- flatcamEditors/FlatCAMGeoEditor.py | 19 ++++++++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4bba0199..d16f0015 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: a disabled/enabled sequence for the VisPy cursor on Gerber edit make the graphics better - Editors: activated an old function that was no longer active: each tool can have it's own set of shortcut keys, the Editor general shortcut keys that are letters are overridden - Gerber and Geometry editors, when using the Backspace keys for certain tools, they will backtrack one point but now the utility geometry is immediately updated +- In Geometry Editor I fixed bug in Arc modes. Arc mode shortcut key is now key 'M' and arc direction change shortcut key is 'D' 13.04.2019 diff --git a/camlib.py b/camlib.py index b3dffb83..20f88c89 100644 --- a/camlib.py +++ b/camlib.py @@ -7589,7 +7589,7 @@ def three_point_circle(p1, p2, p3): center = a1 + b1 * T[0] # Radius - radius = norm(center - p1) + radius = np.linalg.norm(center - p1) return center, radius, T[0] diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index 987c22a9..46ffc961 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -22,6 +22,7 @@ from shapely.ops import cascaded_union import shapely.affinity as affinity from numpy import arctan2, Inf, array, sqrt, sign, dot +from numpy.linalg import norm from rtree import index as rtindex from flatcamGUI.GUIElements import OptionalInputSection, FCCheckBox, FCEntry, FCComboBox, FCTextAreaRich, \ @@ -1989,11 +1990,21 @@ class FCArc(FCShapeTool): self.points.append(point) if len(self.points) == 1: - self.draw_app.app.inform.emit(_("Click on Start arc point ...")) + if self.mode == 'c12': + self.draw_app.app.inform.emit(_("Click on Start point ...")) + elif self.mode == '132': + self.draw_app.app.inform.emit(_("Click on Point3 ...")) + else: + self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) return "Click on 1st point ..." if len(self.points) == 2: - self.draw_app.app.inform.emit(_("Click on End arc point to complete ...")) + if self.mode == 'c12': + self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) + elif self.mode == '132': + self.draw_app.app.inform.emit(_("Click on Point2 ...")) + else: + self.draw_app.app.inform.emit(_("Click on Center point to complete ...")) return "Click on 2nd point to complete ..." if len(self.points) == 3: @@ -2010,11 +2021,13 @@ class FCArc(FCShapeTool): if key == 'M' or key == QtCore.Qt.Key_M: if self.mode == 'c12': self.mode = '12c' + return _('Mode: Start -> Stop -> Center. Click on Start point ...') elif self.mode == '12c': self.mode = '132' + return _('Mode: Point1 -> Point3 -> Point2. Click on 1st point ...') else: self.mode = 'c12' - return _('Mode: %s') % self.mode + return _('Mode: Center -> Start -> Stop. Click on Center ...') def utility_geometry(self, data=None): if len(self.points) == 1: # Show the radius From 1332601624055d80f6e823ebe35840e86e686cf6 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 14 Apr 2019 15:16:37 +0300 Subject: [PATCH 06/42] - moved the key handler out of the Measurement tool to flatcamGUI.FlatCAMGui.keyPressEvent() - Gerber Editor: started to add new function of poligonize which should make a filled polygon out of a shape --- README.md | 2 + camlib.py | 61 +++++++++++++++++++++++- flatcamEditors/FlatCAMExcEditor.py | 6 +-- flatcamEditors/FlatCAMGeoEditor.py | 6 +-- flatcamEditors/FlatCAMGrbEditor.py | 75 ++++++++++++++++++++++++++++-- flatcamGUI/FlatCAMGUI.py | 20 ++++++++ flatcamTools/ToolMeasurement.py | 68 ++++++++++----------------- 7 files changed, 185 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index d16f0015..e70c1538 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ CAD program, and create G-Code for Isolation routing. - Editors: activated an old function that was no longer active: each tool can have it's own set of shortcut keys, the Editor general shortcut keys that are letters are overridden - Gerber and Geometry editors, when using the Backspace keys for certain tools, they will backtrack one point but now the utility geometry is immediately updated - In Geometry Editor I fixed bug in Arc modes. Arc mode shortcut key is now key 'M' and arc direction change shortcut key is 'D' +- moved the key handler out of the Measurement tool to flatcamGUI.FlatCAMGui.keyPressEvent() +- Gerber Editor: started to add new function of poligonize which should make a filled polygon out of a shape 13.04.2019 diff --git a/camlib.py b/camlib.py index 20f88c89..ec598154 100644 --- a/camlib.py +++ b/camlib.py @@ -26,10 +26,11 @@ from rtree import index as rtindex from lxml import etree as ET # See: http://toblerity.org/shapely/manual.html + from shapely.geometry import Polygon, LineString, Point, LinearRing, MultiLineString from shapely.geometry import MultiPoint, MultiPolygon from shapely.geometry import box as shply_box -from shapely.ops import cascaded_union, unary_union +from shapely.ops import cascaded_union, unary_union, polygonize import shapely.affinity as affinity from shapely.wkt import loads as sloads from shapely.wkt import dumps as sdumps @@ -45,6 +46,7 @@ import ezdxf # TODO: Commented for FlatCAM packaging with cx_freeze # from scipy.spatial import KDTree, Delaunay +from scipy.spatial import Delaunay from flatcamParsers.ParseSVG import * from flatcamParsers.ParseDXF import * @@ -7348,6 +7350,63 @@ def parse_gerber_number(strnumber, int_digits, frac_digits, zeros): return ret_val +def alpha_shape(points, alpha): + """ + Compute the alpha shape (concave hull) of a set of points. + + @param points: Iterable container of points. + @param alpha: alpha value to influence the gooeyness of the border. Smaller + numbers don't fall inward as much as larger numbers. Too large, + and you lose everything! + """ + if len(points) < 4: + # When you have a triangle, there is no sense in computing an alpha + # shape. + return MultiPoint(list(points)).convex_hull + + def add_edge(edges, edge_points, coords, i, j): + """Add a line between the i-th and j-th points, if not in the list already""" + if (i, j) in edges or (j, i) in edges: + # already added + return + edges.add( (i, j) ) + edge_points.append(coords[ [i, j] ]) + + coords = np.array([point.coords[0] for point in points]) + + tri = Delaunay(coords) + edges = set() + edge_points = [] + # loop over triangles: + # ia, ib, ic = indices of corner points of the triangle + for ia, ib, ic in tri.vertices: + pa = coords[ia] + pb = coords[ib] + pc = coords[ic] + + # Lengths of sides of triangle + a = math.sqrt((pa[0]-pb[0])**2 + (pa[1]-pb[1])**2) + b = math.sqrt((pb[0]-pc[0])**2 + (pb[1]-pc[1])**2) + c = math.sqrt((pc[0]-pa[0])**2 + (pc[1]-pa[1])**2) + + # Semiperimeter of triangle + s = (a + b + c)/2.0 + + # Area of triangle by Heron's formula + area = math.sqrt(s*(s-a)*(s-b)*(s-c)) + circum_r = a*b*c/(4.0*area) + + # Here's the radius filter. + #print circum_r + if circum_r < 1.0/alpha: + add_edge(edges, edge_points, coords, ia, ib) + add_edge(edges, edge_points, coords, ib, ic) + add_edge(edges, edge_points, coords, ic, ia) + + m = MultiLineString(edge_points) + triangles = list(polygonize(m)) + return cascaded_union(triangles), edge_points + # def voronoi(P): # """ # Returns a list of all edges of the voronoi diagram for the given input points. diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py index 5dc5c731..2f02b7c6 100644 --- a/flatcamEditors/FlatCAMExcEditor.py +++ b/flatcamEditors/FlatCAMExcEditor.py @@ -1683,12 +1683,12 @@ class FlatCAMExcEditor(QtCore.QObject): self.canvas.vis_connect('mouse_press', self.on_canvas_click) self.canvas.vis_connect('mouse_move', self.on_canvas_move) - self.canvas.vis_connect('mouse_release', self.on_canvas_click_release) + self.canvas.vis_connect('mouse_release', self.on_exc_click_release) def disconnect_canvas_event_handlers(self): self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) - self.canvas.vis_disconnect('mouse_release', self.on_canvas_click_release) + self.canvas.vis_disconnect('mouse_release', self.on_exc_click_release) # we restore the key and mouse control to FlatCAMApp method self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) @@ -2136,7 +2136,7 @@ class FlatCAMExcEditor(QtCore.QObject): else: self.storage.insert(shape) # TODO: Check performance - def on_canvas_click_release(self, event): + def on_exc_click_release(self, event): pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) self.modifiers = QtWidgets.QApplication.keyboardModifiers() diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index 46ffc961..add13229 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -2973,13 +2973,13 @@ class FlatCAMGeoEditor(QtCore.QObject): self.canvas.vis_connect('mouse_press', self.on_canvas_click) self.canvas.vis_connect('mouse_move', self.on_canvas_move) - self.canvas.vis_connect('mouse_release', self.on_canvas_click_release) + self.canvas.vis_connect('mouse_release', self.on_geo_click_release) def disconnect_canvas_event_handlers(self): self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) - self.canvas.vis_disconnect('mouse_release', self.on_canvas_click_release) + self.canvas.vis_disconnect('mouse_release', self.on_geo_click_release) # we restore the key and mouse control to FlatCAMApp method self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) @@ -3310,7 +3310,7 @@ class FlatCAMGeoEditor(QtCore.QObject): # Update cursor self.app.app_cursor.set_data(np.asarray([(x, y)]), symbol='++', edge_color='black', size=20) - def on_canvas_click_release(self, event): + def on_geo_click_release(self, event): pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) if self.app.grid_status(): diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 58d78d3a..16d7b5e2 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -476,6 +476,73 @@ class FCPadArray(FCShapeTool): self.draw_app.plot_all() +class FCPoligonize(FCShapeTool): + """ + Resulting type: Polygon + """ + + def __init__(self, draw_app): + DrawTool.__init__(self, draw_app) + self.name = 'poligonize' + self.draw_app = draw_app + + self.start_msg = _("Select shape(s) and then click ...") + self.draw_app.in_action = True + self.make() + + def click(self, point): + # self.draw_app.in_action = True + # if self.draw_app.selected: + # self.make() + # else: + # self.draw_app.app.inform.emit(_("[WARNING_NOTCL] No shapes are selected. Select shapes and try again ...")) + + return "" + + def make(self): + geo = [] + + for shape in self.draw_app.selected: + current_storage = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] + print(self.draw_app.active_tool) + aha = [] + if shape.geo: + shape_points = list(shape.geo.exterior.coords) + for pt in shape_points: + aha.append(Point(pt)) + concave_hull, bla_bla = alpha_shape(points=aha, alpha=0.5) + geo.append(concave_hull) + print(geo) + self.geometry = DrawToolShape(geo) + self.draw_app.on_grb_shape_complete(current_storage) + + self.draw_app.in_action = False + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done. Poligonize completed.")) + + self.draw_app.build_ui() + # MS: always return to the Select Tool if modifier key is not pressed + # else return to the current tool + + key_modifier = QtWidgets.QApplication.keyboardModifiers() + if self.draw_app.app.defaults["global_mselect_key"] == 'Control': + modifier_to_use = Qt.ControlModifier + else: + modifier_to_use = Qt.ShiftModifier + # if modifier key is pressed then we add to the selected list the current shape but if it's already + # in the selected list, we removed it. Therefore first click selects, second deselects. + if key_modifier == modifier_to_use: + self.draw_app.select_tool(self.draw_app.active_tool.name) + else: + self.draw_app.select_tool("select") + return + + def clean_up(self): + self.draw_app.selected = [] + self.draw_app.apertures_table.clearSelection() + self.draw_app.plot_all() + + class FCRegion(FCShapeTool): """ Resulting type: Polygon @@ -1259,6 +1326,8 @@ class FlatCAMGrbEditor(QtCore.QObject): "constructor": FCTrack}, "region": {"button": self.app.ui.grb_add_region_btn, "constructor": FCRegion}, + "poligonize": {"button": self.app.ui.grb_convert_poly_btn, + "constructor": FCPoligonize}, "buffer": {"button": self.app.ui.aperture_buffer_btn, "constructor": FCBuffer}, "scale": {"button": self.app.ui.aperture_scale_btn, @@ -1918,12 +1987,12 @@ class FlatCAMGrbEditor(QtCore.QObject): self.canvas.vis_connect('mouse_press', self.on_canvas_click) self.canvas.vis_connect('mouse_move', self.on_canvas_move) - self.canvas.vis_connect('mouse_release', self.on_canvas_click_release) + self.canvas.vis_connect('mouse_release', self.on_grb_click_release) def disconnect_canvas_event_handlers(self): self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) - self.canvas.vis_disconnect('mouse_release', self.on_canvas_click_release) + self.canvas.vis_disconnect('mouse_release', self.on_grb_click_release) # we restore the key and mouse control to FlatCAMApp method self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) @@ -2338,7 +2407,7 @@ class FlatCAMGrbEditor(QtCore.QObject): else: self.app.log.debug("No active tool to respond to click!") - def on_canvas_click_release(self, event): + def on_grb_click_release(self, event): pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) self.modifiers = QtWidgets.QApplication.keyboardModifiers() diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 8e4c038d..583aa31a 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -690,6 +690,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.add_pad_ar_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/padarray32.png'), _('Add Pad Array')) self.grb_add_track_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/track32.png'), _("Add Track")) self.grb_add_region_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _("Add Region")) + self.grb_convert_poly_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _("Poligonize")) + self.grb_edit_toolbar.addSeparator() self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer')) @@ -2911,6 +2913,24 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_F3 or key == 'F3': self.app.on_shortcut_list() return + elif self.app.call_source == 'measurement': + if modifiers == QtCore.Qt.ControlModifier: + pass + elif modifiers == QtCore.Qt.AltModifier: + pass + elif modifiers == QtCore.Qt.ShiftModifier: + pass + elif modifiers == QtCore.Qt.NoModifier: + if key == QtCore.Qt.Key_Escape or key == 'Escape': + # abort the measurement action + self.app.measurement_tool.on_measure(activate=False) + self.app.measurement_tool.deactivate_measure_tool() + self.app.inform.emit(_("Measurement Tool exit...")) + return + + if key == QtCore.Qt.Key_G or key == 'G': + self.app.ui.grid_snap_btn.trigger() + return def dragEnterEvent(self, event): if event.mimeData().hasUrls: diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py index 6cf0fded..12f68bdd 100644 --- a/flatcamTools/ToolMeasurement.py +++ b/flatcamTools/ToolMeasurement.py @@ -112,6 +112,8 @@ class Measurement(FlatCAMTool): # self.setVisible(False) self.active = 0 + self.original_call_source = 'app' + # VisPy visuals self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.vispy_canvas.view.scene, layers=1) @@ -125,7 +127,7 @@ class Measurement(FlatCAMTool): self.app.ui.notebook.setTabText(2, _("Meas. Tool")) - # if the splitter is hidden, display it, else hide it but only if the current widget is the same + # if the splitter is hidden, display it if self.app.ui.splitter.sizes()[0] == 0: self.app.ui.splitter.setSizes([1, 1]) @@ -155,29 +157,22 @@ class Measurement(FlatCAMTool): self.distance_y_entry.set_value('0') self.total_distance_entry.set_value('0') - def activate(self): + def activate_measure_tool(self): # we disconnect the mouse/key handlers from wherever the measurement tool was called - self.canvas.vis_disconnect('key_press') self.canvas.vis_disconnect('mouse_move') self.canvas.vis_disconnect('mouse_press') self.canvas.vis_disconnect('mouse_release') - self.canvas.vis_disconnect('key_release') # we can safely connect the app mouse events to the measurement tool self.canvas.vis_connect('mouse_move', self.on_mouse_move_meas) - self.canvas.vis_connect('mouse_release', self.on_mouse_click) - self.canvas.vis_connect('key_release', self.on_key_release_meas) + self.canvas.vis_connect('mouse_release', self.on_mouse_click_release) self.set_tool_ui() - def deactivate(self): + def deactivate_measure_tool(self): # disconnect the mouse/key events from functions of measurement tool self.canvas.vis_disconnect('mouse_move', self.on_mouse_move_meas) - self.canvas.vis_disconnect('mouse_release', self.on_mouse_click) - self.canvas.vis_disconnect('key_release', self.on_key_release_meas) - - # reconnect the mouse/key events to the functions from where the tool was called - self.canvas.vis_connect('key_press', self.app.ui.keyPressEvent) + self.canvas.vis_disconnect('mouse_release', self.on_mouse_click_release) if self.app.call_source == 'app': self.canvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) @@ -186,57 +181,44 @@ class Measurement(FlatCAMTool): elif self.app.call_source == 'geo_editor': self.canvas.vis_connect('mouse_move', self.app.geo_editor.on_canvas_move) self.canvas.vis_connect('mouse_press', self.app.geo_editor.on_canvas_click) - # self.canvas.vis_connect('key_press', self.app.geo_editor.on_canvas_key) - self.canvas.vis_connect('mouse_release', self.app.geo_editor.on_canvas_click_release) + self.canvas.vis_connect('mouse_release', self.app.geo_editor.on_geo_click_release) elif self.app.call_source == 'exc_editor': self.canvas.vis_connect('mouse_move', self.app.exc_editor.on_canvas_move) self.canvas.vis_connect('mouse_press', self.app.exc_editor.on_canvas_click) - # self.canvas.vis_connect('key_press', self.app.exc_editor.on_canvas_key) - self.canvas.vis_connect('mouse_release', self.app.exc_editor.on_canvas_click_release) + self.canvas.vis_connect('mouse_release', self.app.exc_editor.on_exc_click_release) elif self.app.call_source == 'grb_editor': self.canvas.vis_connect('mouse_move', self.app.grb_editor.on_canvas_move) self.canvas.vis_connect('mouse_press', self.app.grb_editor.on_canvas_click) - # self.canvas.vis_connect('key_press', self.app.grb_editor.on_canvas_key) - self.canvas.vis_connect('mouse_release', self.app.grb_editor.on_canvas_click_release) + self.canvas.vis_connect('mouse_release', self.app.grb_editor.on_grb_click_release) self.app.ui.notebook.setTabText(2, _("Tools")) self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) def on_measure(self, signal=None, activate=None): log.debug("Measurement.on_measure()") - if activate is False or activate is None: - # DISABLE the Measuring TOOL - self.deactivate() + if activate is True: + # ENABLE the Measuring TOOL + self.clicked_meas = 0 + self.original_call_source = copy(self.app.call_source) + self.app.call_source = 'measurement' + self.app.inform.emit(_("MEASURING: Click on the Start point ...")) + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() + + self.activate_measure_tool() + log.debug("Measurement Tool --> tool initialized") + else: + # DISABLE the Measuring TOOL + self.deactivate_measure_tool() + self.app.call_source = copy(self.original_call_source) self.app.command_active = None # delete the measuring line self.delete_shape() log.debug("Measurement Tool --> exit tool") - elif activate is True: - # ENABLE the Measuring TOOL - self.clicked_meas = 0 - self.app.inform.emit(_("MEASURING: Click on the Start point ...")) - self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() - - self.activate() - log.debug("Measurement Tool --> tool initialized") - - def on_key_release_meas(self, event): - if event.key == 'escape': - # abort the measurement action - self.on_measure(activate=False) - self.app.inform.emit(_("Measurement Tool exit...")) - return - - if event.key == 'G': - # toggle grid status - self.app.ui.grid_snap_btn.trigger() - return - - def on_mouse_click(self, event): + def on_mouse_click_release(self, event): # mouse click releases will be accepted only if the left button is clicked # this is necessary because right mouse click or middle mouse click # are used for panning on the canvas From fc1dfb855035328f46982736adf505513609b681 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 14 Apr 2019 16:59:20 +0300 Subject: [PATCH 07/42] - cleaned up Measuring Tool --- FlatCAMApp.py | 6 +- README.md | 1 + flatcamGUI/FlatCAMGUI.py | 1 - flatcamTools/ToolMeasurement.py | 168 ++++++++++++++++---------------- 4 files changed, 85 insertions(+), 91 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 2787a485..0a4bdf55 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -4472,7 +4472,6 @@ class App(QtCore.QObject): self.report_usage("on_set_origin()") self.inform.emit(_('Click to set the origin ...')) - self.plotcanvas.vis_connect('mouse_press', self.on_set_zero_click) def on_jump_to(self, custom_location=None, fit_center=True): @@ -5117,9 +5116,7 @@ class App(QtCore.QObject): def on_mouse_move_over_plot(self, event, origin_click=None): """ - Callback for the mouse motion event over the plot. This event is generated - by the Matplotlib backend and has been registered in ``self.__init__()``. - For details, see: http://matplotlib.org/users/event_handling.html + Callback for the mouse motion event over the plot. :param event: Contains information about the event. :param origin_click @@ -5314,7 +5311,6 @@ class App(QtCore.QObject): def select_objects(self, key=None): # list where we store the overlapped objects under our mouse left click position objects_under_the_click_list = [] - # Populate the list with the overlapped objects on the click position curr_x, curr_y = self.pos for obj in self.all_objects_list: diff --git a/README.md b/README.md index e70c1538..adf9c96a 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ CAD program, and create G-Code for Isolation routing. - In Geometry Editor I fixed bug in Arc modes. Arc mode shortcut key is now key 'M' and arc direction change shortcut key is 'D' - moved the key handler out of the Measurement tool to flatcamGUI.FlatCAMGui.keyPressEvent() - Gerber Editor: started to add new function of poligonize which should make a filled polygon out of a shape +- cleaned up Measuring Tool 13.04.2019 diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 583aa31a..37914892 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -2923,7 +2923,6 @@ class FlatCAMGUI(QtWidgets.QMainWindow): elif modifiers == QtCore.Qt.NoModifier: if key == QtCore.Qt.Key_Escape or key == 'Escape': # abort the measurement action - self.app.measurement_tool.on_measure(activate=False) self.app.measurement_tool.deactivate_measure_tool() self.app.inform.emit(_("Measurement Tool exit...")) return diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py index 12f68bdd..e8a4f96f 100644 --- a/flatcamTools/ToolMeasurement.py +++ b/flatcamTools/ToolMeasurement.py @@ -103,25 +103,23 @@ class Measurement(FlatCAMTool): self.layout.addStretch() - self.clicked_meas = 0 + # store here the first click and second click of the measurement process + self.points = [] - self.point1 = None - self.point2 = None - - # the default state is disabled for the Move command - # self.setVisible(False) - self.active = 0 + self.active = False self.original_call_source = 'app' # VisPy visuals self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.vispy_canvas.view.scene, layers=1) - self.measure_btn.clicked.connect(lambda: self.on_measure(activate=True)) + self.measure_btn.clicked.connect(self.activate_measure_tool) def run(self, toggle=False): self.app.report_usage("ToolMeasurement()") + self.points[:] = [] + if self.app.tool_tab_locked is True: return @@ -130,8 +128,13 @@ class Measurement(FlatCAMTool): # if the splitter is hidden, display it if self.app.ui.splitter.sizes()[0] == 0: self.app.ui.splitter.setSizes([1, 1]) + if toggle: + pass - self.on_measure(activate=True) + if self.active is False: + self.activate_measure_tool() + else: + self.deactivate_measure_tool() def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs) @@ -156,101 +159,104 @@ class Measurement(FlatCAMTool): self.distance_x_entry.set_value('0') self.distance_y_entry.set_value('0') self.total_distance_entry.set_value('0') + log.debug("Measurement Tool --> tool initialized") def activate_measure_tool(self): - # we disconnect the mouse/key handlers from wherever the measurement tool was called - self.canvas.vis_disconnect('mouse_move') - self.canvas.vis_disconnect('mouse_press') - self.canvas.vis_disconnect('mouse_release') + # ENABLE the Measuring TOOL + self.active = True - # we can safely connect the app mouse events to the measurement tool + self.clicked_meas = 0 + self.original_call_source = copy(self.app.call_source) + + self.app.inform.emit(_("MEASURING: Click on the Start point ...")) + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() + + # we can connect the app mouse events to the measurement tool + # NEVER DISCONNECT THOSE before connecting some other handlers; it breaks something in VisPy self.canvas.vis_connect('mouse_move', self.on_mouse_move_meas) self.canvas.vis_connect('mouse_release', self.on_mouse_click_release) + # we disconnect the mouse/key handlers from wherever the measurement tool was called + if self.app.call_source == 'app': + self.canvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) + self.canvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) + self.canvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) + elif self.app.call_source == 'geo_editor': + self.canvas.vis_disconnect('mouse_move', self.app.geo_editor.on_canvas_move) + self.canvas.vis_disconnect('mouse_press', self.app.geo_editor.on_canvas_click) + self.canvas.vis_disconnect('mouse_release', self.app.geo_editor.on_geo_click_release) + elif self.app.call_source == 'exc_editor': + self.canvas.vis_disconnect('mouse_move', self.app.exc_editor.on_canvas_move) + self.canvas.vis_disconnect('mouse_press', self.app.exc_editor.on_canvas_click) + self.canvas.vis_disconnect('mouse_release', self.app.exc_editor.on_exc_click_release) + elif self.app.call_source == 'grb_editor': + self.canvas.vis_disconnect('mouse_move', self.app.grb_editor.on_canvas_move) + self.canvas.vis_disconnect('mouse_press', self.app.grb_editor.on_canvas_click) + self.canvas.vis_disconnect('mouse_release', self.app.grb_editor.on_grb_click_release) + + self.app.call_source = 'measurement' + self.set_tool_ui() def deactivate_measure_tool(self): - # disconnect the mouse/key events from functions of measurement tool - self.canvas.vis_disconnect('mouse_move', self.on_mouse_move_meas) - self.canvas.vis_disconnect('mouse_release', self.on_mouse_click_release) + # DISABLE the Measuring TOOL + self.active = False + self.points = [] - if self.app.call_source == 'app': + self.app.call_source = copy(self.original_call_source) + if self.original_call_source == 'app': self.canvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.canvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.canvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) - elif self.app.call_source == 'geo_editor': + elif self.original_call_source == 'geo_editor': self.canvas.vis_connect('mouse_move', self.app.geo_editor.on_canvas_move) self.canvas.vis_connect('mouse_press', self.app.geo_editor.on_canvas_click) self.canvas.vis_connect('mouse_release', self.app.geo_editor.on_geo_click_release) - elif self.app.call_source == 'exc_editor': + elif self.original_call_source == 'exc_editor': self.canvas.vis_connect('mouse_move', self.app.exc_editor.on_canvas_move) self.canvas.vis_connect('mouse_press', self.app.exc_editor.on_canvas_click) self.canvas.vis_connect('mouse_release', self.app.exc_editor.on_exc_click_release) - elif self.app.call_source == 'grb_editor': + elif self.original_call_source == 'grb_editor': self.canvas.vis_connect('mouse_move', self.app.grb_editor.on_canvas_move) self.canvas.vis_connect('mouse_press', self.app.grb_editor.on_canvas_click) self.canvas.vis_connect('mouse_release', self.app.grb_editor.on_grb_click_release) - self.app.ui.notebook.setTabText(2, _("Tools")) - self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) + # disconnect the mouse/key events from functions of measurement tool + self.canvas.vis_disconnect('mouse_move', self.on_mouse_move_meas) + self.canvas.vis_disconnect('mouse_release', self.on_mouse_click_release) - def on_measure(self, signal=None, activate=None): - log.debug("Measurement.on_measure()") - if activate is True: - # ENABLE the Measuring TOOL - self.clicked_meas = 0 - self.original_call_source = copy(self.app.call_source) - self.app.call_source = 'measurement' + # self.app.ui.notebook.setTabText(2, _("Tools")) + # self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) - self.app.inform.emit(_("MEASURING: Click on the Start point ...")) - self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() + self.app.command_active = None - self.activate_measure_tool() - log.debug("Measurement Tool --> tool initialized") - else: - # DISABLE the Measuring TOOL - self.deactivate_measure_tool() - self.app.call_source = copy(self.original_call_source) - self.app.command_active = None + # delete the measuring line + self.delete_shape() - # delete the measuring line - self.delete_shape() - - log.debug("Measurement Tool --> exit tool") + log.debug("Measurement Tool --> exit tool") def on_mouse_click_release(self, event): # mouse click releases will be accepted only if the left button is clicked # this is necessary because right mouse click or middle mouse click # are used for panning on the canvas + log.debug("Measuring Tool --> mouse click release") if event.button == 1: pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) + # if GRID is active we need to get the snapped positions + if self.app.grid_status() == True: + pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) + else: + pos = pos_canvas[0], pos_canvas[1] + self.points.append(pos) - if self.clicked_meas == 0: - self.clicked_meas = 1 - - # if GRID is active we need to get the snapped positions - if self.app.grid_status() == True: - pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) - else: - pos = pos_canvas[0], pos_canvas[1] - - self.point1 = pos + if len(self.points) == 1: self.start_entry.set_value("(%.4f, %.4f)" % pos) self.app.inform.emit(_("MEASURING: Click on the Destination point ...")) - else: - # delete the selection bounding box - self.delete_shape() - - # if GRID is active we need to get the snapped positions - if self.app.grid_status() is True: - pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) - else: - pos = pos_canvas[0], pos_canvas[1] - - dx = pos[0] - self.point1[0] - dy = pos[1] - self.point1[1] + if len(self.points) == 2: + dx = self.points[1][0] - self.points[0][0] + dy = self.points[1][1] - self.points[0][1] d = sqrt(dx ** 2 + dy ** 2) self.stop_entry.set_value("(%.4f, %.4f)" % pos) @@ -262,33 +268,25 @@ class Measurement(FlatCAMTool): self.distance_y_entry.set_value('%.4f' % abs(dy)) self.total_distance_entry.set_value('%.4f' % abs(d)) - # TODO: I don't understand why I have to do it twice ... but without it the mouse handlers are - # TODO: are left disconnected ... - self.on_measure(activate=False) - self.deactivate() + self.deactivate_measure_tool() def on_mouse_move_meas(self, event): pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) - - # if GRID is active we need to get the snapped positions + # Update cursor + pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) if self.app.grid_status() == True: - pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) - self.app.app_cursor.enabled = True - # Update cursor self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]), symbol='++', edge_color='black', size=20) - else: - pos = pos_canvas - self.app.app_enabled = False - - self.point2 = (pos[0], pos[1]) # update utility geometry - if self.clicked_meas == 1: - # first delete old shape - self.delete_shape() - # second draw the new shape of the utility geometry - self.meas_line = LineString([self.point2, self.point1]) - self.sel_shapes.add(self.meas_line, color='black', update=True, layer=0, tolerance=None) + if len(self.points) == 1: + self.utility_geometry(pos=pos) + + def utility_geometry(self, pos): + # first delete old shape + self.delete_shape() + # second draw the new shape of the utility geometry + self.meas_line = LineString([pos, self.points[0]]) + self.sel_shapes.add(self.meas_line, color='black', update=True, layer=0, tolerance=None) def delete_shape(self): self.sel_shapes.clear() From 2e7d9f953f306f40e0c8d8ee32583b6a55ae5866 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 14 Apr 2019 22:46:08 +0300 Subject: [PATCH 08/42] - solved bug in Gerber apertures size and dimensions values conversion when file units are different than app units --- README.md | 1 + camlib.py | 14 +++++++++++++- flatcamEditors/FlatCAMGrbEditor.py | 11 +++++------ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index adf9c96a..80f9c49d 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ CAD program, and create G-Code for Isolation routing. - moved the key handler out of the Measurement tool to flatcamGUI.FlatCAMGui.keyPressEvent() - Gerber Editor: started to add new function of poligonize which should make a filled polygon out of a shape - cleaned up Measuring Tool +- solved bug in Gerber apertures size and dimensions values conversion when file units are different than app units 13.04.2019 diff --git a/camlib.py b/camlib.py index ec598154..6f46b161 100644 --- a/camlib.py +++ b/camlib.py @@ -2162,6 +2162,9 @@ class Gerber (Geometry): # Coordinates of the current path, each is [x, y] path = [] + # store the file units here: + gerber_units = 'IN' + # this is for temporary storage of geometry until it is added to poly_buffer geo = None @@ -3180,6 +3183,13 @@ class Gerber (Geometry): self.apertures[last_path_aperture]['solid_geometry'] = [] self.apertures[last_path_aperture]['solid_geometry'].append(geo) + # TODO: make sure to keep track of units changes because right now it seems to happen in a weird way + # find out the conversion factor used to convert inside the self.apertures keys: size, width, height + file_units = gerber_units if gerber_units else 'IN' + app_units = self.app.defaults['units'] + + conversion_factor = 25.4 if file_units == 'IN' else (1/25.4) if file_units != app_units else 1 + # first check if we have any clear_geometry (LPC) and if yes then we need to substract it # from the apertures solid_geometry temp_geo = [] @@ -3195,7 +3205,9 @@ class Gerber (Geometry): self.apertures[apid]['solid_geometry'] = deepcopy(temp_geo) self.apertures[apid].pop('clear_geometry', None) - + for k, v in self.apertures[apid].items(): + if k == 'size' or k == 'width' or k == 'height': + self.apertures[apid][k] = v * conversion_factor # --- Apply buffer --- # this treats the case when we are storing geometry as paths diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 16d7b5e2..9770f25b 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -1570,15 +1570,15 @@ class FlatCAMGrbEditor(QtCore.QObject): if str(self.storage_dict[ap_code]['type']) == 'R' or str(self.storage_dict[ap_code]['type']) == 'O': ap_dim_item = QtWidgets.QTableWidgetItem( - '%.4f, %.4f' % (self.storage_dict[ap_code]['width'] * self.gerber_obj.file_units_factor, - self.storage_dict[ap_code]['height'] * self.gerber_obj.file_units_factor + '%.4f, %.4f' % (self.storage_dict[ap_code]['width'], + self.storage_dict[ap_code]['height'] ) ) ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) elif str(self.storage_dict[ap_code]['type']) == 'P': ap_dim_item = QtWidgets.QTableWidgetItem( - '%.4f, %.4f' % (self.storage_dict[ap_code]['diam'] * self.gerber_obj.file_units_factor, - self.storage_dict[ap_code]['nVertices'] * self.gerber_obj.file_units_factor) + '%.4f, %.4f' % (self.storage_dict[ap_code]['diam'], + self.storage_dict[ap_code]['nVertices']) ) ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) else: @@ -1588,8 +1588,7 @@ class FlatCAMGrbEditor(QtCore.QObject): try: if self.storage_dict[ap_code]['size'] is not None: ap_size_item = QtWidgets.QTableWidgetItem('%.4f' % - float(self.storage_dict[ap_code]['size'] * - self.gerber_obj.file_units_factor)) + float(self.storage_dict[ap_code]['size'])) else: ap_size_item = QtWidgets.QTableWidgetItem('') except KeyError: From db26895b5bde2d351ad5b315a23cb6c6b581ff51 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 15 Apr 2019 03:29:43 +0300 Subject: [PATCH 09/42] - working on a new tool to process automatically PcbWizard Excellon files which are generated in 2 files --- FlatCAMApp.py | 5 +- README.md | 4 + camlib.py | 14 +- flatcamGUI/GUIElements.py | 5 +- flatcamTools/ToolPcbWizard.py | 415 ++++++++++++++++++++++++++++++++++ flatcamTools/__init__.py | 1 + 6 files changed, 437 insertions(+), 7 deletions(-) create mode 100644 flatcamTools/ToolPcbWizard.py diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 0a4bdf55..f567029b 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -2006,6 +2006,9 @@ class App(QtCore.QObject): self.image_tool = ToolImage(self) self.image_tool.install(icon=QtGui.QIcon('share/image32.png'), pos=self.ui.menufileimport, separator=True) + self.pcb_wizard_tool = PcbWizard(self) + self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport, + separator=True) self.log.debug("Tools are installed.") @@ -7081,7 +7084,7 @@ class App(QtCore.QObject): # self.progress.emit(20) try: - ret = excellon_obj.parse_file(filename) + ret = excellon_obj.parse_file(filename=filename) if ret == "fail": log.debug("Excellon parsing failed.") self.inform.emit(_("[ERROR_NOTCL] This is not Excellon file.")) diff --git a/README.md b/README.md index 80f9c49d..08e0ee9d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +15.04.2019 + +- working on a new tool to process automatically PcbWizard Excellon files which are generated in 2 files + 14.04.2019 - Gerber Editor: Remade the processing of 'clear_geometry' (geometry generated by polygons made with Gerber LPC command) to work if more than one such polygon exists diff --git a/camlib.py b/camlib.py index 6f46b161..7676bee1 100644 --- a/camlib.py +++ b/camlib.py @@ -3837,7 +3837,7 @@ class Excellon(Geometry): # Repeating command self.repeat_re = re.compile(r'R(\d+)') - def parse_file(self, filename): + def parse_file(self, filename=None, file_obj=None): """ Reads the specified file as array of lines as passes it to ``parse_lines()``. @@ -3846,9 +3846,15 @@ class Excellon(Geometry): :type filename: str :return: None """ - efile = open(filename, 'r') - estr = efile.readlines() - efile.close() + if file_obj: + estr = file_obj + else: + if filename is None: + return "fail" + efile = open(filename, 'r') + estr = efile.readlines() + efile.close() + try: self.parse_lines(estr) except: diff --git a/flatcamGUI/GUIElements.py b/flatcamGUI/GUIElements.py index e30a2f9b..c7b724f5 100644 --- a/flatcamGUI/GUIElements.py +++ b/flatcamGUI/GUIElements.py @@ -27,7 +27,7 @@ EDIT_SIZE_HINT = 70 class RadioSet(QtWidgets.QWidget): - activated_custom = QtCore.pyqtSignal() + activated_custom = QtCore.pyqtSignal(str) def __init__(self, choices, orientation='horizontal', parent=None, stretch=None): """ @@ -72,7 +72,8 @@ class RadioSet(QtWidgets.QWidget): radio = self.sender() if radio.isChecked(): self.group_toggle_fn() - self.activated_custom.emit() + ret_val = str(self.get_value()) + self.activated_custom.emit(ret_val) return def get_value(self): diff --git a/flatcamTools/ToolPcbWizard.py b/flatcamTools/ToolPcbWizard.py new file mode 100644 index 00000000..d990140d --- /dev/null +++ b/flatcamTools/ToolPcbWizard.py @@ -0,0 +1,415 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 4/15/2019 # +# MIT Licence # +############################################################ + +from FlatCAMTool import FlatCAMTool + +from flatcamGUI.GUIElements import RadioSet, FCComboBox, FCSpinner, FCButton, FCTable +from PyQt5 import QtGui, QtWidgets, QtCore +from PyQt5.QtCore import pyqtSignal +import re +import os + +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + + +class PcbWizard(FlatCAMTool): + + file_loaded = pyqtSignal(str, str) + + toolName = _("PcbWizard Import Tool") + + def __init__(self, app): + FlatCAMTool.__init__(self, app) + + self.app = app + + # Title + title_label = QtWidgets.QLabel("%s" % _('Import 2-file Excellon')) + title_label.setStyleSheet(""" + QLabel + { + font-size: 16px; + font-weight: bold; + } + """) + self.layout.addWidget(title_label) + + self.layout.addWidget(QtWidgets.QLabel("")) + self.layout.addWidget(QtWidgets.QLabel("Load files:")) + + # Form Layout + form_layout = QtWidgets.QFormLayout() + self.layout.addLayout(form_layout) + + self.excellon_label = QtWidgets.QLabel(_("Excellon file:")) + self.excellon_label.setToolTip( + _( "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) + + 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) + + self.tools_table = FCTable() + self.layout.addWidget(self.tools_table) + + self.tools_table.setColumnCount(2) + self.tools_table.setHorizontalHeaderLabels(['#Tool', _('Diameter')]) + + self.tools_table.horizontalHeaderItem(0).setToolTip( + _("Tool Number")) + self.tools_table.horizontalHeaderItem(1).setToolTip( + _("Tool diameter in file units.")) + + # start with apertures table hidden + self.tools_table.setVisible(False) + + self.layout.addWidget(QtWidgets.QLabel("")) + self.layout.addWidget(QtWidgets.QLabel("Excellon format:")) + # Form Layout + form_layout1 = QtWidgets.QFormLayout() + self.layout.addLayout(form_layout1) + + # Integral part of the coordinates + self.int_entry = FCSpinner() + 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.") + ) + form_layout1.addRow(self.int_label, self.int_entry) + + # Fractional part of the coordinates + self.frac_entry = FCSpinner() + self.frac_entry.set_range(1, 10) + self.frac_label = QtWidgets.QLabel(_("Frac. digits:")) + self.frac_label.setToolTip( + _("The number of digits for the fractional part of the coordinates.") + ) + form_layout1.addRow(self.frac_label, self.frac_entry) + + # Zeros suppression for coordinates + self.zeros_radio = RadioSet([{'label': 'LZ', 'value': 'L'}, + {'label': 'TZ', 'value': 'T'}, + {'label': 'No Suppression', 'value': 'D'}]) + self.zeros_label = QtWidgets.QLabel(_("Zeros supp.:")) + self.zeros_label.setToolTip( + _("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") + ) + 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_label = QtWidgets.QLabel("%s:" % _('Units')) + self.units_label.setToolTip( + _("The type of units that the coordinates and tool\n" + "diameters are using. Can be INCH or MM.") + ) + form_layout1.addRow(self.units_label, self.units_radio) + + # Buttons + + self.import_button = QtWidgets.QPushButton(_("Import Excellon")) + self.import_button.setToolTip( + _("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.") + ) + self.layout.addWidget(self.import_button) + + self.layout.addStretch() + + self.excellon_loaded = False + self.inf_loaded = False + self.process_finished = False + + ## Signals + self.excellon_brn.clicked.connect(self.on_load_excellon_click) + self.inf_btn.clicked.connect(self.on_load_inf_click) + self.import_button.clicked.connect(self.on_import_excellon) + self.file_loaded.connect(self.on_file_loaded) + self.units_radio.activated_custom.connect(self.on_units_change) + + self.units = 'INCH' + self.zeros = 'L' + self.integral = 2 + self.fractional = 4 + + self.outname = 'file' + + self.exc_file_content = None + self.tools_from_inf = {} + + def run(self, toggle=False): + self.app.report_usage("PcbWizard Tool()") + + if toggle: + # if the splitter is hidden, display it, else hide it but only if the current widget is the same + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + else: + try: + if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + self.app.ui.splitter.setSizes([0, 1]) + except AttributeError: + pass + else: + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + + FlatCAMTool.run(self) + self.set_tool_ui() + + self.app.ui.notebook.setTabText(2, _("PCBWizard Tool")) + + def install(self, icon=None, separator=None, **kwargs): + FlatCAMTool.install(self, icon, separator, **kwargs) + + def set_tool_ui(self): + ## Initialize form + self.int_entry.set_value(self.integral) + self.frac_entry.set_value(self.fractional) + self.zeros_radio.set_value(self.zeros) + self.units_radio.set_value(self.units) + + self.excellon_loaded = False + self.inf_loaded = False + self.process_finished = False + + self.build_ui() + + def build_ui(self): + sorted_tools = [] + + if not self.tools_from_inf: + self.tools_table.setRowCount(1) + else: + sort = [] + for k, v in list(self.tools_from_inf.items()): + sort.append(int(k)) + sorted_tools = sorted(sort) + n = len(sorted_tools) + self.tools_table.setRowCount(n) + + tool_row = 0 + for tool in sorted_tools: + tool_id_item = QtWidgets.QTableWidgetItem('%d' % int(tool)) + tool_id_item.setFlags(QtCore.Qt.ItemIsEnabled) + self.tools_table.setItem(tool_row, 0, tool_id_item) # Tool name/id + + tool_dia_item = QtWidgets.QTableWidgetItem(str(self.tools_from_inf[tool])) + tool_dia_item.setFlags(QtCore.Qt.ItemIsEnabled) + self.tools_table.setItem(tool_row, 1, tool_dia_item) + tool_row += 1 + + self.tools_table.resizeColumnsToContents() + self.tools_table.resizeRowsToContents() + + vertical_header = self.tools_table.verticalHeader() + vertical_header.hide() + self.tools_table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + + horizontal_header = self.tools_table.horizontalHeader() + # horizontal_header.setMinimumSectionSize(10) + # horizontal_header.setDefaultSectionSize(70) + horizontal_header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) + horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + + self.tools_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.tools_table.setSortingEnabled(False) + self.tools_table.setMinimumHeight(self.tools_table.getHeight()) + self.tools_table.setMaximumHeight(self.tools_table.getHeight()) + + def update_params(self): + self.units = self.units_radio.get_value() + self.zeros = self.zeros_radio.get_value() + self.integral = self.int_entry.get_value() + self.fractional = self.frac_entry.get_value() + + def on_units_change(self, val): + if val == 'INCH': + self.int_entry.set_value(2) + self.frac_entry.set_value(4) + else: + self.int_entry.set_value(3) + self.frac_entry.set_value(3) + + def on_load_excellon_click(self): + """ + + :return: None + """ + self.app.log.debug("on_load_excellon_click()") + + 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) + except TypeError: + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard Excellon file"), + filter=filter) + + filename = str(filename) + + + if filename == "": + self.app.inform.emit(_("Open cancelled.")) + else: + self.app.worker_task.emit({'fcn': self.load_excellon, + 'params': [self, filename]}) + + def on_load_inf_click(self): + """ + + :return: None + """ + self.app.log.debug("on_load_inf_click()") + + 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) + except TypeError: + filename, _f = QtWidgets.QFileDialog.getOpenFileName(caption=_("Load PcbWizard INF file"), + filter=filter) + + filename = str(filename) + + if filename == "": + self.app.inform.emit(_("Open cancelled.")) + else: + self.app.worker_task.emit({'fcn': self.load_inf, 'params': [filename]}) + + def load_inf(self, filename): + self.app.log.debug("ToolPcbWizard.load_inf()") + + with open(filename, 'r') as inf_f: + inf_file_content = inf_f.readlines() + + tool_re = re.compile(r'^T(\d+)\s+(\d*\.?\d+)$') + + for eline in inf_file_content: + # Cleanup lines + eline = eline.strip(' \r\n') + + match = tool_re.search(eline) + if match: + tool =int( match.group(1)) + dia = float(match.group(2)) + if dia < 0.1: + # most likely the file is in INCH + self.units_radio.set_value('INCH') + + self.tools_from_inf[tool] = dia + + if not self.tools_from_inf: + self.app.inform.emit(_("[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.")) + return "fail" + + self.tools_table.setVisible(True) + self.file_loaded.emit('inf', filename) + + def load_excellon(self, filename): + with open(filename, 'r') as exc_f: + self.exc_file_content = exc_f.readlines() + + self.file_loaded.emit("excellon", filename) + + def on_file_loaded(self, signal, filename): + self.build_ui() + + if signal == 'inf': + self.inf_loaded = True + elif signal == 'excellon': + self.excellon_loaded = True + + if self.excellon_loaded and self.inf_loaded: + pass + + + # Register recent file + self.app.defaults["global_last_folder"] = os.path.split(str(filename))[0] + + def on_import_excellon(self, signal, excellon_fileobj): + self.app.log.debug("import_2files_excellon()") + + # How the object should be initialized + def obj_init(excellon_obj, app_obj): + # self.progress.emit(20) + + try: + ret = excellon_obj.parse_file(file_obj=excellon_fileobj) + if ret == "fail": + app_obj.log.debug("Excellon parsing failed.") + app_obj.inform.emit(_("[ERROR_NOTCL] This is not Excellon file.")) + return "fail" + except IOError: + app_obj.inform.emit(_("[ERROR_NOTCL] Cannot parse file: %s") % self.outname) + app_obj.log.debug("Could not import Excellon object.") + app_obj.progress.emit(0) + return "fail" + except: + msg = _("[ERROR_NOTCL] An internal error has occurred. See shell.\n") + msg += app_obj.traceback.format_exc() + app_obj.inform.emit(msg) + return "fail" + + ret = excellon_obj.create_geometry() + if ret == 'fail': + app_obj.log.debug("Could not create geometry for Excellon object.") + return "fail" + app_obj.progress.emit(100) + for tool in excellon_obj.tools: + if excellon_obj.tools[tool]['solid_geometry']: + return + app_obj.inform.emit(_("[ERROR_NOTCL] No geometry found in file: %s") % name) + return "fail" + + if self.process_finished: + with self.app.proc_container.new(_("Importing Excellon.")): + + # Object name + name = self.outname + + ret = self.app.new_object("excellon", name, obj_init, autoselected=False) + if ret == 'fail': + self.app.inform.emit(_('[ERROR_NOTCL] Import Excellon file failed.')) + return + + # Register recent file + self.app.file_opened.emit("excellon", name) + + # GUI feedback + self.app.inform.emit(_("[success] Opened: %s") % name) + else: + self.app.inform.emit(_('[WARNING_NOTCL] Excellon merging is in progress. Please wait...')) + diff --git a/flatcamTools/__init__.py b/flatcamTools/__init__.py index cd9dd56c..6119a4c1 100644 --- a/flatcamTools/__init__.py +++ b/flatcamTools/__init__.py @@ -14,5 +14,6 @@ from flatcamTools.ToolPaint import ToolPaint from flatcamTools.ToolNonCopperClear import NonCopperClear from flatcamTools.ToolTransform import ToolTransform from flatcamTools.ToolSolderPaste import SolderPaste +from flatcamTools.ToolPcbWizard import PcbWizard from flatcamTools.ToolShell import FCShell From 348fe4f13549bf9fa6e2cc49e11512d805bf3c7d Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 15 Apr 2019 05:17:16 +0300 Subject: [PATCH 10/42] - finished ToolPcbWizard; it will autodetect the Excellon format, units from the INF file --- README.md | 1 + flatcamTools/ToolPcbWizard.py | 107 +++++++++++++++++++++++++--------- 2 files changed, 80 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 08e0ee9d..1616ed8b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 15.04.2019 - working on a new tool to process automatically PcbWizard Excellon files which are generated in 2 files +- finished ToolPcbWizard; it will autodetect the Excellon format, units from the INF file 14.04.2019 diff --git a/flatcamTools/ToolPcbWizard.py b/flatcamTools/ToolPcbWizard.py index d990140d..e4338b4d 100644 --- a/flatcamTools/ToolPcbWizard.py +++ b/flatcamTools/ToolPcbWizard.py @@ -13,6 +13,8 @@ from PyQt5 import QtGui, QtWidgets, QtCore from PyQt5.QtCore import pyqtSignal import re import os +from datetime import datetime +from io import StringIO import gettext import FlatCAMTranslation as fcTranslate @@ -108,8 +110,8 @@ class PcbWizard(FlatCAMTool): form_layout1.addRow(self.frac_label, self.frac_entry) # Zeros suppression for coordinates - self.zeros_radio = RadioSet([{'label': 'LZ', 'value': 'L'}, - {'label': 'TZ', 'value': 'T'}, + 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( @@ -148,15 +150,19 @@ class PcbWizard(FlatCAMTool): self.inf_loaded = False self.process_finished = False + self.modified_excellon_file = '' + ## Signals self.excellon_brn.clicked.connect(self.on_load_excellon_click) self.inf_btn.clicked.connect(self.on_load_inf_click) - self.import_button.clicked.connect(self.on_import_excellon) + self.import_button.clicked.connect(lambda: self.on_import_excellon( + excellon_fileobj=self.modified_excellon_file)) + self.file_loaded.connect(self.on_file_loaded) self.units_radio.activated_custom.connect(self.on_units_change) self.units = 'INCH' - self.zeros = 'L' + self.zeros = 'LZ' self.integral = 2 self.fractional = 4 @@ -191,6 +197,16 @@ class PcbWizard(FlatCAMTool): FlatCAMTool.install(self, icon, separator, **kwargs) def set_tool_ui(self): + self.units = 'INCH' + self.zeros = 'LZ' + self.integral = 2 + self.fractional = 4 + + self.outname = 'file' + + self.exc_file_content = None + self.tools_from_inf = {} + ## Initialize form self.int_entry.set_value(self.integral) self.frac_entry.set_value(self.fractional) @@ -200,6 +216,7 @@ class PcbWizard(FlatCAMTool): self.excellon_loaded = False self.inf_loaded = False self.process_finished = False + self.modified_excellon_file = '' self.build_ui() @@ -207,7 +224,7 @@ class PcbWizard(FlatCAMTool): sorted_tools = [] if not self.tools_from_inf: - self.tools_table.setRowCount(1) + self.tools_table.setVisible(False) else: sort = [] for k, v in list(self.tools_from_inf.items()): @@ -281,8 +298,7 @@ class PcbWizard(FlatCAMTool): if filename == "": self.app.inform.emit(_("Open cancelled.")) else: - self.app.worker_task.emit({'fcn': self.load_excellon, - 'params': [self, filename]}) + self.app.worker_task.emit({'fcn': self.load_excellon, 'params': [filename]}) def on_load_inf_click(self): """ @@ -314,6 +330,7 @@ class PcbWizard(FlatCAMTool): inf_file_content = inf_f.readlines() tool_re = re.compile(r'^T(\d+)\s+(\d*\.?\d+)$') + format_re = re.compile(r'^(\d+)\.?(\d+)\s*format,\s*(inches|metric)?,\s*(absolute|incremental)?.*$') for eline in inf_file_content: # Cleanup lines @@ -323,11 +340,24 @@ class PcbWizard(FlatCAMTool): if match: tool =int( match.group(1)) dia = float(match.group(2)) - if dia < 0.1: - # most likely the file is in INCH - self.units_radio.set_value('INCH') + # if dia < 0.1: + # # most likely the file is in INCH + # self.units_radio.set_value('INCH') self.tools_from_inf[tool] = dia + continue + match = format_re.search(eline) + if match: + self.integral = int(match.group(1)) + self.fractional = int(match.group(2)) + units = match.group(3) + if units == 'inches': + self.units = 'INCH' + else: + self.units = 'METRIC' + self.units_radio.set_value(self.units) + self.int_entry.set_value(self.integral) + self.frac_entry.set_value(self.fractional) if not self.tools_from_inf: self.app.inform.emit(_("[ERROR] The INF file does not contain the tool table.\n" @@ -335,7 +365,6 @@ class PcbWizard(FlatCAMTool): "and edit the drill diameters manually.")) return "fail" - self.tools_table.setVisible(True) self.file_loaded.emit('inf', filename) def load_excellon(self, filename): @@ -346,20 +375,39 @@ class PcbWizard(FlatCAMTool): def on_file_loaded(self, signal, filename): self.build_ui() + time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) if signal == 'inf': self.inf_loaded = True + self.tools_table.setVisible(True) + self.app.inform.emit(_("[success] PcbWizard .INF file loaded.")) elif signal == 'excellon': self.excellon_loaded = True + self.outname = os.path.split(str(filename))[1] + self.app.inform.emit(_("[success] Main PcbWizard Excellon file loaded.")) if self.excellon_loaded and self.inf_loaded: - pass - + self.update_params() + excellon_string = '' + for line in self.exc_file_content: + excellon_string += line + if 'M48' in line: + header = ';EXCELLON RE-GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s\n' % \ + (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) + 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)) + excellon_string += header + self.modified_excellon_file = StringIO(excellon_string) + self.process_finished = True # Register recent file self.app.defaults["global_last_folder"] = os.path.split(str(filename))[0] - def on_import_excellon(self, signal, excellon_fileobj): + def on_import_excellon(self, signal=None, excellon_fileobj=None): self.app.log.debug("import_2files_excellon()") # How the object should be initialized @@ -394,22 +442,25 @@ class PcbWizard(FlatCAMTool): app_obj.inform.emit(_("[ERROR_NOTCL] No geometry found in file: %s") % name) return "fail" - if self.process_finished: - with self.app.proc_container.new(_("Importing Excellon.")): + if excellon_fileobj is not None and excellon_fileobj != '': + if self.process_finished: + with self.app.proc_container.new(_("Importing Excellon.")): - # Object name - name = self.outname + # Object name + name = self.outname - ret = self.app.new_object("excellon", name, obj_init, autoselected=False) - if ret == 'fail': - self.app.inform.emit(_('[ERROR_NOTCL] Import Excellon file failed.')) - return + ret = self.app.new_object("excellon", name, obj_init, autoselected=False) + if ret == 'fail': + self.app.inform.emit(_('[ERROR_NOTCL] Import Excellon file failed.')) + return - # Register recent file - self.app.file_opened.emit("excellon", name) + # Register recent file + self.app.file_opened.emit("excellon", name) - # GUI feedback - self.app.inform.emit(_("[success] Opened: %s") % name) + # GUI feedback + self.app.inform.emit(_("[success] Imported: %s") % name) + self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) + else: + self.app.inform.emit(_('[WARNING_NOTCL] Excellon merging is in progress. Please wait...')) else: - self.app.inform.emit(_('[WARNING_NOTCL] Excellon merging is in progress. Please wait...')) - + self.app.inform.emit(_('[ERROR_NOTCL] The imported Excellon file is None.')) From d7cb8a58258a12f859e94add02951c95d3b22208 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 15 Apr 2019 16:19:30 +0300 Subject: [PATCH 11/42] - Gerber Editor: reduced the delay to show UI when editing an empty Gerber object - update the order of event handlers connection in Editors to first connect new handlers then disconnect old handlers. It seems that if nothing is connected some VispY functions like canvas panning no longer works if there is at least once nothing connected to the 'mouse_move' event - Excellon Editor: update so always there is a tool selected even after the Execllon object was just edited; before it always required a click inside of the tool table, not you do it only if needed. - fixed the menu File -> Edit -> Edit/Close Editor entry to reflect the status of the app (Editor active or not) --- FlatCAMApp.py | 20 ++----- README.md | 4 ++ flatcamEditors/FlatCAMExcEditor.py | 92 ++++++++++++++++++------------ flatcamEditors/FlatCAMGeoEditor.py | 44 ++++++++------ flatcamEditors/FlatCAMGrbEditor.py | 81 +++++++++++++++++++------- 5 files changed, 151 insertions(+), 90 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index f567029b..850f3da8 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -2093,12 +2093,9 @@ class App(QtCore.QObject): if isinstance(edited_object, FlatCAMGerber) or isinstance(edited_object, FlatCAMGeometry) or \ isinstance(edited_object, FlatCAMExcellon): - - # adjust the status of the menu entries related to the editor - self.ui.menueditedit.setDisabled(True) - self.ui.menueditok.setDisabled(False) + pass else: - self.inform.emit(_("[WARNING_NOTCL] Select a Geometry or Excellon Object to edit.")) + self.inform.emit(_("[WARNING_NOTCL] Select a Geometry, Gerber or Excellon Object to edit.")) return if isinstance(edited_object, FlatCAMGeometry): @@ -2109,7 +2106,8 @@ class App(QtCore.QObject): edited_tools = [int(x.text()) for x in edited_object.ui.geo_tools_table.selectedItems()] if len(edited_tools) > 1: self.inform.emit(_("[WARNING_NOTCL] Simultanoeus editing of tools geometry in a MultiGeo Geometry " - "is not possible.\n Edit only one geometry at a time.")) + "is not possible.\n" + "Edit only one geometry at a time.")) self.geo_editor.edit_fcgeometry(edited_object, multigeo_tool=edited_tools[0]) else: self.geo_editor.edit_fcgeometry(edited_object) @@ -2156,16 +2154,8 @@ class App(QtCore.QObject): """ self.report_usage("editor2object()") - # adjust the status of the menu entries related to the editor - self.ui.menueditedit.setDisabled(False) - self.ui.menueditok.setDisabled(True) - # do not update a geometry or excellon object unless it comes out of an editor if self.call_source != 'app': - # adjust the visibility of some of the canvas context menu - self.ui.popmenu_edit.setVisible(True) - self.ui.popmenu_save.setVisible(False) - edited_obj = self.collection.get_active() obj_type = "" @@ -2244,6 +2234,8 @@ class App(QtCore.QObject): self.grb_editor.deactivate_grb_editor() elif isinstance(edited_obj, FlatCAMExcellon): self.exc_editor.deactivate() + # set focus on the project tab + self.ui.notebook.setCurrentWidget(self.ui.project_tab) else: self.inform.emit(_("[WARNING_NOTCL] Select a Gerber, Geometry or Excellon Object to update.")) return diff --git a/README.md b/README.md index 1616ed8b..d8e8fffe 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,10 @@ CAD program, and create G-Code for Isolation routing. - working on a new tool to process automatically PcbWizard Excellon files which are generated in 2 files - finished ToolPcbWizard; it will autodetect the Excellon format, units from the INF file +- Gerber Editor: reduced the delay to show UI when editing an empty Gerber object +- update the order of event handlers connection in Editors to first connect new handlers then disconnect old handlers. It seems that if nothing is connected some VispY functions like canvas panning no longer works if there is at least once nothing connected to the 'mouse_move' event +- Excellon Editor: update so always there is a tool selected even after the Execllon object was just edited; before it always required a click inside of the tool table, not you do it only if needed. +- fixed the menu File -> Edit -> Edit/Close Editor entry to reflect the status of the app (Editor active or not) 14.04.2019 diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py index 2f02b7c6..89e23a51 100644 --- a/flatcamEditors/FlatCAMExcEditor.py +++ b/flatcamEditors/FlatCAMExcEditor.py @@ -12,6 +12,8 @@ from camlib import * from flatcamGUI.GUIElements import FCEntry, FCComboBox, FCTable, FCDoubleSpinner, LengthEntry, RadioSet, SpinBoxDelegate from flatcamEditors.FlatCAMGeoEditor import FCShapeTool, DrawTool, DrawToolShape, DrawToolUtilityShape, FlatCAMGeoEditor +from copy import copy, deepcopy + import gettext import FlatCAMTranslation as fcTranslate @@ -695,12 +697,23 @@ class FlatCAMExcEditor(QtCore.QObject): self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() self.exc_edit_widget = QtWidgets.QWidget() + ## Box for custom widgets + # This gets populated in offspring implementations. layout = QtWidgets.QVBoxLayout() self.exc_edit_widget.setLayout(layout) + # add a frame and inside add a vertical box layout. Inside this vbox layout I add all the Drills widgets + # this way I can hide/show the frame + self.drills_frame = QtWidgets.QFrame() + self.drills_frame.setContentsMargins(0, 0, 0, 0) + layout.addWidget(self.drills_frame) + self.tools_box = QtWidgets.QVBoxLayout() + self.tools_box.setContentsMargins(0, 0, 0, 0) + self.drills_frame.setLayout(self.tools_box) + ## Page Title box (spacing between children) self.title_box = QtWidgets.QHBoxLayout() - layout.addLayout(self.title_box) + self.tools_box.addLayout(self.title_box) ## Page Title icon pixmap = QtGui.QPixmap('share/flatcam_icon32.png') @@ -715,26 +728,12 @@ class FlatCAMExcEditor(QtCore.QObject): ## Object name self.name_box = QtWidgets.QHBoxLayout() - layout.addLayout(self.name_box) + self.tools_box.addLayout(self.name_box) name_label = QtWidgets.QLabel(_("Name:")) self.name_box.addWidget(name_label) self.name_entry = FCEntry() self.name_box.addWidget(self.name_entry) - ## Box box for custom widgets - # This gets populated in offspring implementations. - self.custom_box = QtWidgets.QVBoxLayout() - layout.addLayout(self.custom_box) - - # add a frame and inside add a vertical box layout. Inside this vbox layout I add all the Drills widgets - # this way I can hide/show the frame - self.drills_frame = QtWidgets.QFrame() - self.drills_frame.setContentsMargins(0, 0, 0, 0) - self.custom_box.addWidget(self.drills_frame) - self.tools_box = QtWidgets.QVBoxLayout() - self.tools_box.setContentsMargins(0, 0, 0, 0) - self.drills_frame.setLayout(self.tools_box) - #### Tools Drills #### self.tools_table_label = QtWidgets.QLabel("%s" % _('Tools Table')) self.tools_table_label.setToolTip( @@ -1134,6 +1133,7 @@ class FlatCAMExcEditor(QtCore.QObject): return storage def set_ui(self): + # updated units self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() @@ -1177,7 +1177,7 @@ class FlatCAMExcEditor(QtCore.QObject): tool_dia = float('%.2f' % v['C']) self.tool2tooldia[int(k)] = tool_dia - def build_ui(self): + def build_ui(self, first_run=None): try: # if connected, disconnect the signal from the slot on item_changed as it creates issues @@ -1271,6 +1271,11 @@ class FlatCAMExcEditor(QtCore.QObject): self.tools_table_exc.setItem(self.tool_row, 1, dia) # Diameter self.tools_table_exc.setItem(self.tool_row, 2, drill_count) # Number of drills per tool self.tools_table_exc.setItem(self.tool_row, 3, slot_count) # Number of drills per tool + + if first_run is True: + # set now the last tool selected + self.last_tool_selected = int(tool_id) + self.tool_row += 1 # make the diameter column editable @@ -1568,6 +1573,13 @@ class FlatCAMExcEditor(QtCore.QObject): self.edited_obj_name = self.name_entry.get_value() def activate(self): + # adjust the status of the menu entries related to the editor + self.app.ui.menueditedit.setDisabled(True) + self.app.ui.menueditok.setDisabled(False) + # adjust the visibility of some of the canvas context menu + self.app.ui.popmenu_edit.setVisible(False) + self.app.ui.popmenu_save.setVisible(True) + self.connect_canvas_event_handlers() # initialize working objects @@ -1604,14 +1616,20 @@ class FlatCAMExcEditor(QtCore.QObject): if self.app.ui.grid_snap_btn.isChecked() is False: self.app.ui.grid_snap_btn.trigger() - # adjust the visibility of some of the canvas context menu - self.app.ui.popmenu_edit.setVisible(False) - self.app.ui.popmenu_save.setVisible(True) - # Tell the App that the editor is active self.editor_active = True + # show the UI + self.drills_frame.show() + def deactivate(self): + # adjust the status of the menu entries related to the editor + self.app.ui.menueditedit.setDisabled(False) + self.app.ui.menueditok.setDisabled(True) + # adjust the visibility of some of the canvas context menu + self.app.ui.popmenu_edit.setVisible(True) + self.app.ui.popmenu_save.setVisible(False) + self.disconnect_canvas_event_handlers() self.clear() self.app.ui.exc_edit_toolbar.setDisabled(True) @@ -1661,42 +1679,44 @@ class FlatCAMExcEditor(QtCore.QObject): self.app.ui.g_editor_cmenu.setEnabled(False) self.app.ui.e_editor_cmenu.setEnabled(False) - # adjust the visibility of some of the canvas context menu - self.app.ui.popmenu_edit.setVisible(True) - self.app.ui.popmenu_save.setVisible(False) - # Show original geometry if self.exc_obj: self.exc_obj.visible = True + # hide the UI + self.drills_frame.hide() + def connect_canvas_event_handlers(self): ## Canvas events + # first connect to new, then disconnect the old handlers + # don't ask why but if there is nothing connected I've seen issues + self.canvas.vis_connect('mouse_press', self.on_canvas_click) + self.canvas.vis_connect('mouse_move', self.on_canvas_move) + self.canvas.vis_connect('mouse_release', self.on_exc_click_release) + # make sure that the shortcuts key and mouse events will no longer be linked to the methods from FlatCAMApp # but those from FlatCAMGeoEditor - self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_disconnect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.disconnect() - self.canvas.vis_connect('mouse_press', self.on_canvas_click) - self.canvas.vis_connect('mouse_move', self.on_canvas_move) - self.canvas.vis_connect('mouse_release', self.on_exc_click_release) - def disconnect_canvas_event_handlers(self): - self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) - self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) - self.canvas.vis_disconnect('mouse_release', self.on_exc_click_release) - # we restore the key and mouse control to FlatCAMApp method + # first connect to new, then disconnect the old handlers + # don't ask why but if there is nothing connected I've seen issues self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.connect(self.app.collection.on_mouse_down) + self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) + self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) + self.canvas.vis_disconnect('mouse_release', self.on_exc_click_release) + def clear(self): self.active_tool = None # self.shape_buffer = [] @@ -1741,7 +1761,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.set_ui() # now that we hava data, create the GUI interface and add it to the Tool Tab - self.build_ui() + self.build_ui(first_run=True) # we activate this after the initial build as we don't need to see the tool been populated self.tools_table_exc.itemChanged.connect(self.on_tool_edit) @@ -1992,7 +2012,7 @@ class FlatCAMExcEditor(QtCore.QObject): try: selected_dia = self.tool2tooldia[self.tools_table_exc.currentRow() + 1] - self.last_tool_selected = self.tools_table_exc.currentRow() + 1 + self.last_tool_selected = copy(self.tools_table_exc.currentRow()) + 1 for obj in self.storage_dict[selected_dia].get_objects(): self.selected.append(obj) except Exception as e: diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index add13229..5067abf3 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -2855,6 +2855,13 @@ class FlatCAMGeoEditor(QtCore.QObject): self.replot() def activate(self): + # adjust the status of the menu entries related to the editor + self.app.ui.menueditedit.setDisabled(True) + self.app.ui.menueditok.setDisabled(False) + # adjust the visibility of some of the canvas context menu + self.app.ui.popmenu_edit.setVisible(False) + self.app.ui.popmenu_save.setVisible(True) + self.connect_canvas_event_handlers() # initialize working objects @@ -2887,14 +2894,17 @@ class FlatCAMGeoEditor(QtCore.QObject): for w in sel_tab_widget_list: w.setEnabled(False) - # adjust the visibility of some of the canvas context menu - self.app.ui.popmenu_edit.setVisible(False) - self.app.ui.popmenu_save.setVisible(True) - # Tell the App that the editor is active self.editor_active = True def deactivate(self): + # adjust the status of the menu entries related to the editor + self.app.ui.menueditedit.setDisabled(False) + self.app.ui.menueditok.setDisabled(True) + # adjust the visibility of some of the canvas context menu + self.app.ui.popmenu_edit.setVisible(True) + self.app.ui.popmenu_save.setVisible(False) + self.disconnect_canvas_event_handlers() self.clear() self.app.ui.geo_edit_toolbar.setDisabled(True) @@ -2942,10 +2952,6 @@ class FlatCAMGeoEditor(QtCore.QObject): # Tell the app that the editor is no longer active self.editor_active = False - # adjust the visibility of some of the canvas context menu - self.app.ui.popmenu_edit.setVisible(True) - self.app.ui.popmenu_save.setVisible(False) - try: # re-enable all the widgets in the Selected Tab that were disabled after entering in Edit Geometry Mode sel_tab_widget_list = self.app.ui.selected_tab.findChildren(QtWidgets.QWidget) @@ -2961,9 +2967,14 @@ class FlatCAMGeoEditor(QtCore.QObject): def connect_canvas_event_handlers(self): ## Canvas events + # first connect to new, then disconnect the old handlers + # don't ask why but if there is nothing connected I've seen issues + self.canvas.vis_connect('mouse_press', self.on_canvas_click) + self.canvas.vis_connect('mouse_move', self.on_canvas_move) + self.canvas.vis_connect('mouse_release', self.on_geo_click_release) + # make sure that the shortcuts key and mouse events will no longer be linked to the methods from FlatCAMApp # but those from FlatCAMGeoEditor - self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) @@ -2971,23 +2982,20 @@ class FlatCAMGeoEditor(QtCore.QObject): self.app.collection.view.clicked.disconnect() - self.canvas.vis_connect('mouse_press', self.on_canvas_click) - self.canvas.vis_connect('mouse_move', self.on_canvas_move) - self.canvas.vis_connect('mouse_release', self.on_geo_click_release) - def disconnect_canvas_event_handlers(self): - - self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) - self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) - self.canvas.vis_disconnect('mouse_release', self.on_geo_click_release) - # we restore the key and mouse control to FlatCAMApp method + # first connect to new, then disconnect the old handlers + # don't ask why but if there is nothing connected I've seen issues self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.connect(self.app.collection.on_mouse_down) + self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) + self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) + self.canvas.vis_disconnect('mouse_release', self.on_geo_click_release) + def add_shape(self, shape): """ Adds a shape to the shape storage. diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 9770f25b..e29b1137 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -8,7 +8,7 @@ import shapely.affinity as affinity from numpy import arctan2, Inf, array, sqrt, sign, dot from rtree import index as rtindex import threading, time -import copy +from copy import copy, deepcopy from camlib import * from flatcamGUI.GUIElements import FCEntry, FCComboBox, FCTable, FCDoubleSpinner, LengthEntry, RadioSet, \ @@ -36,8 +36,14 @@ class FCPad(FCShapeTool): self.name = 'pad' self.draw_app = draw_app + try: + self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 + except KeyError: + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add a Pad, first select a tool in Tool Table")) + self.draw_app.in_action = False + self.complete = True + return self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] - self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] # if those cause KeyError exception it means that the aperture type is not 'R'. Only 'R' type has those keys @@ -51,7 +57,6 @@ class FCPad(FCShapeTool): pass geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) - if isinstance(geo, DrawToolShape) and geo.geo is not None: self.draw_app.draw_utility_geometry(geo=geo) @@ -191,8 +196,15 @@ class FCPadArray(FCShapeTool): self.name = 'array' self.draw_app = draw_app + try: + self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 + except KeyError: + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table")) + self.complete = True + self.draw_app.in_action = False + self.draw_app.array_frame.hide() + return self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] - self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] # if those cause KeyError exception it means that the aperture type is not 'R'. Only 'R' type has those keys @@ -229,12 +241,6 @@ class FCPadArray(FCShapeTool): self.draw_app.app.inform.emit(self.start_msg) - try: - self.selected_size = self.draw_app.tool2tooldia[self.draw_app.last_aperture_selected] - except KeyError: - self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table")) - return - geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y), static=True) if isinstance(geo, DrawToolShape) and geo.geo is not None: @@ -466,7 +472,7 @@ class FCPadArray(FCShapeTool): self.geometry.append(DrawToolShape(geo)) self.complete = True self.draw_app.app.inform.emit(_("[success] Done. Pad Array added.")) - self.draw_app.in_action = True + self.draw_app.in_action = False self.draw_app.array_frame.hide() return @@ -1518,7 +1524,7 @@ class FlatCAMGrbEditor(QtCore.QObject): self.pad_direction_radio.set_value('CW') self.pad_axis_radio.set_value('X') - def build_ui(self): + def build_ui(self, first_run=None): try: # if connected, disconnect the signal from the slot on item_changed as it creates issues @@ -1601,6 +1607,9 @@ class FlatCAMGrbEditor(QtCore.QObject): self.apertures_table.setItem(self.apertures_row, 4, ap_dim_item) # Aperture Dimensions self.apertures_row += 1 + if first_run is True: + # set now the last aperture selected + self.last_aperture_selected = ap_code for ap_code in sorted_macros: ap_code = str(ap_code) @@ -1618,6 +1627,9 @@ class FlatCAMGrbEditor(QtCore.QObject): self.apertures_table.setItem(self.apertures_row, 2, ap_type_item) # Aperture Type self.apertures_row += 1 + if first_run is True: + # set now the last aperture selected + self.last_aperture_selected = ap_code self.apertures_table.selectColumn(0) self.apertures_table.resizeColumnsToContents() @@ -1872,6 +1884,13 @@ class FlatCAMGrbEditor(QtCore.QObject): self.apsize_entry.setReadOnly(False) def activate_grb_editor(self): + # adjust the status of the menu entries related to the editor + self.app.ui.menueditedit.setDisabled(True) + self.app.ui.menueditok.setDisabled(False) + # adjust the visibility of some of the canvas context menu + self.app.ui.popmenu_edit.setVisible(False) + self.app.ui.popmenu_save.setVisible(True) + self.connect_canvas_event_handlers() # init working objects @@ -1914,6 +1933,13 @@ class FlatCAMGrbEditor(QtCore.QObject): self.editor_active = True def deactivate_grb_editor(self): + # adjust the status of the menu entries related to the editor + self.app.ui.menueditedit.setDisabled(False) + self.app.ui.menueditok.setDisabled(True) + # adjust the visibility of some of the canvas context menu + self.app.ui.popmenu_edit.setVisible(True) + self.app.ui.popmenu_save.setVisible(False) + self.disconnect_canvas_event_handlers() self.clear() self.app.ui.grb_edit_toolbar.setDisabled(True) @@ -1978,28 +2004,33 @@ class FlatCAMGrbEditor(QtCore.QObject): # make sure that the shortcuts key and mouse events will no longer be linked to the methods from FlatCAMApp # but those from FlatCAMGeoEditor + # first connect to new, then disconnect the old handlers + # don't ask why but if there is nothing connected I've seen issues + self.canvas.vis_connect('mouse_press', self.on_canvas_click) + self.canvas.vis_connect('mouse_move', self.on_canvas_move) + self.canvas.vis_connect('mouse_release', self.on_grb_click_release) + self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_disconnect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.disconnect() - self.canvas.vis_connect('mouse_press', self.on_canvas_click) - self.canvas.vis_connect('mouse_move', self.on_canvas_move) - self.canvas.vis_connect('mouse_release', self.on_grb_click_release) - def disconnect_canvas_event_handlers(self): - self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) - self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) - self.canvas.vis_disconnect('mouse_release', self.on_grb_click_release) # we restore the key and mouse control to FlatCAMApp method + # first connect to new, then disconnect the old handlers + # don't ask why but if there is nothing connected I've seen issues self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.connect(self.app.collection.on_mouse_down) + self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) + self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) + self.canvas.vis_disconnect('mouse_release', self.on_grb_click_release) + def clear(self): self.active_tool = None # self.shape_buffer = [] @@ -2104,7 +2135,13 @@ class FlatCAMGrbEditor(QtCore.QObject): self.grb_plot_promises.append(apid) self.app.worker_task.emit({'fcn': job_thread, 'params': [self, apid]}) - self.start_delayed_plot(check_period=1000) + # 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: + self.set_ui() + # 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) def update_fcgerber(self, grb_obj): """ @@ -2296,7 +2333,7 @@ class FlatCAMGrbEditor(QtCore.QObject): try: # selected_apid = str(self.tool2tooldia[row + 1]) selected_apid = self.apertures_table.item(row, 1).text() - self.last_aperture_selected = selected_apid + self.last_aperture_selected = copy(selected_apid) for obj in self.storage_dict[selected_apid]['solid_geometry']: self.selected.append(obj) @@ -2685,7 +2722,7 @@ class FlatCAMGrbEditor(QtCore.QObject): self.set_ui() # now that we have data, create the GUI interface and add it to the Tool Tab - self.build_ui() + self.build_ui(first_run=True) self.plot_all() # HACK: enabling/disabling the cursor seams to somehow update the shapes making them more 'solid' From 2b4beebba2cdd69eebb23b941f44f2afb6b7bbaf Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 15 Apr 2019 19:29:23 +0300 Subject: [PATCH 12/42] - added support in Excellon parser for autodetection of Excellon file format for the Excellon files generate by the following ECAD sw: DipTrace, Eagle, Altium, Sprint Layout --- README.md | 1 + camlib.py | 44 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d8e8fffe..8a2adb8a 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ CAD program, and create G-Code for Isolation routing. - update the order of event handlers connection in Editors to first connect new handlers then disconnect old handlers. It seems that if nothing is connected some VispY functions like canvas panning no longer works if there is at least once nothing connected to the 'mouse_move' event - Excellon Editor: update so always there is a tool selected even after the Execllon object was just edited; before it always required a click inside of the tool table, not you do it only if needed. - fixed the menu File -> Edit -> Edit/Close Editor entry to reflect the status of the app (Editor active or not) +- added support in Excellon parser for autodetection of Excellon file format for the Excellon files generate by the following ECAD sw: DipTrace, Eagle, Altium, Sprint Layout 14.04.2019 diff --git a/camlib.py b/camlib.py index 7676bee1..05773d7c 100644 --- a/camlib.py +++ b/camlib.py @@ -3738,6 +3738,8 @@ class Excellon(Geometry): self.excellon_format_upper_mm = excellon_format_upper_mm or self.defaults["excellon_format_upper_mm"] self.excellon_format_lower_mm = excellon_format_lower_mm or self.defaults["excellon_format_lower_mm"] self.excellon_units = excellon_units or self.defaults["excellon_units"] + # detected Excellon format is stored here: + self.excellon_format = None # Attributes to be included in serialization # Always append to it because it carries contents @@ -3766,10 +3768,10 @@ class Excellon(Geometry): # Ignored in the parser #self.fmat_re = re.compile(r'^FMAT,([12])$') - # Number format and units + # Uunits and possible Excellon zeros and possible Excellon format # INCH uses 6 digits # METRIC uses 5/6 - self.units_re = re.compile(r'^(INCH|METRIC)(?:,([TL])Z)?.*$') + self.units_re = re.compile(r'^(INCH|METRIC)(?:,([TL])Z)?,?(\d*\.\d+)?.*$') # Tool definition/parameters (?= is look-ahead # NOTE: This might be an overkill! @@ -3831,6 +3833,10 @@ class Excellon(Geometry): # Allegro Excellon format support self.tool_units_re = re.compile(r'(\;\s*Holesize \d+.\s*\=\s*(\d+.\d+).*(MILS|MM))') + # Altium Excellon format support + # it's a comment like this: ";FILE_FORMAT=2:5" + self.altium_format = re.compile(r'^;\s*(?:FILE_FORMAT)?(?:Format)?[=|:]\s*(\d+)[:|.](\d+).*$') + # Parse coordinates self.leadingzeros_re = re.compile(r'^[-\+]?(0*)(\d*)') @@ -3946,6 +3952,16 @@ class Excellon(Geometry): log.debug(" Tool definition: %s %s" % (name_tool, spec)) spec['solid_geometry'] = [] continue + # search for Altium Excellon Format / Sprint Layout who is included as a comment + match = self.altium_format.search(eline) + if match: + self.excellon_format_upper_mm = match.group(1) + self.excellon_format_lower_mm = match.group(2) + + self.excellon_format_upper_in = match.group(1) + self.excellon_format_lower_in = match.group(2) + log.warning("Altium Excellon format preset found: %s:%s" % (match.group(1), match.group(2))) + continue else: log.warning("Line ignored, it's a comment: %s" % eline) else: @@ -4373,8 +4389,16 @@ class Excellon(Geometry): if match: self.units_found = match.group(1) self.zeros = match.group(2) # "T" or "L". Might be empty - - # self.units = {"INCH": "IN", "METRIC": "MM"}[match.group(1)] + self.excellon_format = match.group(3) + if self.excellon_format: + upper = len(self.excellon_format.partition('.')[0]) + lower = len(self.excellon_format.partition('.')[2]) + if self.units == 'MM': + self.excellon_format_upper_mm = upper + self.excellon_format_lower_mm = lower + else: + self.excellon_format_upper_in = upper + self.excellon_format_lower_in = lower # Modified for issue #80 self.convert_units({"INCH": "IN", "METRIC": "MM"}[self.units_found]) @@ -4423,8 +4447,16 @@ class Excellon(Geometry): if match: self.units_found = match.group(1) self.zeros = match.group(2) # "T" or "L". Might be empty - - # self.units = {"INCH": "IN", "METRIC": "MM"}[match.group(1)] + self.excellon_format = match.group(3) + if self.excellon_format: + upper = len(self.excellon_format.partition('.')[0]) + lower = len(self.excellon_format.partition('.')[2]) + if self.units == 'MM': + self.excellon_format_upper_mm = upper + self.excellon_format_lower_mm = lower + else: + self.excellon_format_upper_in = upper + self.excellon_format_lower_in = lower # Modified for issue #80 self.convert_units({"INCH": "IN", "METRIC": "MM"}[self.units_found]) From 2ba0b494ff23549b8394057a4f4584515e5d1fb6 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 15 Apr 2019 22:48:22 +0300 Subject: [PATCH 13/42] - Gerber Editor: finished a new tool: Poligonize Tool (ALT+N in Editor). It will fuse a selection of tracks into a polygon. It will fill a selection of polygons if they are apart and it will make a single polygon if the selection is overlapped. All the newly created filled polygons will be stored in aperture '0' (if it does not exist it will be automatically created) - fixed a bug in Move command in context menu who crashed the app when triggered - Gerber Editor: when adding a new aperture it will be store as the last selected and it will be used for any tools that are triggered until a new aperture is selected. --- FlatCAMApp.py | 2 +- README.md | 5 ++- camlib.py | 12 ++--- flatcamEditors/FlatCAMGrbEditor.py | 69 ++++++++++++++++++----------- flatcamGUI/FlatCAMGUI.py | 11 ++++- share/poligonize32.png | Bin 0 -> 522 bytes 6 files changed, 64 insertions(+), 35 deletions(-) create mode 100644 share/poligonize32.png diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 850f3da8..d563be51 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -5653,7 +5653,7 @@ class App(QtCore.QObject): def obj_move(self): self.report_usage("obj_move()") - self.move_tool.run() + self.move_tool.run(toggle=False) def on_fileopengerber(self): """ diff --git a/README.md b/README.md index 8a2adb8a..a73e875c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,10 @@ CAD program, and create G-Code for Isolation routing. - update the order of event handlers connection in Editors to first connect new handlers then disconnect old handlers. It seems that if nothing is connected some VispY functions like canvas panning no longer works if there is at least once nothing connected to the 'mouse_move' event - Excellon Editor: update so always there is a tool selected even after the Execllon object was just edited; before it always required a click inside of the tool table, not you do it only if needed. - fixed the menu File -> Edit -> Edit/Close Editor entry to reflect the status of the app (Editor active or not) -- added support in Excellon parser for autodetection of Excellon file format for the Excellon files generate by the following ECAD sw: DipTrace, Eagle, Altium, Sprint Layout +- added support in Excellon parser for autodetection of Excellon file format for the Excellon files generated by the following ECAD sw: DipTrace, Eagle, Altium, Sprint Layout +- Gerber Editor: finished a new tool: Poligonize Tool (ALT+N in Editor). It will fuse a selection of tracks into a polygon. It will fill a selection of polygons if they are apart and it will make a single polygon if the selection is overlapped. All the newly created filled polygons will be stored in aperture '0' (if it does not exist it will be automatically created) +- fixed a bug in Move command in context menu who crashed the app when triggered +- Gerber Editor: when adding a new aperture it will be store as the last selected and it will be used for any tools that are triggered until a new aperture is selected. 14.04.2019 diff --git a/camlib.py b/camlib.py index 05773d7c..41d03454 100644 --- a/camlib.py +++ b/camlib.py @@ -3928,9 +3928,10 @@ class Excellon(Geometry): log.warning("Found ALLEGRO start of the header: %s" % eline) continue - # Header End # - # Since there might be comments in the header that include char % or M95 - # we ignore the lines starting with ';' which show they are comments + # Search for Header End # + # Since there might be comments in the header that include header end char (% or M95) + # we ignore the lines starting with ';' that contains such header end chars because it is not a + # real header end. if self.comm_re.search(eline): match = self.tool_units_re.search(eline) if match: @@ -3938,7 +3939,7 @@ class Excellon(Geometry): line_units_found = True line_units = match.group(3) self.convert_units({"MILS": "IN", "MM": "MM"}[line_units]) - log.warning("Type of Allegro UNITS found inline: %s" % line_units) + log.warning("Type of Allegro UNITS found inline in comments: %s" % line_units) if match.group(2): name_tool += 1 @@ -3960,7 +3961,8 @@ class Excellon(Geometry): self.excellon_format_upper_in = match.group(1) self.excellon_format_lower_in = match.group(2) - log.warning("Altium Excellon format preset found: %s:%s" % (match.group(1), match.group(2))) + log.warning("Altium Excellon format preset found in comments: %s:%s" % + (match.group(1), match.group(2))) continue else: log.warning("Line ignored, it's a comment: %s" % eline) diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index e29b1137..d94ebb9d 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -2,7 +2,7 @@ from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt, QSettings from shapely.geometry import LineString, LinearRing, MultiLineString -from shapely.ops import cascaded_union +from shapely.ops import cascaded_union, unary_union import shapely.affinity as affinity from numpy import arctan2, Inf, array, sqrt, sign, dot @@ -497,39 +497,42 @@ class FCPoligonize(FCShapeTool): self.make() def click(self, point): - # self.draw_app.in_action = True - # if self.draw_app.selected: - # self.make() - # else: - # self.draw_app.app.inform.emit(_("[WARNING_NOTCL] No shapes are selected. Select shapes and try again ...")) - return "" def make(self): - geo = [] - for shape in self.draw_app.selected: - current_storage = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] - print(self.draw_app.active_tool) - aha = [] - if shape.geo: - shape_points = list(shape.geo.exterior.coords) - for pt in shape_points: - aha.append(Point(pt)) - concave_hull, bla_bla = alpha_shape(points=aha, alpha=0.5) - geo.append(concave_hull) - print(geo) - self.geometry = DrawToolShape(geo) - self.draw_app.on_grb_shape_complete(current_storage) + if not self.draw_app.selected: + self.draw_app.in_action = False + self.complete = True + self.draw_app.app.inform.emit(_("[ERROR_NOTCL] Failed. Nothing selected.")) + self.draw_app.select_tool("select") + return + + try: + current_storage = self.draw_app.storage_dict['0']['solid_geometry'] + except KeyError: + self.draw_app.on_aperture_add(apid='0') + current_storage = self.draw_app.storage_dict['0']['solid_geometry'] + + fused_geo = [Polygon(sh.geo.exterior) for sh in self.draw_app.selected] + + fused_geo = MultiPolygon(fused_geo) + fused_geo = fused_geo.buffer(0.0000001) + if isinstance(fused_geo, MultiPolygon): + for geo in fused_geo: + self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(geo)) + else: + self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(fused_geo)) + + self.draw_app.delete_selected() + self.draw_app.plot_all() self.draw_app.in_action = False self.complete = True self.draw_app.app.inform.emit(_("[success] Done. Poligonize completed.")) - self.draw_app.build_ui() # MS: always return to the Select Tool if modifier key is not pressed # else return to the current tool - key_modifier = QtWidgets.QApplication.keyboardModifiers() if self.draw_app.app.defaults["global_mselect_key"] == 'Control': modifier_to_use = Qt.ControlModifier @@ -1472,6 +1475,7 @@ class FlatCAMGrbEditor(QtCore.QObject): self.app.ui.grb_add_track_menuitem.triggered.connect(self.on_track_add) self.app.ui.grb_add_region_menuitem.triggered.connect(self.on_region_add) + self.app.ui.grb_convert_poly_menuitem.triggered.connect(self.on_poligonize) 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_transform_menuitem.triggered.connect(self.transform_tool.run) @@ -1760,6 +1764,8 @@ class FlatCAMGrbEditor(QtCore.QObject): self.build_ui() + self.last_aperture_selected = ap_id + # make a quick sort through the tool2tooldia dict so we find which row to select row_to_be_selected = None for key in sorted(self.tool2tooldia): @@ -2346,15 +2352,22 @@ class FlatCAMGrbEditor(QtCore.QObject): self.options[key] = self.sender().isChecked() return self.options[key] - def on_grb_shape_complete(self, storage=None): + def on_grb_shape_complete(self, storage=None, specific_shape=None): self.app.log.debug("on_shape_complete()") + if specific_shape: + geo = specific_shape + else: + geo = self.active_tool.geometry + if geo is None: + return + if storage is not None: # Add shape - self.add_gerber_shape(self.active_tool.geometry, storage) + self.add_gerber_shape(geo, storage) else: stora = self.storage_dict[self.last_aperture_selected]['solid_geometry'] - self.add_gerber_shape(self.active_tool.geometry, storage=stora) + self.add_gerber_shape(geo, storage=stora) # Remove any utility shapes self.delete_utility_geometry() @@ -2372,6 +2385,7 @@ class FlatCAMGrbEditor(QtCore.QObject): :return: None """ # List of DrawToolShape? + if isinstance(shape, list): for subshape in shape: self.add_gerber_shape(subshape, storage) @@ -2859,6 +2873,9 @@ class FlatCAMGrbEditor(QtCore.QObject): def on_region_add(self): self.select_tool('region') + def on_poligonize(self): + self.select_tool('poligonize') + def on_buffer(self): buff_value = 0.01 log.debug("FlatCAMGrbEditor.on_buffer()") diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 37914892..d8b37baf 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -470,6 +470,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow): _('Add Region\tN')) self.grb_editor_menu.addSeparator() + self.grb_convert_poly_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/poligonize32.png'), + _("Poligonize\tALT+N")) self.grb_add_buffer_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer\tB')) self.grb_add_scale_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/scale32.png'), @@ -690,7 +692,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.add_pad_ar_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/padarray32.png'), _('Add Pad Array')) self.grb_add_track_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/track32.png'), _("Add Track")) self.grb_add_region_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _("Add Region")) - self.grb_convert_poly_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _("Poligonize")) + self.grb_convert_poly_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/poligonize32.png'), + _("Poligonize")) self.grb_edit_toolbar.addSeparator() @@ -2529,11 +2532,15 @@ class FlatCAMGUI(QtWidgets.QMainWindow): elif modifiers == QtCore.Qt.ShiftModifier: pass elif modifiers == QtCore.Qt.AltModifier: + # 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() return - elif modifiers == QtCore.Qt.NoModifier: # Abort the current action if key == QtCore.Qt.Key_Escape or key == 'Escape': diff --git a/share/poligonize32.png b/share/poligonize32.png new file mode 100644 index 0000000000000000000000000000000000000000..95a5e3863f99259a8ecf23f96e3b596bf1ae976a GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE zr>`sfV-|j9Yk4PW%{~SOMj=lZ#}JR>Z>QMi9dZz8wYTnUQN0v2Nl*R6%pDTBD(f6F zHF;TudQ}4gCS?5Z4p^g58I*A5*6+th^JeO`pw^Vzv_VmUMdszl<(z^^VtH)(DL-3W zQ|n^pXz(!kA68la=h@C1+-HQ&6|Q>1$j-1d*7f4Dr6o3R$_!TI$M526JyIlp^!^cH ze_vG|hBcil|2$`#SrmBg$jHeWM8P_Say}BTLKo=IEp-h{bPY{I3=OPIEv<|Vbq&m|3=B5!+rAY= dLvDUbW?Cg~4Tm1{a{@Imc)I$ztaD0e0sy|S!DRpd literal 0 HcmV?d00001 From d92750d124345a2ac63c621c619619d34bf5a2a0 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 16 Apr 2019 15:27:51 +0300 Subject: [PATCH 14/42] - added ability to use ENTER key to finish tool adding in Editors, NCC Tool, Paint Tool and SolderPaste Tool. --- FlatCAMObj.py | 2 ++ README.md | 4 ++++ flatcamEditors/FlatCAMExcEditor.py | 2 +- flatcamEditors/FlatCAMGrbEditor.py | 5 ++++- flatcamGUI/ObjectUI.py | 2 +- flatcamTools/ToolNonCopperClear.py | 3 ++- flatcamTools/ToolPaint.py | 3 ++- flatcamTools/ToolSolderPaste.py | 5 +++-- 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 83678a70..fcb955dc 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -3032,6 +3032,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click) self.ui.paint_tool_button.clicked.connect(lambda: self.app.paint_tool.run(toggle=False)) self.ui.pp_geometry_name_cb.activated.connect(self.on_pp_changed) + self.ui.addtool_entry.returnPressed.connect(lambda: self.on_tool_add()) def set_tool_offset_visibility(self, current_row): if current_row is None: @@ -3107,6 +3108,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # I use lambda's because the connected functions have parameters that could be used in certain scenarios self.ui.addtool_btn.clicked.connect(lambda: self.on_tool_add()) + self.ui.copytool_btn.clicked.connect(lambda: self.on_tool_copy()) self.ui.deltool_btn.clicked.connect(lambda: self.on_tool_delete()) diff --git a/README.md b/README.md index a73e875c..2e9f41a4 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +16.04.2019 + +- added ability to use ENTER key to finish tool adding in Editors, NCC Tool, Paint Tool and SolderPaste Tool. + 15.04.2019 - working on a new tool to process automatically PcbWizard Excellon files which are generated in 2 files diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py index 89e23a51..c75ea1a2 100644 --- a/flatcamEditors/FlatCAMExcEditor.py +++ b/flatcamEditors/FlatCAMExcEditor.py @@ -1020,7 +1020,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.app.ui.delete_drill_btn.triggered.connect(self.on_delete_btn) self.name_entry.returnPressed.connect(self.on_name_activate) self.addtool_btn.clicked.connect(self.on_tool_add) - # self.addtool_entry.editingFinished.connect(self.on_tool_add) + self.addtool_entry.returnPressed.connect(self.on_tool_add) self.deltool_btn.clicked.connect(self.on_tool_delete) # self.tools_table_exc.selectionModel().currentChanged.connect(self.on_row_selected) self.tools_table_exc.cellPressed.connect(self.on_row_selected) diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index d94ebb9d..06cafa3e 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -1084,7 +1084,7 @@ class FlatCAMGrbEditor(QtCore.QObject): ) grid1.addWidget(self.apdim_lbl, 4, 0) - self.apdim_entry = EvalEntry() + self.apdim_entry = EvalEntry2() grid1.addWidget(self.apdim_entry, 4, 1) apadd_lbl = QtWidgets.QLabel('%s' % _('Add Aperture:')) @@ -1466,6 +1466,9 @@ class FlatCAMGrbEditor(QtCore.QObject): self.aptype_cb.currentIndexChanged[str].connect(self.on_aptype_changed) self.addaperture_btn.clicked.connect(self.on_aperture_add) + self.apsize_entry.returnPressed.connect(self.on_aperture_add) + self.apdim_entry.returnPressed.connect(self.on_aperture_add) + self.delaperture_btn.clicked.connect(self.on_aperture_delete) self.apertures_table.cellPressed.connect(self.on_row_selected) diff --git a/flatcamGUI/ObjectUI.py b/flatcamGUI/ObjectUI.py index 72391d8e..d5cbac25 100644 --- a/flatcamGUI/ObjectUI.py +++ b/flatcamGUI/ObjectUI.py @@ -975,7 +975,7 @@ class GeometryObjectUI(ObjectUI): "Diameter for the new tool" ) ) - self.addtool_entry = FCEntry() + self.addtool_entry = FCEntry2() # hlay.addWidget(self.addtool_label) # hlay.addStretch() diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index 4b7ee0de..a29bc229 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -121,7 +121,7 @@ class NonCopperClear(FlatCAMTool, Gerber): self.addtool_entry_lbl.setToolTip( _("Diameter for the new tool to add in the Tool Table") ) - self.addtool_entry = FCEntry() + self.addtool_entry = FCEntry2() # hlay.addWidget(self.addtool_label) # hlay.addStretch() @@ -254,6 +254,7 @@ class NonCopperClear(FlatCAMTool, Gerber): self.tools_box.addStretch() self.addtool_btn.clicked.connect(self.on_tool_add) + self.addtool_entry.returnPressed.connect(self.on_tool_add) self.deltool_btn.clicked.connect(self.on_tool_delete) self.generate_ncc_button.clicked.connect(self.on_ncc) diff --git a/flatcamTools/ToolPaint.py b/flatcamTools/ToolPaint.py index c6aff23c..4e3c1e8a 100644 --- a/flatcamTools/ToolPaint.py +++ b/flatcamTools/ToolPaint.py @@ -118,7 +118,7 @@ class ToolPaint(FlatCAMTool, Gerber): self.addtool_entry_lbl.setToolTip( _("Diameter for the new tool.") ) - self.addtool_entry = FCEntry() + self.addtool_entry = FCEntry2() # hlay.addWidget(self.addtool_label) # hlay.addStretch() @@ -307,6 +307,7 @@ class ToolPaint(FlatCAMTool, Gerber): ## Signals self.addtool_btn.clicked.connect(self.on_tool_add) + self.addtool_entry.returnPressed.connect(self.on_tool_add) # self.copytool_btn.clicked.connect(lambda: self.on_tool_copy()) self.tools_table.itemChanged.connect(self.on_tool_edit) self.deltool_btn.clicked.connect(self.on_tool_delete) diff --git a/flatcamTools/ToolSolderPaste.py b/flatcamTools/ToolSolderPaste.py index 477c055f..4f7a21e7 100644 --- a/flatcamTools/ToolSolderPaste.py +++ b/flatcamTools/ToolSolderPaste.py @@ -8,7 +8,7 @@ from FlatCAMTool import FlatCAMTool from FlatCAMCommon import LoudDict -from flatcamGUI.GUIElements import FCComboBox, FCEntry, FCTable +from flatcamGUI.GUIElements import FCComboBox, FCEntry, FCEntry2, FCTable from FlatCAMApp import log from camlib import distance from FlatCAMObj import FlatCAMCNCjob @@ -102,7 +102,7 @@ class SolderPaste(FlatCAMTool): self.addtool_entry_lbl.setToolTip( _("Diameter for the new Nozzle tool to add in the Tool Table") ) - self.addtool_entry = FCEntry() + self.addtool_entry = FCEntry2() # hlay.addWidget(self.addtool_label) # hlay.addStretch() @@ -415,6 +415,7 @@ class SolderPaste(FlatCAMTool): ## Signals self.combo_context_del_action.triggered.connect(self.on_delete_object) self.addtool_btn.clicked.connect(self.on_tool_add) + self.addtool_entry.returnPressed.connect(self.on_tool_add) self.deltool_btn.clicked.connect(self.on_tool_delete) self.soldergeo_btn.clicked.connect(self.on_create_geo_click) self.solder_gcode_btn.clicked.connect(self.on_create_gcode_click) From 83cb0b875592b83c415fa4b2184edb4eb80c0a19 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 16 Apr 2019 18:27:24 +0300 Subject: [PATCH 15/42] - Gerber Editor: started to add modes of laying a track --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 99 +++++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 2e9f41a4..9bb424d3 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 16.04.2019 - added ability to use ENTER key to finish tool adding in Editors, NCC Tool, Paint Tool and SolderPaste Tool. +- Gerber Editor: started to add modes of laying a track 15.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 06cafa3e..91e5d99f 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -565,6 +565,10 @@ class FCRegion(FCShapeTool): size_ap = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) self.buf_val = (size_ap / 2) if size_ap > 0 else 0.0000001 + self.gridx_size = float(self.draw_app.app.ui.grid_gap_x_entry.get_value()) + self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value()) + self.temp_points = [] + self.start_msg = _("Click on 1st point ...") def click(self, point): @@ -577,6 +581,10 @@ class FCRegion(FCShapeTool): return "" + def update_grid_info(self): + self.gridx_size =float( self.draw_app.app.ui.grid_gap_x_entry.get_value()) + self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value()) + def utility_geometry(self, data=None): if len(self.points) == 1: @@ -619,8 +627,10 @@ class FCTrack(FCRegion): """ def make(self): - - self.geometry = DrawToolShape(LineString(self.points).buffer(self.buf_val)) + if len(self.temp_points) == 1: + self.geometry = DrawToolShape(Point(self.temp_points).buffer(self.buf_val)) + else: + self.geometry = DrawToolShape(LineString(self.temp_points).buffer(self.buf_val)) self.name = 'track' self.draw_app.in_action = False @@ -632,13 +642,62 @@ class FCTrack(FCRegion): self.draw_app.apertures_table.clearSelection() self.draw_app.plot_all() - def utility_geometry(self, data=None): - if len(self.points) > 0: - temp_points = [x for x in self.points] - temp_points.append(data) + def click(self, point): + self.draw_app.in_action = True + self.points.append(point) - return DrawToolUtilityShape(LineString(temp_points).buffer(self.buf_val)) - return None + if len(self.temp_points) == 1: + g = DrawToolShape(Point(self.temp_points).buffer(self.buf_val)) + else: + g = DrawToolShape(LineString(self.temp_points).buffer(self.buf_val)) + + self.draw_app.add_gerber_shape(g, self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry']) + self.draw_app.plot_all() + if len(self.points) > 0: + self.draw_app.app.inform.emit(_("Click on next Point or click Right mouse button to complete ...")) + return "Click on next point or hit ENTER to complete ..." + + return "" + + def utility_geometry(self, data=None): + self.update_grid_info() + + if len(self.points) == 0: + return None + elif len(self.points) > 0: + + # TODO make sure to check the status of GRID SNAP BUTTON: if enabled ot not + self.temp_points = [self.points[-1]] + old_x = self.points[-1][0] + old_y = self.points[-1][1] + x = data[0] + y = data[1] + if (x > old_x and y == old_y) or (x < old_x and y == old_y) or (x == old_x and y > old_y) or (x == old_x and y < old_y): + self.temp_points.append(data) + elif x > old_x and y > old_y: + self.temp_points.append((x-self.gridx_size, old_y)) + self.temp_points.append((x, old_y+self.gridy_size)) + self.temp_points.append(data) + + elif x > old_x and y < old_y: + self.temp_points.append((x-self.gridx_size, old_y)) + self.temp_points.append((x, old_y-self.gridy_size)) + self.temp_points.append(data) + + elif x < old_x and y > old_y: + self.temp_points.append((x+self.gridx_size, old_y)) + self.temp_points.append((x, old_y+self.gridy_size)) + self.temp_points.append(data) + + elif x < old_x and y < old_y: + self.temp_points.append((x+self.gridx_size, old_y)) + self.temp_points.append((x, old_y-self.gridy_size)) + self.temp_points.append(data) + + if len(self.temp_points) == 1: + return DrawToolUtilityShape(Point(self.temp_points).buffer(self.buf_val)) + + return DrawToolUtilityShape(LineString(self.temp_points).buffer(self.buf_val)) def on_key(self, key): if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: @@ -2491,16 +2550,19 @@ class FlatCAMGrbEditor(QtCore.QObject): self.app.inform.emit(_("[success] Done.")) # MS: always return to the Select Tool if modifier key is not pressed - # else return to the current tool - key_modifier = QtWidgets.QApplication.keyboardModifiers() - if (self.app.defaults["global_mselect_key"] == 'Control' and - key_modifier == Qt.ControlModifier) or \ - (self.app.defaults["global_mselect_key"] == 'Shift' and - key_modifier == Qt.ShiftModifier): - + # else return to the current tool but not for FCTrack + if isinstance(self.active_tool, FCTrack): self.select_tool(self.active_tool.name) else: - self.select_tool("select") + key_modifier = QtWidgets.QApplication.keyboardModifiers() + if (self.app.defaults["global_mselect_key"] == 'Control' and + key_modifier == Qt.ControlModifier) or \ + (self.app.defaults["global_mselect_key"] == 'Shift' and + key_modifier == Qt.ShiftModifier): + + self.select_tool(self.active_tool.name) + else: + self.select_tool("select") except Exception as e: log.warning("Error: %s" % str(e)) raise @@ -2663,11 +2725,14 @@ class FlatCAMGrbEditor(QtCore.QObject): # Add the new utility shape self.tool_shape.add( shape=el, color=(self.app.defaults["global_draw_color"] + '80'), + # face_color=self.app.defaults['global_alt_sel_fill'], update=False, layer=0, tolerance=None) else: # Add the new utility shape self.tool_shape.add( - shape=geo.geo, color=(self.app.defaults["global_draw_color"] + '80'), + shape=geo.geo, + color=(self.app.defaults["global_draw_color"] + '80'), + # face_color=self.app.defaults['global_alt_sel_fill'], update=False, layer=0, tolerance=None) self.tool_shape.redraw() From 862eb2ae78e1b4903c55e00bab51b41282734445 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 16 Apr 2019 23:21:19 +0300 Subject: [PATCH 16/42] - Gerber Editor: Add Track Tool: added 5 modes for laying a track: 45-degrees, reverse-45 degrees, 90-degrees, reverse 90-degrees and free angle. Key 'T' will cycle forward through the modes and key 'R' will cycle in reverse through the track laying modes. - Gerber Editor: Add Track Tool: first right click will finish the track. Second right click will exit the Track Tool and return to Select Tool. --- README.md | 4 +- flatcamEditors/FlatCAMGrbEditor.py | 132 +++++++++++++++++++++++------ 2 files changed, 110 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 9bb424d3..0e83387d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing. - added ability to use ENTER key to finish tool adding in Editors, NCC Tool, Paint Tool and SolderPaste Tool. - Gerber Editor: started to add modes of laying a track +- Gerber Editor: Add Track Tool: added 5 modes for laying a track: 45-degrees, reverse-45 degrees, 90-degrees, reverse 90-degrees and free angle. Key 'T' will cycle forward through the modes and key 'R' will cycle in reverse through the track laying modes. +- Gerber Editor: Add Track Tool: first right click will finish the track. Second right click will exit the Track Tool and return to Select Tool. 15.04.2019 @@ -20,7 +22,7 @@ CAD program, and create G-Code for Isolation routing. - finished ToolPcbWizard; it will autodetect the Excellon format, units from the INF file - Gerber Editor: reduced the delay to show UI when editing an empty Gerber object - update the order of event handlers connection in Editors to first connect new handlers then disconnect old handlers. It seems that if nothing is connected some VispY functions like canvas panning no longer works if there is at least once nothing connected to the 'mouse_move' event -- Excellon Editor: update so always there is a tool selected even after the Execllon object was just edited; before it always required a click inside of the tool table, not you do it only if needed. +- Excellon Editor: update so always there is a tool selected even after the Excellon object was just edited; before it always required a click inside of the tool table, not you do it only if needed. - fixed the menu File -> Edit -> Edit/Close Editor entry to reflect the status of the app (Editor active or not) - added support in Excellon parser for autodetection of Excellon file format for the Excellon files generated by the following ECAD sw: DipTrace, Eagle, Altium, Sprint Layout - Gerber Editor: finished a new tool: Poligonize Tool (ALT+N in Editor). It will fuse a selection of tracks into a polygon. It will fill a selection of polygons if they are apart and it will make a single polygon if the selection is overlapped. All the newly created filled polygons will be stored in aperture '0' (if it does not exist it will be automatically created) diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 91e5d99f..88f9a8f6 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -582,7 +582,7 @@ class FCRegion(FCShapeTool): return "" def update_grid_info(self): - self.gridx_size =float( self.draw_app.app.ui.grid_gap_x_entry.get_value()) + self.gridx_size = float(self.draw_app.app.ui.grid_gap_x_entry.get_value()) self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value()) def utility_geometry(self, data=None): @@ -625,6 +625,11 @@ class FCTrack(FCRegion): """ Resulting type: Polygon """ + def __init__(self, draw_app): + FCRegion.__init__(self, draw_app) + self.draw_app = draw_app + self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) + self.mode = 1 def make(self): if len(self.temp_points) == 1: @@ -663,37 +668,61 @@ class FCTrack(FCRegion): self.update_grid_info() if len(self.points) == 0: - return None + return DrawToolUtilityShape(Point(data).buffer(self.buf_val)) elif len(self.points) > 0: - # TODO make sure to check the status of GRID SNAP BUTTON: if enabled ot not self.temp_points = [self.points[-1]] old_x = self.points[-1][0] old_y = self.points[-1][1] x = data[0] y = data[1] - if (x > old_x and y == old_y) or (x < old_x and y == old_y) or (x == old_x and y > old_y) or (x == old_x and y < old_y): - self.temp_points.append(data) - elif x > old_x and y > old_y: - self.temp_points.append((x-self.gridx_size, old_y)) - self.temp_points.append((x, old_y+self.gridy_size)) - self.temp_points.append(data) - elif x > old_x and y < old_y: - self.temp_points.append((x-self.gridx_size, old_y)) - self.temp_points.append((x, old_y-self.gridy_size)) - self.temp_points.append(data) + mx = abs(round((x - old_x) / self.gridx_size)) + my = abs(round((y - old_y) / self.gridy_size)) - elif x < old_x and y > old_y: - self.temp_points.append((x+self.gridx_size, old_y)) - self.temp_points.append((x, old_y+self.gridy_size)) - self.temp_points.append(data) - - elif x < old_x and y < old_y: - self.temp_points.append((x+self.gridx_size, old_y)) - self.temp_points.append((x, old_y-self.gridy_size)) - self.temp_points.append(data) + if self.draw_app.app.ui.grid_snap_btn.isChecked(): + if self.mode == 1: + if x > old_x: + if mx > my: + self.temp_points.append((old_x + self.gridx_size*(mx-my), old_y)) + if mx < my: + if y < old_y: + self.temp_points.append((old_x, old_y - self.gridy_size * (my-mx))) + else: + self.temp_points.append((old_x, old_y - self.gridy_size * (mx-my))) + if x < old_x: + if mx > my: + self.temp_points.append((old_x - self.gridx_size*(mx-my), old_y)) + if mx < my: + if y < old_y: + self.temp_points.append((old_x, old_y - self.gridy_size * (my-mx))) + else: + self.temp_points.append((old_x, old_y - self.gridy_size * (mx-my))) + elif self.mode == 2: + if x > old_x: + if mx > my: + self.temp_points.append((old_x + self.gridx_size*my, y)) + if mx < my: + if y < old_y: + self.temp_points.append((x, old_y - self.gridy_size * mx)) + else: + self.temp_points.append((x, old_y + self.gridy_size * mx)) + if x < old_x: + if mx > my: + self.temp_points.append((old_x - self.gridx_size * my, y)) + if mx < my: + if y < old_y: + self.temp_points.append((x, old_y - self.gridy_size * mx)) + else: + self.temp_points.append((x, old_y + self.gridy_size * mx)) + elif self.mode == 3: + self.temp_points.append((old_x, y)) + elif self.mode == 4: + self.temp_points.append((x, old_y)) + else: + pass + self.temp_points.append(data) if len(self.temp_points) == 1: return DrawToolUtilityShape(Point(self.temp_points).buffer(self.buf_val)) @@ -702,13 +731,61 @@ class FCTrack(FCRegion): def on_key(self, key): if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: - self.points = self.points[0:-1] + self.temp_points = self.points[0:-1] # Remove any previous utility shape self.draw_app.tool_shape.clear(update=False) geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) self.draw_app.draw_utility_geometry(geo=geo) return _("Backtracked one point ...") + if key == 'T' or key == QtCore.Qt.Key_T: + if self.mode == 1: + self.mode = 2 + msg = _('Track Mode 2: Reverse 45 degrees ...') + elif self.mode == 2: + self.mode = 3 + msg = _('Track Mode 3: 90 degrees ...') + elif self.mode == 3: + self.mode = 4 + msg = _('Track Mode 4: Reverse 90 degrees ...') + elif self.mode == 4: + self.mode = 5 + msg = _('Track Mode 5: Free angle ...') + else: + self.mode = 1 + msg = _('Track Mode 1: 45 degrees ...') + + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + + return msg + + if key == 'R' or key == QtCore.Qt.Key_R: + if self.mode == 1: + self.mode = 5 + msg = _('Track Mode 5: Free angle ...') + elif self.mode == 5: + self.mode = 4 + msg = _('Track Mode 4: Reverse 90 degrees ...') + elif self.mode == 4: + self.mode = 3 + msg = _('Track Mode 3: 90 degrees ...') + elif self.mode == 3: + self.mode = 2 + msg = _('Track Mode 2: Reverse 45 degrees ...') + else: + self.mode = 1 + msg = _('Track Mode 1: 45 degrees ...') + + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + + return msg + class FCScale(FCShapeTool): def __init__(self, draw_app): @@ -2537,8 +2614,13 @@ class FlatCAMGrbEditor(QtCore.QObject): self.app.panning_action = False else: if self.in_action is False: - self.app.cursor = QtGui.QCursor() - self.app.ui.popMenu.popup(self.app.cursor.pos()) + if self.active_tool.complete is False and not isinstance(self.active_tool, FCApertureSelect): + self.active_tool.complete = True + self.delete_utility_geometry() + self.select_tool('select') + else: + self.app.cursor = QtGui.QCursor() + self.app.ui.popMenu.popup(self.app.cursor.pos()) else: # if right click on canvas and the active tool need to be finished (like Path or Polygon) # right mouse click will finish the action From 7707baa9b2e9622ba509249297262c42baf7a8d1 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 01:10:21 +0300 Subject: [PATCH 17/42] - Gerber Editor: added protections for the Pad Array and Pad Tool for the case when the aperture size is zero (the aperture where to store the regions) --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 47 ++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0e83387d..47de23b6 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: started to add modes of laying a track - Gerber Editor: Add Track Tool: added 5 modes for laying a track: 45-degrees, reverse-45 degrees, 90-degrees, reverse 90-degrees and free angle. Key 'T' will cycle forward through the modes and key 'R' will cycle in reverse through the track laying modes. - Gerber Editor: Add Track Tool: first right click will finish the track. Second right click will exit the Track Tool and return to Select Tool. +- Gerber Editor: added protections for the Pad Array and Pad Tool for the case when the aperture size is zero (the aperture where to store the regions) 15.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 88f9a8f6..4e7c5a2f 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -39,10 +39,19 @@ class FCPad(FCShapeTool): try: self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 except KeyError: - self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add a Pad, first select a tool in Tool Table")) + self.draw_app.app.inform.emit(_( + "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table")) self.draw_app.in_action = False self.complete = True return + + if self.radius == 0: + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero.")) + self.dont_execute = True + return + else: + self.dont_execute = False + self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] @@ -72,6 +81,10 @@ class FCPad(FCShapeTool): return "Done." def utility_geometry(self, data=None): + if self.dont_execute is True: + self.draw_app.select_tool('select') + return + self.points = data geo_data = self.util_shape(data) if geo_data: @@ -199,11 +212,20 @@ class FCPadArray(FCShapeTool): try: self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 except KeyError: - self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table")) + self.draw_app.app.inform.emit(_( + "[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table")) self.complete = True self.draw_app.in_action = False self.draw_app.array_frame.hide() return + + if self.radius == 0: + self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero.")) + self.dont_execute = True + return + else: + self.dont_execute = False + self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] @@ -274,6 +296,10 @@ class FCPadArray(FCShapeTool): self.origin = origin def utility_geometry(self, data=None, static=None): + if self.dont_execute is True: + self.draw_app.select_tool('select') + return + self.pad_axis = self.draw_app.pad_axis_radio.get_value() self.pad_direction = self.draw_app.pad_direction_radio.get_value() self.pad_array = self.draw_app.array_type_combo.get_value() @@ -823,6 +849,11 @@ class FCScale(FCShapeTool): self.draw_app.on_scale() self.deactivate_scale() + def clean_up(self): + self.draw_app.selected = [] + self.draw_app.apertures_table.clearSelection() + self.draw_app.plot_all() + class FCBuffer(FCShapeTool): def __init__(self, draw_app): @@ -860,6 +891,11 @@ class FCBuffer(FCShapeTool): self.draw_app.on_buffer() self.deactivate_buffer() + 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): @@ -1078,6 +1114,11 @@ class FCTransform(FCShapeTool): self.origin = (0, 0) self.draw_app.transform_tool.run() + def clean_up(self): + self.draw_app.selected = [] + self.draw_app.apertures_table.clearSelection() + self.draw_app.plot_all() + class FlatCAMGrbEditor(QtCore.QObject): @@ -2781,8 +2822,8 @@ class FlatCAMGrbEditor(QtCore.QObject): self.draw_utility_geometry(geo=geo) ### Selection area on canvas section ### - dx = pos[0] - self.pos[0] if event.is_dragging == 1 and event.button == 1: + dx = pos[0] - self.pos[0] self.app.delete_selection_shape() if dx < 0: self.app.draw_moving_selection_shape((self.pos[0], self.pos[1]), (x,y), From b35dc84f0dd171bf1c1a8e9e62ca7b2165541440 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 01:38:29 +0300 Subject: [PATCH 18/42] - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion --- README.md | 4 ++++ flatcamEditors/FlatCAMGrbEditor.py | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 47de23b6..ed313ad1 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +17.04.2019 + +- Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion + 16.04.2019 - added ability to use ENTER key to finish tool adding in Editors, NCC Tool, Paint Tool and SolderPaste Tool. diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 4e7c5a2f..7255cbb0 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -1962,6 +1962,9 @@ class FlatCAMGrbEditor(QtCore.QObject): try: if apid is None or apid is False: # deleted_tool_dia = float(self.apertures_table.item(self.apertures_table.currentRow(), 1).text()) + if len(self.apertures_table.selectionModel().selectedRows()) == 0: + self.app.inform.emit(_("[WARNING_NOTCL] Select an aperture in Aperture Table")) + return for index in self.apertures_table.selectionModel().selectedRows(): row = index.row() deleted_apcode_list.append(self.apertures_table.item(row, 1).text()) @@ -1972,7 +1975,7 @@ class FlatCAMGrbEditor(QtCore.QObject): else: deleted_apcode_list.append(apid) except: - self.app.inform.emit(_("[WARNING_NOTCL] Select a tool in Tool Table")) + self.app.inform.emit(_("[WARNING_NOTCL] Select an aperture in Aperture Table")) return for deleted_aperture in deleted_apcode_list: @@ -2964,12 +2967,17 @@ class FlatCAMGrbEditor(QtCore.QObject): def delete_selected(self): temp_ref = [s for s in self.selected] + + if len(temp_ref) == 0: + self.app.inform.emit(_("[ERROR_NOTCL] Failed. No aperture geometry is selected.")) + return + for shape_sel in temp_ref: self.delete_shape(shape_sel) self.selected = [] self.build_ui() - self.app.inform.emit(_("[success] Done. Apertures deleted.")) + self.app.inform.emit(_("[success] Done. Apertures geometry deleted.")) def delete_shape(self, shape): self.is_modified = True From 5a855292c47f05dac5eff0e9e214922b0e0fb30b Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 02:26:41 +0300 Subject: [PATCH 19/42] - wip --- flatcamEditors/FlatCAMGrbEditor.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 7255cbb0..fee5f331 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -653,6 +653,9 @@ class FCTrack(FCRegion): """ def __init__(self, draw_app): FCRegion.__init__(self, draw_app) + + self.name = 'track' + self.draw_app = draw_app self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) self.mode = 1 @@ -662,7 +665,6 @@ class FCTrack(FCRegion): self.geometry = DrawToolShape(Point(self.temp_points).buffer(self.buf_val)) else: self.geometry = DrawToolShape(LineString(self.temp_points).buffer(self.buf_val)) - self.name = 'track' self.draw_app.in_action = False self.complete = True From a27d19c64e373dacb6205a9d51fa1629b96c6f5c Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 02:49:12 +0300 Subject: [PATCH 20/42] - fixed version check --- FlatCAMApp.py | 2 +- README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index d563be51..b19cb4a1 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -7772,7 +7772,7 @@ The normal flow when working in FlatCAM is the following:

self.log.debug("version_check()") - if self.ui.general_defaults_form.general_gui_group.send_stats_cb.get_value() is True: + if self.ui.general_defaults_form.general_app_group.send_stats_cb.get_value() is True: full_url = App.version_url + \ "?s=" + str(self.defaults['global_serial']) + \ "&v=" + str(self.version) + \ diff --git a/README.md b/README.md index ed313ad1..2398e87b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 17.04.2019 - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion +- fixed version check 16.04.2019 From c49ee7d27df9825905d76a6d45d64b578e725102 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 16:17:12 +0300 Subject: [PATCH 21/42] - added custom mouse cursors for some tools in Gerber Editor --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 58 ++++++++++++++++++++++++++--- share/aero.png | Bin 0 -> 2710 bytes share/aero_array.png | Bin 0 -> 2713 bytes share/aero_buffer.png | Bin 0 -> 2540 bytes share/aero_circle.png | Bin 0 -> 2725 bytes share/aero_path.png | Bin 0 -> 2712 bytes 7 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 share/aero.png create mode 100644 share/aero_array.png create mode 100644 share/aero_buffer.png create mode 100644 share/aero_circle.png create mode 100644 share/aero_path.png diff --git a/README.md b/README.md index 2398e87b..28f29376 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion - fixed version check +- added custom mouse cursors for some tools in Gerber Editor 16.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index fee5f331..71dbae67 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -36,6 +36,13 @@ class FCPad(FCShapeTool): self.name = 'pad' self.draw_app = draw_app + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + try: self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2 except KeyError: @@ -226,6 +233,13 @@ class FCPadArray(FCShapeTool): else: self.dont_execute = False + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_array.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] @@ -593,7 +607,18 @@ class FCRegion(FCShapeTool): self.gridx_size = float(self.draw_app.app.ui.grid_gap_x_entry.get_value()) self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value()) + self.temp_points = [] + # this will store the inflexion point in the geometry + self.inter_point = None + + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.start_msg = _("Click on 1st point ...") @@ -612,16 +637,18 @@ class FCRegion(FCShapeTool): self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value()) def utility_geometry(self, data=None): + if len(self.points) == 0: + return DrawToolUtilityShape(Point(data).buffer(self.buf_val)) if len(self.points) == 1: - temp_points = [x for x in self.points] - temp_points.append(data) - return DrawToolUtilityShape(LineString(temp_points).buffer(self.buf_val, join_style=1)) + self.temp_points = [x for x in self.points] + self.temp_points.append(data) + return DrawToolUtilityShape(LineString(self.temp_points).buffer(self.buf_val, join_style=1)) if len(self.points) > 1: - temp_points = [x for x in self.points] - temp_points.append(data) - return DrawToolUtilityShape(LinearRing(temp_points).buffer(self.buf_val, join_style=1)) + self.temp_points = [x for x in self.points] + self.temp_points.append(data) + return DrawToolUtilityShape(LinearRing(self.temp_points).buffer(self.buf_val, join_style=1)) return None def make(self): @@ -657,6 +684,14 @@ class FCTrack(FCRegion): self.name = 'track' self.draw_app = draw_app + + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) self.mode = 1 @@ -1042,6 +1077,11 @@ class FCApertureSelect(DrawTool): self.grb_editor_app.hide_tool('all') self.grb_editor_app.hide_tool('select') + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + def set_origin(self, origin): self.origin = origin @@ -2660,8 +2700,14 @@ class FlatCAMGrbEditor(QtCore.QObject): self.app.panning_action = False else: if self.in_action is False: + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + if self.active_tool.complete is False and not isinstance(self.active_tool, FCApertureSelect): self.active_tool.complete = True + self.in_action = False self.delete_utility_geometry() self.select_tool('select') else: diff --git a/share/aero.png b/share/aero.png new file mode 100644 index 0000000000000000000000000000000000000000..a5bc59818d7cb2deedd53ed749c310edcf7921e4 GIT binary patch literal 2710 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 Q!2kdN07*qoM6N<$f{5}J_y7O^ literal 0 HcmV?d00001 diff --git a/share/aero_array.png b/share/aero_array.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a4a4f48fb579f1c07086d433bd52cb134ba5e8 GIT binary patch literal 2713 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 T*)TS500000NkvXXu0mjfp7t!* literal 0 HcmV?d00001 diff --git a/share/aero_buffer.png b/share/aero_buffer.png new file mode 100644 index 0000000000000000000000000000000000000000..077ae73b445f3756180b1cc3885e0bfd7aea35e1 GIT binary patch literal 2540 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ck{r1W{O2ir1Og;p$KeYRzJZVLWOZvKjkI2` z><@=S-7{U)Y!(P26F{<@fBZem-|%8lFI~(vR4ZORdho!F*VpTHrP`m*=hgQ6H~N0O zbbbH87;1Os>#Lsk{DE=#`hfNK`22pn*m~RXw;}p4{PN(geDB|$_}ft9*Eqeumv}!g z^qcLx|9QR5zKwtW-VMRn0(*@MpGK{|K3^*}c+sK_TsuCg8Q&4XeQWlN^dI9_?zf#k z58%h$r})(`p0%&xD6h!AC+Md*y~jyDjkk|w_&bk?KUU^%Jv#Y8gdgIUxjpl|b~m~f zgiGI>`m&Yh4ihKB*`CJ~Z^OUf-kx{h?RC@z)Hb#{OP%-<#E5lLr%i*B&U0O~;9}>) z2sbk?ZqJw_{K4x1rQbItTLC`1Ij~wlu3?xze4%IExa(mt$I6>9lL^KMPki?-p9g;R z{hguAOLL;?uQ-7g@QW{H;l@Soeqt5?p?t?wp7>IEUFzr81-1b}dBW`2;HdLuVhVlb zR(o)6RSKr|`pOrw{WgFQVQqmk)PO)$5Sx^$F&h!$=)h;db8ej{5FjbS8(wm6O#zPc zT^r9BJ#$(3HH`8CAfzdh#BTxttlp(7^36e^QKU&15fu}ckfBYximIC4IyJ0WH!(Fc zx3J;OyNj!vyN8e9XeeV+Lc_u%Vhk)g`hcy0`2z!!XPbS>)M?Xa%&|b9)t4+?wtU4J zn|IqN0cGp9?K}23bU>xkj~qRA{KOdvu4T)flA4yDk>dk3dZ+DosC`E6U!z8E)c67F z&a^HuV2!h_*sV436}=8f}h(QqX+pX^*(2nLF39w#P(?NrI?GAw&m2okAg1 zDRwKC(5hjCiiN7v+McubX*?WN>O`E|QmZ)|q}S1T-~}ptE-0C-+n~9)3|zCL-wO26 z%GCm$_i#m}YdJ-aCKMA^g+0j~vdP*^6uve?uos6cny8RHAyc8P49lJy5%fDjN8gfN zQT|h>hS*lRRdWp(mpQTLBwwdlrC7KAmlTo+Uug0JBJ7&tsP%>4U$~Y(n^4=>xH+?L zoGNTj2+*DxZ1WK6HyUOY8Ch(S`qZ~?9jkrqB)yQu)Yu4%gGfs>!kq*P3szYflII4 z>Ggp`?qREZx%t)W#q&a2c9ZFZh75F^TAm&!9nK>61eXM@kVFxSwIMlmMtgSCP%?ZX zY7HJ5l@TC5Qg!hjy2pa5nGstdLpOp9+KT&uaKga?j~_%Fk3%82Ese33s3FX~807B| zfw)+Lz##B7kYNJ4Lx%yMM<*bWd+u{-$#bHPAfIIlI}{I&Ey$Y!{s^>Gg?O>R`K605 zoH+$Cn2;IV>jI%6aT2uwiR69kHD_ZEWCin^Kr8sOYUl3>-9r-~y)L(yc$YoI#+2%15rbQUuR5`AzeZ5sOUQIoi2fMPk#noh^kP(Un^2~-pLC3_B`+$=Zw8qW` z_<2v>hC{{KMF|J#z(L`-j%mAN^}g{OquJ061rIvsPeCoei1u$o|5Ju2af|}W<)5bo zA3YdEKw_pIPc5e5Ilk`UFF{6;-2rA>*>bd5g1JuCnGm`3r+NZ6(EZnj?r|32`JKLPixOlwl!4 zt44~6B<)8%{KJkvK`xnGB`|UueG%B5zw~{TwJ#_c@MbU0fwG*$&eh$PgBU}f%h}|rYtaU z3v{o!y*2l7`T(S!Z009pH0S^HI5Ca7m0Rj>N1sDJS|M>a) z@bL5K=<4C&NgyFSW5-`SWt+c-XlM3pg=NS_(^B=fQc5YM)L$=7JEg-Z&G4oP-Zjn- z4f9i@{L*h{bS%#3_&B3ubxhYbwH~Bv`rHNCgP!v z^F6<+;Rx2}7L2wBHU8!N)ZoJhV=n%@hVM zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=NKk{l}zh2L4lEP+3PSdKstF*}&$&qr3dZTGb& zt{wMj!jbS#6aK{~_gF)fu5Gjy`P5NIHZC;2KCg3%_4$52<$dP< zyYW!IJd_zKcjoK1?e~0RT)sZg>wA2DKOXveucPmU(#OJIEJ)9_zm0q^RPt*)z3;<# zKVa>f*LnZt^;4>rL!-q7YtF0A5GOYyWw1V}CQp`5+Ru5V zg^4xq4BR>AmCG}xz(4YONU8ToC-(q9UKFkt%oT?7hb`&ZcijEhOxf8JGjn3G#1r2g z;q$=n9^Wl=&UN#YqP}q255f7mEM{Eh?l-d_B%L>=^5C1o>l8nKF0lm$<$?LKXK}uk zn3BHwR(W_XQ36wIe8o%Z{$2ox*jq3r6&Q#O$4)K9o^wwL92I^H%X6uD!a$NB*|9R$ zQX1rFzI*dbPtV*e`8ABZK!gw?9cl<5$f{LpBi%D6q-Lz;`(WYHhhuX-aAY&3n8-3^)!;DR>8fzKzje(hGnRUu+vrnC4+QNNS zU9#HhOV?QD*^46q!JBtiA8tEsTxr)WyY0Spk8KBEJLS|Pr=5QEjAI|HrFYnV$J%G+ z{x@ss&02nly7T&1))?;n%M$6ziCoTLEY}3%{W5?<=gV2tRBOJ>UC!djC6po=E9H{o z=`sd`b*C&ReQ@`cxu5bDK=)U9%Rgc+T?bjv#)lPp!^2}#inGO}5xEF@|rRY^j*WzQq= zZ=OT^`wzq}FJp%J!j@TfntROBW;$V_En?zx);5c8r0vLD%`+7W*=`M_l|nj>)#|Zi zXY8}u*l~KLlI^xA5M>7&MQnLlv+dcVd9%Hir8)}`>@8A|uC#r#Lq*C`IcFfpls}X$ ztD`^M&tNP(SLulLOg+vHT1}@lKXsd?)atY;=&0sh$GWBMHEt9=9g#LfIrEOBY^xD< zMGIH$C!Vr|al~_%dA#>J&&+OXWL1%~o#a18zquVkRy|e9A=CD3QmMGo627n@{~mGS zw+NfD>^R7mBPXZa1i=7wfIq}}jhlxn!*#^1{h;NIoPCUZU>i_LBT3KBsQldOJNpAb z^qyB>wGPaSEXXSs*=5n^kcUUj@zloqJ6Y#!3OYI+o0j*S*frADV(JrW$S`37b}G|n z9b57u5hbC3?n>24wKWL@)*s2C=rk1)tr|2>Tq&;;-F@rmConDfl(m=dbBnc&quSI( z6|dW@Od*4>%doXXI*gm#JiK}yR)n4IqcD>wDWoGI92%+`U5Sawx z-ZX*~CE}u70*pC-;PQRn0?_(OHCyyfk>2fbS%S|<%k z-VV%D%N#YWjlVTJ)+2H<4-eB{ouId&IeRYK<>H}^#~i~6Yd%_uRyNzBdXr$F1gy?7*PSIV@rX)+v;~0mkM>6#zIy9-~nzd?cHGNT3FPi*|pU>fEKm6bv z_v8X1iV$?Cy(vUIAu(JQA^0ngNSg3ohu}lHDlTgJP$;9Wr3uxds)Vby@K9>e*fQY| zh|IG6@euZs)^VECZn-FF!o352p^&5uEHY@iOfUewjD?m)mm=Z^asxV$yq49WXbC<5 z8z7A8^E$H&QA5EiZfT53C4T=;V9kW840N`1bk@_A+WTTlCPlUHHc0|~XS!Mtfr{)h zXhmQ?1{c0e=sv>7e?&kb{G8+a!v&J>8o`e*sT*fRc*2|xhcE|9viL}a{BLMF`i>*Xyx$e- zaY8Qet|F}#GR=e0uVMPrb4Y&{`a28V1U15c0Yketsb{XPLI3~(glR)VP)S2WAW%|I zMoCOX004NLeUUv#!$2IxU(<@B6%h-HIAo|!7DPoHrHVzcP}&NuI+$Gg1x*@~6cuLz(YJs3nlVx}HXEvDf)zV6}U>s^Frd7t}p^eQ=%0X~st?f%Ws?u4huXpWTcbx#35p_(8h8bv!bCAPZNg~Rik_%u@MinKLVIe}RMv93f?MFTQ!;U{eE}2{lN54hX`hMsiEkQ~WRQ^@Cm_cQvYEHH2jbg#L+HTQA)0Hmp_i000000S*EM76Aef000gF0uTZO z6#)Sc0Rj;K0S^HI4*>xX0|giX0ullR7ytkN`1$+r@bl>C>fzzz^z`?$w7kN?$=24` zoZarS00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmYE+YT{E+YYWr9XB6 z000McNliru;{*{51`%}8E2aPd0FFsSK~zY`?a|8$fFKZsVT}<|BBqPg`#))#V(pr< zi5BxOgupLv#%P+RX|Hv-AXqTL0wqa+BnymO0wP5qq>719!84(P7eWQEBo{HAJSP^> zZP;B!XL??Hxk$kHoxNC)%VXf9EMjvK=MNsr{5HN7#%qQ8Wu-f8|F%+cZ|PS8J_mkR f(0e=#H2>>Pj28wT^d~)}00000NkvXXu0mjf-{2ru literal 0 HcmV?d00001 diff --git a/share/aero_path.png b/share/aero_path.png new file mode 100644 index 0000000000000000000000000000000000000000..10e4a6dfc6e8a98f3a3c4d4d85d76037bcc7ecb4 GIT binary patch literal 2712 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 Date: Wed, 17 Apr 2019 17:34:15 +0300 Subject: [PATCH 22/42] - Gerber Editor: work in progress to add multiple modes of drawing for the Region Tool --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 173 ++++++++++++++++++++++++++++- 2 files changed, 170 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 28f29376..07972183 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion - fixed version check - added custom mouse cursors for some tools in Gerber Editor +- Gerber Editor: work in progress to add multiple modes of drawing for the Region Tool 16.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 71dbae67..8891e0df 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -616,14 +616,19 @@ class FCRegion(FCShapeTool): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.mode = 1 + self.start_msg = _("Click on 1st point ...") def click(self, point): self.draw_app.in_action = True + + if self.inter_point is not None: + self.points.append(self.inter_point) + self.points.append(point) if len(self.points) > 0: @@ -637,16 +642,129 @@ class FCRegion(FCShapeTool): self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value()) def utility_geometry(self, data=None): + + x = data[0] + y = data[1] + if len(self.points) == 0: return DrawToolUtilityShape(Point(data).buffer(self.buf_val)) if len(self.points) == 1: self.temp_points = [x for x in self.points] - self.temp_points.append(data) - return DrawToolUtilityShape(LineString(self.temp_points).buffer(self.buf_val, join_style=1)) + + old_x = self.points[0][0] + old_y = self.points[0][1] + mx = abs(round((x - old_x) / self.gridx_size)) + my = abs(round((y - old_y) / self.gridy_size)) + + if self.draw_app.app.ui.grid_snap_btn.isChecked(): + if self.mode != 5: + if self.mode == 1: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + elif self.mode == 2: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + elif self.mode == 3: + self.temp_points.append((old_x, y)) + elif self.mode == 4: + self.temp_points.append((x, old_y)) + if self.inter_point is not None: + self.temp_points.append(self.inter_point) + else: + self.inter_point = data + self.temp_points.append(data) + else: + self.inter_point = data + self.temp_points.append(data) + + if len(self.temp_points) > 1: + try: + return DrawToolUtilityShape(LineString(self.temp_points).buffer(self.buf_val, join_style=1)) + except: + pass + else: + return DrawToolUtilityShape(Point(self.temp_points).buffer(self.buf_val)) if len(self.points) > 1: self.temp_points = [x for x in self.points] + + old_x = self.points[-1][0] + old_y = self.points[-1][1] + mx = abs(round((x - old_x) / self.gridx_size)) + my = abs(round((y - old_y) / self.gridy_size)) + + if self.draw_app.app.ui.grid_snap_btn.isChecked(): + if self.mode != 5: + if self.mode == 1: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + elif self.mode == 2: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + elif self.mode == 3: + self.temp_points.append((old_x, y)) + elif self.mode == 4: + self.temp_points.append((x, old_y)) + + self.temp_points.append(self.inter_point) + self.temp_points.append(data) return DrawToolUtilityShape(LinearRing(self.temp_points).buffer(self.buf_val, join_style=1)) return None @@ -673,6 +791,54 @@ class FCRegion(FCShapeTool): self.draw_app.draw_utility_geometry(geo=geo) return _("Backtracked one point ...") + if key == 'T' or key == QtCore.Qt.Key_T: + if self.mode == 1: + self.mode = 2 + msg = _('Track Mode 2: Reverse 45 degrees ...') + elif self.mode == 2: + self.mode = 3 + msg = _('Track Mode 3: 90 degrees ...') + elif self.mode == 3: + self.mode = 4 + msg = _('Track Mode 4: Reverse 90 degrees ...') + elif self.mode == 4: + self.mode = 5 + msg = _('Track Mode 5: Free angle ...') + else: + self.mode = 1 + msg = _('Track Mode 1: 45 degrees ...') + + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + + return msg + + if key == 'R' or key == QtCore.Qt.Key_R: + if self.mode == 1: + self.mode = 5 + msg = _('Track Mode 5: Free angle ...') + elif self.mode == 5: + self.mode = 4 + msg = _('Track Mode 4: Reverse 90 degrees ...') + elif self.mode == 4: + self.mode = 3 + msg = _('Track Mode 3: 90 degrees ...') + elif self.mode == 3: + self.mode = 2 + msg = _('Track Mode 2: Reverse 45 degrees ...') + else: + self.mode = 1 + msg = _('Track Mode 1: 45 degrees ...') + + # Remove any previous utility shape + self.draw_app.tool_shape.clear(update=False) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) + self.draw_app.draw_utility_geometry(geo=geo) + + return msg + class FCTrack(FCRegion): """ @@ -693,7 +859,6 @@ class FCTrack(FCRegion): QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) - self.mode = 1 def make(self): if len(self.temp_points) == 1: From 7218c2d920a8429ef322b639455845ef125cf747 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 20:36:36 +0300 Subject: [PATCH 23/42] - Gerber Editor: added multiple modes to lay a Region: 45-degrees, reverse 45-degrees, 90-degrees, reverse 90-degrees and free-angle. Added also key shortcuts 'T' and 'R' to cycle forward, respectively in reverse through the modes. --- README.md | 2 +- flatcamEditors/FlatCAMGrbEditor.py | 129 +++++++++++++++-------------- 2 files changed, 69 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 07972183..aecb636c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion - fixed version check - added custom mouse cursors for some tools in Gerber Editor -- Gerber Editor: work in progress to add multiple modes of drawing for the Region Tool +- Gerber Editor: added multiple modes to lay a Region: 45-degrees, reverse 45-degrees, 90-degrees, reverse 90-degrees and free-angle. Added also key shortcuts 'T' and 'R' to cycle forward, respectively in reverse through the modes. 16.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 8891e0df..9d23a39c 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -620,6 +620,7 @@ class FCRegion(FCShapeTool): QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.mode = 1 + self.draw_app.app.inform.emit(_('Corner Mode 1: 45 degrees ...')) self.start_msg = _("Click on 1st point ...") @@ -628,7 +629,6 @@ class FCRegion(FCShapeTool): if self.inter_point is not None: self.points.append(self.inter_point) - self.points.append(point) if len(self.points) > 0: @@ -694,13 +694,15 @@ class FCRegion(FCShapeTool): else: self.inter_point = (x, old_y + self.gridy_size * mx) elif self.mode == 3: - self.temp_points.append((old_x, y)) + self.inter_point = (old_x, y) elif self.mode == 4: - self.temp_points.append((x, old_y)) + self.inter_point = (x, old_y) + if self.inter_point is not None: self.temp_points.append(self.inter_point) else: self.inter_point = data + self.temp_points.append(data) else: self.inter_point = data @@ -714,67 +716,68 @@ class FCRegion(FCShapeTool): else: return DrawToolUtilityShape(Point(self.temp_points).buffer(self.buf_val)) - if len(self.points) > 1: + if len(self.points) > 2: self.temp_points = [x for x in self.points] - old_x = self.points[-1][0] old_y = self.points[-1][1] mx = abs(round((x - old_x) / self.gridx_size)) my = abs(round((y - old_y) / self.gridy_size)) - if self.draw_app.app.ui.grid_snap_btn.isChecked(): - if self.mode != 5: - if self.mode == 1: - if x > old_x: - if mx > my: - self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) - if mx < my: - if y < old_y: - self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) - else: - self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) - if x < old_x: - if mx > my: - self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) - if mx < my: - if y < old_y: - self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) - else: - self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) - elif self.mode == 2: - if x > old_x: - if mx > my: - self.inter_point = (old_x + self.gridx_size * my, y) - if mx < my: - if y < old_y: - self.inter_point = (x, old_y - self.gridy_size * mx) - else: - self.inter_point = (x, old_y + self.gridy_size * mx) - if x < old_x: - if mx > my: - self.inter_point = (old_x - self.gridx_size * my, y) - if mx < my: - if y < old_y: - self.inter_point = (x, old_y - self.gridy_size * mx) - else: - self.inter_point = (x, old_y + self.gridy_size * mx) - elif self.mode == 3: - self.temp_points.append((old_x, y)) - elif self.mode == 4: - self.temp_points.append((x, old_y)) - - self.temp_points.append(self.inter_point) + if mx and my: + if self.draw_app.app.ui.grid_snap_btn.isChecked(): + if self.mode != 5: + if self.mode == 1: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + elif self.mode == 2: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + elif self.mode == 3: + self.inter_point = (old_x, y) + elif self.mode == 4: + self.inter_point = (x, old_y) + self.temp_points.append(self.inter_point) self.temp_points.append(data) + return DrawToolUtilityShape(LinearRing(self.temp_points).buffer(self.buf_val, join_style=1)) return None def make(self): # self.geometry = LinearRing(self.points) - self.geometry = DrawToolShape(Polygon(self.points).buffer(self.buf_val, join_style=2)) + if len(self.points) > 2: + self.geometry = DrawToolShape(Polygon(self.points).buffer(self.buf_val, join_style=2)) self.draw_app.in_action = False self.complete = True - self.draw_app.app.inform.emit(_("[success] Done. Region completed.")) + self.draw_app.app.inform.emit(_("[success] Done.")) def clean_up(self): self.draw_app.selected = [] @@ -784,7 +787,10 @@ class FCRegion(FCShapeTool): def on_key(self, key): if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: - self.points = self.points[0:-1] + if self.mode == 5: + self.points = self.points[0:-1] + else: + self.points = self.points[0:-2] # Remove any previous utility shape self.draw_app.tool_shape.clear(update=False) geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) @@ -794,19 +800,19 @@ class FCRegion(FCShapeTool): if key == 'T' or key == QtCore.Qt.Key_T: if self.mode == 1: self.mode = 2 - msg = _('Track Mode 2: Reverse 45 degrees ...') + msg = _('Corner Mode 2: Reverse 45 degrees ...') elif self.mode == 2: self.mode = 3 - msg = _('Track Mode 3: 90 degrees ...') + msg = _('Corner Mode 3: 90 degrees ...') elif self.mode == 3: self.mode = 4 - msg = _('Track Mode 4: Reverse 90 degrees ...') + msg = _('Corner Mode 4: Reverse 90 degrees ...') elif self.mode == 4: self.mode = 5 - msg = _('Track Mode 5: Free angle ...') + msg = _('Corner Mode 5: Free angle ...') else: self.mode = 1 - msg = _('Track Mode 1: 45 degrees ...') + msg = _('Corner Mode 1: 45 degrees ...') # Remove any previous utility shape self.draw_app.tool_shape.clear(update=False) @@ -818,19 +824,19 @@ class FCRegion(FCShapeTool): if key == 'R' or key == QtCore.Qt.Key_R: if self.mode == 1: self.mode = 5 - msg = _('Track Mode 5: Free angle ...') + msg = _('Corner Mode 5: Free angle ...') elif self.mode == 5: self.mode = 4 - msg = _('Track Mode 4: Reverse 90 degrees ...') + msg = _('Corner Mode 4: Reverse 90 degrees ...') elif self.mode == 4: self.mode = 3 - msg = _('Track Mode 3: 90 degrees ...') + msg = _('Corner Mode 3: 90 degrees ...') elif self.mode == 3: self.mode = 2 - msg = _('Track Mode 2: Reverse 45 degrees ...') + msg = _('Corner Mode 2: Reverse 45 degrees ...') else: self.mode = 1 - msg = _('Track Mode 1: 45 degrees ...') + msg = _('Corner Mode 1: 45 degrees ...') # Remove any previous utility shape self.draw_app.tool_shape.clear(update=False) @@ -868,7 +874,7 @@ class FCTrack(FCRegion): self.draw_app.in_action = False self.complete = True - self.draw_app.app.inform.emit(_("[success] Done. Path completed.")) + self.draw_app.app.inform.emit(_("[success] Done.")) def clean_up(self): self.draw_app.selected = [] @@ -2874,6 +2880,7 @@ class FlatCAMGrbEditor(QtCore.QObject): self.active_tool.complete = True self.in_action = False self.delete_utility_geometry() + self.app.inform.emit(_("[success] Done.")) self.select_tool('select') else: self.app.cursor = QtGui.QCursor() From b749a47652ce8d34377d42e92be40f74820cff3a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 21:30:43 +0300 Subject: [PATCH 24/42] - Excellon Editor: fixed issue not remembering last tool after adding a new tool - added custom mouse cursors for Excellon and Geometry Editors in some of their tools --- README.md | 2 ++ flatcamEditors/FlatCAMExcEditor.py | 30 ++++++++++++++++ flatcamEditors/FlatCAMGeoEditor.py | 55 +++++++++++++++++++++++++++++ share/aero_array.png | Bin 2713 -> 4563 bytes share/aero_drill.png | Bin 0 -> 4538 bytes share/aero_drill_array.png | Bin 0 -> 4996 bytes 6 files changed, 87 insertions(+) create mode 100644 share/aero_drill.png create mode 100644 share/aero_drill_array.png diff --git a/README.md b/README.md index aecb636c..302b830f 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ CAD program, and create G-Code for Isolation routing. - fixed version check - added custom mouse cursors for some tools in Gerber Editor - Gerber Editor: added multiple modes to lay a Region: 45-degrees, reverse 45-degrees, 90-degrees, reverse 90-degrees and free-angle. Added also key shortcuts 'T' and 'R' to cycle forward, respectively in reverse through the modes. +- Excellon Editor: fixed issue not remembering last tool after adding a new tool +- added custom mouse cursors for Excellon and Geometry Editors in some of their tools 16.04.2019 diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py index c75ea1a2..25d44fc9 100644 --- a/flatcamEditors/FlatCAMExcEditor.py +++ b/flatcamEditors/FlatCAMExcEditor.py @@ -47,6 +47,13 @@ class FCDrillAdd(FCShapeTool): self.draw_app.select_tool("select") return + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_drill.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) if isinstance(geo, DrawToolShape) and geo.geo is not None: @@ -82,6 +89,11 @@ class FCDrillAdd(FCShapeTool): def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + # add the point to drills if the diameter is a key in the dict, if not, create it add the drill location # to the value, as a list of itself if self.selected_dia in self.draw_app.points_edit: @@ -137,6 +149,13 @@ class FCDrillArray(FCShapeTool): self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table")) return + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_drill_array.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y), static=True) if isinstance(geo, DrawToolShape) and geo.geo is not None: @@ -252,6 +271,11 @@ class FCDrillArray(FCShapeTool): self.geometry = [] geo = None + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + # add the point to drills if the diameter is a key in the dict, if not, create it add the drill location # to the value, as a list of itself if self.selected_dia not in self.draw_app.points_edit: @@ -537,6 +561,11 @@ class FCDrillSelect(DrawTool): DrawTool.__init__(self, exc_editor_app) self.name = 'drill_select' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.exc_editor_app = exc_editor_app self.storage = self.exc_editor_app.storage_dict # self.selected = self.exc_editor_app.selected @@ -1433,6 +1462,7 @@ class FlatCAMExcEditor(QtCore.QObject): for key in sorted(self.tool2tooldia): if self.tool2tooldia[key] == tool_dia: row_to_be_selected = int(key) - 1 + self.last_tool_selected = int(key) break self.tools_table_exc.selectRow(row_to_be_selected) diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index 5067abf3..4af68b11 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -1932,6 +1932,13 @@ class FCCircle(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'circle' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on CENTER ...") self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] @@ -1958,6 +1965,11 @@ class FCCircle(FCShapeTool): return None def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + p1 = self.points[0] p2 = self.points[1] radius = distance(p1, p2) @@ -2173,6 +2185,13 @@ class FCRectangle(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'rectangle' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on 1st corner ...") def click(self, point): @@ -2196,6 +2215,11 @@ class FCRectangle(FCShapeTool): return None def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + p1 = self.points[0] p2 = self.points[1] # self.geometry = LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]) @@ -2213,6 +2237,13 @@ class FCPolygon(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'polygon' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on 1st point ...") def click(self, point): @@ -2239,6 +2270,11 @@ class FCPolygon(FCShapeTool): return None def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + # self.geometry = LinearRing(self.points) self.geometry = DrawToolShape(Polygon(self.points)) self.draw_app.in_action = False @@ -2260,11 +2296,25 @@ class FCPath(FCPolygon): """ Resulting type: LineString """ + def __init__(self, draw_app): + FCPolygon.__init__(self, draw_app) + + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) def make(self): self.geometry = DrawToolShape(LineString(self.points)) self.name = 'path' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.draw_app.in_action = False self.complete = True self.draw_app.app.inform.emit(_("[success] Done. Path completed.")) @@ -2293,6 +2343,11 @@ class FCSelect(DrawTool): DrawTool.__init__(self, draw_app) self.name = 'select' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.storage = self.draw_app.storage # self.shape_buffer = self.draw_app.shape_buffer # self.selected = self.draw_app.selected diff --git a/share/aero_array.png b/share/aero_array.png index e8a4a4f48fb579f1c07086d433bd52cb134ba5e8..655351ade3be98971c2e112212b74e90dd2ef572 100644 GIT binary patch delta 4425 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 P00000NkvXXu0mjf&?cG) delta 2580 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%0A@-RS&Ko)s9hBCl; zfj3Ac^)Ap2E{s^tg|p>7twA@=f+>KF9c*#Rc}T~;P_gC?25zKMu|I)fkeHEIpTxCu zqdQOZ*}_G{QVw_qnx`GUCRy^ZjDfqUgOAys<_cniBmS%>{_ZvWsSCZ!gh3|OwWbDT zcoM{j!lSiJ6|%w{AirsNqwe^L*Bi&8c0HKNjejzp+?_X=9(23jhR8E4{>gqs03=D zk~?g!kb0B=&rP#;BYZMT$V`@A2~jRME-i6GL}CM(-*~RpHgZ1;j_AU)1{&8BC-Hru zBlLNSa>xh(4Gfd2>Ee(T|62j(@hek5VT z&_zImbK*d&dqWWT;H4`CjUPZ3-?(YVp0ep{LIs!x4zvxiRV1j@A)Beu&DWF?aFy*p z>s4=9{WoE^47|s3z*zbC7EZa=kt*m=)Bv`x*;+i?@fB2_a25 zfKzu8My+KGDb3Pj2wFl%L;b_sUk?%V?%P|m%lb%DdP>Qjb{#A}VnIU?YaQ6#S?Oaj z$#gv?YtV$0$y9L)k1c^T$c5l&!07G0I zW*B_4oa=pyji$dpKTxkkw;v*DcP%7jC_@@pm<1+lbC2#jX;56GuF)`{es_8CI~p*b ztm=ioVDbQy!6)j6^ zTY0;R3-h4r@OG`|EyLxr>A=a(0Y{17+R>xp zsG>0-eZ!|{iwk`Fl^B@+-tWmnUpL)|*NZFPV}Y7uuKK3g7ZUYb(3^P6ihR&cE#E&* zn~wwY4OdQu>?dAr-!VQkHqHS**X4kq!Mo?uNt`bAaZT9mLX1-_of;N= z8|{5O#oGxq2`XRROXpI1ICCm2uRuT7b?H{mQgj)ERK4|Z{@bW#b8bP_G5<6u18>DJ z;`^S=d-+xw{ZXRvJLiw*_(O{6&61m5E`3`bm5NkE>>%Qhp*potRK!uLSOg2Dt2Y(i;4ld5RI=Bjg;17t4tCOOOl=xjzXc6Nb$349Fy)Sp)0YbCJR5K6< zRLwFn$%L3Mtcbx^1TaW5j;O>;J(XR^!E=1w!^ii#7|-&q`*ZXwMUw$Ok$9HrhDE$i zJiTe@ocD>ttRgAI=fqKiE=c^yb=l=N&Si%Mo*6cBnK|Mxu~_b6xrH9ABZ{g~ zzL0lW;k?CJt<_okp8SQOqPCpnI;~M8v4|AX5Fw+EDr&G0qg^A#M25~29{v%>pC*?~ zt|}Ng=CJ`4lH&*egWtV1OOq3BQYZoRyx8`~7!ceAS`FL&KDO=F3E+PQuC$JSqY2D> zlHTZOkt1MW8@RacX!0I#xdRM8>5?HilAo4PDgp0j^i2g|=oaW(b^F#n$LRx*qh2lD z00)P_c$u=-Jl@^g-M4>h+Wq?h%uRC3`8l*y0000^P)t-sEopB2V{HHc0003F0tFTU z0uTTI4gmrX0t6KS0S^HJ5dZ-X0RayI0T2TP7y$wj0tFZU|Nr>;`|$Ad=;-R<;p6o5 z_p`LT!otbc*4U+h9qj-B00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF-;q5fL>Q?U=?90001eNklVgc9os+oV;9AV8Y2kEXcJta`D(bhQc#=^l=&ev#@qJVS9gyF(-e! Y08JqVqWFQ;1poj507*qoM6N<$f@6cHLI3~& literal 0 HcmV?d00001 diff --git a/share/aero_drill_array.png b/share/aero_drill_array.png new file mode 100644 index 0000000000000000000000000000000000000000..7136f86db0863666e29ae42ef120ff6896db2198 GIT binary patch literal 4996 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 O0000 Date: Wed, 17 Apr 2019 22:15:02 +0300 Subject: [PATCH 25/42] - added a warning regarding the fact that the loaded Excellon file has no tool info about the diameters. This is the case for at least the Excellon's generated by PCB Wizard. --- camlib.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/camlib.py b/camlib.py index 41d03454..178a66fe 100644 --- a/camlib.py +++ b/camlib.py @@ -4026,6 +4026,13 @@ class Excellon(Geometry): # the bellow construction is so each tool will have a slightly different diameter # starting with a default value, to allow Excellon editing after that self.diameterless = True + self.app.inform.emit(_("[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.\nThe user needs to edit the " + "resulting Excellon object and change the diameters to " + "reflect the real diameters.") % current_tool) if self.excellon_units == 'MM': diam = self.toolless_diam + (int(current_tool) - 1) / 100 From 839baea4b8e26cd30284eca02ecb1a47d6340589 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 18 Apr 2019 16:35:50 +0300 Subject: [PATCH 26/42] - Gerber Editor: added custom mouse cursors for each mode in Add Track Tool - Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). --- FlatCAMProcess.py | 4 +- README.md | 4 ++ flatcamEditors/FlatCAMGrbEditor.py | 85 +++++++++++++++++++---------- share/aero_path.png | Bin 2712 -> 0 bytes share/aero_path1.png | Bin 0 -> 6749 bytes share/aero_path2.png | Bin 0 -> 6749 bytes share/aero_path3.png | Bin 0 -> 6750 bytes share/aero_path4.png | Bin 0 -> 6749 bytes share/aero_path5.png | Bin 0 -> 6748 bytes 9 files changed, 61 insertions(+), 32 deletions(-) delete mode 100644 share/aero_path.png create mode 100644 share/aero_path1.png create mode 100644 share/aero_path2.png create mode 100644 share/aero_path3.png create mode 100644 share/aero_path4.png create mode 100644 share/aero_path5.png diff --git a/FlatCAMProcess.py b/FlatCAMProcess.py index d71e62d8..1556ab4a 100644 --- a/FlatCAMProcess.py +++ b/FlatCAMProcess.py @@ -134,13 +134,13 @@ class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer): self.something_changed.connect(self.update_view) def on_done(self, proc): - self.app.log.debug("FCVisibleProcessContainer.on_done()") + # self.app.log.debug("FCVisibleProcessContainer.on_done()") super(FCVisibleProcessContainer, self).on_done(proc) self.something_changed.emit() def on_change(self, proc): - self.app.log.debug("FCVisibleProcessContainer.on_change()") + # self.app.log.debug("FCVisibleProcessContainer.on_change()") super(FCVisibleProcessContainer, self).on_change(proc) self.something_changed.emit() diff --git a/README.md b/README.md index 302b830f..ceb4c452 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +18.04.2019 +- Gerber Editor: added custom mouse cursors for each mode in Add Track Tool +- Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). + 17.04.2019 - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 9d23a39c..67177756 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -540,7 +540,6 @@ class FCPoligonize(FCShapeTool): return "" def make(self): - if not self.draw_app.selected: self.draw_app.in_action = False self.complete = True @@ -548,20 +547,22 @@ class FCPoligonize(FCShapeTool): self.draw_app.select_tool("select") return - try: - current_storage = self.draw_app.storage_dict['0']['solid_geometry'] - except KeyError: - self.draw_app.on_aperture_add(apid='0') - current_storage = self.draw_app.storage_dict['0']['solid_geometry'] - fused_geo = [Polygon(sh.geo.exterior) for sh in self.draw_app.selected] - fused_geo = MultiPolygon(fused_geo) fused_geo = fused_geo.buffer(0.0000001) + + current_storage = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] if isinstance(fused_geo, MultiPolygon): for geo in fused_geo: self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(geo)) else: + if len(fused_geo.interiors) == 0: + try: + current_storage = self.draw_app.storage_dict['0']['solid_geometry'] + except KeyError: + self.draw_app.on_aperture_add(apid='0') + current_storage = self.draw_app.storage_dict['0']['solid_geometry'] + self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(fused_geo)) self.draw_app.delete_selected() @@ -694,9 +695,9 @@ class FCRegion(FCShapeTool): else: self.inter_point = (x, old_y + self.gridy_size * mx) elif self.mode == 3: - self.inter_point = (old_x, y) - elif self.mode == 4: self.inter_point = (x, old_y) + elif self.mode == 4: + self.inter_point = (old_x, y) if self.inter_point is not None: self.temp_points.append(self.inter_point) @@ -761,9 +762,9 @@ class FCRegion(FCShapeTool): else: self.inter_point = (x, old_y + self.gridy_size * mx) elif self.mode == 3: - self.inter_point = (old_x, y) - elif self.mode == 4: self.inter_point = (x, old_y) + elif self.mode == 4: + self.inter_point = (old_x, y) self.temp_points.append(self.inter_point) self.temp_points.append(data) @@ -861,7 +862,7 @@ class FCTrack(FCRegion): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path.png')) + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) @@ -950,9 +951,9 @@ class FCTrack(FCRegion): else: self.temp_points.append((x, old_y + self.gridy_size * mx)) elif self.mode == 3: - self.temp_points.append((old_x, y)) - elif self.mode == 4: self.temp_points.append((x, old_y)) + elif self.mode == 4: + self.temp_points.append((old_x, y)) else: pass @@ -973,20 +974,34 @@ class FCTrack(FCRegion): return _("Backtracked one point ...") if key == 'T' or key == QtCore.Qt.Key_T: + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass if self.mode == 1: self.mode = 2 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path2.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 2: Reverse 45 degrees ...') elif self.mode == 2: self.mode = 3 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path3.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 3: 90 degrees ...') elif self.mode == 3: self.mode = 4 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path4.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 4: Reverse 90 degrees ...') elif self.mode == 4: self.mode = 5 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 5: Free angle ...') else: self.mode = 1 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 1: 45 degrees ...') # Remove any previous utility shape @@ -997,20 +1012,34 @@ class FCTrack(FCRegion): return msg if key == 'R' or key == QtCore.Qt.Key_R: + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass if self.mode == 1: self.mode = 5 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 5: Free angle ...') elif self.mode == 5: self.mode = 4 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path4.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 4: Reverse 90 degrees ...') elif self.mode == 4: self.mode = 3 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path3.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 3: 90 degrees ...') elif self.mode == 3: self.mode = 2 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path2.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 2: Reverse 45 degrees ...') else: self.mode = 1 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 1: 45 degrees ...') # Remove any previous utility shape @@ -1477,30 +1506,26 @@ class FlatCAMGrbEditor(QtCore.QObject): self.apdim_entry = EvalEntry2() grid1.addWidget(self.apdim_entry, 4, 1) - apadd_lbl = QtWidgets.QLabel('%s' % _('Add Aperture:')) - apadd_lbl.setToolTip( - _("Add an aperture to the aperture list") + apadd_del_lbl = QtWidgets.QLabel('%s' % _('Add/Delete Aperture:')) + apadd_del_lbl.setToolTip( + _("Add/Delete an aperture in the aperture table") ) - grid1.addWidget(apadd_lbl, 5, 0) + self.apertures_box.addWidget(apadd_del_lbl) - self.addaperture_btn = QtWidgets.QPushButton(_('Go')) + hlay_ad = QtWidgets.QHBoxLayout() + self.apertures_box.addLayout(hlay_ad) + + self.addaperture_btn = QtWidgets.QPushButton(_('Add')) self.addaperture_btn.setToolTip( _( "Add a new aperture to the aperture list.") ) - grid1.addWidget(self.addaperture_btn, 5, 1) - apdelete_lbl = QtWidgets.QLabel('%s' % _('Del Aperture:')) - apdelete_lbl.setToolTip( - _( "Delete a aperture in the aperture list.\n" - "It will delete also the associated geometry.") - ) - grid1.addWidget(apdelete_lbl, 6, 0) - - self.delaperture_btn = QtWidgets.QPushButton(_('Go')) + self.delaperture_btn = QtWidgets.QPushButton(_('Delete')) self.delaperture_btn.setToolTip( _( "Delete a aperture in the aperture list") ) - grid1.addWidget(self.delaperture_btn, 6, 1) + hlay_ad.addWidget(self.addaperture_btn) + hlay_ad.addWidget(self.delaperture_btn) ### BUFFER TOOL ### diff --git a/share/aero_path.png b/share/aero_path.png deleted file mode 100644 index 10e4a6dfc6e8a98f3a3c4d4d85d76037bcc7ecb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2712 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 JtI=`2@K67)Xd(ar literal 0 HcmV?d00001 diff --git a/share/aero_path2.png b/share/aero_path2.png new file mode 100644 index 0000000000000000000000000000000000000000..d528c860446cd97d7c2424d3c62246860fce83ca GIT binary patch literal 6749 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 K4pU@&GV)&~&wTFy literal 0 HcmV?d00001 diff --git a/share/aero_path3.png b/share/aero_path3.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d7bac4fae427e26fc924ef87194e35ecd06a6c GIT binary patch literal 6750 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 literal 0 HcmV?d00001 diff --git a/share/aero_path4.png b/share/aero_path4.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc7b9ab68bab53b31f71b6fffac24f6f7c663d7 GIT binary patch literal 6749 zcmeH}XH*ke8-OPvp$9@oYWNUEq$wRj=xynUG@}7Tno^~g2nZMvSp=mh9fN?l$lmGz0v@}(X zh(~$iu1-!u>^04A3;+P>lAp1ehmn;x!qwfy*5SrAgom%|HN-U^2U`H}`S``uDTe(O zY`6WwBsoM8XmHyK%l(9C(!Y7K;7cjyN=htu&O`j=R@`_Hq7o$jZo6ruco!yOvVhO= zrYepwy~m7n?OIs)T506eKC>3Hw|~EeTcmYZK{R}_Eg-OTEk!{zAH%)8!Ie7lGYiH= zZqEsaqOL`jpB>rx<@BDD=9Yxs(h}b=E%lDA+|sQpF2ybrskKrXqGhjBT*r7%e*L;_ zp*0#7N{wbmX~~Yz`7SQuGMvs1oY)?Eq%34WS=hO~(1|SX#Ci!bKJsZLJ6Sd&b#~fhCREKJ+A&(p zthv;ppV^D6Q@RN)kgK7mYy9KeNov3Cw;4?1WemR*NCz`7-xIku)~L3KwPps=1DcFe zw~Tx*&(HKhO@h);R*U_k*=yIV1p=qykkZ;cAvt+9t6>4PFodevr7>y>c(!_mjdAk8 zU3e2s04dVW0T~Q97!EJTJi&oDY)E<=#q`?ICRkWz6+q6!Kqjt<2l2CHeX7fOiU zvb0=%IFP0H1ho?>!#rF3@x!%urkJ9}X(4vLv>SspJ5lm9oCb3xnN3lt*zrh6pV3Qv z7T&JCc_o;wx@$wO8^ya>V3;Z8xC?mBY@2qAe%>cQhTJn)#1M`5gUT@wMf;kB9=*I3 zwMA=_+jt!R8|~`R8l0Fi?&kgI8B)?n#pjtS+)zEYSyIPr*O3~cR8l3`n+hi)Ieg+BrsrgT58lKp-P1|)k_}hPebWVRQp~xep z+HU0fbeku7BZ2>%7QBZ)bQZ|I!2dLh;6gC6kVrBpGVoO0NXpZl=`_UaHB<IN9M#YicaplH(1f zg!83+hH_b`Sy-97pue+f#}XrF;B`rrZT%@RH@8R?b zJGS^2vL2<;Jv$8pIl|Qu^_@GdCXy{Rk2w9x?8shrG|i561xP^V-aqgh&=HBiroh;w z(L&F*APa+O)v}(qTm2jW<*rKgE2AIIdRqh{I{o_vFwWSoek)ZSaYC|k={zLKdNI!k zEi`ry{3EnOOf)lagj1S&Pk7p$A$*zos=A};7fyi2c`vdoS@{cQKR!_eJMY2UoR+tN zMI^Zv)=iMnHBA_h55*JAv|H(>O*mG)vz5_;YL@UVwq{Z2Q2Lvo_DqK8W}(fBl1Uju zjp%mSM{kS^X~1yry{xRDvX0@ zwItGva7b-i`6-pkkYU44&(W3>T(i1Q?}kUDghWm4pc%?mA~Tuz+FFaFlOiS?1MJLY$5C#b3WOH>&V;<~X-f!leCS=r$ z)7dGxJlax2EU=)-pkAd9Jq?dJ#=Z2$m;IjE=@XsM_m42<;EwRF^o zKfI*C2lAS46gdc(E=RmE1(=2SdZDK`8hfnew=B)wH+ z=IQFz+f#oL4pC4a6LXVDH=LQEN8zXX7xvi=T@6-hJ^Ywvar3b%g1L~X z`9jKWSbb7i%(!f;RYPH@G(DUrGlKqYAw2yeFF`eCBU5;vrzsT?uai&DD#L6LOxdz> z`=EZwxplYOM(hkLwDQW0ovV=LCGh>nPPe!Ry(S>bC=yePK}-%waq82)j}}|xvxB6< z`Gb$E$k23t-h~&qK*U)Cvi!lZJ=YUcGJ9p7y=*~Fq9bth64Z%u?It#Kp)!yV*%p004fV zrK)6XMgdxfQ!NoIj@z+;V*|$qjtv|eI5u!>;12`fKf)tKV8{`m-w`nUpWtBlKf#Ig zKfn*^qvOBQN5=n09~J+NraPMX-)K1fk?{Z1aE7DczteEWBjATL6Y-fHw%=dC9}b8# z6O{Sr&Y7S9Ih>LFhv)lqA(#jQ6fAIxKPP`Uh7e%@poFs?ZSr5|pahj}eEJ=J_= H%aH#9^_F;W literal 0 HcmV?d00001 diff --git a/share/aero_path5.png b/share/aero_path5.png new file mode 100644 index 0000000000000000000000000000000000000000..76e580d74d845840f4af9fa9fb1787bad3518cf2 GIT binary patch literal 6748 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 D_e*m5 literal 0 HcmV?d00001 From c5c924cbc49face31d18f8217b0fe04f720c46c7 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 18 Apr 2019 16:48:47 +0300 Subject: [PATCH 27/42] - Gerber Editor: Region Tool will add regions only in '0' aperture --- README.md | 1 + flatcamEditors/FlatCAMGrbEditor.py | 103 +++++++++++++++-------------- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index ceb4c452..8c758dd9 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 18.04.2019 - Gerber Editor: added custom mouse cursors for each mode in Add Track Tool - Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). +- Gerber Editor: Region Tool will add regions only in '0' aperture 17.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 67177756..ce4f82cd 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -620,6 +620,12 @@ class FCRegion(FCShapeTool): self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) + # regions are added always in the '0' aperture + if '0' not in self.draw_app.storage_dict: + self.draw_app.on_aperture_add(apid='0') + else: + self.draw_app.last_aperture_selected = '0' + self.mode = 1 self.draw_app.app.inform.emit(_('Corner Mode 1: 45 degrees ...')) @@ -658,56 +664,57 @@ class FCRegion(FCShapeTool): mx = abs(round((x - old_x) / self.gridx_size)) my = abs(round((y - old_y) / self.gridy_size)) - if self.draw_app.app.ui.grid_snap_btn.isChecked(): - if self.mode != 5: - if self.mode == 1: - if x > old_x: - if mx > my: - self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) - if mx < my: - if y < old_y: - self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) - else: - self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) - if x < old_x: - if mx > my: - self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) - if mx < my: - if y < old_y: - self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) - else: - self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) - elif self.mode == 2: - if x > old_x: - if mx > my: - self.inter_point = (old_x + self.gridx_size * my, y) - if mx < my: - if y < old_y: - self.inter_point = (x, old_y - self.gridy_size * mx) - else: - self.inter_point = (x, old_y + self.gridy_size * mx) - if x < old_x: - if mx > my: - self.inter_point = (old_x - self.gridx_size * my, y) - if mx < my: - if y < old_y: - self.inter_point = (x, old_y - self.gridy_size * mx) - else: - self.inter_point = (x, old_y + self.gridy_size * mx) - elif self.mode == 3: - self.inter_point = (x, old_y) - elif self.mode == 4: - self.inter_point = (old_x, y) + if mx and my: + if self.draw_app.app.ui.grid_snap_btn.isChecked(): + if self.mode != 5: + if self.mode == 1: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) + if mx < my: + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + elif self.mode == 2: + if x > old_x: + if mx > my: + self.inter_point = (old_x + self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + if x < old_x: + if mx > my: + self.inter_point = (old_x - self.gridx_size * my, y) + if mx < my: + if y < old_y: + self.inter_point = (x, old_y - self.gridy_size * mx) + else: + self.inter_point = (x, old_y + self.gridy_size * mx) + elif self.mode == 3: + self.inter_point = (x, old_y) + elif self.mode == 4: + self.inter_point = (old_x, y) - if self.inter_point is not None: - self.temp_points.append(self.inter_point) - else: - self.inter_point = data + if self.inter_point is not None: + self.temp_points.append(self.inter_point) + else: + self.inter_point = data - self.temp_points.append(data) - else: - self.inter_point = data - self.temp_points.append(data) + else: + self.inter_point = data + + self.temp_points.append(data) if len(self.temp_points) > 1: try: From f7f52e3bec79ddc3934c301b6588f5c4044b4d31 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 18 Apr 2019 21:46:00 +0300 Subject: [PATCH 28/42] - Gerber Editor: the bending mode will now survive until the tool is exited - Gerber Editor: solved some bugs related with deleting an aperture and updating the last_selected_aperture --- README.md | 2 + flatcamEditors/FlatCAMGrbEditor.py | 237 ++++++++++++++++------------- 2 files changed, 132 insertions(+), 107 deletions(-) diff --git a/README.md b/README.md index 8c758dd9..ced07166 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: added custom mouse cursors for each mode in Add Track Tool - Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). - Gerber Editor: Region Tool will add regions only in '0' aperture +- Gerber Editor: the bending mode will now survive until the tool is exited +- Gerber Editor: solved some bugs related with deleting an aperture and updating the last_selected_aperture 17.04.2019 diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index ce4f82cd..be649a12 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -547,8 +547,8 @@ class FCPoligonize(FCShapeTool): self.draw_app.select_tool("select") return - fused_geo = [Polygon(sh.geo.exterior) for sh in self.draw_app.selected] - fused_geo = MultiPolygon(fused_geo) + exterior_geo = [Polygon(sh.geo.exterior) for sh in self.draw_app.selected] + fused_geo = MultiPolygon(exterior_geo) fused_geo = fused_geo.buffer(0.0000001) current_storage = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] @@ -556,7 +556,7 @@ class FCPoligonize(FCShapeTool): for geo in fused_geo: self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(geo)) else: - if len(fused_geo.interiors) == 0: + if len(fused_geo.interiors) == 0 and len(exterior_geo) == 1: try: current_storage = self.draw_app.storage_dict['0']['solid_geometry'] except KeyError: @@ -620,13 +620,6 @@ class FCRegion(FCShapeTool): self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) - # regions are added always in the '0' aperture - if '0' not in self.draw_app.storage_dict: - self.draw_app.on_aperture_add(apid='0') - else: - self.draw_app.last_aperture_selected = '0' - - self.mode = 1 self.draw_app.app.inform.emit(_('Corner Mode 1: 45 degrees ...')) self.start_msg = _("Click on 1st point ...") @@ -666,8 +659,8 @@ class FCRegion(FCShapeTool): if mx and my: if self.draw_app.app.ui.grid_snap_btn.isChecked(): - if self.mode != 5: - if self.mode == 1: + if self.draw_app.bend_mode != 5: + if self.draw_app.bend_mode == 1: if x > old_x: if mx > my: self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) @@ -684,7 +677,7 @@ class FCRegion(FCShapeTool): self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) else: self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) - elif self.mode == 2: + elif self.draw_app.bend_mode == 2: if x > old_x: if mx > my: self.inter_point = (old_x + self.gridx_size * my, y) @@ -701,9 +694,9 @@ class FCRegion(FCShapeTool): self.inter_point = (x, old_y - self.gridy_size * mx) else: self.inter_point = (x, old_y + self.gridy_size * mx) - elif self.mode == 3: + elif self.draw_app.bend_mode == 3: self.inter_point = (x, old_y) - elif self.mode == 4: + elif self.draw_app.bend_mode == 4: self.inter_point = (old_x, y) if self.inter_point is not None: @@ -733,8 +726,8 @@ class FCRegion(FCShapeTool): if mx and my: if self.draw_app.app.ui.grid_snap_btn.isChecked(): - if self.mode != 5: - if self.mode == 1: + if self.draw_app.bend_mode != 5: + if self.draw_app.bend_mode == 1: if x > old_x: if mx > my: self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) @@ -751,7 +744,7 @@ class FCRegion(FCShapeTool): self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) else: self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) - elif self.mode == 2: + elif self.draw_app.bend_mode == 2: if x > old_x: if mx > my: self.inter_point = (old_x + self.gridx_size * my, y) @@ -768,9 +761,9 @@ class FCRegion(FCShapeTool): self.inter_point = (x, old_y - self.gridy_size * mx) else: self.inter_point = (x, old_y + self.gridy_size * mx) - elif self.mode == 3: + elif self.draw_app.bend_mode == 3: self.inter_point = (x, old_y) - elif self.mode == 4: + elif self.draw_app.bend_mode == 4: self.inter_point = (old_x, y) self.temp_points.append(self.inter_point) @@ -782,6 +775,13 @@ class FCRegion(FCShapeTool): def make(self): # self.geometry = LinearRing(self.points) if len(self.points) > 2: + + # regions are added always in the '0' aperture + if '0' not in self.draw_app.storage_dict: + self.draw_app.on_aperture_add(apid='0') + else: + self.draw_app.last_aperture_selected = '0' + self.geometry = DrawToolShape(Polygon(self.points).buffer(self.buf_val, join_style=2)) self.draw_app.in_action = False self.complete = True @@ -795,7 +795,7 @@ class FCRegion(FCShapeTool): def on_key(self, key): if key == 'Backspace' or key == QtCore.Qt.Key_Backspace: if len(self.points) > 0: - if self.mode == 5: + if self.draw_app.bend_mode == 5: self.points = self.points[0:-1] else: self.points = self.points[0:-2] @@ -806,20 +806,20 @@ class FCRegion(FCShapeTool): return _("Backtracked one point ...") if key == 'T' or key == QtCore.Qt.Key_T: - if self.mode == 1: - self.mode = 2 + if self.draw_app.bend_mode == 1: + self.draw_app.bend_mode = 2 msg = _('Corner Mode 2: Reverse 45 degrees ...') - elif self.mode == 2: - self.mode = 3 + elif self.draw_app.bend_mode == 2: + self.draw_app.bend_mode = 3 msg = _('Corner Mode 3: 90 degrees ...') - elif self.mode == 3: - self.mode = 4 + elif self.draw_app.bend_mode == 3: + self.draw_app.bend_mode = 4 msg = _('Corner Mode 4: Reverse 90 degrees ...') - elif self.mode == 4: - self.mode = 5 + elif self.draw_app.bend_mode == 4: + self.draw_app.bend_mode = 5 msg = _('Corner Mode 5: Free angle ...') else: - self.mode = 1 + self.draw_app.bend_mode = 1 msg = _('Corner Mode 1: 45 degrees ...') # Remove any previous utility shape @@ -830,20 +830,20 @@ class FCRegion(FCShapeTool): return msg if key == 'R' or key == QtCore.Qt.Key_R: - if self.mode == 1: - self.mode = 5 + if self.draw_app.bend_mode == 1: + self.draw_app.bend_mode = 5 msg = _('Corner Mode 5: Free angle ...') - elif self.mode == 5: - self.mode = 4 + elif self.draw_app.bend_mode == 5: + self.draw_app.bend_mode = 4 msg = _('Corner Mode 4: Reverse 90 degrees ...') - elif self.mode == 4: - self.mode = 3 + elif self.draw_app.bend_mode == 4: + self.draw_app.bend_mode = 3 msg = _('Corner Mode 3: 90 degrees ...') - elif self.mode == 3: - self.mode = 2 + elif self.draw_app.bend_mode == 3: + self.draw_app.bend_mode = 2 msg = _('Corner Mode 2: Reverse 45 degrees ...') else: - self.mode = 1 + self.draw_app.bend_mode = 1 msg = _('Corner Mode 1: 45 degrees ...') # Remove any previous utility shape @@ -869,7 +869,7 @@ class FCTrack(FCRegion): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path%s.png' % self.draw_app.bend_mode)) QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) @@ -923,7 +923,7 @@ class FCTrack(FCRegion): my = abs(round((y - old_y) / self.gridy_size)) if self.draw_app.app.ui.grid_snap_btn.isChecked(): - if self.mode == 1: + if self.draw_app.bend_mode == 1: if x > old_x: if mx > my: self.temp_points.append((old_x + self.gridx_size*(mx-my), old_y)) @@ -940,7 +940,7 @@ class FCTrack(FCRegion): self.temp_points.append((old_x, old_y - self.gridy_size * (my-mx))) else: self.temp_points.append((old_x, old_y - self.gridy_size * (mx-my))) - elif self.mode == 2: + elif self.draw_app.bend_mode == 2: if x > old_x: if mx > my: self.temp_points.append((old_x + self.gridx_size*my, y)) @@ -957,9 +957,9 @@ class FCTrack(FCRegion): self.temp_points.append((x, old_y - self.gridy_size * mx)) else: self.temp_points.append((x, old_y + self.gridy_size * mx)) - elif self.mode == 3: + elif self.draw_app.bend_mode == 3: self.temp_points.append((x, old_y)) - elif self.mode == 4: + elif self.draw_app.bend_mode == 4: self.temp_points.append((old_x, y)) else: pass @@ -985,28 +985,28 @@ class FCTrack(FCRegion): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - if self.mode == 1: - self.mode = 2 + if self.draw_app.bend_mode == 1: + self.draw_app.bend_mode = 2 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path2.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 2: Reverse 45 degrees ...') - elif self.mode == 2: - self.mode = 3 + elif self.draw_app.bend_mode == 2: + self.draw_app.bend_mode = 3 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path3.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 3: 90 degrees ...') - elif self.mode == 3: - self.mode = 4 + elif self.draw_app.bend_mode == 3: + self.draw_app.bend_mode = 4 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path4.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 4: Reverse 90 degrees ...') - elif self.mode == 4: - self.mode = 5 + elif self.draw_app.bend_mode == 4: + self.draw_app.bend_mode = 5 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 5: Free angle ...') else: - self.mode = 1 + self.draw_app.bend_mode = 1 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 1: 45 degrees ...') @@ -1023,28 +1023,28 @@ class FCTrack(FCRegion): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - if self.mode == 1: - self.mode = 5 + if self.draw_app.bend_mode == 1: + self.draw_app.bend_mode = 5 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 5: Free angle ...') - elif self.mode == 5: - self.mode = 4 + elif self.draw_app.bend_mode == 5: + self.draw_app.bend_mode = 4 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path4.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 4: Reverse 90 degrees ...') - elif self.mode == 4: - self.mode = 3 + elif self.draw_app.bend_mode == 4: + self.draw_app.bend_mode = 3 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path3.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 3: 90 degrees ...') - elif self.mode == 3: - self.mode = 2 + elif self.draw_app.bend_mode == 3: + self.draw_app.bend_mode = 2 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path2.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 2: Reverse 45 degrees ...') else: - self.mode = 1 + self.draw_app.bend_mode = 1 self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 1: 45 degrees ...') @@ -1280,6 +1280,10 @@ class FCApertureSelect(DrawTool): # here we store all shapes that were selected self.sel_storage = [] + # since FCApertureSelect tool is activated whenever a tool is exited I place here the reinitialization of the + # bending modes using in FCRegion and FCTrack + self.draw_app.bend_mode = 1 + self.grb_editor_app.apertures_table.clearSelection() self.grb_editor_app.hide_tool('all') self.grb_editor_app.hide_tool('select') @@ -1815,8 +1819,8 @@ class FlatCAMGrbEditor(QtCore.QObject): self.scale_factor_entry.set_value(1.0) # VisPy Visuals - self.shapes = self.app.plotcanvas.new_shape_collection(layers=1) - self.tool_shape = self.app.plotcanvas.new_shape_collection(layers=1) + self.shapes = self.canvas.new_shape_collection(layers=1) + self.tool_shape = self.canvas.new_shape_collection(layers=1) self.app.pool_recreated.connect(self.pool_recreated) # Remove from scene @@ -1835,6 +1839,9 @@ class FlatCAMGrbEditor(QtCore.QObject): self.snap_y = None self.pos = None + # used in FCRegion and FCTrack. Will store the bending mode + self.bend_mode = 1 + # signal that there is an action active like polygon or path self.in_action = False # this will flag if the Editor "tools" are launched from key shortcuts (True) or from menu toolbar (False) @@ -2122,7 +2129,7 @@ class FlatCAMGrbEditor(QtCore.QObject): return if ap_id == '0': - if ap_id not in self.olddia_newdia: + if ap_id not in self.tool2tooldia: self.storage_dict[ap_id] = {} self.storage_dict[ap_id]['type'] = 'REG' size_val = 0 @@ -2205,7 +2212,13 @@ class FlatCAMGrbEditor(QtCore.QObject): deleted_tool_offset_list = [] try: - if apid is None or apid is False: + if apid: + if isinstance(apid, list): + for dd in apid: + deleted_apcode_list.append(dd) + else: + deleted_apcode_list.append(apid) + else: # deleted_tool_dia = float(self.apertures_table.item(self.apertures_table.currentRow(), 1).text()) if len(self.apertures_table.selectionModel().selectedRows()) == 0: self.app.inform.emit(_("[WARNING_NOTCL] Select an aperture in Aperture Table")) @@ -2213,41 +2226,45 @@ class FlatCAMGrbEditor(QtCore.QObject): for index in self.apertures_table.selectionModel().selectedRows(): row = index.row() deleted_apcode_list.append(self.apertures_table.item(row, 1).text()) - else: - if isinstance(apid, list): - for dd in apid: - deleted_apcode_list.append(dd) - else: - deleted_apcode_list.append(apid) except: self.app.inform.emit(_("[WARNING_NOTCL] Select an aperture in Aperture Table")) return - for deleted_aperture in deleted_apcode_list: - # delete the storage used for that tool - self.storage_dict.pop(deleted_aperture, None) + if deleted_apcode_list: + for deleted_aperture in deleted_apcode_list: + # delete the storage used for that tool + self.storage_dict.pop(deleted_aperture, None) - # I've added this flag_del variable because dictionary don't like - # having keys deleted while iterating through them - flag_del = [] - for deleted_tool in self.tool2tooldia: - if self.tool2tooldia[deleted_tool] == deleted_aperture: - flag_del.append(deleted_tool) - - if flag_del: - for aperture_to_be_deleted in flag_del: - # delete the tool - self.tool2tooldia.pop(aperture_to_be_deleted, None) + # I've added this flag_del variable because dictionary don't like + # having keys deleted while iterating through them flag_del = [] + for deleted_tool in self.tool2tooldia: + if self.tool2tooldia[deleted_tool] == deleted_aperture: + flag_del.append(deleted_tool) - self.olddia_newdia.pop(deleted_aperture, None) + if flag_del: + for aperture_to_be_deleted in flag_del: + # delete the tool + self.tool2tooldia.pop(aperture_to_be_deleted, None) + flag_del = [] - self.app.inform.emit(_("[success] Deleted aperture with code: {del_dia}").format( - del_dia=str(deleted_aperture))) + self.olddia_newdia.pop(deleted_aperture, None) + + self.app.inform.emit(_("[success] Deleted aperture with code: {del_dia}").format( + del_dia=str(deleted_aperture))) self.plot_all() self.build_ui() + # if last aperture selected was in the apertures deleted than make sure to select a 'new' last aperture selected + # because there are tools who depend on it. + # if there is no aperture left, then add a default one :) + if self.last_aperture_selected in deleted_apcode_list: + if self.apertures_table.rowCount() == 0: + self.on_aperture_add('10') + else: + self.last_aperture_selected = self.apertures_table.item(0, 1).text() + def on_tool_edit(self, item_changed): # if connected, disconnect the signal from the slot on item_changed as it creates issues @@ -2444,10 +2461,10 @@ class FlatCAMGrbEditor(QtCore.QObject): self.canvas.vis_connect('mouse_move', self.on_canvas_move) self.canvas.vis_connect('mouse_release', self.on_grb_click_release) - self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) - self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) - self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) - self.app.plotcanvas.vis_disconnect('mouse_double_click', self.app.on_double_click_over_plot) + self.canvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) + self.canvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) + self.canvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) + self.canvas.vis_disconnect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.disconnect() def disconnect_canvas_event_handlers(self): @@ -2455,10 +2472,10 @@ class FlatCAMGrbEditor(QtCore.QObject): # we restore the key and mouse control to FlatCAMApp method # first connect to new, then disconnect the old handlers # don't ask why but if there is nothing connected I've seen issues - self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) - self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) - self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) - self.app.plotcanvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) + self.canvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) + self.canvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) + self.canvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) + self.canvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) self.app.collection.view.clicked.connect(self.app.collection.on_mouse_down) self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) @@ -2576,6 +2593,8 @@ class FlatCAMGrbEditor(QtCore.QObject): self.set_ui() # 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 + self.on_aperture_add('10') def update_fcgerber(self, grb_obj): """ @@ -2976,7 +2995,6 @@ class FlatCAMGrbEditor(QtCore.QObject): :return: """ poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])]) - sel_aperture = set() self.apertures_table.clearSelection() @@ -3078,16 +3096,21 @@ class FlatCAMGrbEditor(QtCore.QObject): ### Selection area on canvas section ### if event.is_dragging == 1 and event.button == 1: - dx = pos[0] - self.pos[0] - self.app.delete_selection_shape() - if dx < 0: - self.app.draw_moving_selection_shape((self.pos[0], self.pos[1]), (x,y), - color=self.app.defaults["global_alt_sel_line"], - face_color=self.app.defaults['global_alt_sel_fill']) - self.app.selection_type = False + # I make an exception for FCRegion and FCTrack because clicking and dragging while making regions can + # create strange issues like missing a point in a track/region + if isinstance(self.active_tool, FCRegion) or isinstance(self.active_tool, FCTrack): + pass else: - self.app.draw_moving_selection_shape((self.pos[0], self.pos[1]), (x,y)) - self.app.selection_type = True + dx = pos[0] - self.pos[0] + self.app.delete_selection_shape() + if dx < 0: + self.app.draw_moving_selection_shape((self.pos[0], self.pos[1]), (x,y), + color=self.app.defaults["global_alt_sel_line"], + face_color=self.app.defaults['global_alt_sel_fill']) + self.app.selection_type = False + else: + self.app.draw_moving_selection_shape((self.pos[0], self.pos[1]), (x,y)) + self.app.selection_type = True else: self.app.selection_type = None From 52fceae054134a8ff3b92c3453518a7e2d995cae Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Fri, 19 Apr 2019 17:12:10 +0300 Subject: [PATCH 29/42] - started to work on PDF import tool --- FlatCAMApp.py | 6 +- README.md | 6 ++ flatcamTools/ToolPDF.py | 178 +++++++++++++++++++++++++++++++++++++++ flatcamTools/__init__.py | 1 + share/pdf32.png | Bin 0 -> 2032 bytes 5 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 flatcamTools/ToolPDF.py create mode 100644 share/pdf32.png diff --git a/FlatCAMApp.py b/FlatCAMApp.py index b19cb4a1..8620ed20 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -2007,8 +2007,10 @@ class App(QtCore.QObject): self.image_tool.install(icon=QtGui.QIcon('share/image32.png'), pos=self.ui.menufileimport, separator=True) self.pcb_wizard_tool = PcbWizard(self) - self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport, - separator=True) + self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport) + + self.pdf_tool = ToolPDF(self) + self.pdf_tool.install(icon=QtGui.QIcon('share/pdf32.png'), pos=self.ui.menufileimport) self.log.debug("Tools are installed.") diff --git a/README.md b/README.md index ced07166..54b860da 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,13 @@ CAD program, and create G-Code for Isolation routing. ================================================= +19.04.2019 + +- started to work on PDF import tool + + 18.04.2019 + - Gerber Editor: added custom mouse cursors for each mode in Add Track Tool - Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). - Gerber Editor: Region Tool will add regions only in '0' aperture diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py new file mode 100644 index 00000000..b2676a3b --- /dev/null +++ b/flatcamTools/ToolPDF.py @@ -0,0 +1,178 @@ +############################################################ +# FlatCAM: 2D Post-processing for Manufacturing # +# http://flatcam.org # +# File Author: Marius Adrian Stanciu (c) # +# Date: 3/10/2019 # +# MIT Licence # +############################################################ + +from FlatCAMTool import FlatCAMTool +from FlatCAMObj import * +import math +import numpy as np +import scipy.interpolate + +import zlib +import re + +import gettext +import FlatCAMTranslation as fcTranslate + +fcTranslate.apply_language('strings') +import builtins +if '_' not in builtins.__dict__: + _ = gettext.gettext + + +class ToolPDF(FlatCAMTool): + ''' + Parse a PDF file. + Reference here: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf + Return a list of geometries + ''' + toolName = _("PDF Import Tool") + + def __init__(self, app): + FlatCAMTool.__init__(self, app) + self.app = app + self.step_per_circles = self.app.defaults["gerber_circle_steps"] + + self.stream_re = re.compile(b'.*?FlateDecode.*?stream(.*?)endstream', re.S) + + # detect 'w' command + self.strokewidth_re = re.compile(r'^(\d+\.?\d*)\s*w$') + # detect 're' command + self.rect_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sre$') + # detect 'm' command + self.start_path_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sm$') + # detect 'l' command + self.draw_line_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sl') + # detect 'c' command + self.draw_arc_3pt_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sc$') + # detect 'v' command + self.draw_arc_2pt_23_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sv$') + # detect 'y' command + self.draw_arc_2pt_13_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sy$') + # detect 'h' command + self.end_path_re = re.compile(r'^h$') + + + self.pdf_parsed = '' + + def run(self, toggle=True): + self.app.report_usage("ToolPDF()") + + # if toggle: + # # if the splitter is hidden, display it, else hide it but only if the current widget is the same + # if self.app.ui.splitter.sizes()[0] == 0: + # self.app.ui.splitter.setSizes([1, 1]) + # else: + # try: + # if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: + # self.app.ui.splitter.setSizes([0, 1]) + # except AttributeError: + # pass + # else: + # if self.app.ui.splitter.sizes()[0] == 0: + # self.app.ui.splitter.setSizes([1, 1]) + # + # FlatCAMTool.run(self) + + self.set_tool_ui() + self.on_open_pdf_click() + + # self.app.ui.notebook.setTabText(2, "PDF Tool") + + def install(self, icon=None, separator=None, **kwargs): + FlatCAMTool.install(self, icon, separator, shortcut='ALT+Q', **kwargs) + + def set_tool_ui(self): + pass + + def on_open_pdf_click(self): + """ + File menu callback for opening an PDF file. + + :return: None + """ + + self.app.report_usage("ToolPDF.on_open_pdf_click()") + self.app.log.debug("ToolPDF.on_open_pdf_click()") + + _filter_ = "Adobe PDF Files (*.pdf);;" \ + "All Files (*.*)" + + try: + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open PDF"), + directory=self.app.get_last_folder(), filter=_filter_) + except TypeError: + filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open PDF"), filter=_filter_) + + filenames = [str(filename) for filename in filenames] + + if len(filenames) == 0: + self.app.inform.emit(_("[WARNING_NOTCL] Open PDF cancelled.")) + else: + for filename in filenames: + if filename != '': + self.app.worker_task.emit({'fcn': self.open_pdf, + 'params': [filename]}) + + def open_pdf(self, filename): + + def obj_init(grb_obj, app_obj): + with open(filename, "rb") as f: + pdf = f.read() + + for s in re.findall(self.stream_re, pdf): + s = s.strip(b'\r\n') + try: + self.pdf_parsed += zlib.decompress(s).decode('UTF-8') + except: + pass + grb_obj.solid_geometry = [self.bezier_to_linestring(0, 0, 0, 0)] + + + with self.app.proc_container.new(_("Opening PDF.")): + # obj_init() + self.parse_pdf() + ret = self.app.new_object("geometry", "bla", obj_init, autoselected=False) + # Register recent file + self.app.file_opened.emit("geometry", "bla") + # # Object name + # name = outname or filename.split('/')[-1].split('\\')[-1] + # + # ret = self.new_object("excellon", name, obj_init, autoselected=False) + # if ret == 'fail': + # self.inform.emit(_('[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file.')) + # return + # + # # Register recent file + # self.file_opened.emit("excellon", filename) + # + # # GUI feedback + # self.inform.emit(_("[success] Opened: %s") % filename) + # # self.progress.emit(100) + + def parse_pdf(self): + for pline in self.pdf_parsed: + pass + + def bezier_to_linestring(self, start, stop, c1, c2): + """ + From here: https://gis.stackexchange.com/questions/106937/python-library-or-algorithm-to-generate-arc-geometry-from-three-coordinate-pairs + :return: LineString geometry + """ + coords = np.array([[0, 0], [25, 10], [33, 39], [53, 53]]) + + # equation Bezier, page 184 PDF 1.4 reference + # https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf + # R(t) = P0*(1 - t) ** 3 + P1*3*t*(1 - 5) ** 2 + P2 * 3*(1 - t) * t ** 2 + P3*t ** 3 + + domain = [] + i = 0 + while i <=1: + domain.append(i) + for i in domain: + + return even_line diff --git a/flatcamTools/__init__.py b/flatcamTools/__init__.py index 6119a4c1..71286c55 100644 --- a/flatcamTools/__init__.py +++ b/flatcamTools/__init__.py @@ -15,5 +15,6 @@ from flatcamTools.ToolNonCopperClear import NonCopperClear from flatcamTools.ToolTransform import ToolTransform from flatcamTools.ToolSolderPaste import SolderPaste from flatcamTools.ToolPcbWizard import PcbWizard +from flatcamTools.ToolPDF import ToolPDF from flatcamTools.ToolShell import FCShell diff --git a/share/pdf32.png b/share/pdf32.png new file mode 100644 index 0000000000000000000000000000000000000000..f90b13f7c3162a2f30e4804ff4b1b787a4e42b70 GIT binary patch literal 2032 zcmV3_ekWc}pf)D_Ng@ zcJ)0on#^UrUP*o|OR|1mAV06q;fr(V&!JnxE%D15-j$As1TQlE&dYQ7<{Spx-UYWY zpTme77a@lLUt`IrSEUo1h!d6)?cdT7IYLSSSkzDF@NwxxX5bM^>Go^sh=h_#fUnNs zE$;WOx53BUkEJ6KLJ9$R@u$)WD+ts6rgS8Hkrtr!i@!19MkJ6FfY1Dg(g~`F6K$~<^Q1?`5=aT~9hRn^@;+5dAR)kqSUN>Q;ddr1Mdk0MGr|B%wGm6r zK9*`FkPzS}ENx(4*k)#?-bxSJ54d9qVg=w`GQ+>U&tq9J`m=Px1Jn2@bgt?oh!r5D z+4s06{+2HO#?M&9m7ppKVg(4v7$&;LXT1;7mE3A1h!x-;_!a-BbNH-uVk6)St+&GG ztU`hq0YaXQ18%3%XW~;V5=+B#7QHcI1PI9#mJ-E_yG&^fg@a256w03*0?g;|QHjI} zl2QOt>~WAo03LJ8&;O9L#!y586+kwvv1FG(1&~dv1X(3e0c6uEMK%dk0NJ!kl0^a) zKsK$?B$q%1kWFg}l1iWg$fh+Fl;D#TCsqMu)0&bA2?m;~0J3RK%>-cyQ~=qu=0J4v zi3%W_)?9E5hR8HD6+kwvx!`Mf&bjdqvm;!BO*!x6~LdrQ0Lso84)9{Q~-ZI$1;AeM%W@aG~Yr62&2}OPkJ1j zbD;u+!{PAki0K5+*{y+h@)5aur~r2Z^L4~>QGMaDD!`qQW!jwzP%j}fuX?BecZqM) zvxf@cgdI72joPh$^Uk`3^?rYYUtNI5r~npRE0|OsFwF0&_ zze#|@gDMiD0wjoEZ~1?11q4#N0JgVjZ1Za~P$1E@3qbyW->zjPUtEY00M*z59e_drIv{zDu4jC$sv61n@WY6hKQ>G0+`zWyvUS- z5||cbsHJJB0z_ha53nt@>UvKwp!{qh6(ADR#LyYfSJiS&9_>-KQm6t%V5|I@ig#Np zq4bXDDnJCbuHO#t&j5P4#?#hR9AJJNFb`fizDI#r&p29&r~na|b~bm#<@NfxZI!MO zPZzsG*eYS$f)uQHhBPr%fP>gx|6W^X|C$7`%xfHcA1NxpK}^r|8SW)j*&^s6zXsr* zkoOKMfMC4#13$L~AGeT`0e($P72p7-Oxu=KCn+xaY4weh^&AZQ)&kEz zL8gM}yX%(<;K{X)92dOk6PCN(XNeegFtIc^+Efh54;A1F?Cu@0+)*JHB=n;1p>PA9 zuRiMgyFL6ngH!+u+l3zjzB6OF;H;EME(XQUBMP|n5MGu-^F`oqhi>+$0_@8fqEdbp#b){T)+V+QoqKgE=HaRkPC89f(scgE^&WP5|EdEW$g>=i91Zri$Q$QCc8^qBn|G$laD`}`IzK50q-;!_ITd$E5>a{>^K>1T(|zOB!@eng#1x~8H@ z0X8^Jf9ne7U4M(Ob7N^*07V689u=T*RDi}&0UGBn1eoETm8;lsEpvZKkBS8#Y}2>U zaU+Rs*E1763J4Gq!2$O%NHZs{Jr4F9zQJO*N--_NV&Vj?2ZZAL{O3*h!OOb3kNyY{()>tr0pRdK)Zr zxPmRQU7Bm9O(5B)wW-KLVmIbbI32@1_u3nGuoj2~0c?~Bl?*X#DC;1-^%hjJahL_y{ O0000 Date: Sun, 21 Apr 2019 04:43:49 +0300 Subject: [PATCH 30/42] - finished adding the PDF import tool although it does not support all kinds of outputs from PDF printers. Microsoft PDF printer is not supported. --- FlatCAMApp.py | 1 + README.md | 4 + flatcamTools/ToolPDF.py | 532 ++++++++++++++++++++++++++++++++++------ 3 files changed, 459 insertions(+), 78 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 8620ed20..bad73459 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -7606,6 +7606,7 @@ class App(QtCore.QObject): openers = { 'gerber': lambda fname: self.worker_task.emit({'fcn': self.open_gerber, 'params': [fname]}), 'excellon': lambda fname: self.worker_task.emit({'fcn': self.open_excellon, 'params': [fname]}), + 'geometry': lambda fname: self.worker_task.emit({'fcn': self.import_dxf, 'params': [fname]}), 'cncjob': lambda fname: self.worker_task.emit({'fcn': self.open_gcode, 'params': [fname]}), 'project': self.open_project, 'svg': self.import_svg, diff --git a/README.md b/README.md index 54b860da..b8704ad8 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +20.04.2019 + +- finished adding the PDF import tool although it does not support all kinds of outputs from PDF printers. Microsoft PDF printer is not supported. + 19.04.2019 - started to work on PDF import tool diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index b2676a3b..34a3be34 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -7,29 +7,33 @@ ############################################################ from FlatCAMTool import FlatCAMTool +from shapely.geometry import Point, Polygon, LineString +from shapely.ops import cascaded_union, unary_union + from FlatCAMObj import * + import math +from copy import copy, deepcopy import numpy as np -import scipy.interpolate import zlib import re import gettext import FlatCAMTranslation as fcTranslate +import builtins fcTranslate.apply_language('strings') -import builtins if '_' not in builtins.__dict__: _ = gettext.gettext class ToolPDF(FlatCAMTool): - ''' + """ Parse a PDF file. Reference here: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf Return a list of geometries - ''' + """ toolName = _("PDF Import Tool") def __init__(self, app): @@ -39,50 +43,72 @@ class ToolPDF(FlatCAMTool): self.stream_re = re.compile(b'.*?FlateDecode.*?stream(.*?)endstream', re.S) + # detect 're' command + self.rect_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*re$') + # detect 'm' command + self.start_subpath_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sm$') + # detect 'l' command + self.draw_line_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sl') + # detect 'c' command + self.draw_arc_3pt_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)' + r'\s(-?\d+\.?\d*)\s*c$') + # detect 'v' command + self.draw_arc_2pt_c1start_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*v$') + # detect 'y' command + self.draw_arc_2pt_c2stop_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*y$') + # detect 'h' command + self.end_subpath_re = re.compile(r'^h$') + # detect 'w' command self.strokewidth_re = re.compile(r'^(\d+\.?\d*)\s*w$') - # detect 're' command - self.rect_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sre$') - # detect 'm' command - self.start_path_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sm$') - # detect 'l' command - self.draw_line_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sl') - # detect 'c' command - self.draw_arc_3pt_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sc$') - # detect 'v' command - self.draw_arc_2pt_23_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sv$') - # detect 'y' command - self.draw_arc_2pt_13_re = re.compile(r'(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\sy$') - # detect 'h' command - self.end_path_re = re.compile(r'^h$') + # detect 'S' command + self.stroke_path__re = re.compile(r'^S$') + # detect 's' command + self.close_stroke_path__re = re.compile(r'^s$') + # detect 'f' or 'f*' command + self.fill_path_re = re.compile(r'^[f|F][*]?$') + # detect 'B' or 'B*' command + self.fill_stroke_path_re = re.compile(r'^B[*]?$') + # detect 'b' or 'b*' command + self.close_fill_stroke_path_re = re.compile(r'^b[*]?$') + # detect 'n' + self.no_op_re = re.compile(r'^n$') + # detect offset transformation. Pattern: (1) (0) (0) (1) (x) (y) + self.offset_re = re.compile(r'^1\.?0*\s0?\.?0*\s0?\.?0*\s1\.?0*\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*cm$') + # detect scale transformation. Pattern: (factor_x) (0) (0) (factor_y) (0) (0) + self.scale_re = re.compile(r'^q? (-?\d+\.?\d*) 0\.?0* 0\.?0* (-?\d+\.?\d*) 0\.?0* 0\.?0*\s+cm$') + # detect combined transformation. Should always be the last + self.combined_transform_re = re.compile(r'^q?\s*(-?\d+\.?\d*) (-?\d+\.?\d*) (-?\d+\.?\d*) (-?\d+\.?\d*) ' + r'(-?\d+\.?\d*) (-?\d+\.?\d*)\s+cm$') + # detect clipping path + self.clip_path_re = re.compile(r'^W[*]? n?$') + + self.geo_buffer = [] self.pdf_parsed = '' + # conversion factor to INCH + self.point_to_unit_factor = 0.01388888888 + def run(self, toggle=True): self.app.report_usage("ToolPDF()") - # if toggle: - # # if the splitter is hidden, display it, else hide it but only if the current widget is the same - # if self.app.ui.splitter.sizes()[0] == 0: - # self.app.ui.splitter.setSizes([1, 1]) - # else: - # try: - # if self.app.ui.tool_scroll_area.widget().objectName() == self.toolName: - # self.app.ui.splitter.setSizes([0, 1]) - # except AttributeError: - # pass - # else: - # if self.app.ui.splitter.sizes()[0] == 0: - # self.app.ui.splitter.setSizes([1, 1]) - # - # FlatCAMTool.run(self) + # init variables for reuse + self.geo_buffer = [] + self.pdf_parsed = '' + + # the UNITS in PDF files are points and here we set the factor to convert them to real units (either MM or INCH) + if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': + # 1 inch = 72 points => 1 point = 1 / 72 = 0.01388888888 inch = 0.01388888888 inch * 25.4 = 0.35277777778 mm + self.point_to_unit_factor = 0.35277777778 + else: + # 1 inch = 72 points => 1 point = 1 / 72 = 0.01388888888 inch + self.point_to_unit_factor = 0.01388888888 self.set_tool_ui() self.on_open_pdf_click() - # self.app.ui.notebook.setTabText(2, "PDF Tool") - def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+Q', **kwargs) @@ -104,75 +130,425 @@ class ToolPDF(FlatCAMTool): try: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open PDF"), - directory=self.app.get_last_folder(), filter=_filter_) + directory=self.app.get_last_folder(), + filter=_filter_) except TypeError: filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open PDF"), filter=_filter_) - filenames = [str(filename) for filename in filenames] - if len(filenames) == 0: self.app.inform.emit(_("[WARNING_NOTCL] Open PDF cancelled.")) else: for filename in filenames: if filename != '': - self.app.worker_task.emit({'fcn': self.open_pdf, - 'params': [filename]}) + self.app.worker_task.emit({'fcn': self.open_pdf, 'params': [filename]}) def open_pdf(self, filename): + new_name = filename.split('/')[-1].split('\\')[-1] def obj_init(grb_obj, app_obj): with open(filename, "rb") as f: pdf = f.read() + stream_nr = 0 for s in re.findall(self.stream_re, pdf): + stream_nr += 1 + print("STREAM:", stream_nr, '\n', '\n') s = s.strip(b'\r\n') try: - self.pdf_parsed += zlib.decompress(s).decode('UTF-8') - except: - pass - grb_obj.solid_geometry = [self.bezier_to_linestring(0, 0, 0, 0)] + self.pdf_parsed += (zlib.decompress(s).decode('UTF-8') + '\r\n') + except Exception as e: + app_obj.log.debug("ToolPDF.open_pdf().obj_init() --> %s" % str(e)) + ap_dict = self.parse_pdf(pdf_content=self.pdf_parsed) + grb_obj.apertures = deepcopy(ap_dict) + + poly_buff = [] + for ap in ap_dict: + for k in ap_dict[ap]: + if k == 'solid_geometry': + poly_buff += ap_dict[ap][k] + + poly_buff = unary_union(poly_buff) + poly_buff = poly_buff.buffer(0.0000001) + poly_buff = poly_buff.buffer(-0.0000001) + + grb_obj.solid_geometry = deepcopy(poly_buff) with self.app.proc_container.new(_("Opening PDF.")): - # obj_init() - self.parse_pdf() - ret = self.app.new_object("geometry", "bla", obj_init, autoselected=False) - # Register recent file - self.app.file_opened.emit("geometry", "bla") - # # Object name - # name = outname or filename.split('/')[-1].split('\\')[-1] - # - # ret = self.new_object("excellon", name, obj_init, autoselected=False) - # if ret == 'fail': - # self.inform.emit(_('[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file.')) - # return - # - # # Register recent file - # self.file_opened.emit("excellon", filename) - # - # # GUI feedback - # self.inform.emit(_("[success] Opened: %s") % filename) - # # self.progress.emit(100) - def parse_pdf(self): - for pline in self.pdf_parsed: - pass + ret = self.app.new_object("gerber", new_name, obj_init, autoselected=False) + if ret == 'fail': + self.app.inform.emit(_('[ERROR_NOTCL] Open PDF file failed.')) + return - def bezier_to_linestring(self, start, stop, c1, c2): + # Register recent file + self.app.file_opened.emit("gerber", new_name) + + # GUI feedback + self.app.inform.emit(_("[success] Opened: %s") % filename) + + def parse_pdf(self, pdf_content): + path = dict() + path['lines'] = [] # it's a list of points + path['bezier'] = [] # it's a list of sublists each like this [start, c1, c2, stop] + path['rectangle'] = [] # it's a list of sublists of points + + start_point = None + current_point = None + size = None + + # signal that we have encountered a close path command + flag_close_path = False + + # initial values for the transformations, in case they are not encountered in the PDF file + offset_geo = [0, 0] + scale_geo = [1, 1] + + # initial aperture + aperture = 10 + + # store the apertures here + apertures_dict = {} + + line_nr = 0 + lines = pdf_content.splitlines() + + for pline in lines: + line_nr += 1 + log.debug("line %d: %s" % (line_nr, pline)) + + # TRANSFORMATIONS DETECTION # + + # Detect Scale transform + match = self.scale_re.search(pline) + if match: + log.debug( + "ToolPDF.parse_pdf() --> SCALE transformation found on line: %s --> %s" % (line_nr, pline)) + scale_geo = [float(match.group(1)), float(match.group(2))] + continue + + # Detect Offset transform + match = self.offset_re.search(pline) + if match: + log.debug( + "ToolPDF.parse_pdf() --> OFFSET transformation found on line: %s --> %s" % (line_nr, pline)) + offset_geo = [float(match.group(1)), float(match.group(2))] + continue + + # Detect combined transformation. Must be always the last from transformations to be checked. + # TODO: Perhaps it can replace the others transformation detections + match = self.combined_transform_re.search(pline) + if match: + # transformation = TRANSLATION (OFFSET) + if float(match.group(1)) == 1 and float(match.group(2)) == 0 and \ + float(match.group(3)) == 0 and float(match.group(4)) == 1: + pass + + # transformation = SCALING + elif float(match.group(2)) == 0 and float(match.group(3)) == 0 and \ + float(match.group(5)) == 0 and float(match.group(6)) == 0: + pass + + # transformation = ROTATION + elif float(match.group(1)) == float(match.group(4)) and \ + float(match.group(2)) == - float(match.group(3)) and \ + float(match.group(5)) == 0 and float(match.group(6)) == 0: + # rot_angle = math.acos(float(match.group(1))) + pass + + # transformation = SKEW + elif float(match.group(1)) == 1 and float(match.group(4)) == 1 and \ + float(match.group(5)) == 0 and float(match.group(6)) == 0: + # skew_x = math.atan(float(match.group(2))) + # skew_y = math.atan(float(match.group(3))) + pass + + # transformation combined + else: + log.debug("ToolPDF.parse_pdf() --> COMBINED transformation found on line: %s --> %s" % + (line_nr, pline)) + scale_geo = [float(match.group(1)), float(match.group(4))] + offset_geo = [float(match.group(5)), float(match.group(6))] + continue + + # PATH CONSTRUCTION # + + # Start SUBPATH + match = self.start_subpath_re.search(pline) + if match: + x = float(match.group(1)) + offset_geo[0] + y = float(match.group(2)) + offset_geo[1] + pt = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + start_point = pt + current_point = pt + continue + + # Draw Line + match = self.draw_line_re.search(pline) + if match: + x = float(match.group(1)) + offset_geo[0] + y = float(match.group(2)) + offset_geo[1] + pt = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + path['lines'].append(pt) + current_point = pt + continue + + # Draw Bezier 'c' + match = self.draw_arc_3pt_re.search(pline) + if match: + start = current_point + x = float(match.group(1)) + offset_geo[0] + y = float(match.group(2)) + offset_geo[1] + c1 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + x = float(match.group(3)) + offset_geo[0] + y = float(match.group(4)) + offset_geo[1] + c2 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + x = float(match.group(5)) + offset_geo[0] + y = float(match.group(6)) + offset_geo[1] + stop = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + + path['bezier'].append([start, c1, c2, stop]) + current_point = stop + continue + + # Draw Bezier 'v' + match = self.draw_arc_2pt_c1start_re.search(pline) + if match: + start = current_point + x = float(match.group(1)) + offset_geo[0] + y = float(match.group(2)) + offset_geo[1] + c2 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + x = float(match.group(3)) + offset_geo[0] + y = float(match.group(4)) + offset_geo[1] + stop = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + + path['bezier'].append([start, start, c2, stop]) + current_point = stop + continue + + # Draw Bezier 'y' + match = self.draw_arc_2pt_c2stop_re.search(pline) + if match: + start = current_point + x = float(match.group(1)) + offset_geo[0] + y = float(match.group(2)) + offset_geo[1] + c1 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + x = float(match.group(3)) + offset_geo[0] + y = float(match.group(4)) + offset_geo[1] + stop = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + + path['bezier'].append([start, c1, stop, stop]) + current_point = stop + continue + + # Close SUBPATH + match = self.end_subpath_re.search(pline) + if match: + flag_close_path = True + continue + + # Draw RECTANGLE + match = self.rect_re.search(pline) + if match: + 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] + pt1 = (x, y) + pt2 = (x+width, y) + pt3 = (x+width, y+height) + pt4 = (x, y+height) + path['rectangle'] += [pt1, pt2, pt3, pt4, pt1] + current_point = pt1 + continue + + # Detect clipping path set + # ignore this and delete the current subpath + match = self.clip_path_re.search(pline) + if match: + path['lines'] = [] + path['bezier'] = [] + path['rectangle'] = [] + continue + + # PATH PAINTING # + + # Detect Stroke width / aperture + match = self.strokewidth_re.search(pline) + if match: + size = float(match.group(1)) * self.point_to_unit_factor * scale_geo[0] + flag = 0 + + if not apertures_dict: + apertures_dict[str(aperture)] = dict() + apertures_dict[str(aperture)]['size'] = size + apertures_dict[str(aperture)]['type'] = 'C' + apertures_dict[str(aperture)]['solid_geometry'] = [] + else: + for k in apertures_dict: + if size == apertures_dict[k]['size']: + flag = 1 + break + if flag == 0: + aperture += 1 + apertures_dict[str(aperture)] = dict() + apertures_dict[str(aperture)]['size'] = size + apertures_dict[str(aperture)]['type'] = 'C' + apertures_dict[str(aperture)]['solid_geometry'] = [] + continue + + # Detect No_Op command, ignore the current subpath + match = self.no_op_re.search(pline) + if match: + path['lines'] = [] + path['bezier'] = [] + path['rectangle'] = [] + continue + + # Stroke the path + match = self.stroke_path__re.search(pline) + if match: + # path['lines'] = [] + # path['bezier'] = [] + # path['rectangle'] = [] + # continue + geo = None + if path['lines']: + path['lines'].insert(0, start_point) + geo = copy(path['lines']) + if flag_close_path: + flag_close_path = False + geo.append(start_point) + path['lines'] = [] + + if path['bezier']: + geo = list() + geo.append(start_point) + for b in path['bezier']: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + if flag_close_path: + flag_close_path = False + geo.append(start_point) + path['bezier'] = [] + + if path['rectangle']: + geo = copy(path['rectangle']) + # if flag_close_path: + # flag_close_path = False + # geo.append(start_point) + path['rectangle'] = [] + + ext_geo = LineString(geo) + ext_geo = ext_geo.buffer((float(size) / 2), resolution=self.step_per_circles) + # ext_geo = affinity.scale(ext_geo, scale_geo[0], scale_geo[1]) + # off_x = offset_geo[0] + # off_y = offset_geo[1] + # + # ext_geo = affinity.translate(ext_geo, off_x, off_y) + try: + apertures_dict[str(aperture)]['solid_geometry'].append(deepcopy(ext_geo)) + except KeyError: + # in case there is no stroke width yet therefore no aperture + apertures_dict['0'] = {} + apertures_dict['0']['solid_geometry'] = [] + apertures_dict['0']['size'] = size + apertures_dict['0']['type'] = 'C' + apertures_dict['0']['solid_geometry'].append(deepcopy(ext_geo)) + continue + + # Fill the path + match = self.fill_path_re.search(pline) + match2 = self.fill_stroke_path_re.search(pline) + if match or match2: + + geo = None + if path['lines']: + path['lines'].insert(0, start_point) + geo = copy(path['lines']) + geo.append(start_point) + path['lines'] = [] + + elif path['bezier']: + geo = [] + for b in path['bezier']: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + geo.append(start_point) + path['bezier'] = [] + + elif path['rectangle']: + # path['rectangle'].append(start_point) + geo = copy(path['rectangle']) + path['rectangle'] = [] + + ext_geo = Polygon(geo) + ext_geo = ext_geo.buffer(0.000001, resolution=self.step_per_circles) + # ext_geo = affinity.scale(ext_geo, scale_geo[0], scale_geo[1]) + # off_x = offset_geo[0] + # off_y = offset_geo[1] + # + # ext_geo = affinity.translate(ext_geo, off_x, off_y) + try: + apertures_dict[str(aperture)]['solid_geometry'].append(deepcopy(ext_geo)) + except KeyError: + # in case there is no stroke width yet therefore no aperture + apertures_dict['0'] = {} + apertures_dict['0']['solid_geometry'] = [] + apertures_dict['0']['size'] = size + apertures_dict['0']['type'] = 'C' + apertures_dict['0']['solid_geometry'].append(deepcopy(ext_geo)) + continue + + return apertures_dict + + def bezier_to_points(self, start, c1, c2, stop): """ - From here: https://gis.stackexchange.com/questions/106937/python-library-or-algorithm-to-generate-arc-geometry-from-three-coordinate-pairs + # Equation Bezier, page 184 PDF 1.4 reference + # https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf + # Given the coordinates of the four points, the curve is generated by varying the parameter t from 0.0 to 1.0 + # in the following equation: + # R(t) = P0*(1 - t) ** 3 + P1*3*t*(1 - t) ** 2 + P2 * 3*(1 - t) * t ** 2 + P3*t ** 3 + # When t = 0.0, the value from the function coincides with the current point P0; when t = 1.0, R(t) coincides + # with the final point P3. Intermediate values of t generate intermediate points along the curve. + # The curve does not, in general, pass through the two control points P1 and P2 + :return: LineString geometry """ - coords = np.array([[0, 0], [25, 10], [33, 39], [53, 53]]) - # equation Bezier, page 184 PDF 1.4 reference - # https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf - # R(t) = P0*(1 - t) ** 3 + P1*3*t*(1 - 5) ** 2 + P2 * 3*(1 - t) * t ** 2 + P3*t ** 3 + # here we store the geometric points + points = [] - domain = [] - i = 0 - while i <=1: - domain.append(i) - for i in domain: + nr_points = np.arange(0.0, 1.0, (1 / self.step_per_circles)) + for t in nr_points: + term_p0 = (1 - t) ** 3 + term_p1 = 3 * t * (1 - t) ** 2 + term_p2 = 3 * (1 - t) * t ** 2 + term_p3 = t ** 3 - return even_line + x = start[0] * term_p0 + c1[0] * term_p1 + c2[0] * term_p2 + stop[0] * term_p3 + y = start[1] * term_p0 + c1[1] * term_p1 + c2[1] * term_p2 + stop[1] * term_p3 + points.append([x, y]) + + return points + + # def bezier_to_circle(self, path): + # lst = [] + # for el in range(len(path)): + # if type(path) is list: + # for coord in path[el]: + # lst.append(coord) + # else: + # lst.append(el) + # + # if lst: + # minx = min(lst, key=lambda t: t[0])[0] + # miny = min(lst, key=lambda t: t[1])[1] + # maxx = max(lst, key=lambda t: t[0])[0] + # maxy = max(lst, key=lambda t: t[1])[1] + # center = (maxx-minx, maxy-miny) + # radius = (maxx-minx) / 2 + # return [center, radius] + # + # def circle_to_points(self, center, radius): + # geo = Point(center).buffer(radius, resolution=self.step_per_circles) + # return LineString(list(geo.exterior.coords)) + # From 53444fc6852ac11eb90490ba66728342c14adf92 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 22 Apr 2019 03:28:05 +0300 Subject: [PATCH 31/42] - fixed the PDF import tool to work with files generated by the Microsoft PDF printer (chained subpaths) - in PDF import tool added support for paths filled and at the same time stroked ('B' and 'B*'commands) - added a shortcut key for PDF Import Tool (ALT+Q) and updated the Shortcut list (also with the 'T' and 'R' keys for Gerber Editor where they control the bend in Track and Region tool and the 'M' and 'D' keys for Add Arc tool in Geometry Editor) --- FlatCAMApp.py | 9 +- README.md | 6 + flatcamGUI/FlatCAMGUI.py | 25 ++ flatcamTools/ToolPDF.py | 573 +++++++++++++++++++++++++++------------ 4 files changed, 441 insertions(+), 172 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index bad73459..bcac9669 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -95,7 +95,7 @@ class App(QtCore.QObject): # Version version = 8.914 - version_date = "2019/04/20" + version_date = "2019/04/22" beta = True # current date now @@ -2003,15 +2003,16 @@ class App(QtCore.QObject): self.properties_tool = Properties(self) self.properties_tool.install(icon=QtGui.QIcon('share/properties32.png'), pos=self.ui.menuoptions) + self.pdf_tool = ToolPDF(self) + self.pdf_tool.install(icon=QtGui.QIcon('share/pdf32.png'), pos=self.ui.menufileimport, + separator=True) + self.image_tool = ToolImage(self) self.image_tool.install(icon=QtGui.QIcon('share/image32.png'), pos=self.ui.menufileimport, separator=True) self.pcb_wizard_tool = PcbWizard(self) self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport) - self.pdf_tool = ToolPDF(self) - self.pdf_tool.install(icon=QtGui.QIcon('share/pdf32.png'), pos=self.ui.menufileimport) - self.log.debug("Tools are installed.") def remove_tools(self): diff --git a/README.md b/README.md index b8704ad8..acfa35c7 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ CAD program, and create G-Code for Isolation routing. ================================================= +21.04.2019 + +- fixed the PDF import tool to work with files generated by the Microsoft PDF printer (chained subpaths) +- in PDF import tool added support for paths filled and at the same time stroked ('B' and 'B*'commands) +- added a shortcut key for PDF Import Tool (ALT+Q) and updated the Shortcut list (also with the 'T' and 'R' keys for Gerber Editor where they control the bend in Track and Region tool and the 'M' and 'D' keys for Add Arc tool in Geometry Editor) + 20.04.2019 - finished adding the PDF import tool although it does not support all kinds of outputs from PDF printers. Microsoft PDF printer is not supported. diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index d8b37baf..567cea12 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -1146,6 +1146,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ALT+P  Paint Area Tool + + ALT+Q +  PDF Import Tool + ALT+R  Transformations Tool @@ -1238,6 +1242,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): C  Copy Geo Item + + D +  Within Add Arc will toogle the ARC direction: CW or CCW + E  Polygon Intersection Tool @@ -1258,6 +1266,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): M  Move Geo Item + + M +  Within Add Arc will cycle through the ARC modes + N  Draw a Polygon @@ -1452,6 +1464,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): P  Add Pad + + R +  Within Track & Region Tools will cycle in REVERSE the bend modes + S  Scale @@ -1460,6 +1476,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): T  Add Track + + R +  Within Track & Region Tools will cycle FORWARD the bend modes +     @@ -2087,6 +2107,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.paint_tool.run(toggle=True) return + # Paint Tool + if key == QtCore.Qt.Key_Q: + self.app.pdf_tool.run() + return + # Transformation Tool if key == QtCore.Qt.Key_R: self.app.transform_tool.run(toggle=True) diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index 34a3be34..69536c28 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -62,7 +62,7 @@ class ToolPDF(FlatCAMTool): # detect 'w' command self.strokewidth_re = re.compile(r'^(\d+\.?\d*)\s*w$') # detect 'S' command - self.stroke_path__re = re.compile(r'^S$') + self.stroke_path__re = re.compile(r'^S\s?[Q]?$') # detect 's' command self.close_stroke_path__re = re.compile(r'^s$') # detect 'f' or 'f*' command @@ -152,7 +152,7 @@ class ToolPDF(FlatCAMTool): stream_nr = 0 for s in re.findall(self.stream_re, pdf): stream_nr += 1 - print("STREAM:", stream_nr, '\n', '\n') + log.debug(" PDF STREAM: %d\n" % stream_nr) s = s.strip(b'\r\n') try: self.pdf_parsed += (zlib.decompress(s).decode('UTF-8') + '\r\n') @@ -189,27 +189,41 @@ class ToolPDF(FlatCAMTool): def parse_pdf(self, pdf_content): path = dict() - path['lines'] = [] # it's a list of points - path['bezier'] = [] # it's a list of sublists each like this [start, c1, c2, stop] - path['rectangle'] = [] # it's a list of sublists of points + path['lines'] = [] # it's a list of lines subpaths + path['bezier'] = [] # it's a list of bezier arcs subpaths + path['rectangle'] = [] # it's a list of rectangle subpaths + + subpath = dict() + subpath['lines'] = [] # it's a list of points + subpath['bezier'] = [] # it's a list of sublists each like this [start, c1, c2, stop] + subpath['rectangle'] = [] # it's a list of sublists of points + + # store the start point (when 'm' command is encountered) + current_subpath = None + + # set True when 'h' command is encountered (close path) + close_path = False start_point = None current_point = None - size = None - - # signal that we have encountered a close path command - flag_close_path = False + size = 0 # initial values for the transformations, in case they are not encountered in the PDF file offset_geo = [0, 0] scale_geo = [1, 1] + c_offset_f= [0, 0] + c_scale_f = [1, 1] + # initial aperture aperture = 10 # store the apertures here apertures_dict = {} + # it seems that first transform apply to the whole PDF; signal here if it's first + first_transform = True + line_nr = 0 lines = pdf_content.splitlines() @@ -219,56 +233,50 @@ class ToolPDF(FlatCAMTool): # TRANSFORMATIONS DETECTION # - # Detect Scale transform - match = self.scale_re.search(pline) - if match: - log.debug( - "ToolPDF.parse_pdf() --> SCALE transformation found on line: %s --> %s" % (line_nr, pline)) - scale_geo = [float(match.group(1)), float(match.group(2))] - continue + # # Detect Scale transform + # match = self.scale_re.search(pline) + # if match: + # log.debug( + # "ToolPDF.parse_pdf() --> SCALE transformation found on line: %s --> %s" % (line_nr, pline)) + # if first_transform: + # first_transform = False + # c_scale_f = [float(match.group(1)), float(match.group(2))] + # else: + # scale_geo = [float(match.group(1)), float(match.group(2))] + # continue - # Detect Offset transform - match = self.offset_re.search(pline) - if match: - log.debug( - "ToolPDF.parse_pdf() --> OFFSET transformation found on line: %s --> %s" % (line_nr, pline)) - offset_geo = [float(match.group(1)), float(match.group(2))] - continue + # # Detect Offset transform + # match = self.offset_re.search(pline) + # if match: + # log.debug( + # "ToolPDF.parse_pdf() --> OFFSET transformation found on line: %s --> %s" % (line_nr, pline)) + # offset_geo = [float(match.group(1)), float(match.group(2))] + # continue # Detect combined transformation. Must be always the last from transformations to be checked. - # TODO: Perhaps it can replace the others transformation detections match = self.combined_transform_re.search(pline) if match: # transformation = TRANSLATION (OFFSET) - if float(match.group(1)) == 1 and float(match.group(2)) == 0 and \ - float(match.group(3)) == 0 and float(match.group(4)) == 1: - pass + if (float(match.group(2)) == 0 and float(match.group(3)) == 0) and \ + (float(match.group(5)) != 0 or float(match.group(6)) != 0): + log.debug( + "ToolPDF.parse_pdf() --> OFFSET transformation found on line: %s --> %s" % (line_nr, pline)) + if first_transform: + c_offset_f = [float(match.group(5)), float(match.group(6))] + else: + offset_geo = [float(match.group(5)), float(match.group(6))] # transformation = SCALING - elif float(match.group(2)) == 0 and float(match.group(3)) == 0 and \ - float(match.group(5)) == 0 and float(match.group(6)) == 0: - pass + if float(match.group(1)) != 1 and float(match.group(4)) != 1: + log.debug( + "ToolPDF.parse_pdf() --> SCALE transformation found on line: %s --> %s" % (line_nr, pline)) + if first_transform: + c_scale_f = [float(match.group(1)), float(match.group(4))] + else: + scale_geo = [float(match.group(1)), float(match.group(4))] - # transformation = ROTATION - elif float(match.group(1)) == float(match.group(4)) and \ - float(match.group(2)) == - float(match.group(3)) and \ - float(match.group(5)) == 0 and float(match.group(6)) == 0: - # rot_angle = math.acos(float(match.group(1))) - pass - - # transformation = SKEW - elif float(match.group(1)) == 1 and float(match.group(4)) == 1 and \ - float(match.group(5)) == 0 and float(match.group(6)) == 0: - # skew_x = math.atan(float(match.group(2))) - # skew_y = math.atan(float(match.group(3))) - pass - - # transformation combined - else: - log.debug("ToolPDF.parse_pdf() --> COMBINED transformation found on line: %s --> %s" % - (line_nr, pline)) - scale_geo = [float(match.group(1)), float(match.group(4))] - offset_geo = [float(match.group(5)), float(match.group(6))] + if first_transform: + first_transform = False continue # PATH CONSTRUCTION # @@ -276,53 +284,77 @@ class ToolPDF(FlatCAMTool): # Start SUBPATH match = self.start_subpath_re.search(pline) if match: + # we just started a subpath so we mark it as not closed yet + close_path = False + + # init subpaths + subpath['lines'] = [] + subpath['bezier'] = [] + subpath['rectangle'] = [] + + # detect start point to move to x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - pt = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + pt = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) start_point = pt - current_point = pt + + # add the start point to subpaths + subpath['lines'].append(start_point) + # subpath['bezier'].append(start_point) + subpath['rectangle'].append(start_point) + current_point = start_point continue # Draw Line match = self.draw_line_re.search(pline) if match: + current_subpath = 'lines' x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - pt = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) - path['lines'].append(pt) + pt = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + subpath['lines'].append(pt) current_point = pt continue # Draw Bezier 'c' match = self.draw_arc_3pt_re.search(pline) if match: + current_subpath = 'bezier' start = current_point x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - c1 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + c1 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) x = float(match.group(3)) + offset_geo[0] y = float(match.group(4)) + offset_geo[1] - c2 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + c2 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) x = float(match.group(5)) + offset_geo[0] y = float(match.group(6)) + offset_geo[1] - stop = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + stop = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) - path['bezier'].append([start, c1, c2, stop]) + subpath['bezier'].append([start, c1, c2, stop]) current_point = stop continue # Draw Bezier 'v' match = self.draw_arc_2pt_c1start_re.search(pline) if match: + current_subpath = 'bezier' start = current_point x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - c2 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + c2 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) x = float(match.group(3)) + offset_geo[0] y = float(match.group(4)) + offset_geo[1] - stop = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + stop = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) - path['bezier'].append([start, start, c2, stop]) + subpath['bezier'].append([start, start, c2, stop]) current_point = stop continue @@ -332,33 +364,34 @@ class ToolPDF(FlatCAMTool): start = current_point x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - c1 = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + c1 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) x = float(match.group(3)) + offset_geo[0] y = float(match.group(4)) + offset_geo[1] - stop = (x * self.point_to_unit_factor * scale_geo[0], y * self.point_to_unit_factor * scale_geo[1]) + stop = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], + y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) - path['bezier'].append([start, c1, stop, stop]) + subpath['bezier'].append([start, c1, stop, stop]) + print(subpath['bezier']) current_point = stop continue - # Close SUBPATH - match = self.end_subpath_re.search(pline) - if match: - flag_close_path = True - continue - # Draw RECTANGLE match = self.rect_re.search(pline) if match: - 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] + current_subpath = 'rectangle' + x = (float(match.group(1)) + offset_geo[0]) * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0] + y = (float(match.group(2)) + offset_geo[1]) * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1] + width = (float(match.group(3)) + offset_geo[0]) * \ + self.point_to_unit_factor * scale_geo[0] * c_scale_f[0] + height = (float(match.group(4)) + offset_geo[1]) * \ + self.point_to_unit_factor * scale_geo[1] * c_scale_f[1] pt1 = (x, y) pt2 = (x+width, y) pt3 = (x+width, y+height) pt4 = (x, y+height) - path['rectangle'] += [pt1, pt2, pt3, pt4, pt1] + # TODO: I'm not sure if rectangles are a subpath in themselves that autoclose + subpath['rectangle'] += [pt1, pt2, pt3, pt4, pt1] current_point = pt1 continue @@ -366,9 +399,38 @@ class ToolPDF(FlatCAMTool): # ignore this and delete the current subpath match = self.clip_path_re.search(pline) if match: - path['lines'] = [] - path['bezier'] = [] - path['rectangle'] = [] + subpath['lines'] = [] + subpath['bezier'] = [] + subpath['rectangle'] = [] + # it measns that we've already added the subpath to path and we need to delete it + # clipping path is usually either rectangle or lines + if close_path is True: + close_path = False + if current_subpath == 'lines': + path['lines'].pop(-1) + if current_subpath == 'rectangle': + path['rectangle'].pop(-1) + continue + + # Close SUBPATH + match = self.end_subpath_re.search(pline) + if match: + close_path = True + if current_subpath == 'lines': + subpath['lines'].append(start_point) + # since we are closing the subpath add it to the path, a path may have chained subpaths + path['lines'].append(copy(subpath['lines'])) + subpath['lines'] = [] + elif current_subpath == 'bezier': + # subpath['bezier'].append(start_point) + # since we are closing the subpath add it to the path, a path may have chained subpaths + path['bezier'].append(copy(subpath['bezier'])) + subpath['bezier'] = [] + elif current_subpath == 'rectangle': + subpath['rectangle'].append(start_point) + # since we are closing the subpath add it to the path, a path may have chained subpaths + path['rectangle'].append(copy(subpath['rectangle'])) + subpath['rectangle'] = [] continue # PATH PAINTING # @@ -376,128 +438,303 @@ class ToolPDF(FlatCAMTool): # Detect Stroke width / aperture match = self.strokewidth_re.search(pline) if match: - size = float(match.group(1)) * self.point_to_unit_factor * scale_geo[0] - flag = 0 - - if not apertures_dict: - apertures_dict[str(aperture)] = dict() - apertures_dict[str(aperture)]['size'] = size - apertures_dict[str(aperture)]['type'] = 'C' - apertures_dict[str(aperture)]['solid_geometry'] = [] - else: - for k in apertures_dict: - if size == apertures_dict[k]['size']: - flag = 1 - break - if flag == 0: - aperture += 1 - apertures_dict[str(aperture)] = dict() - apertures_dict[str(aperture)]['size'] = size - apertures_dict[str(aperture)]['type'] = 'C' - apertures_dict[str(aperture)]['solid_geometry'] = [] + size = float(match.group(1)) + # flag = 0 + # + # if not apertures_dict: + # apertures_dict[str(aperture)] = dict() + # apertures_dict[str(aperture)]['size'] = size + # apertures_dict[str(aperture)]['type'] = 'C' + # apertures_dict[str(aperture)]['solid_geometry'] = [] + # else: + # for k in apertures_dict: + # if size == apertures_dict[k]['size']: + # flag = 1 + # break + # if flag == 0: + # aperture += 1 + # apertures_dict[str(aperture)] = dict() + # apertures_dict[str(aperture)]['size'] = size + # apertures_dict[str(aperture)]['type'] = 'C' + # apertures_dict[str(aperture)]['solid_geometry'] = [] continue # Detect No_Op command, ignore the current subpath match = self.no_op_re.search(pline) if match: - path['lines'] = [] - path['bezier'] = [] - path['rectangle'] = [] + subpath['lines'] = [] + subpath['bezier'] = [] + subpath['rectangle'] = [] continue # Stroke the path match = self.stroke_path__re.search(pline) if match: - # path['lines'] = [] - # path['bezier'] = [] - # path['rectangle'] = [] - # continue - geo = None - if path['lines']: - path['lines'].insert(0, start_point) - geo = copy(path['lines']) - if flag_close_path: - flag_close_path = False - geo.append(start_point) - path['lines'] = [] + # scale the size here; some PDF printers apply transformation after the size is declared + applied_size = size * scale_geo[0] * c_scale_f[0] * self.point_to_unit_factor - if path['bezier']: - geo = list() - geo.append(start_point) - for b in path['bezier']: - geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) - if flag_close_path: - flag_close_path = False - geo.append(start_point) - path['bezier'] = [] + path_geo = list() + if current_subpath == 'lines': + if path['lines']: + for subp in path['lines']: + geo = copy(subp) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + # the path was painted therefore initialize it + path['lines'] = [] + else: + geo = copy(subpath['lines']) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + subpath['lines'] = [] - if path['rectangle']: - geo = copy(path['rectangle']) - # if flag_close_path: - # flag_close_path = False - # geo.append(start_point) - path['rectangle'] = [] + if current_subpath == 'bezier': + if path['bezier']: + for subp in path['bezier']: + geo = [] + for b in subp: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + # the path was painted therefore initialize it + path['bezier'] = [] + else: + geo = [] + for b in subpath['bezier']: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + subpath['bezier'] = [] + + if current_subpath == 'rectangle': + if path['rectangle']: + for subp in path['rectangle']: + geo = copy(subp) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + # the path was painted therefore initialize it + path['rectangle'] = [] + else: + geo = copy(subpath['rectangle']) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + subpath['rectangle'] = [] - ext_geo = LineString(geo) - ext_geo = ext_geo.buffer((float(size) / 2), resolution=self.step_per_circles) - # ext_geo = affinity.scale(ext_geo, scale_geo[0], scale_geo[1]) - # off_x = offset_geo[0] - # off_y = offset_geo[1] - # - # ext_geo = affinity.translate(ext_geo, off_x, off_y) try: - apertures_dict[str(aperture)]['solid_geometry'].append(deepcopy(ext_geo)) + apertures_dict[str(aperture)]['solid_geometry'] += path_geo except KeyError: # in case there is no stroke width yet therefore no aperture - apertures_dict['0'] = {} - apertures_dict['0']['solid_geometry'] = [] - apertures_dict['0']['size'] = size - apertures_dict['0']['type'] = 'C' - apertures_dict['0']['solid_geometry'].append(deepcopy(ext_geo)) + apertures_dict[str(aperture)] = {} + apertures_dict[str(aperture)]['size'] = applied_size + apertures_dict[str(aperture)]['type'] = 'C' + apertures_dict[str(aperture)]['solid_geometry'] = [] + apertures_dict[str(aperture)]['solid_geometry'] += path_geo + continue # Fill the path match = self.fill_path_re.search(pline) - match2 = self.fill_stroke_path_re.search(pline) - if match or match2: + if match: + # scale the size here; some PDF printers apply transformation after the size is declared + applied_size = size * scale_geo[0] * c_scale_f[0] * self.point_to_unit_factor - geo = None - if path['lines']: - path['lines'].insert(0, start_point) - geo = copy(path['lines']) - geo.append(start_point) - path['lines'] = [] + path_geo = list() + if current_subpath == 'lines': + if path['lines']: + for subp in path['lines']: + geo = copy(subp) + # close the subpath if it was not closed already + if close_path is False: + geo.append(geo[0]) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # the path was painted therefore initialize it + path['lines'] = [] + else: + geo = copy(subpath['lines']) + # close the subpath if it was not closed already + if close_path is False: + geo.append(start_point) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + subpath['lines'] = [] - elif path['bezier']: + if current_subpath == 'bezier': geo = [] - for b in path['bezier']: - geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) - geo.append(start_point) - path['bezier'] = [] + if path['bezier']: + for subp in path['bezier']: + for b in subp: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + # close the subpath if it was not closed already + if close_path is False: + geo.append(geo[0]) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # the path was painted therefore initialize it + path['bezier'] = [] + else: + for b in subpath['bezier']: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + if close_path is False: + geo.append(start_point) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + subpath['bezier'] = [] - elif path['rectangle']: - # path['rectangle'].append(start_point) - geo = copy(path['rectangle']) - path['rectangle'] = [] + if current_subpath == 'rectangle': + if path['rectangle']: + for subp in path['rectangle']: + geo = copy(subp) + # close the subpath if it was not closed already + if close_path is False: + geo.append(geo[0]) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # the path was painted therefore initialize it + path['rectangle'] = [] + else: + geo = copy(subpath['rectangle']) + # close the subpath if it was not closed already + if close_path is False: + geo.append(start_point) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + subpath['rectangle'] = [] + + # we finished painting and also closed the path if it was the case + close_path = True - ext_geo = Polygon(geo) - ext_geo = ext_geo.buffer(0.000001, resolution=self.step_per_circles) - # ext_geo = affinity.scale(ext_geo, scale_geo[0], scale_geo[1]) - # off_x = offset_geo[0] - # off_y = offset_geo[1] - # - # ext_geo = affinity.translate(ext_geo, off_x, off_y) try: - apertures_dict[str(aperture)]['solid_geometry'].append(deepcopy(ext_geo)) + apertures_dict['0']['solid_geometry'] += path_geo except KeyError: # in case there is no stroke width yet therefore no aperture apertures_dict['0'] = {} - apertures_dict['0']['solid_geometry'] = [] - apertures_dict['0']['size'] = size + apertures_dict['0']['size'] = applied_size apertures_dict['0']['type'] = 'C' - apertures_dict['0']['solid_geometry'].append(deepcopy(ext_geo)) + apertures_dict['0']['solid_geometry'] = [] + apertures_dict['0']['solid_geometry'] += path_geo continue + # fill and stroke the path + match = self.fill_stroke_path_re.search(pline) + if match: + # scale the size here; some PDF printers apply transformation after the size is declared + applied_size = size * scale_geo[0] * c_scale_f[0] * self.point_to_unit_factor + + path_geo = list() + if current_subpath == 'lines': + if path['lines']: + # fill + for subp in path['lines']: + geo = copy(subp) + # close the subpath if it was not closed already + if close_path is False: + geo.append(geo[0]) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # stroke + for subp in path['lines']: + geo = copy(subp) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + # the path was painted therefore initialize it + path['lines'] = [] + else: + # fill + geo = copy(subpath['lines']) + # close the subpath if it was not closed already + if close_path is False: + geo.append(start_point) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # stroke + geo = copy(subpath['lines']) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + subpath['lines'] = [] + subpath['lines'] = [] + + if current_subpath == 'bezier': + geo = [] + if path['bezier']: + # fill + for subp in path['bezier']: + for b in subp: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + # close the subpath if it was not closed already + if close_path is False: + geo.append(geo[0]) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # stroke + for subp in path['bezier']: + geo = [] + for b in subp: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + # the path was painted therefore initialize it + path['bezier'] = [] + else: + # fill + for b in subpath['bezier']: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + if close_path is False: + geo.append(start_point) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # stroke + geo = [] + for b in subpath['bezier']: + geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + subpath['bezier'] = [] + + if current_subpath == 'rectangle': + if path['rectangle']: + # fill + for subp in path['rectangle']: + geo = copy(subp) + # close the subpath if it was not closed already + if close_path is False: + geo.append(geo[0]) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # stroke + for subp in path['rectangle']: + geo = copy(subp) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + # the path was painted therefore initialize it + path['rectangle'] = [] + else: + # fill + geo = copy(subpath['rectangle']) + # close the subpath if it was not closed already + if close_path is False: + geo.append(start_point) + geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) + path_geo.append(geo_el) + # stroke + geo = copy(subpath['rectangle']) + geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) + path_geo.append(geo) + subpath['rectangle'] = [] + + # we finished painting and also closed the path if it was the case + close_path = True + + try: + apertures_dict['0']['solid_geometry'] += path_geo + except KeyError: + # in case there is no stroke width yet therefore no aperture + apertures_dict['0'] = {} + apertures_dict['0']['size'] = applied_size + apertures_dict['0']['type'] = 'C' + apertures_dict['0']['solid_geometry'] = [] + apertures_dict['0']['solid_geometry'] += path_geo + continue return apertures_dict def bezier_to_points(self, start, c1, c2, stop): From 8a2a48f668c31b9ed466210023f79b0aff471ac3 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 22 Apr 2019 15:35:21 +0300 Subject: [PATCH 32/42] - PDF import tool: added support for save/restore Graphics stack. Only for scale and offset transformations and for the linewidth. This is the final fix for Microsoft PDF printer who saves in PDF format 1.7 --- README.md | 4 + flatcamTools/ToolPDF.py | 228 +++++++++++++++++++++------------------- 2 files changed, 123 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index acfa35c7..81d8384b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +22.04.2019 + +- PDF import tool: added support for save/restore Graphics stack. Only for scale and offset transformations and for the linewidth. This is the final fix for Microsoft PDF printer who saves in PDF format 1.7 + 21.04.2019 - fixed the PDF import tool to work with files generated by the Microsoft PDF printer (chained subpaths) diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index 69536c28..638dd9e4 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -75,16 +75,30 @@ class ToolPDF(FlatCAMTool): self.no_op_re = re.compile(r'^n$') # detect offset transformation. Pattern: (1) (0) (0) (1) (x) (y) - self.offset_re = re.compile(r'^1\.?0*\s0?\.?0*\s0?\.?0*\s1\.?0*\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*cm$') + # self.offset_re = re.compile(r'^1\.?0*\s0?\.?0*\s0?\.?0*\s1\.?0*\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*cm$') # detect scale transformation. Pattern: (factor_x) (0) (0) (factor_y) (0) (0) - self.scale_re = re.compile(r'^q? (-?\d+\.?\d*) 0\.?0* 0\.?0* (-?\d+\.?\d*) 0\.?0* 0\.?0*\s+cm$') + # self.scale_re = re.compile(r'^q? (-?\d+\.?\d*) 0\.?0* 0\.?0* (-?\d+\.?\d*) 0\.?0* 0\.?0*\s+cm$') # detect combined transformation. Should always be the last - self.combined_transform_re = re.compile(r'^q?\s*(-?\d+\.?\d*) (-?\d+\.?\d*) (-?\d+\.?\d*) (-?\d+\.?\d*) ' + self.combined_transform_re = re.compile(r'^(q)?\s*(-?\d+\.?\d*) (-?\d+\.?\d*) (-?\d+\.?\d*) (-?\d+\.?\d*) ' r'(-?\d+\.?\d*) (-?\d+\.?\d*)\s+cm$') # detect clipping path self.clip_path_re = re.compile(r'^W[*]? n?$') + # detect save graphic state in graphic stack + self.save_gs_re = re.compile(r'^q.*?$') + + # detect restore graphic state from graphic stack + self.restore_gs_re = re.compile(r'^Q.*$') + + # graphic stack where we save parameters like transformation, line_width + self.gs = dict() + # each element is a list composed of sublist elements + # (each sublist has 2 lists each having 2 elements: first is offset like: + # offset_geo = [off_x, off_y], second element is scale list with 2 elements, like: scale_geo = [sc_x, sc_yy]) + self.gs['transform'] = [] + self.gs['line_width'] = [] # each element is a float + self.geo_buffer = [] self.pdf_parsed = '' @@ -201,8 +215,8 @@ class ToolPDF(FlatCAMTool): # store the start point (when 'm' command is encountered) current_subpath = None - # set True when 'h' command is encountered (close path) - close_path = False + # set True when 'h' command is encountered (close subpath) + close_subpath = False start_point = None current_point = None @@ -212,80 +226,94 @@ class ToolPDF(FlatCAMTool): offset_geo = [0, 0] scale_geo = [1, 1] - c_offset_f= [0, 0] - c_scale_f = [1, 1] - # initial aperture aperture = 10 # store the apertures here apertures_dict = {} - # it seems that first transform apply to the whole PDF; signal here if it's first - first_transform = True - line_nr = 0 lines = pdf_content.splitlines() for pline in lines: line_nr += 1 - log.debug("line %d: %s" % (line_nr, pline)) + # log.debug("line %d: %s" % (line_nr, pline)) # TRANSFORMATIONS DETECTION # - # # Detect Scale transform - # match = self.scale_re.search(pline) - # if match: - # log.debug( - # "ToolPDF.parse_pdf() --> SCALE transformation found on line: %s --> %s" % (line_nr, pline)) - # if first_transform: - # first_transform = False - # c_scale_f = [float(match.group(1)), float(match.group(2))] - # else: - # scale_geo = [float(match.group(1)), float(match.group(2))] - # continue - - # # Detect Offset transform - # match = self.offset_re.search(pline) - # if match: - # log.debug( - # "ToolPDF.parse_pdf() --> OFFSET transformation found on line: %s --> %s" % (line_nr, pline)) - # offset_geo = [float(match.group(1)), float(match.group(2))] - # continue - - # Detect combined transformation. Must be always the last from transformations to be checked. + # Detect combined transformation. match = self.combined_transform_re.search(pline) if match: + # detect save graphic stack event + # sometimes they combine save_to_graphics_stack with the transformation on the same line + if match.group(1) == 'q': + log.debug( + "ToolPDF.parse_pdf() --> Save to GS found on line: %s --> offset=[%f, %f] ||| scale=[%f, %f]" % + (line_nr, offset_geo[0], offset_geo[1], scale_geo[0], scale_geo[1])) + + self.gs['transform'].append(deepcopy([offset_geo, scale_geo])) + self.gs['line_width'].append(deepcopy(size)) + # transformation = TRANSLATION (OFFSET) - if (float(match.group(2)) == 0 and float(match.group(3)) == 0) and \ - (float(match.group(5)) != 0 or float(match.group(6)) != 0): + if (float(match.group(3)) == 0 and float(match.group(4)) == 0) and \ + (float(match.group(6)) != 0 or float(match.group(7)) != 0): log.debug( "ToolPDF.parse_pdf() --> OFFSET transformation found on line: %s --> %s" % (line_nr, pline)) - if first_transform: - c_offset_f = [float(match.group(5)), float(match.group(6))] - else: - offset_geo = [float(match.group(5)), float(match.group(6))] + + offset_geo[0] += float(match.group(6)) + offset_geo[1] += float(match.group(7)) + # log.debug("Offset= [%f, %f]" % (offset_geo[0], offset_geo[1])) # transformation = SCALING - if float(match.group(1)) != 1 and float(match.group(4)) != 1: + if float(match.group(2)) != 1 and float(match.group(5)) != 1: log.debug( "ToolPDF.parse_pdf() --> SCALE transformation found on line: %s --> %s" % (line_nr, pline)) - if first_transform: - c_scale_f = [float(match.group(1)), float(match.group(4))] - else: - scale_geo = [float(match.group(1)), float(match.group(4))] - if first_transform: - first_transform = False + scale_geo[0] *= float(match.group(2)) + scale_geo[1] *= float(match.group(5)) + # log.debug("Scale= [%f, %f]" % (scale_geo[0], scale_geo[1])) + continue + # detect save graphic stack event + match = self.save_gs_re.search(pline) + if match: + log.debug( + "ToolPDF.parse_pdf() --> Save to GS found on line: %s --> offset=[%f, %f] ||| scale=[%f, %f]" % + (line_nr, offset_geo[0], offset_geo[1], scale_geo[0], scale_geo[1])) + self.gs['transform'].append(deepcopy([offset_geo, scale_geo])) + self.gs['line_width'].append(deepcopy(size)) + + # detect restore from graphic stack event + match = self.restore_gs_re.search(pline) + if match: + log.debug( + "ToolPDF.parse_pdf() --> Restore from GS found on line: %s --> %s" % (line_nr, pline)) + try: + restored_transform = self.gs['transform'].pop(-1) + offset_geo = restored_transform[0] + scale_geo = restored_transform[1] + except IndexError: + # nothing to remove + log.debug("ToolPDF.parse_pdf() --> Nothing to restore") + pass + + try: + size = self.gs['line_width'].pop(-1) + except IndexError: + log.debug("ToolPDF.parse_pdf() --> Nothing to restore") + # nothing to remove + pass + # log.debug("Restored Offset= [%f, %f]" % (offset_geo[0], offset_geo[1])) + # log.debug("Restored Scale= [%f, %f]" % (scale_geo[0], scale_geo[1])) + # PATH CONSTRUCTION # # Start SUBPATH match = self.start_subpath_re.search(pline) if match: # we just started a subpath so we mark it as not closed yet - close_path = False + close_subpath = False # init subpaths subpath['lines'] = [] @@ -295,8 +323,8 @@ class ToolPDF(FlatCAMTool): # detect start point to move to x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - pt = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + pt = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) start_point = pt # add the start point to subpaths @@ -312,8 +340,8 @@ class ToolPDF(FlatCAMTool): current_subpath = 'lines' x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - pt = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + pt = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) subpath['lines'].append(pt) current_point = pt continue @@ -325,16 +353,16 @@ class ToolPDF(FlatCAMTool): start = current_point x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - c1 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + c1 = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) x = float(match.group(3)) + offset_geo[0] y = float(match.group(4)) + offset_geo[1] - c2 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + c2 = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) x = float(match.group(5)) + offset_geo[0] y = float(match.group(6)) + offset_geo[1] - stop = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + stop = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) subpath['bezier'].append([start, c1, c2, stop]) current_point = stop @@ -347,12 +375,12 @@ class ToolPDF(FlatCAMTool): start = current_point x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - c2 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + c2 = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) x = float(match.group(3)) + offset_geo[0] y = float(match.group(4)) + offset_geo[1] - stop = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + stop = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) subpath['bezier'].append([start, start, c2, stop]) current_point = stop @@ -364,33 +392,33 @@ class ToolPDF(FlatCAMTool): start = current_point x = float(match.group(1)) + offset_geo[0] y = float(match.group(2)) + offset_geo[1] - c1 = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + c1 = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) x = float(match.group(3)) + offset_geo[0] y = float(match.group(4)) + offset_geo[1] - stop = (x * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0], - y * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1]) + stop = (x * self.point_to_unit_factor * scale_geo[0], + y * self.point_to_unit_factor * scale_geo[1]) subpath['bezier'].append([start, c1, stop, stop]) print(subpath['bezier']) current_point = stop continue - # Draw RECTANGLE + # Draw Rectangle 're match = self.rect_re.search(pline) if match: current_subpath = 'rectangle' - x = (float(match.group(1)) + offset_geo[0]) * self.point_to_unit_factor * scale_geo[0] * c_scale_f[0] - y = (float(match.group(2)) + offset_geo[1]) * self.point_to_unit_factor * scale_geo[1] * c_scale_f[1] + 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] * c_scale_f[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] * c_scale_f[1] + self.point_to_unit_factor * scale_geo[1] pt1 = (x, y) pt2 = (x+width, y) pt3 = (x+width, y+height) pt4 = (x, y+height) - # TODO: I'm not sure if rectangles are a subpath in themselves that autoclose + # TODO: I'm not sure if rectangles are a type of subpath that close by itself subpath['rectangle'] += [pt1, pt2, pt3, pt4, pt1] current_point = pt1 continue @@ -404,8 +432,8 @@ class ToolPDF(FlatCAMTool): subpath['rectangle'] = [] # it measns that we've already added the subpath to path and we need to delete it # clipping path is usually either rectangle or lines - if close_path is True: - close_path = False + if close_subpath is True: + close_subpath = False if current_subpath == 'lines': path['lines'].pop(-1) if current_subpath == 'rectangle': @@ -415,7 +443,7 @@ class ToolPDF(FlatCAMTool): # Close SUBPATH match = self.end_subpath_re.search(pline) if match: - close_path = True + close_subpath = True if current_subpath == 'lines': subpath['lines'].append(start_point) # since we are closing the subpath add it to the path, a path may have chained subpaths @@ -439,24 +467,6 @@ class ToolPDF(FlatCAMTool): match = self.strokewidth_re.search(pline) if match: size = float(match.group(1)) - # flag = 0 - # - # if not apertures_dict: - # apertures_dict[str(aperture)] = dict() - # apertures_dict[str(aperture)]['size'] = size - # apertures_dict[str(aperture)]['type'] = 'C' - # apertures_dict[str(aperture)]['solid_geometry'] = [] - # else: - # for k in apertures_dict: - # if size == apertures_dict[k]['size']: - # flag = 1 - # break - # if flag == 0: - # aperture += 1 - # apertures_dict[str(aperture)] = dict() - # apertures_dict[str(aperture)]['size'] = size - # apertures_dict[str(aperture)]['type'] = 'C' - # apertures_dict[str(aperture)]['solid_geometry'] = [] continue # Detect No_Op command, ignore the current subpath @@ -471,7 +481,7 @@ class ToolPDF(FlatCAMTool): match = self.stroke_path__re.search(pline) if match: # scale the size here; some PDF printers apply transformation after the size is declared - applied_size = size * scale_geo[0] * c_scale_f[0] * self.point_to_unit_factor + applied_size = size * scale_geo[0] * self.point_to_unit_factor path_geo = list() if current_subpath == 'lines': @@ -536,7 +546,7 @@ class ToolPDF(FlatCAMTool): match = self.fill_path_re.search(pline) if match: # scale the size here; some PDF printers apply transformation after the size is declared - applied_size = size * scale_geo[0] * c_scale_f[0] * self.point_to_unit_factor + applied_size = size * scale_geo[0] * self.point_to_unit_factor path_geo = list() if current_subpath == 'lines': @@ -544,7 +554,7 @@ class ToolPDF(FlatCAMTool): for subp in path['lines']: geo = copy(subp) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -553,7 +563,7 @@ class ToolPDF(FlatCAMTool): else: geo = copy(subpath['lines']) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -566,7 +576,7 @@ class ToolPDF(FlatCAMTool): for b in subp: geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -575,7 +585,7 @@ class ToolPDF(FlatCAMTool): else: for b in subpath['bezier']: geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) - if close_path is False: + if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -586,7 +596,7 @@ class ToolPDF(FlatCAMTool): for subp in path['rectangle']: geo = copy(subp) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -595,14 +605,14 @@ class ToolPDF(FlatCAMTool): else: geo = copy(subpath['rectangle']) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) subpath['rectangle'] = [] # we finished painting and also closed the path if it was the case - close_path = True + close_subpath = True try: apertures_dict['0']['solid_geometry'] += path_geo @@ -619,7 +629,7 @@ class ToolPDF(FlatCAMTool): match = self.fill_stroke_path_re.search(pline) if match: # scale the size here; some PDF printers apply transformation after the size is declared - applied_size = size * scale_geo[0] * c_scale_f[0] * self.point_to_unit_factor + applied_size = size * scale_geo[0] * self.point_to_unit_factor path_geo = list() if current_subpath == 'lines': @@ -628,7 +638,7 @@ class ToolPDF(FlatCAMTool): for subp in path['lines']: geo = copy(subp) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -643,7 +653,7 @@ class ToolPDF(FlatCAMTool): # fill geo = copy(subpath['lines']) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -662,7 +672,7 @@ class ToolPDF(FlatCAMTool): for b in subp: geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -679,7 +689,7 @@ class ToolPDF(FlatCAMTool): # fill for b in subpath['bezier']: geo += self.bezier_to_points(start=b[0], c1=b[1], c2=b[2], stop=b[3]) - if close_path is False: + if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -697,7 +707,7 @@ class ToolPDF(FlatCAMTool): for subp in path['rectangle']: geo = copy(subp) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -712,7 +722,7 @@ class ToolPDF(FlatCAMTool): # fill geo = copy(subpath['rectangle']) # close the subpath if it was not closed already - if close_path is False: + if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -723,7 +733,7 @@ class ToolPDF(FlatCAMTool): subpath['rectangle'] = [] # we finished painting and also closed the path if it was the case - close_path = True + close_subpath = True try: apertures_dict['0']['solid_geometry'] += path_geo From 7442af1b06920fc51e36c5354ae6ff67dfcabf77 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 22 Apr 2019 17:35:36 +0300 Subject: [PATCH 33/42] - PDF Import tool: added support for PDF files that embed multiple Gerber layers (top, bottom, outline, silkscreen etc). Each will be opened in it's own Gerber file. The requirement is that each one is drawn in a different color --- README.md | 1 + flatcamTools/ToolPDF.py | 86 +++++++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 81d8384b..27c119da 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 22.04.2019 - PDF import tool: added support for save/restore Graphics stack. Only for scale and offset transformations and for the linewidth. This is the final fix for Microsoft PDF printer who saves in PDF format 1.7 +- PDF Import tool: added support for PDF files that embed multiple Gerber layers (top, bottom, outline, silkscreen etc). Each will be opened in it's own Gerber file. The requirement is that each one is drawn in a different color 21.04.2019 diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index 638dd9e4..926ecee4 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -43,6 +43,9 @@ class ToolPDF(FlatCAMTool): self.stream_re = re.compile(b'.*?FlateDecode.*?stream(.*?)endstream', re.S) + # detect color change; it means a new object to be created + self.color_re = re.compile(r'^\s*(\d+\.?\d*) (\d+\.?\d*) (\d+\.?\d*)\s*RG$') + # detect 're' command self.rect_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*re$') # detect 'm' command @@ -159,7 +162,7 @@ class ToolPDF(FlatCAMTool): def open_pdf(self, filename): new_name = filename.split('/')[-1].split('\\')[-1] - def obj_init(grb_obj, app_obj): + with self.app.proc_container.new(_("Parsing PDF file ...")): with open(filename, "rb") as f: pdf = f.read() @@ -171,35 +174,41 @@ class ToolPDF(FlatCAMTool): try: self.pdf_parsed += (zlib.decompress(s).decode('UTF-8') + '\r\n') except Exception as e: - app_obj.log.debug("ToolPDF.open_pdf().obj_init() --> %s" % str(e)) + log.debug("ToolPDF.open_pdf().obj_init() --> %s" % str(e)) - ap_dict = self.parse_pdf(pdf_content=self.pdf_parsed) - grb_obj.apertures = deepcopy(ap_dict) + obj_dict = self.parse_pdf(pdf_content=self.pdf_parsed) - poly_buff = [] - for ap in ap_dict: - for k in ap_dict[ap]: - if k == 'solid_geometry': - poly_buff += ap_dict[ap][k] + for k in obj_dict: + ap_dict = obj_dict[k] + if ap_dict: + def obj_init(grb_obj, app_obj): - poly_buff = unary_union(poly_buff) - poly_buff = poly_buff.buffer(0.0000001) - poly_buff = poly_buff.buffer(-0.0000001) + grb_obj.apertures = deepcopy(ap_dict) - grb_obj.solid_geometry = deepcopy(poly_buff) + poly_buff = [] + for ap in grb_obj.apertures: + for k in grb_obj.apertures[ap]: + if k == 'solid_geometry': + poly_buff += ap_dict[ap][k] - with self.app.proc_container.new(_("Opening PDF.")): + poly_buff = unary_union(poly_buff) + poly_buff = poly_buff.buffer(0.0000001) + poly_buff = poly_buff.buffer(-0.0000001) - ret = self.app.new_object("gerber", new_name, obj_init, autoselected=False) - if ret == 'fail': - self.app.inform.emit(_('[ERROR_NOTCL] Open PDF file failed.')) - return + grb_obj.solid_geometry = deepcopy(poly_buff) - # Register recent file - self.app.file_opened.emit("gerber", new_name) + with self.app.proc_container.new(_("Opening PDF layer #%d ...") % (int(k) - 2)): - # GUI feedback - self.app.inform.emit(_("[success] Opened: %s") % filename) + ret = self.app.new_object("gerber", new_name, obj_init, autoselected=False) + if ret == 'fail': + self.app.inform.emit(_('[ERROR_NOTCL] Open PDF file failed.')) + return + + # Register recent file + self.app.file_opened.emit("gerber", new_name) + + # GUI feedback + self.app.inform.emit(_("[success] Opened: %s") % filename) def parse_pdf(self, pdf_content): path = dict() @@ -229,9 +238,23 @@ class ToolPDF(FlatCAMTool): # initial aperture aperture = 10 + # store the objects to be transformed into Gerbers + object_dict = {} + + # will serve as key in the object_dict + object_nr = 1 + # store the apertures here apertures_dict = {} + # create first object + object_dict[object_nr] = apertures_dict + object_nr += 1 + + # on 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] + line_nr = 0 lines = pdf_content.splitlines() @@ -239,6 +262,21 @@ class ToolPDF(FlatCAMTool): line_nr += 1 # log.debug("line %d: %s" % (line_nr, pline)) + # COLOR DETECTION / OBJECT DETECTION + match = self.color_re.search(pline) + if match: + color = [float(match.group(1)), float(match.group(2)), float(match.group(3))] + + if color[0] == old_color[0] and color[1] == old_color[1] and color[2] == old_color[2]: + # same color, do nothing + continue + else: + object_dict[object_nr] = deepcopy(apertures_dict) + object_nr += 1 + object_dict[object_nr] = {} + apertures_dict.clear() + old_color = copy(color) + # TRANSFORMATIONS DETECTION # # Detect combined transformation. @@ -605,7 +643,7 @@ class ToolPDF(FlatCAMTool): else: geo = copy(subpath['rectangle']) # close the subpath if it was not closed already - if close_subpath is False: + if close_subpath is False and start_point is not None: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) @@ -745,7 +783,7 @@ class ToolPDF(FlatCAMTool): apertures_dict['0']['solid_geometry'] = [] apertures_dict['0']['solid_geometry'] += path_geo continue - return apertures_dict + return object_dict def bezier_to_points(self, start, c1, c2, stop): """ From 8f1a0c1fdc254d02b72695b507faf4f7c52593aa Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 22 Apr 2019 19:18:23 +0300 Subject: [PATCH 34/42] - added PDF file as type in the Recent File list and capability to load it from there - PDF's can be drag & dropped on the GUI to be loaded --- FlatCAMApp.py | 5 ++++- README.md | 2 ++ flatcamGUI/FlatCAMGUI.py | 4 ++++ flatcamTools/ToolPDF.py | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index bcac9669..bb57422a 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -1838,6 +1838,7 @@ class App(QtCore.QObject): 'mpf'] self.svg_list = ['svg'] self.dxf_list = ['dxf'] + self.pdf_list = ['pdf'] self.prj_list = ['flatprj'] # global variable used by NCC Tool to signal that some polygons could not be cleared, if True @@ -7600,6 +7601,7 @@ class App(QtCore.QObject): "project": "share/project16.png", "svg": "share/geometry16.png", "dxf": "share/dxf16.png", + "pdf": "share/pdf32.png", "image": "share/image16.png" } @@ -7612,7 +7614,8 @@ class App(QtCore.QObject): 'project': self.open_project, 'svg': self.import_svg, 'dxf': self.import_dxf, - 'image': self.import_image + 'image': self.import_image, + 'pdf': lambda fname: self.worker_task.emit({'fcn': self.pdf_tool.open_pdf, 'params': [fname]}) } # Open file diff --git a/README.md b/README.md index 27c119da..61394e8c 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ CAD program, and create G-Code for Isolation routing. 22.04.2019 +- added PDF file as type in the Recent File list and capability to load it from there +- PDF's can be drag & dropped on the GUI to be loaded - PDF import tool: added support for save/restore Graphics stack. Only for scale and offset transformations and for the linewidth. This is the final fix for Microsoft PDF printer who saves in PDF format 1.7 - PDF Import tool: added support for PDF files that embed multiple Gerber layers (top, bottom, outline, silkscreen etc). Each will be opened in it's own Gerber file. The requirement is that each one is drawn in a different color diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 567cea12..a0643961 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -3015,6 +3015,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.worker_task.emit({'fcn': self.app.import_dxf, 'params': [self.filename, object_type, None]}) + if extension in self.app.pdf_list: + self.app.worker_task.emit({'fcn': self.app.pdf_tool.open_pdf, + 'params': [self.filename]}) + if extension in self.app.prj_list: # self.app.open_project() is not Thread Safe self.app.open_project(self.filename) diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index 926ecee4..99f7de2d 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -205,7 +205,7 @@ class ToolPDF(FlatCAMTool): return # Register recent file - self.app.file_opened.emit("gerber", new_name) + self.app.file_opened.emit("gerber", filename) # GUI feedback self.app.inform.emit(_("[success] Opened: %s") % filename) From d66d914cc3920e68123c13cd1857d7b1852f919c Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 22 Apr 2019 20:33:03 +0300 Subject: [PATCH 35/42] - PDF Import tool: fixed bugs when drag & dropping PDF files on canvas the files geometry previously opened was added to the new one. Also scaling issues. Solved. --- README.md | 2 ++ flatcamTools/ToolPDF.py | 34 ++++++++++++++++------------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 61394e8c..f1991ec7 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ CAD program, and create G-Code for Isolation routing. - PDF's can be drag & dropped on the GUI to be loaded - PDF import tool: added support for save/restore Graphics stack. Only for scale and offset transformations and for the linewidth. This is the final fix for Microsoft PDF printer who saves in PDF format 1.7 - PDF Import tool: added support for PDF files that embed multiple Gerber layers (top, bottom, outline, silkscreen etc). Each will be opened in it's own Gerber file. The requirement is that each one is drawn in a different color +- PDF Import tool: fixed bugs when drag & dropping PDF files on canvas the files geometry previously opened was added to the new one. Also scaling issues. Solved. + 21.04.2019 diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index 99f7de2d..e790b98b 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -102,7 +102,7 @@ class ToolPDF(FlatCAMTool): self.gs['transform'] = [] self.gs['line_width'] = [] # each element is a float - self.geo_buffer = [] + self.obj_dict = dict() self.pdf_parsed = '' # conversion factor to INCH @@ -111,18 +111,6 @@ class ToolPDF(FlatCAMTool): def run(self, toggle=True): self.app.report_usage("ToolPDF()") - # init variables for reuse - self.geo_buffer = [] - self.pdf_parsed = '' - - # the UNITS in PDF files are points and here we set the factor to convert them to real units (either MM or INCH) - if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': - # 1 inch = 72 points => 1 point = 1 / 72 = 0.01388888888 inch = 0.01388888888 inch * 25.4 = 0.35277777778 mm - self.point_to_unit_factor = 0.35277777778 - else: - # 1 inch = 72 points => 1 point = 1 / 72 = 0.01388888888 inch - self.point_to_unit_factor = 0.01388888888 - self.set_tool_ui() self.on_open_pdf_click() @@ -161,6 +149,16 @@ class ToolPDF(FlatCAMTool): def open_pdf(self, filename): new_name = filename.split('/')[-1].split('\\')[-1] + self.obj_dict.clear() + self.pdf_parsed = '' + + # the UNITS in PDF files are points and here we set the factor to convert them to real units (either MM or INCH) + if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': + # 1 inch = 72 points => 1 point = 1 / 72 = 0.01388888888 inch = 0.01388888888 inch * 25.4 = 0.35277777778 mm + self.point_to_unit_factor = 25.4 / 72 + else: + # 1 inch = 72 points => 1 point = 1 / 72 = 0.01388888888 inch + self.point_to_unit_factor = 1 / 72 with self.app.proc_container.new(_("Parsing PDF file ...")): with open(filename, "rb") as f: @@ -176,14 +174,14 @@ class ToolPDF(FlatCAMTool): except Exception as e: log.debug("ToolPDF.open_pdf().obj_init() --> %s" % str(e)) - obj_dict = self.parse_pdf(pdf_content=self.pdf_parsed) + self.obj_dict = self.parse_pdf(pdf_content=self.pdf_parsed) - for k in obj_dict: - ap_dict = obj_dict[k] + for k in self.obj_dict: + ap_dict = deepcopy(self.obj_dict[k]) if ap_dict: def obj_init(grb_obj, app_obj): - grb_obj.apertures = deepcopy(ap_dict) + grb_obj.apertures = ap_dict poly_buff = [] for ap in grb_obj.apertures: @@ -273,7 +271,7 @@ class ToolPDF(FlatCAMTool): else: object_dict[object_nr] = deepcopy(apertures_dict) object_nr += 1 - object_dict[object_nr] = {} + object_dict[object_nr] = dict() apertures_dict.clear() old_color = copy(color) From 82a0287f4da9cbcbbbe6eec5d81c4decb516b775 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 23 Apr 2019 02:02:20 +0300 Subject: [PATCH 36/42] - PDF Import tool: added support for detection of circular geometry drawn with white color which means actually invisible color. When detected, FlatCAM will build an Excellon file out of those geoms. - PDF Import tool: fixed storing geometries in apertures with the right size (before they were all stored in aperture D10) --- FlatCAMApp.py | 2 +- README.md | 3 +- flatcamTools/ToolPDF.py | 286 +++++++++++++++++++++++++++++++--------- 3 files changed, 228 insertions(+), 63 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index bb57422a..c05d27c7 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -95,7 +95,7 @@ class App(QtCore.QObject): # Version version = 8.914 - version_date = "2019/04/22" + version_date = "2019/04/23" beta = True # current date now diff --git a/README.md b/README.md index f1991ec7..456bb339 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ CAD program, and create G-Code for Isolation routing. - PDF import tool: added support for save/restore Graphics stack. Only for scale and offset transformations and for the linewidth. This is the final fix for Microsoft PDF printer who saves in PDF format 1.7 - PDF Import tool: added support for PDF files that embed multiple Gerber layers (top, bottom, outline, silkscreen etc). Each will be opened in it's own Gerber file. The requirement is that each one is drawn in a different color - PDF Import tool: fixed bugs when drag & dropping PDF files on canvas the files geometry previously opened was added to the new one. Also scaling issues. Solved. - +- PDF Import tool: added support for detection of circular geometry drawn with white color which means actually invisible color. When detected, FlatCAM will build an Excellon file out of those geoms. +- PDF Import tool: fixed storing geometries in apertures with the right size (before they were all stored in aperture D10) 21.04.2019 diff --git a/flatcamTools/ToolPDF.py b/flatcamTools/ToolPDF.py index e790b98b..226347b6 100644 --- a/flatcamTools/ToolPDF.py +++ b/flatcamTools/ToolPDF.py @@ -43,8 +43,12 @@ class ToolPDF(FlatCAMTool): self.stream_re = re.compile(b'.*?FlateDecode.*?stream(.*?)endstream', re.S) - # detect color change; it means a new object to be created - self.color_re = re.compile(r'^\s*(\d+\.?\d*) (\d+\.?\d*) (\d+\.?\d*)\s*RG$') + # detect stroke color change; it means a new object to be created + self.stroke_color_re = re.compile(r'^\s*(\d+\.?\d*) (\d+\.?\d*) (\d+\.?\d*)\s*RG$') + + # detect fill color change; we check here for white color (transparent geometry); + # if detected we create an Excellon from it + self.fill_color_re = re.compile(r'^\s*(\d+\.?\d*) (\d+\.?\d*) (\d+\.?\d*)\s*rg$') # detect 're' command self.rect_re = re.compile(r'^(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s(-?\d+\.?\d*)\s*re$') @@ -104,6 +108,7 @@ class ToolPDF(FlatCAMTool): self.obj_dict = dict() self.pdf_parsed = '' + self.parsed_obj_dict = dict() # conversion factor to INCH self.point_to_unit_factor = 0.01388888888 @@ -151,6 +156,8 @@ class ToolPDF(FlatCAMTool): new_name = filename.split('/')[-1].split('\\')[-1] self.obj_dict.clear() self.pdf_parsed = '' + self.parsed_obj_dict = {} + obj_type = 'gerber' # the UNITS in PDF files are points and here we set the factor to convert them to real units (either MM or INCH) if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': @@ -174,37 +181,96 @@ class ToolPDF(FlatCAMTool): except Exception as e: log.debug("ToolPDF.open_pdf().obj_init() --> %s" % str(e)) - self.obj_dict = self.parse_pdf(pdf_content=self.pdf_parsed) + self.parsed_obj_dict = self.parse_pdf(pdf_content=self.pdf_parsed) - for k in self.obj_dict: - ap_dict = deepcopy(self.obj_dict[k]) + for k in self.parsed_obj_dict: + ap_dict = deepcopy(self.parsed_obj_dict[k]) if ap_dict: - def obj_init(grb_obj, app_obj): + if k == 0: + # Excellon + obj_type = 'excellon' - grb_obj.apertures = ap_dict + new_name = new_name + "_exc" + # store the points here until reconstitution: keys are diameters and values are list of (x,y) coords + points = {} - poly_buff = [] - for ap in grb_obj.apertures: - for k in grb_obj.apertures[ap]: - if k == 'solid_geometry': - poly_buff += ap_dict[ap][k] + def obj_init(exc_obj, app_obj): + # print(self.parsed_obj_dict[0]) - poly_buff = unary_union(poly_buff) - poly_buff = poly_buff.buffer(0.0000001) - poly_buff = poly_buff.buffer(-0.0000001) + for geo in self.parsed_obj_dict[0]['0']['solid_geometry']: + xmin, ymin, xmax, ymax = geo.bounds + center = (((xmax - xmin) / 2) + xmin, ((ymax - ymin) / 2) + ymin) - grb_obj.solid_geometry = deepcopy(poly_buff) + # for drill bits, even in INCH, it's enough 3 decimals + correction_factor = 0.974 + dia = (xmax - xmin) * correction_factor + dia = round(dia, 3) + if dia in points: + points[dia].append(center) + else: + points[dia] = [center] - with self.app.proc_container.new(_("Opening PDF layer #%d ...") % (int(k) - 2)): + sorted_dia = sorted(points.keys()) - ret = self.app.new_object("gerber", new_name, obj_init, autoselected=False) + name_tool = 0 + for dia in sorted_dia: + name_tool += 1 + + # create tools dictionary + spec = {"C": dia} + spec['solid_geometry'] = [] + exc_obj.tools[str(name_tool)] = spec + + # create drill list of dictionaries + for dia_points in points: + if dia == dia_points: + for pt in points[dia_points]: + exc_obj.drills.append({'point': Point(pt), 'tool': str(name_tool)}) + break + + ret = exc_obj.create_geometry() + if ret == 'fail': + log.debug("Could not create geometry for Excellon object.") + return "fail" + for tool in exc_obj.tools: + if exc_obj.tools[tool]['solid_geometry']: + return + app_obj.inform.emit(_("[ERROR_NOTCL] No geometry found in file: %s") % new_name) + return "fail" + else: + # Gerber + obj_type = 'gerber' + + def obj_init(grb_obj, app_obj): + + grb_obj.apertures = ap_dict + + poly_buff = [] + for ap in grb_obj.apertures: + for k in grb_obj.apertures[ap]: + if k == 'solid_geometry': + poly_buff += ap_dict[ap][k] + + poly_buff = unary_union(poly_buff) + try: + poly_buff = poly_buff.buffer(0.0000001) + except ValueError: + pass + try: + poly_buff = poly_buff.buffer(-0.0000001) + except ValueError: + pass + + grb_obj.solid_geometry = deepcopy(poly_buff) + + with self.app.proc_container.new(_("Rendering PDF layer #%d ...") % (int(k) - 2)): + + ret = self.app.new_object(obj_type, new_name, obj_init, autoselected=False) if ret == 'fail': self.app.inform.emit(_('[ERROR_NOTCL] Open PDF file failed.')) return - # Register recent file - self.app.file_opened.emit("gerber", filename) - + self.app.file_opened.emit(obj_type, filename) # GUI feedback self.app.inform.emit(_("[success] Opened: %s") % filename) @@ -233,9 +299,6 @@ class ToolPDF(FlatCAMTool): offset_geo = [0, 0] scale_geo = [1, 1] - # initial aperture - aperture = 10 - # store the objects to be transformed into Gerbers object_dict = {} @@ -245,14 +308,29 @@ class ToolPDF(FlatCAMTool): # store the apertures here apertures_dict = {} + # initial aperture + aperture = 10 + + # store the apertures with clear geometry here + # we are interested only in the circular geometry (drill holes) therefore we target only Bezier subpaths + clear_apertures_dict = dict() + # everything will be stored in the '0' aperture since we are dealing with clear polygons not strokes + clear_apertures_dict['0'] = dict() + clear_apertures_dict['0']['size'] = 0.0 + clear_apertures_dict['0']['type'] = 'C' + clear_apertures_dict['0']['solid_geometry'] = [] + # create first object object_dict[object_nr] = apertures_dict object_nr += 1 - # on 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 + # 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] + # signal that we have clear geometry and the geometry will be added to a special object_nr = 0 + flag_clear_geo = False + line_nr = 0 lines = pdf_content.splitlines() @@ -261,9 +339,12 @@ class ToolPDF(FlatCAMTool): # log.debug("line %d: %s" % (line_nr, pline)) # COLOR DETECTION / OBJECT DETECTION - match = self.color_re.search(pline) + match = self.stroke_color_re.search(pline) if match: color = [float(match.group(1)), float(match.group(2)), float(match.group(3))] + log.debug( + "ToolPDF.parse_pdf() --> STROKE Color change on line: %s --> RED=%f GREEN=%f BLUE=%f" % + (line_nr, color[0], color[1], color[2])) if color[0] == old_color[0] and color[1] == old_color[1] and color[2] == old_color[2]: # same color, do nothing @@ -271,9 +352,28 @@ class ToolPDF(FlatCAMTool): else: object_dict[object_nr] = deepcopy(apertures_dict) object_nr += 1 + object_dict[object_nr] = dict() - apertures_dict.clear() + apertures_dict = {} old_color = copy(color) + # we make sure that the following geometry is added to the right storage + flag_clear_geo = False + continue + + # CLEAR GEOMETRY detection + match = self.fill_color_re.search(pline) + if match: + fill_color = [float(match.group(1)), float(match.group(2)), float(match.group(3))] + log.debug( + "ToolPDF.parse_pdf() --> FILL Color change on line: %s --> RED=%f GREEN=%f BLUE=%f" % + (line_nr, fill_color[0], fill_color[1], fill_color[2])) + # if the color is white we are seeing 'clear_geometry' that can't be seen. It may be that those + # geometries are actually holes from which we can make an Excellon file + if fill_color[0] == 1 and fill_color[1] == 1 and fill_color[2] == 1: + flag_clear_geo = True + else: + flag_clear_geo = False + continue # TRANSFORMATIONS DETECTION # @@ -366,7 +466,7 @@ class ToolPDF(FlatCAMTool): # add the start point to subpaths subpath['lines'].append(start_point) # subpath['bezier'].append(start_point) - subpath['rectangle'].append(start_point) + # subpath['rectangle'].append(start_point) current_point = start_point continue @@ -440,7 +540,7 @@ class ToolPDF(FlatCAMTool): current_point = stop continue - # Draw Rectangle 're + # Draw Rectangle 're' match = self.rect_re.search(pline) if match: current_subpath = 'rectangle' @@ -454,7 +554,6 @@ class ToolPDF(FlatCAMTool): pt2 = (x+width, y) pt3 = (x+width, y+height) pt4 = (x, y+height) - # TODO: I'm not sure if rectangles are a type of subpath that close by itself subpath['rectangle'] += [pt1, pt2, pt3, pt4, pt1] current_point = pt1 continue @@ -491,7 +590,7 @@ class ToolPDF(FlatCAMTool): path['bezier'].append(copy(subpath['bezier'])) subpath['bezier'] = [] elif current_subpath == 'rectangle': - subpath['rectangle'].append(start_point) + # subpath['rectangle'].append(start_point) # since we are closing the subpath add it to the path, a path may have chained subpaths path['rectangle'].append(copy(subpath['rectangle'])) subpath['rectangle'] = [] @@ -566,12 +665,29 @@ class ToolPDF(FlatCAMTool): path_geo.append(geo) subpath['rectangle'] = [] - try: - apertures_dict[str(aperture)]['solid_geometry'] += path_geo - except KeyError: - # in case there is no stroke width yet therefore no aperture + # store the found geometry + found_aperture = None + if apertures_dict: + for apid in apertures_dict: + # if we already have an aperture with the current size (rounded to 5 decimals) + if apertures_dict[apid]['size'] == round(applied_size, 5): + found_aperture = apid + break + + if found_aperture: + apertures_dict[copy(found_aperture)]['solid_geometry'] += path_geo + found_aperture = None + else: + if str(aperture) in apertures_dict.keys(): + aperture += 1 + apertures_dict[str(aperture)] = {} + apertures_dict[str(aperture)]['size'] = round(applied_size, 5) + apertures_dict[str(aperture)]['type'] = 'C' + apertures_dict[str(aperture)]['solid_geometry'] = [] + apertures_dict[str(aperture)]['solid_geometry'] += path_geo + else: apertures_dict[str(aperture)] = {} - apertures_dict[str(aperture)]['size'] = applied_size + apertures_dict[str(aperture)]['size'] = round(applied_size, 5) apertures_dict[str(aperture)]['type'] = 'C' apertures_dict[str(aperture)]['solid_geometry'] = [] apertures_dict[str(aperture)]['solid_geometry'] += path_geo @@ -583,8 +699,8 @@ class ToolPDF(FlatCAMTool): if match: # scale the size here; some PDF printers apply transformation after the size is declared applied_size = size * scale_geo[0] * self.point_to_unit_factor - path_geo = list() + if current_subpath == 'lines': if path['lines']: for subp in path['lines']: @@ -632,8 +748,8 @@ class ToolPDF(FlatCAMTool): for subp in path['rectangle']: geo = copy(subp) # close the subpath if it was not closed already - if close_subpath is False: - geo.append(geo[0]) + if close_subpath is False and start_point is not None: + geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) path_geo.append(geo_el) # the path was painted therefore initialize it @@ -650,24 +766,35 @@ class ToolPDF(FlatCAMTool): # we finished painting and also closed the path if it was the case close_subpath = True - try: - apertures_dict['0']['solid_geometry'] += path_geo - except KeyError: - # in case there is no stroke width yet therefore no aperture - apertures_dict['0'] = {} - apertures_dict['0']['size'] = applied_size - apertures_dict['0']['type'] = 'C' - apertures_dict['0']['solid_geometry'] = [] - apertures_dict['0']['solid_geometry'] += path_geo - continue + # if there was a fill color change we look for circular geometries from which we can make drill holes + # for the Excellon file + if flag_clear_geo is True: + # we llok for circular geometries + if current_subpath == 'bezier': + # if there are geometries in the list + if path_geo: + clear_apertures_dict['0']['solid_geometry'] += path_geo + else: + # else, add the geometry as usual + try: + apertures_dict['0']['solid_geometry'] += path_geo + except KeyError: + # in case there is no stroke width yet therefore no aperture + apertures_dict['0'] = {} + apertures_dict['0']['size'] = applied_size + apertures_dict['0']['type'] = 'C' + apertures_dict['0']['solid_geometry'] = [] + apertures_dict['0']['solid_geometry'] += path_geo + continue - # fill and stroke the path + # Fill and Stroke the path match = self.fill_stroke_path_re.search(pline) if match: # scale the size here; some PDF printers apply transformation after the size is declared applied_size = size * scale_geo[0] * self.point_to_unit_factor - path_geo = list() + fill_geo = list() + if current_subpath == 'lines': if path['lines']: # fill @@ -677,7 +804,7 @@ class ToolPDF(FlatCAMTool): if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) - path_geo.append(geo_el) + fill_geo.append(geo_el) # stroke for subp in path['lines']: geo = copy(subp) @@ -692,7 +819,7 @@ class ToolPDF(FlatCAMTool): if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) - path_geo.append(geo_el) + fill_geo.append(geo_el) # stroke geo = copy(subpath['lines']) geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) @@ -711,7 +838,7 @@ class ToolPDF(FlatCAMTool): if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) - path_geo.append(geo_el) + fill_geo.append(geo_el) # stroke for subp in path['bezier']: geo = [] @@ -728,7 +855,7 @@ class ToolPDF(FlatCAMTool): if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) - path_geo.append(geo_el) + fill_geo.append(geo_el) # stroke geo = [] for b in subpath['bezier']: @@ -746,7 +873,7 @@ class ToolPDF(FlatCAMTool): if close_subpath is False: geo.append(geo[0]) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) - path_geo.append(geo_el) + fill_geo.append(geo_el) # stroke for subp in path['rectangle']: geo = copy(subp) @@ -761,7 +888,7 @@ class ToolPDF(FlatCAMTool): if close_subpath is False: geo.append(start_point) geo_el = Polygon(geo).buffer(0.0000001, resolution=self.step_per_circles) - path_geo.append(geo_el) + fill_geo.append(geo_el) # stroke geo = copy(subpath['rectangle']) geo = LineString(geo).buffer((float(applied_size) / 2), resolution=self.step_per_circles) @@ -771,16 +898,53 @@ class ToolPDF(FlatCAMTool): # we finished painting and also closed the path if it was the case close_subpath = True + # store the found geometry for stroking the path + found_aperture = None + if apertures_dict: + for apid in apertures_dict: + # if we already have an aperture with the current size (rounded to 5 decimals) + if apertures_dict[apid]['size'] == round(applied_size, 5): + found_aperture = apid + break + + if found_aperture: + apertures_dict[copy(found_aperture)]['solid_geometry'] += path_geo + found_aperture = None + else: + if str(aperture) in apertures_dict.keys(): + aperture += 1 + apertures_dict[str(aperture)] = {} + apertures_dict[str(aperture)]['size'] = round(applied_size, 5) + apertures_dict[str(aperture)]['type'] = 'C' + apertures_dict[str(aperture)]['solid_geometry'] = [] + apertures_dict[str(aperture)]['solid_geometry'] += path_geo + else: + apertures_dict[str(aperture)] = {} + apertures_dict[str(aperture)]['size'] = round(applied_size, 5) + apertures_dict[str(aperture)]['type'] = 'C' + apertures_dict[str(aperture)]['solid_geometry'] = [] + apertures_dict[str(aperture)]['solid_geometry'] += path_geo + + # store the found geometry for filling the path try: - apertures_dict['0']['solid_geometry'] += path_geo + apertures_dict['0']['solid_geometry'] += fill_geo except KeyError: # in case there is no stroke width yet therefore no aperture apertures_dict['0'] = {} - apertures_dict['0']['size'] = applied_size + apertures_dict['0']['size'] = round(applied_size, 5) apertures_dict['0']['type'] = 'C' apertures_dict['0']['solid_geometry'] = [] - apertures_dict['0']['solid_geometry'] += path_geo + apertures_dict['0']['solid_geometry'] += fill_geo + continue + + # tidy up. copy the current aperture dict to the object dict but only if it is not empty + if apertures_dict: + object_dict[object_nr] = deepcopy(apertures_dict) + + if clear_apertures_dict['0']['solid_geometry']: + object_dict[0] = deepcopy(clear_apertures_dict) + return object_dict def bezier_to_points(self, start, c1, c2, stop): From 929d70542cd0fd456e810a7e46f2527255204aa5 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 23 Apr 2019 04:24:10 +0300 Subject: [PATCH 37/42] - Gerber Editor: added two new tools: Add Disc and Add SemiDisc (porting of Circle and Arc from Geometry Editor) --- README.md | 4 + flatcamEditors/FlatCAMGrbEditor.py | 292 +++++++++++++++++++++++++++++ flatcamGUI/FlatCAMGUI.py | 27 +++ share/disc32.png | Bin 0 -> 435 bytes share/semidisc32.png | Bin 0 -> 435 bytes 5 files changed, 323 insertions(+) create mode 100644 share/disc32.png create mode 100644 share/semidisc32.png diff --git a/README.md b/README.md index 456bb339..c4227757 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +23.04.2019 + +- Gerber Editor: added two new tools: Add Disc and Add SemiDisc (porting of Circle and Arc from Geometry Editor) + 22.04.2019 - added PDF file as type in the Recent File list and capability to load it from there diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index be649a12..ed2c5612 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -1057,6 +1057,286 @@ class FCTrack(FCRegion): return msg +class FCDisc(FCShapeTool): + """ + Resulting type: Polygon + """ + + def __init__(self, draw_app): + DrawTool.__init__(self, draw_app) + self.name = 'disc' + + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + + size_ap = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) + self.buf_val = (size_ap / 2) if size_ap > 0 else 0.0000001 + + self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] + + self.start_msg = _("Click on CENTER ...") + self.steps_per_circ = self.draw_app.app.defaults["gerber_circle_steps"] + + def click(self, point): + self.points.append(point) + + if len(self.points) == 1: + self.draw_app.app.inform.emit(_("Click on perimeter point to complete ...")) + return "Click on perimeter to complete ..." + + if len(self.points) == 2: + self.make() + return "Done." + + return "" + + def utility_geometry(self, data=None): + if len(self.points) == 1: + p1 = self.points[0] + p2 = data + radius = sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) + return DrawToolUtilityShape(Point(p1).buffer((radius + self.buf_val / 2), int(self.steps_per_circ / 4))) + + return None + + def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + + self.draw_app.current_storage = self.storage_obj + + p1 = self.points[0] + p2 = self.points[1] + radius = distance(p1, p2) + self.geometry = DrawToolShape(Point(p1).buffer((radius + self.buf_val / 2), int(self.steps_per_circ / 4))) + self.draw_app.in_action = False + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done.")) + + def clean_up(self): + self.draw_app.selected = [] + self.draw_app.apertures_table.clearSelection() + self.draw_app.plot_all() + + +class FCSemiDisc(FCShapeTool): + def __init__(self, draw_app): + DrawTool.__init__(self, draw_app) + self.name = 'semidisc' + + self.start_msg = _("Click on CENTER ...") + + # Direction of rotation between point 1 and 2. + # 'cw' or 'ccw'. Switch direction by hitting the + # 'o' key. + self.direction = "cw" + + # Mode + # C12 = Center, p1, p2 + # 12C = p1, p2, Center + # 132 = p1, p3, p2 + self.mode = "c12" # Center, p1, p2 + + size_ap = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) + self.buf_val = (size_ap / 2) if size_ap > 0 else 0.0000001 + + self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] + + self.steps_per_circ = self.draw_app.app.defaults["gerber_circle_steps"] + + def click(self, point): + self.points.append(point) + + if len(self.points) == 1: + if self.mode == 'c12': + self.draw_app.app.inform.emit(_("Click on Start point ...")) + elif self.mode == '132': + self.draw_app.app.inform.emit(_("Click on Point3 ...")) + else: + self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) + return "Click on 1st point ..." + + if len(self.points) == 2: + if self.mode == 'c12': + self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) + elif self.mode == '132': + self.draw_app.app.inform.emit(_("Click on Point2 ...")) + else: + self.draw_app.app.inform.emit(_("Click on Center point to complete ...")) + return "Click on 2nd point to complete ..." + + if len(self.points) == 3: + self.make() + return "Done." + + return "" + + def on_key(self, key): + if key == 'D' or key == QtCore.Qt.Key_D: + self.direction = 'cw' if self.direction == 'ccw' else 'ccw' + return _('Direction: %s') % self.direction.upper() + + if key == 'M' or key == QtCore.Qt.Key_M: + if self.mode == 'c12': + self.mode = '12c' + return _('Mode: Start -> Stop -> Center. Click on Start point ...') + elif self.mode == '12c': + self.mode = '132' + return _('Mode: Point1 -> Point3 -> Point2. Click on 1st point ...') + else: + self.mode = 'c12' + return _('Mode: Center -> Start -> Stop. Click on Center ...') + + def utility_geometry(self, data=None): + if len(self.points) == 1: # Show the radius + center = self.points[0] + p1 = data + + return DrawToolUtilityShape(LineString([center, p1])) + + if len(self.points) == 2: # Show the arc + + if self.mode == 'c12': + center = self.points[0] + p1 = self.points[1] + p2 = data + + radius = sqrt((center[0] - p1[0]) ** 2 + (center[1] - p1[1]) ** 2) + (self.buf_val / 2) + startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) + stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) + + return DrawToolUtilityShape([LineString(arc(center, radius, startangle, stopangle, + self.direction, self.steps_per_circ)), + Point(center)]) + + elif self.mode == '132': + p1 = array(self.points[0]) + p3 = array(self.points[1]) + p2 = array(data) + + center, radius, t = three_point_circle(p1, p2, p3) + direction = 'cw' if sign(t) > 0 else 'ccw' + radius += (self.buf_val / 2) + + startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) + stopangle = arctan2(p3[1] - center[1], p3[0] - center[0]) + + return DrawToolUtilityShape([LineString(arc(center, radius, startangle, stopangle, + direction, self.steps_per_circ)), + Point(center), Point(p1), Point(p3)]) + + else: # '12c' + p1 = array(self.points[0]) + p2 = array(self.points[1]) + + # Midpoint + a = (p1 + p2) / 2.0 + + # Parallel vector + c = p2 - p1 + + # Perpendicular vector + b = dot(c, array([[0, -1], [1, 0]], dtype=float32)) + b /= norm(b) + + # Distance + t = distance(data, a) + + # Which side? Cross product with c. + # cross(M-A, B-A), where line is AB and M is test point. + side = (data[0] - p1[0]) * c[1] - (data[1] - p1[1]) * c[0] + t *= sign(side) + + # Center = a + bt + center = a + b * t + + radius = norm(center - p1) + (self.buf_val / 2) + startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) + stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) + + return DrawToolUtilityShape([LineString(arc(center, radius, startangle, stopangle, + self.direction, self.steps_per_circ)), + Point(center)]) + + return None + + def make(self): + self.draw_app.current_storage = self.storage_obj + + if self.mode == 'c12': + center = self.points[0] + p1 = self.points[1] + p2 = self.points[2] + + radius = distance(center, p1) + (self.buf_val / 2) + startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) + stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) + self.geometry = DrawToolShape(Polygon(arc(center, radius, startangle, stopangle, + self.direction, self.steps_per_circ))) + + elif self.mode == '132': + p1 = array(self.points[0]) + p3 = array(self.points[1]) + p2 = array(self.points[2]) + + center, radius, t = three_point_circle(p1, p2, p3) + direction = 'cw' if sign(t) > 0 else 'ccw' + radius += (self.buf_val / 2) + + startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) + stopangle = arctan2(p3[1] - center[1], p3[0] - center[0]) + + self.geometry = DrawToolShape(Polygon(arc(center, radius, startangle, stopangle, + direction, self.steps_per_circ))) + + else: # self.mode == '12c' + p1 = array(self.points[0]) + p2 = array(self.points[1]) + pc = array(self.points[2]) + + # Midpoint + a = (p1 + p2) / 2.0 + + # Parallel vector + c = p2 - p1 + + # Perpendicular vector + b = dot(c, array([[0, -1], [1, 0]], dtype=float32)) + b /= norm(b) + + # Distance + t = distance(pc, a) + + # Which side? Cross product with c. + # cross(M-A, B-A), where line is AB and M is test point. + side = (pc[0] - p1[0]) * c[1] - (pc[1] - p1[1]) * c[0] + t *= sign(side) + + # Center = a + bt + center = a + b * t + + radius = norm(center - p1) + (self.buf_val / 2) + startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) + stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) + + self.geometry = DrawToolShape(Polygon(arc(center, radius, startangle, stopangle, + self.direction, self.steps_per_circ))) + self.draw_app.in_action = False + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done.")) + + def clean_up(self): + self.draw_app.selected = [] + self.draw_app.apertures_table.clearSelection() + self.draw_app.plot_all() + + class FCScale(FCShapeTool): def __init__(self, draw_app): FCShapeTool.__init__(self, draw_app) @@ -1763,6 +2043,10 @@ class FlatCAMGrbEditor(QtCore.QObject): "constructor": FCRegion}, "poligonize": {"button": self.app.ui.grb_convert_poly_btn, "constructor": FCPoligonize}, + "semidisc": {"button": self.app.ui.grb_add_semidisc_btn, + "constructor": FCSemiDisc}, + "disc": {"button": self.app.ui.grb_add_disc_btn, + "constructor": FCDisc}, "buffer": {"button": self.app.ui.aperture_buffer_btn, "constructor": FCBuffer}, "scale": {"button": self.app.ui.aperture_scale_btn, @@ -1908,6 +2192,8 @@ class FlatCAMGrbEditor(QtCore.QObject): self.app.ui.grb_add_region_menuitem.triggered.connect(self.on_region_add) self.app.ui.grb_convert_poly_menuitem.triggered.connect(self.on_poligonize) + self.app.ui.grb_add_semidisc_menuitem.triggered.connect(self.on_add_semidisc) + 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_transform_menuitem.triggered.connect(self.transform_tool.run) @@ -3350,6 +3636,12 @@ class FlatCAMGrbEditor(QtCore.QObject): def on_poligonize(self): self.select_tool('poligonize') + def on_disc_add(self): + self.select_tool('disc') + + def on_add_semidisc(self): + self.select_tool('semidisc') + def on_buffer(self): buff_value = 0.01 log.debug("FlatCAMGrbEditor.on_buffer()") diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index a0643961..19241777 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -472,6 +472,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.grb_convert_poly_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/poligonize32.png'), _("Poligonize\tALT+N")) + self.grb_add_semidisc_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/semidisc32.png'), + _("Add SemiDisc\tE")) + self.grb_add_disc_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/disc32.png'), + _("Add Disc\tD")) self.grb_add_buffer_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer\tB')) self.grb_add_scale_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/scale32.png'), @@ -695,6 +699,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.grb_convert_poly_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/poligonize32.png'), _("Poligonize")) + + self.grb_add_semidisc_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/semidisc32.png'), _("SemiDisc")) + self.grb_add_disc_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/disc32.png'), _("Disc")) self.grb_edit_toolbar.addSeparator() self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer')) @@ -1448,6 +1455,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow): C  Copy + + D +  Add Disc + + + E +  Add SemiDisc + J  Jump to Location (x, y) @@ -2673,6 +2688,18 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to copy.")) return + # Add Disc Tool + if key == QtCore.Qt.Key_D or key == 'D': + self.app.grb_editor.launched_from_shortcuts = True + self.app.grb_editor.select_tool('disc') + return + + # Add SemiDisc Tool + if key == QtCore.Qt.Key_E or key == 'E': + self.app.grb_editor.launched_from_shortcuts = True + self.app.grb_editor.select_tool('semidisc') + return + # Grid Snap if key == QtCore.Qt.Key_G or key == 'G': self.app.grb_editor.launched_from_shortcuts = True diff --git a/share/disc32.png b/share/disc32.png new file mode 100644 index 0000000000000000000000000000000000000000..da1593d547e86df25ef760bd79a9a785e29f2b7a GIT binary patch literal 435 zcmV;k0ZjghP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Z2(iK~z{r?bk_8 z!!Q`d@tlEi4XlAB&)}AiAqR$PVM-Mvgwn4Ql;8os>ZRu zG>i1i3U+XUV{Bs?gJugCnBphl5gMbhVOhf+zTqzFeBl=Qr>Zi+8{9>5yx;)6a*9v5 z!X;EgwThx&t-sL~>_fHokd<}3!xgIWidD>w7Mv>(;ToOM<5RNQOR4rIlDUMN80j3z zbZs(G9$=%b)J+(|5?a}X8$1M^Bdr|54IYB7)yn8UVDwus`XW?xp1TQ=?vad|2{$Ry z8IsX9IpkKXQ*i^Gxq+J;;RPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Z2(iK~z{r?bb0U z24Nh>@#D>+6fsyODT7iL29rfLc4W1f$n@4*7G~KnDJ5Z27_Cw=nY{yIqEPt$UPL`p>6;HKU9-d|?Q|YQ-TmEO!W22}f|_ za*SYA5FeKf1Ze>7ZyvXXAnhSJE<5mEH>}@YPT{>dSmSaJ9Zs)p!5VkQ;I(sD!_FqW zb_HwLc}Fk2bpdNQP7kOicxfNjXwnM2vCNW_$&1$N1i8=36h2^G zFpo=gqNc|21na_CoS_~6ss{(K2GTrZ3A(EaYXsYPfHf*NSVkATrNcCcNz7vgdJgDi drcu2WMc>e)?T%^c-W&h`002ovPDHLkV1o6axkUf~ literal 0 HcmV?d00001 From 49120c088ee9393a5f4a6a013194b2487990149a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 23 Apr 2019 13:13:10 +0300 Subject: [PATCH 38/42] - Gerber Editor: made Add Pad repeat until user exits the Add Pad through either mouse right click, or ESC key or deselecting the Add Pad menu item - Gerber and Geometry Editors: fixed some issues with the Add Arc/Add Semidisc; in mode 132, the norm() function was not the one from numpy but from a FlatCAM Class. Also fixed some of the texts and made sure that when changing the mode, the current points are reset to prepare for the newly selected mode. --- FlatCAMApp.py | 2 +- README.md | 2 ++ camlib.py | 6 +++- flatcamEditors/FlatCAMGeoEditor.py | 37 ++++++++++++++-------- flatcamEditors/FlatCAMGrbEditor.py | 50 ++++++++++++++++++++---------- 5 files changed, 65 insertions(+), 32 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index c05d27c7..4c195ccb 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -4508,7 +4508,7 @@ class App(QtCore.QObject): jump_loc = self.plotcanvas.vispy_canvas.translate_coords_2((location[0], location[1])) cursor.setPos(canvas_origin.x() + jump_loc[0], (canvas_origin.y() + jump_loc[1])) - self.inform.emit(_("Done.")) + self.inform.emit(_("[success] Done.")) def on_copy_object(self): self.report_usage("on_copy_object()") diff --git a/README.md b/README.md index c4227757..d2f06309 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ CAD program, and create G-Code for Isolation routing. 23.04.2019 - Gerber Editor: added two new tools: Add Disc and Add SemiDisc (porting of Circle and Arc from Geometry Editor) +- Gerber Editor: made Add Pad repeat until user exits the Add Pad through either mouse right click, or ESC key or deselecting the Add Pad menu item +- Gerber and Geometry Editors: fixed some issues with the Add Arc/Add Semidisc; in mode 132, the norm() function was not the one from numpy but from a FlatCAM Class. Also fixed some of the texts and made sure that when changing the mode, the current points are reset to prepare for the newly selected mode. 22.04.2019 diff --git a/camlib.py b/camlib.py index 178a66fe..7340501b 100644 --- a/camlib.py +++ b/camlib.py @@ -7701,7 +7701,11 @@ def three_point_circle(p1, p2, p3): b2 = dot((p3 - p2), array([[0, 1], [-1, 0]], dtype=float32)) # Params - T = solve(transpose(array([-b1, b2])), a1 - a2) + try: + T = solve(transpose(array([-b1, b2])), a1 - a2) + except Exception as e: + log.debug("camlib.three_point_circle() --> %s" % str(e)) + return # Center center = a1 + b1 * T[0] diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index 4af68b11..f5973f5e 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -22,7 +22,7 @@ from shapely.ops import cascaded_union import shapely.affinity as affinity from numpy import arctan2, Inf, array, sqrt, sign, dot -from numpy.linalg import norm +from numpy.linalg import norm as numpy_norm from rtree import index as rtindex from flatcamGUI.GUIElements import OptionalInputSection, FCCheckBox, FCEntry, FCComboBox, FCTextAreaRich, \ @@ -1939,14 +1939,15 @@ class FCCircle(FCShapeTool): self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) - self.start_msg = _("Click on CENTER ...") + self.start_msg = _("Click on Center point ...") + self.draw_app.app.inform.emit(_("Click on Center point ...")) self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] def click(self, point): self.points.append(point) if len(self.points) == 1: - self.draw_app.app.inform.emit(_("Click on Circle perimeter point to complete ...")) + self.draw_app.app.inform.emit(_("Click on Perimeter point to complete ...")) return "Click on perimeter to complete ..." if len(self.points) == 2: @@ -1983,7 +1984,8 @@ class FCArc(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'arc' - self.start_msg = _("Click on CENTER ...") + self.start_msg = _("Click on Center point ...") + self.draw_app.app.inform.emit(_("Click on Center point ...")) # Direction of rotation between point 1 and 2. # 'cw' or 'ccw'. Switch direction by hitting the @@ -2007,14 +2009,14 @@ class FCArc(FCShapeTool): elif self.mode == '132': self.draw_app.app.inform.emit(_("Click on Point3 ...")) else: - self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) + self.draw_app.app.inform.emit(_("Click on Stop point ...")) return "Click on 1st point ..." if len(self.points) == 2: if self.mode == 'c12': self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) elif self.mode == '132': - self.draw_app.app.inform.emit(_("Click on Point2 ...")) + self.draw_app.app.inform.emit(_("Click on Point2 to complete ...")) else: self.draw_app.app.inform.emit(_("Click on Center point to complete ...")) return "Click on 2nd point to complete ..." @@ -2031,15 +2033,20 @@ class FCArc(FCShapeTool): return _('Direction: %s') % self.direction.upper() if key == 'M' or key == QtCore.Qt.Key_M: + # delete the possible points made before this action; we want to start anew + self.points[:] = [] + # and delete the utility geometry made up until this point + self.draw_app.delete_utility_geometry() + if self.mode == 'c12': self.mode = '12c' return _('Mode: Start -> Stop -> Center. Click on Start point ...') elif self.mode == '12c': self.mode = '132' - return _('Mode: Point1 -> Point3 -> Point2. Click on 1st point ...') + return _('Mode: Point1 -> Point3 -> Point2. Click on Point1 ...') else: self.mode = 'c12' - return _('Mode: Center -> Start -> Stop. Click on Center ...') + return _('Mode: Center -> Start -> Stop. Click on Center point ...') def utility_geometry(self, data=None): if len(self.points) == 1: # Show the radius @@ -2068,7 +2075,11 @@ class FCArc(FCShapeTool): p3 = array(self.points[1]) p2 = array(data) - center, radius, t = three_point_circle(p1, p2, p3) + try: + center, radius, t = three_point_circle(p1, p2, p3) + except TypeError: + return + direction = 'cw' if sign(t) > 0 else 'ccw' startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) @@ -2090,7 +2101,7 @@ class FCArc(FCShapeTool): # Perpendicular vector b = dot(c, array([[0, -1], [1, 0]], dtype=float32)) - b /= norm(b) + b /= numpy_norm(b) # Distance t = distance(data, a) @@ -2103,7 +2114,7 @@ class FCArc(FCShapeTool): # Center = a + bt center = a + b * t - radius = norm(center - p1) + radius = numpy_norm(center - p1) startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) @@ -2153,7 +2164,7 @@ class FCArc(FCShapeTool): # Perpendicular vector b = dot(c, array([[0, -1], [1, 0]], dtype=float32)) - b /= norm(b) + b /= numpy_norm(b) # Distance t = distance(pc, a) @@ -2166,7 +2177,7 @@ class FCArc(FCShapeTool): # Center = a + bt center = a + b * t - radius = norm(center - p1) + radius = numpy_norm(center - p1) startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index ed2c5612..6fe396f7 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -17,6 +17,8 @@ from flatcamEditors.FlatCAMGeoEditor import FCShapeTool, DrawTool, DrawToolShape from FlatCAMObj import FlatCAMGerber from FlatCAMTool import FlatCAMTool +from numpy.linalg import norm as numpy_norm + import gettext import FlatCAMTranslation as fcTranslate @@ -860,9 +862,7 @@ class FCTrack(FCRegion): """ def __init__(self, draw_app): FCRegion.__init__(self, draw_app) - self.name = 'track' - self.draw_app = draw_app try: @@ -1078,15 +1078,17 @@ class FCDisc(FCShapeTool): self.storage_obj = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] - self.start_msg = _("Click on CENTER ...") + self.start_msg = _("Click on Center point ...") + self.draw_app.app.inform.emit(_("Click on Center point ...")) + self.steps_per_circ = self.draw_app.app.defaults["gerber_circle_steps"] def click(self, point): self.points.append(point) if len(self.points) == 1: - self.draw_app.app.inform.emit(_("Click on perimeter point to complete ...")) - return "Click on perimeter to complete ..." + self.draw_app.app.inform.emit(_("Click on Perimeter point to complete ...")) + return "Click on Perimeter to complete ..." if len(self.points) == 2: self.make() @@ -1130,7 +1132,8 @@ class FCSemiDisc(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'semidisc' - self.start_msg = _("Click on CENTER ...") + self.start_msg = _("Click on Center point ...") + self.draw_app.app.inform.emit(_("Click on Center point ...")) # Direction of rotation between point 1 and 2. # 'cw' or 'ccw'. Switch direction by hitting the @@ -1159,14 +1162,14 @@ class FCSemiDisc(FCShapeTool): elif self.mode == '132': self.draw_app.app.inform.emit(_("Click on Point3 ...")) else: - self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) + self.draw_app.app.inform.emit(_("Click on Stop point ...")) return "Click on 1st point ..." if len(self.points) == 2: if self.mode == 'c12': self.draw_app.app.inform.emit(_("Click on Stop point to complete ...")) elif self.mode == '132': - self.draw_app.app.inform.emit(_("Click on Point2 ...")) + self.draw_app.app.inform.emit(_("Click on Point2 to complete ...")) else: self.draw_app.app.inform.emit(_("Click on Center point to complete ...")) return "Click on 2nd point to complete ..." @@ -1183,15 +1186,20 @@ class FCSemiDisc(FCShapeTool): return _('Direction: %s') % self.direction.upper() if key == 'M' or key == QtCore.Qt.Key_M: + # delete the possible points made before this action; we want to start anew + self.points = [] + # and delete the utility geometry made up until this point + self.draw_app.delete_utility_geometry() + if self.mode == 'c12': self.mode = '12c' return _('Mode: Start -> Stop -> Center. Click on Start point ...') elif self.mode == '12c': self.mode = '132' - return _('Mode: Point1 -> Point3 -> Point2. Click on 1st point ...') + return _('Mode: Point1 -> Point3 -> Point2. Click on Point1 ...') else: self.mode = 'c12' - return _('Mode: Center -> Start -> Stop. Click on Center ...') + return _('Mode: Center -> Start -> Stop. Click on Center point ...') def utility_geometry(self, data=None): if len(self.points) == 1: # Show the radius @@ -1220,7 +1228,11 @@ class FCSemiDisc(FCShapeTool): p3 = array(self.points[1]) p2 = array(data) - center, radius, t = three_point_circle(p1, p2, p3) + try: + center, radius, t = three_point_circle(p1, p2, p3) + except TypeError: + return + direction = 'cw' if sign(t) > 0 else 'ccw' radius += (self.buf_val / 2) @@ -1234,7 +1246,6 @@ class FCSemiDisc(FCShapeTool): else: # '12c' p1 = array(self.points[0]) p2 = array(self.points[1]) - # Midpoint a = (p1 + p2) / 2.0 @@ -1243,7 +1254,7 @@ class FCSemiDisc(FCShapeTool): # Perpendicular vector b = dot(c, array([[0, -1], [1, 0]], dtype=float32)) - b /= norm(b) + b /= numpy_norm(b) # Distance t = distance(data, a) @@ -1256,7 +1267,7 @@ class FCSemiDisc(FCShapeTool): # Center = a + bt center = a + b * t - radius = norm(center - p1) + (self.buf_val / 2) + radius = numpy_norm(center - p1) + (self.buf_val / 2) startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) @@ -1308,7 +1319,7 @@ class FCSemiDisc(FCShapeTool): # Perpendicular vector b = dot(c, array([[0, -1], [1, 0]], dtype=float32)) - b /= norm(b) + b /= numpy_norm(b) # Distance t = distance(pc, a) @@ -1321,7 +1332,7 @@ class FCSemiDisc(FCShapeTool): # Center = a + bt center = a + b * t - radius = norm(center - p1) + (self.buf_val / 2) + radius = numpy_norm(center - p1) + (self.buf_val / 2) startangle = arctan2(p1[1] - center[1], p1[0] - center[0]) stopangle = arctan2(p2[1] - center[1], p2[0] - center[0]) @@ -3181,7 +3192,11 @@ class FlatCAMGrbEditor(QtCore.QObject): if key_modifier == modifier_to_use: self.select_tool(self.active_tool.name) else: - self.select_tool("select") + # return to Select tool but not for FCPad + if isinstance(self.active_tool, FCPad): + self.select_tool(self.active_tool.name) + else: + self.select_tool("select") return if isinstance(self.active_tool, FCApertureSelect): @@ -3234,6 +3249,7 @@ class FlatCAMGrbEditor(QtCore.QObject): # MS: always return to the Select Tool if modifier key is not pressed # else return to the current tool but not for FCTrack + if isinstance(self.active_tool, FCTrack): self.select_tool(self.active_tool.name) else: From 5f5b37eb9891a0b4cc7cc393f81eab80781a9d2b Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 23 Apr 2019 16:10:34 +0300 Subject: [PATCH 39/42] - Fixed Measurement Tool to show the mouse coordinates on the status bar (it was broken at some point) --- README.md | 1 + flatcamTools/ToolMeasurement.py | 57 ++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d2f06309..6295f79e 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: added two new tools: Add Disc and Add SemiDisc (porting of Circle and Arc from Geometry Editor) - Gerber Editor: made Add Pad repeat until user exits the Add Pad through either mouse right click, or ESC key or deselecting the Add Pad menu item - Gerber and Geometry Editors: fixed some issues with the Add Arc/Add Semidisc; in mode 132, the norm() function was not the one from numpy but from a FlatCAM Class. Also fixed some of the texts and made sure that when changing the mode, the current points are reset to prepare for the newly selected mode. +- Fixed Measurement Tool to show the mouse coordinates on the status bar (it was broken at some point) 22.04.2019 diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py index e8a4f96f..e2b759f8 100644 --- a/flatcamTools/ToolMeasurement.py +++ b/flatcamTools/ToolMeasurement.py @@ -106,6 +106,9 @@ class Measurement(FlatCAMTool): # store here the first click and second click of the measurement process self.points = [] + self.rel_point1 = None + self.rel_point2 = None + self.active = False self.original_call_source = 'app' @@ -120,6 +123,9 @@ class Measurement(FlatCAMTool): self.points[:] = [] + self.rel_point1 = None + self.rel_point2 = None + if self.app.tool_tab_locked is True: return @@ -244,12 +250,21 @@ class Measurement(FlatCAMTool): if event.button == 1: pos_canvas = self.canvas.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(): pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) else: pos = pos_canvas[0], pos_canvas[1] self.points.append(pos) + # Reset here the relative coordinates so there is a new reference on the click position + if self.rel_point1 is None: + self.app.ui.rel_position_label.setText("Dx: %.4f   Dy: " + "%.4f    " % (0.0, 0.0)) + self.rel_point1 = pos + else: + self.rel_point2 = copy(self.rel_point1) + self.rel_point1 = pos + if len(self.points) == 1: self.start_entry.set_value("(%.4f, %.4f)" % pos) self.app.inform.emit(_("MEASURING: Click on the Destination point ...")) @@ -258,7 +273,6 @@ class Measurement(FlatCAMTool): dx = self.points[1][0] - self.points[0][0] dy = self.points[1][1] - self.points[0][1] d = sqrt(dx ** 2 + dy ** 2) - self.stop_entry.set_value("(%.4f, %.4f)" % pos) self.app.inform.emit(_("MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}").format( @@ -267,19 +281,40 @@ class Measurement(FlatCAMTool): self.distance_x_entry.set_value('%.4f' % abs(dx)) self.distance_y_entry.set_value('%.4f' % abs(dy)) self.total_distance_entry.set_value('%.4f' % abs(d)) - + self.app.ui.rel_position_label.setText("Dx: %.4f   Dy: " + "%.4f    " % (pos[0], pos[1])) self.deactivate_measure_tool() def on_mouse_move_meas(self, event): - pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) - # Update cursor - pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) - if self.app.grid_status() == True: - self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]), symbol='++', edge_color='black', size=20) + try: # May fail in case mouse not within axes + pos_canvas = self.app.plotcanvas.vispy_canvas.translate_coords(event.pos) + if self.app.grid_status(): + pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1]) + self.app.app_cursor.enabled = True + # Update cursor + self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]), + symbol='++', edge_color='black', size=20) + else: + pos = (pos_canvas[0], pos_canvas[1]) + self.app.app_cursor.enabled = False - # update utility geometry - if len(self.points) == 1: - self.utility_geometry(pos=pos) + if self.rel_point1 is not None: + dx = pos[0] - self.rel_point1[0] + dy = pos[1] - self.rel_point1[1] + else: + dx = pos[0] + dy = pos[1] + + self.app.ui.position_label.setText("    X: %.4f   " + "Y: %.4f" % (pos[0], pos[1])) + self.app.ui.rel_position_label.setText("Dx: %.4f   Dy: " + "%.4f    " % (dx, dy)) + # update utility geometry + if len(self.points) == 1: + self.utility_geometry(pos=pos) + except: + self.app.ui.position_label.setText("") + self.app.ui.rel_position_label.setText("") def utility_geometry(self, pos): # first delete old shape From 54d6a32b6ce5cacc2a829e606bdce065c99ad083 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 23 Apr 2019 17:51:09 +0300 Subject: [PATCH 40/42] - updated the translation files --- README.md | 1 + flatcamGUI/FlatCAMGUI.py | 6 +- locale/de/LC_MESSAGES/strings.mo | Bin 279570 -> 290744 bytes locale/de/LC_MESSAGES/strings.po | 3451 ++++++++++++++----------- locale/en/LC_MESSAGES/strings.mo | Bin 260939 -> 271106 bytes locale/en/LC_MESSAGES/strings.po | 4039 +++++++++++++++++++----------- locale/ro/LC_MESSAGES/strings.mo | Bin 278654 -> 289012 bytes locale/ro/LC_MESSAGES/strings.po | 3742 ++++++++++++++------------- locale_template/strings.pot | 3312 +++++++++++++----------- 9 files changed, 8284 insertions(+), 6267 deletions(-) diff --git a/README.md b/README.md index 6295f79e..c63dfebb 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: made Add Pad repeat until user exits the Add Pad through either mouse right click, or ESC key or deselecting the Add Pad menu item - Gerber and Geometry Editors: fixed some issues with the Add Arc/Add Semidisc; in mode 132, the norm() function was not the one from numpy but from a FlatCAM Class. Also fixed some of the texts and made sure that when changing the mode, the current points are reset to prepare for the newly selected mode. - Fixed Measurement Tool to show the mouse coordinates on the status bar (it was broken at some point) +- updated the translation files 22.04.2019 diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 19241777..eff33c93 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -977,6 +977,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):     + + B +  New Gerber + E  Edit Object (if selected) @@ -1492,7 +1496,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):  Add Track - R + T  Within Track & Region Tools will cycle FORWARD the bend modes diff --git a/locale/de/LC_MESSAGES/strings.mo b/locale/de/LC_MESSAGES/strings.mo index 47c7f41f39e5cf020631f470d4030268e8fc54d0..db843e0ee1cd8c122cca533723221ba61ee5f130 100644 GIT binary patch delta 45486 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 G75X1)656-` delta 37893 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 E0Dd*JQ~&?~ diff --git a/locale/de/LC_MESSAGES/strings.po b/locale/de/LC_MESSAGES/strings.po index 3434df97..af137464 100644 --- a/locale/de/LC_MESSAGES/strings.po +++ b/locale/de/LC_MESSAGES/strings.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"POT-Creation-Date: 2019-04-13 01:11+0300\n" -"PO-Revision-Date: 2019-04-13 16:52+0300\n" +"POT-Creation-Date: 2019-04-23 17:13+0300\n" +"PO-Revision-Date: 2019-04-23 17:43+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -23,126 +23,127 @@ msgstr "" "[ERROR] Die Sprachdateien konnten nicht gefunden werden. Die App-" "Zeichenfolgen fehlen." -#: FlatCAMApp.py:1888 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +#: FlatCAMApp.py:1889 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +#: flatcamTools/ToolPcbWizard.py:299 flatcamTools/ToolPcbWizard.py:322 msgid "Open cancelled." msgstr "Geöffnet storniert." -#: FlatCAMApp.py:1902 +#: FlatCAMApp.py:1903 msgid "Open Config file failed." msgstr "Open Config-Datei ist fehlgeschlagen." -#: FlatCAMApp.py:1916 +#: FlatCAMApp.py:1917 msgid "Open Script file failed." msgstr "Open Script-Datei ist fehlgeschlagen." -#: FlatCAMApp.py:2098 -msgid "[WARNING_NOTCL] Select a Geometry or Excellon Object to edit." +#: FlatCAMApp.py:2102 +msgid "[WARNING_NOTCL] Select a Geometry, Gerber or Excellon Object to edit." msgstr "" -"[WARNING_NOTCL] Wählen Sie ein Geometrie- oder Excellon-Objekt zum " -"Bearbeiten aus." +"[WARNING_NOTCL] Wählen Sie ein zu bearbeitendes Geometrie-, Gerber- oder " +"Excellon-Objekt aus." -#: FlatCAMApp.py:2108 +#: FlatCAMApp.py:2112 msgid "" "[WARNING_NOTCL] Simultanoeus editing of tools geometry in a MultiGeo " "Geometry is not possible.\n" -" Edit only one geometry at a time." +"Edit only one geometry at a time." msgstr "" "[WARNING_NOTCL] Die gleichzeitige Bearbeitung der Werkzeuggeometrie in einer " -"Multi-Geo-Geometrie ist nicht möglich. Bearbeiten Sie jeweils nur eine " -"Geometrie." +"Multi-Geo-Geometrie ist nicht möglich.\n" +"Bearbeiten Sie jeweils nur eine Geometrie." -#: FlatCAMApp.py:2144 +#: FlatCAMApp.py:2149 msgid "[WARNING_NOTCL] Editor is activated ..." msgstr "[WARNING_NOTCL] Editor ist aktiviert ..." -#: FlatCAMApp.py:2171 +#: FlatCAMApp.py:2168 msgid "Do you want to save the edited object?" msgstr "Möchten Sie das bearbeitete Objekt speichern?" -#: FlatCAMApp.py:2172 flatcamGUI/FlatCAMGUI.py:1549 +#: FlatCAMApp.py:2169 flatcamGUI/FlatCAMGUI.py:1593 msgid "Close Editor" msgstr "Editor schließen" -#: FlatCAMApp.py:2175 FlatCAMApp.py:3255 FlatCAMApp.py:5564 -#: FlatCAMTranslation.py:89 flatcamGUI/FlatCAMGUI.py:3542 +#: FlatCAMApp.py:2172 FlatCAMApp.py:3254 FlatCAMApp.py:5559 +#: FlatCAMTranslation.py:89 flatcamGUI/FlatCAMGUI.py:3631 msgid "Yes" msgstr "Ja" -#: FlatCAMApp.py:2176 FlatCAMApp.py:3256 FlatCAMApp.py:5565 -#: FlatCAMTranslation.py:90 flatcamGUI/FlatCAMGUI.py:3543 +#: FlatCAMApp.py:2173 FlatCAMApp.py:3255 FlatCAMApp.py:5560 +#: FlatCAMTranslation.py:90 flatcamGUI/FlatCAMGUI.py:3632 msgid "No" msgstr "Nein" -#: FlatCAMApp.py:2177 FlatCAMApp.py:3257 FlatCAMApp.py:3589 FlatCAMApp.py:5566 +#: FlatCAMApp.py:2174 FlatCAMApp.py:3256 FlatCAMApp.py:3588 FlatCAMApp.py:5561 msgid "Cancel" msgstr "Kündigen" -#: FlatCAMApp.py:2199 FlatCAMApp.py:2224 +#: FlatCAMApp.py:2196 FlatCAMApp.py:2221 msgid "[WARNING] Object empty after edit." msgstr "[WARNING] Das Objekt ist nach der Bearbeitung leer." -#: FlatCAMApp.py:2233 FlatCAMApp.py:2245 FlatCAMApp.py:2257 +#: FlatCAMApp.py:2230 FlatCAMApp.py:2244 FlatCAMApp.py:2256 msgid "[WARNING_NOTCL] Select a Gerber, Geometry or Excellon Object to update." msgstr "" "[WARNING_NOTCL] Wählen Sie ein Gerber-, Geometrie- oder Excellon-Objekt zum " "Aktualisieren aus." -#: FlatCAMApp.py:2236 +#: FlatCAMApp.py:2233 #, python-format msgid "[selected] %s is updated, returning to App..." msgstr "[selected] %s wird aktualisiert und kehrt zur App zurück ..." -#: FlatCAMApp.py:2593 +#: FlatCAMApp.py:2592 msgid "[ERROR] Could not load defaults file." msgstr "[ERROR] Standarddatei konnte nicht geladen werden." -#: FlatCAMApp.py:2605 +#: FlatCAMApp.py:2604 msgid "[ERROR] Failed to parse defaults file." msgstr "[ERROR] Fehler beim Parsen der Standarddatei." -#: FlatCAMApp.py:2626 FlatCAMApp.py:2629 +#: FlatCAMApp.py:2625 FlatCAMApp.py:2628 msgid "Import FlatCAM Preferences" msgstr "FlatCAM-Voreinstellungen importieren" -#: FlatCAMApp.py:2634 +#: FlatCAMApp.py:2633 msgid "[WARNING_NOTCL] FlatCAM preferences import cancelled." msgstr "[WARNING_NOTCL] Import der FlatCAM-Einstellungen wurde abgebrochen." -#: FlatCAMApp.py:2642 FlatCAMApp.py:2689 FlatCAMApp.py:3134 +#: FlatCAMApp.py:2641 FlatCAMApp.py:2688 FlatCAMApp.py:3133 msgid "[ERROR_NOTCL] Could not load defaults file." msgstr "[ERROR_NOTCL] Standarddatei konnte nicht geladen werden." -#: FlatCAMApp.py:2650 FlatCAMApp.py:3143 +#: FlatCAMApp.py:2649 FlatCAMApp.py:3142 msgid "[ERROR_NOTCL] Failed to parse defaults file." msgstr "[ERROR_NOTCL] Fehler beim Parsen der Standarddatei." -#: FlatCAMApp.py:2653 +#: FlatCAMApp.py:2652 #, python-format msgid "[success] Imported Defaults from %s" msgstr "[success] Importierte Standardwerte aus %s" -#: FlatCAMApp.py:2663 FlatCAMApp.py:2667 +#: FlatCAMApp.py:2662 FlatCAMApp.py:2666 msgid "Export FlatCAM Preferences" msgstr "FlatCAM-Voreinstellungen exportieren" -#: FlatCAMApp.py:2673 +#: FlatCAMApp.py:2672 msgid "[WARNING_NOTCL] FlatCAM preferences export cancelled." msgstr "[WARNING_NOTCL] Export der FlatCAM-Einstellungen wurde abgebrochen." -#: FlatCAMApp.py:2708 FlatCAMApp.py:3188 +#: FlatCAMApp.py:2707 FlatCAMApp.py:3187 msgid "[ERROR_NOTCL] Failed to write defaults to file." msgstr "[ERROR_NOTCL] Fehler beim Schreiben der Standardwerte in die Datei." -#: FlatCAMApp.py:2760 +#: FlatCAMApp.py:2759 msgid "[ERROR_NOTCL] Failed to open recent files file for writing." msgstr "" "[ERROR_NOTCL] Fehler beim Öffnen der zuletzt geöffneten Datei zum Schreiben." -#: FlatCAMApp.py:2845 camlib.py:4430 +#: FlatCAMApp.py:2844 camlib.py:4493 msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" msgstr "[ERROR_NOTCL] Ein interner Fehler ist aufgetreten. Siehe Shell.\n" -#: FlatCAMApp.py:2846 +#: FlatCAMApp.py:2845 #, python-brace-format msgid "" "Object ({kind}) failed because: {error} \n" @@ -151,11 +152,11 @@ msgstr "" "Objekt ({kind}) gescheitert weil: {error} \n" "\n" -#: FlatCAMApp.py:2866 +#: FlatCAMApp.py:2865 msgid "Converting units to " msgstr "Einheiten in umrechnen " -#: FlatCAMApp.py:2936 FlatCAMApp.py:2939 FlatCAMApp.py:2942 FlatCAMApp.py:2945 +#: FlatCAMApp.py:2935 FlatCAMApp.py:2938 FlatCAMApp.py:2941 FlatCAMApp.py:2944 #, python-brace-format msgid "" "[selected] {kind} created/selected: {name}{name}" "" -#: FlatCAMApp.py:3039 +#: FlatCAMApp.py:3038 #, python-brace-format msgid "" "FlatCAM
Version {version} {beta} ({date}) - " @@ -187,32 +188,32 @@ msgstr "" "org/jpcgt/flatcam/src/Beta/\">hier.
DOWNLOAD-Bereich hier.
" -#: FlatCAMApp.py:3192 +#: FlatCAMApp.py:3191 msgid "[success] Defaults saved." msgstr "[success] Standardeinstellungen gespeichert." -#: FlatCAMApp.py:3213 +#: FlatCAMApp.py:3212 msgid "[ERROR_NOTCL] Could not load factory defaults file." msgstr "[ERROR_NOTCL] Factory-Standarddatei konnte nicht geladen werden." -#: FlatCAMApp.py:3222 +#: FlatCAMApp.py:3221 msgid "[ERROR_NOTCL] Failed to parse factory defaults file." msgstr "[ERROR_NOTCL] Fehler beim Parsen der Werksvorgaben-Datei." -#: FlatCAMApp.py:3236 +#: FlatCAMApp.py:3235 msgid "[ERROR_NOTCL] Failed to write factory defaults to file." msgstr "" "[ERROR_NOTCL] Fehler beim Schreiben der Werkseinstellungen in die Datei." -#: FlatCAMApp.py:3240 +#: FlatCAMApp.py:3239 msgid "Factory defaults saved." msgstr "Werkseinstellungen gespeichert." -#: FlatCAMApp.py:3245 flatcamGUI/FlatCAMGUI.py:2974 +#: FlatCAMApp.py:3244 flatcamGUI/FlatCAMGUI.py:3063 msgid "[WARNING_NOTCL] Application is saving the project. Please wait ..." msgstr "[WARNING_NOTCL] Anwendung speichert das Projekt. Warten Sie mal ..." -#: FlatCAMApp.py:3250 +#: FlatCAMApp.py:3249 msgid "" "There are files/objects modified in FlatCAM. \n" "Do you want to Save the project?" @@ -220,11 +221,11 @@ msgstr "" "In FlatCAM wurden Dateien / Objekte geändert.\n" "Möchten Sie das Projekt speichern?" -#: FlatCAMApp.py:3253 FlatCAMApp.py:5562 +#: FlatCAMApp.py:3252 FlatCAMApp.py:5557 msgid "Save changes" msgstr "Änderungen speichern" -#: FlatCAMApp.py:3320 +#: FlatCAMApp.py:3319 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 " @@ -242,74 +243,74 @@ msgstr "" "und das Ergebnis entspricht möglicherweise nicht dem, was erwartet wurde.\n" "Überprüfen Sie den generierten GCODE." -#: FlatCAMApp.py:3361 +#: FlatCAMApp.py:3360 msgid "[ERROR_NOTCL] Failed. Excellon joining works only on Excellon objects." msgstr "" "[ERROR_NOTCL] Gescheitert. Die Verbindung von Excellon funktioniert nur bei " "Excellon-Objekten." -#: FlatCAMApp.py:3383 +#: FlatCAMApp.py:3382 msgid "[ERROR_NOTCL] Failed. Gerber joining works only on Gerber objects." msgstr "" "[ERROR_NOTCL] Gescheitert. Das Gerber-Verbinden funktioniert nur bei Gerber-" "Objekten." -#: FlatCAMApp.py:3398 FlatCAMApp.py:3423 +#: FlatCAMApp.py:3397 FlatCAMApp.py:3422 msgid "[ERROR_NOTCL] Failed. Select a Geometry Object and try again." msgstr "" "[ERROR_NOTCL] Gescheitert. Wählen Sie ein Geometrieobjekt aus und versuchen " "Sie es erneut." -#: FlatCAMApp.py:3402 FlatCAMApp.py:3427 +#: FlatCAMApp.py:3401 FlatCAMApp.py:3426 #, python-format msgid "[ERROR_NOTCL] Expected a FlatCAMGeometry, got %s" msgstr "[ERROR_NOTCL] Erwartete eine FlatCAMGeometry, bekam % s" -#: FlatCAMApp.py:3415 +#: FlatCAMApp.py:3414 msgid "[success] A Geometry object was converted to MultiGeo type." msgstr "[success] Ein Geometrieobjekt wurde in den MultiGeo-Typ konvertiert." -#: FlatCAMApp.py:3441 +#: FlatCAMApp.py:3440 msgid "[success] A Geometry object was converted to SingleGeo type." msgstr "[success] Ein Geometrieobjekt wurde in den SingleGeo-Typ konvertiert." -#: FlatCAMApp.py:3588 FlatCAMApp.py:4353 FlatCAMApp.py:5829 FlatCAMApp.py:5840 -#: FlatCAMApp.py:6026 FlatCAMApp.py:6036 +#: FlatCAMApp.py:3587 FlatCAMApp.py:4352 FlatCAMApp.py:5824 FlatCAMApp.py:5835 +#: FlatCAMApp.py:6021 FlatCAMApp.py:6031 msgid "Ok" msgstr "Ok" -#: FlatCAMApp.py:3629 +#: FlatCAMApp.py:3628 #, python-format msgid "[success] Converted units to %s" msgstr "[success] Einheiten in umgerechnet %s" -#: FlatCAMApp.py:3640 +#: FlatCAMApp.py:3639 msgid "[WARNING_NOTCL] Units conversion cancelled." msgstr "[WARNING_NOTCL] Einheitenumrechnung abgebrochen." -#: FlatCAMApp.py:4222 +#: FlatCAMApp.py:4221 msgid "Open file" msgstr "Datei öffnen" -#: FlatCAMApp.py:4253 FlatCAMApp.py:4258 +#: FlatCAMApp.py:4252 FlatCAMApp.py:4257 msgid "Export G-Code ..." msgstr "G-Code exportieren ..." -#: FlatCAMApp.py:4261 +#: FlatCAMApp.py:4260 msgid "[WARNING_NOTCL] Export Code cancelled." msgstr "[WARNING_NOTCL] Exportcode wurde abgebrochen." -#: FlatCAMApp.py:4271 +#: FlatCAMApp.py:4270 msgid "[WARNING] No such file or directory" msgstr "[WARNING] Keine solche Datei oder Ordner" -#: FlatCAMApp.py:4278 +#: FlatCAMApp.py:4277 #, python-format msgid "Saved to: %s" msgstr "Gespeichert in: %s" -#: FlatCAMApp.py:4341 FlatCAMApp.py:4374 FlatCAMApp.py:4385 FlatCAMApp.py:4396 -#: flatcamTools/ToolNonCopperClear.py:488 flatcamTools/ToolSolderPaste.py:764 +#: FlatCAMApp.py:4340 FlatCAMApp.py:4373 FlatCAMApp.py:4384 FlatCAMApp.py:4395 +#: flatcamTools/ToolNonCopperClear.py:489 flatcamTools/ToolSolderPaste.py:765 msgid "" "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " "format." @@ -317,12 +318,12 @@ msgstr "" "[WARNING_NOTCL] Bitte geben Sie einen Werkzeugdurchmesser mit einem Wert " "ungleich Null im Float-Format ein." -#: FlatCAMApp.py:4346 FlatCAMApp.py:4379 FlatCAMApp.py:4390 FlatCAMApp.py:4401 -#: flatcamGUI/FlatCAMGUI.py:2891 +#: FlatCAMApp.py:4345 FlatCAMApp.py:4378 FlatCAMApp.py:4389 FlatCAMApp.py:4400 +#: flatcamGUI/FlatCAMGUI.py:2959 msgid "[WARNING_NOTCL] Adding Tool cancelled ..." msgstr "[WARNING_NOTCL] Addierwerkzeug abgebrochen ..." -#: FlatCAMApp.py:4349 +#: FlatCAMApp.py:4348 msgid "" "Adding Tool works only when Advanced is checked.\n" "Go to Preferences -> General - Show Advanced Options." @@ -331,113 +332,120 @@ msgstr "" "ist.\n" "Gehen Sie zu Einstellungen -> Allgemein - Erweiterte Optionen anzeigen." -#: FlatCAMApp.py:4455 +#: FlatCAMApp.py:4454 msgid "Object(s) deleted ..." msgstr "Objekt (e) gelöscht ..." -#: FlatCAMApp.py:4459 +#: FlatCAMApp.py:4458 msgid "Failed. No object(s) selected..." msgstr "Gescheitert. Kein Objekt ausgewählt ..." -#: FlatCAMApp.py:4461 +#: FlatCAMApp.py:4460 msgid "Save the work in Editor and try again ..." msgstr "Speichern Sie die Arbeit im Editor und versuchen Sie es erneut ..." -#: FlatCAMApp.py:4474 +#: FlatCAMApp.py:4473 msgid "Click to set the origin ..." msgstr "Klicken Sie hier, um den Ursprung festzulegen ..." -#: FlatCAMApp.py:4487 +#: FlatCAMApp.py:4485 msgid "Jump to ..." msgstr "Springen zu ..." -#: FlatCAMApp.py:4488 +#: FlatCAMApp.py:4486 msgid "Enter the coordinates in format X,Y:" msgstr "Geben Sie die Koordinaten im Format X, Y ein:" -#: FlatCAMApp.py:4495 +#: FlatCAMApp.py:4493 msgid "Wrong coordinates. Enter coordinates in format: X,Y" msgstr "Falsche Koordinaten. Koordinaten im Format eingeben: X, Y" -#: FlatCAMApp.py:4513 -msgid "Done." -msgstr "Gemacht." +#: FlatCAMApp.py:4511 flatcamEditors/FlatCAMGeoEditor.py:3413 +#: flatcamEditors/FlatCAMGrbEditor.py:790 +#: flatcamEditors/FlatCAMGrbEditor.py:885 +#: flatcamEditors/FlatCAMGrbEditor.py:1122 +#: flatcamEditors/FlatCAMGrbEditor.py:1343 +#: flatcamEditors/FlatCAMGrbEditor.py:3235 +#: flatcamEditors/FlatCAMGrbEditor.py:3248 flatcamGUI/FlatCAMGUI.py:2373 +#: flatcamGUI/FlatCAMGUI.py:2385 +msgid "[success] Done." +msgstr "[success] Erledigt." -#: FlatCAMApp.py:4672 +#: FlatCAMApp.py:4670 msgid "[success] Origin set ..." msgstr "[success] Ursprung gesetzt ..." -#: FlatCAMApp.py:4690 +#: FlatCAMApp.py:4688 msgid "Preferences" msgstr "Einstellungen" -#: FlatCAMApp.py:4710 +#: FlatCAMApp.py:4708 msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." msgstr "[WARNING_NOTCL] Kein Objekt ausgewählt, um auf der Y-Achse zu kippen." -#: FlatCAMApp.py:4735 +#: FlatCAMApp.py:4733 msgid "[success] Flip on Y axis done." msgstr "[success] Y-Achse umdrehen fertig." -#: FlatCAMApp.py:4737 FlatCAMApp.py:4777 -#: flatcamEditors/FlatCAMGeoEditor.py:1353 -#: flatcamEditors/FlatCAMGrbEditor.py:3522 flatcamTools/ToolTransform.py:750 +#: FlatCAMApp.py:4735 FlatCAMApp.py:4775 +#: flatcamEditors/FlatCAMGeoEditor.py:1354 +#: flatcamEditors/FlatCAMGrbEditor.py:4533 flatcamTools/ToolTransform.py:750 #, python-format msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." msgstr "[ERROR_NOTCL] Aufgrund von %s wurde die Flip-Aktion nicht ausgeführt." -#: FlatCAMApp.py:4750 +#: FlatCAMApp.py:4748 msgid "[WARNING_NOTCL] No object selected to Flip on X axis." msgstr "[WARNING_NOTCL] Kein Objekt ausgewählt, um auf der X-Achse zu kippen." -#: FlatCAMApp.py:4775 +#: FlatCAMApp.py:4773 msgid "[success] Flip on X axis done." msgstr "[success] Dreh auf der X-Achse fertig." -#: FlatCAMApp.py:4790 +#: FlatCAMApp.py:4788 msgid "[WARNING_NOTCL] No object selected to Rotate." msgstr "[WARNING_NOTCL] Kein Objekt zum Drehen ausgewählt." -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Transform" msgstr "Verwandeln" -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Enter the Angle value:" msgstr "Geben Sie den Winkelwert ein:" -#: FlatCAMApp.py:4823 +#: FlatCAMApp.py:4821 msgid "[success] Rotation done." msgstr "[success] Rotation erfolgt." -#: FlatCAMApp.py:4825 flatcamEditors/FlatCAMGeoEditor.py:1296 -#: flatcamEditors/FlatCAMGrbEditor.py:3465 flatcamTools/ToolTransform.py:678 +#: FlatCAMApp.py:4823 flatcamEditors/FlatCAMGeoEditor.py:1297 +#: flatcamEditors/FlatCAMGrbEditor.py:4476 flatcamTools/ToolTransform.py:678 #, python-format msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." msgstr "" "[ERROR_NOTCL] Aufgrund von %s wurde keine Rotationsbewegung ausgeführt." -#: FlatCAMApp.py:4836 +#: FlatCAMApp.py:4834 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." msgstr "" "[WARNING_NOTCL] Kein Objekt für Neigung / Scherung auf der X-Achse " "ausgewählt." -#: FlatCAMApp.py:4857 +#: FlatCAMApp.py:4855 msgid "[success] Skew on X axis done." msgstr "[success] Neigung auf der X-Achse fertig." -#: FlatCAMApp.py:4867 +#: FlatCAMApp.py:4865 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." msgstr "" "[WARNING_NOTCL] Kein Objekt für Neigung / Scherung auf der Y-Achse " "ausgewählt." -#: FlatCAMApp.py:4888 +#: FlatCAMApp.py:4886 msgid "[success] Skew on Y axis done." msgstr "[success] Neigung auf der Y-Achse fertig." -#: FlatCAMApp.py:4984 FlatCAMApp.py:5011 +#: FlatCAMApp.py:4982 FlatCAMApp.py:5009 msgid "" "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " "format." @@ -445,48 +453,48 @@ msgstr "" "[WARNING_NOTCL] Bitte geben Sie im Float-Format einen Rasterwert mit einem " "Wert ungleich Null ein." -#: FlatCAMApp.py:4990 +#: FlatCAMApp.py:4988 msgid "[success] New Grid added ..." msgstr "[success] Neues Netz hinzugefügt ..." -#: FlatCAMApp.py:4993 +#: FlatCAMApp.py:4991 msgid "[WARNING_NOTCL] Grid already exists ..." msgstr "[WARNING_NOTCL] Netz existiert bereits ..." -#: FlatCAMApp.py:4996 +#: FlatCAMApp.py:4994 msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." msgstr "[WARNING_NOTCL] Neues Netz wurde abgebrochen ..." -#: FlatCAMApp.py:5018 +#: FlatCAMApp.py:5016 msgid "[ERROR_NOTCL] Grid Value does not exist ..." msgstr "[ERROR_NOTCL] Rasterwert existiert nicht ..." -#: FlatCAMApp.py:5021 +#: FlatCAMApp.py:5019 msgid "[success] Grid Value deleted ..." msgstr "[success] Rasterwert gelöscht ..." -#: FlatCAMApp.py:5024 +#: FlatCAMApp.py:5022 msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." msgstr "[WARNING_NOTCL] Rasterwert löschen abgebrochen ..." -#: FlatCAMApp.py:5063 +#: FlatCAMApp.py:5061 msgid "[WARNING_NOTCL] No object selected to copy it's name" msgstr "[WARNING_NOTCL] Kein Objekt zum Kopieren des Namens ausgewählt" -#: FlatCAMApp.py:5067 +#: FlatCAMApp.py:5065 msgid "Name copied on clipboard ..." msgstr "Name in Zwischenablage kopiert ..." -#: FlatCAMApp.py:5362 FlatCAMApp.py:5365 FlatCAMApp.py:5368 FlatCAMApp.py:5371 -#: FlatCAMApp.py:5385 FlatCAMApp.py:5388 FlatCAMApp.py:5391 FlatCAMApp.py:5394 -#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 FlatCAMApp.py:5439 FlatCAMApp.py:5442 +#: FlatCAMApp.py:5357 FlatCAMApp.py:5360 FlatCAMApp.py:5363 FlatCAMApp.py:5366 +#: FlatCAMApp.py:5380 FlatCAMApp.py:5383 FlatCAMApp.py:5386 FlatCAMApp.py:5389 +#: FlatCAMApp.py:5428 FlatCAMApp.py:5431 FlatCAMApp.py:5434 FlatCAMApp.py:5437 #: ObjectCollection.py:711 ObjectCollection.py:714 ObjectCollection.py:717 #: ObjectCollection.py:720 #, python-brace-format msgid "[selected]{name} selected" msgstr "[selected]{name} ausgewählt" -#: FlatCAMApp.py:5559 +#: FlatCAMApp.py:5554 msgid "" "There are files/objects opened in FlatCAM.\n" "Creating a New project will delete them.\n" @@ -496,112 +504,112 @@ msgstr "" "Wenn Sie ein neues Projekt erstellen, werden diese gelöscht.\n" "Möchten Sie das Projekt speichern?" -#: FlatCAMApp.py:5580 +#: FlatCAMApp.py:5575 msgid "[success] New Project created..." msgstr "[success] Neues Projekt erstellt ..." -#: FlatCAMApp.py:5688 FlatCAMApp.py:5691 flatcamGUI/FlatCAMGUI.py:594 -#: flatcamGUI/FlatCAMGUI.py:1762 +#: FlatCAMApp.py:5683 FlatCAMApp.py:5686 flatcamGUI/FlatCAMGUI.py:600 +#: flatcamGUI/FlatCAMGUI.py:1806 msgid "Open Gerber" msgstr "Gerber öffnen" -#: FlatCAMApp.py:5696 +#: FlatCAMApp.py:5691 msgid "[WARNING_NOTCL] Open Gerber cancelled." msgstr "[WARNING_NOTCL] Offener Gerber abgebrochen." -#: FlatCAMApp.py:5717 FlatCAMApp.py:5720 flatcamGUI/FlatCAMGUI.py:595 -#: flatcamGUI/FlatCAMGUI.py:1763 +#: FlatCAMApp.py:5712 FlatCAMApp.py:5715 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1807 msgid "Open Excellon" msgstr "Excellon öffnen" -#: FlatCAMApp.py:5725 +#: FlatCAMApp.py:5720 msgid "[WARNING_NOTCL] Open Excellon cancelled." msgstr "[WARNING_NOTCL] Offener Excellon abgebrochen." -#: FlatCAMApp.py:5747 FlatCAMApp.py:5750 +#: FlatCAMApp.py:5742 FlatCAMApp.py:5745 msgid "Open G-Code" msgstr "G-Code öffnen" -#: FlatCAMApp.py:5755 +#: FlatCAMApp.py:5750 msgid "[WARNING_NOTCL] Open G-Code cancelled." msgstr "[WARNING_NOTCL] Geöffneter G-Code wurde abgebrochen." -#: FlatCAMApp.py:5773 FlatCAMApp.py:5776 +#: FlatCAMApp.py:5768 FlatCAMApp.py:5771 msgid "Open Project" msgstr "Offenes Projekt" -#: FlatCAMApp.py:5784 +#: FlatCAMApp.py:5779 msgid "[WARNING_NOTCL] Open Project cancelled." msgstr "[WARNING_NOTCL] Projekt abbrechen abgebrochen." -#: FlatCAMApp.py:5803 FlatCAMApp.py:5806 +#: FlatCAMApp.py:5798 FlatCAMApp.py:5801 msgid "Open Configuration File" msgstr "Offene Einstellungsdatei" -#: FlatCAMApp.py:5810 +#: FlatCAMApp.py:5805 msgid "[WARNING_NOTCL Open Config cancelled." msgstr "[WARNING_NOTCL] Open Config abgesagt." -#: FlatCAMApp.py:5825 FlatCAMApp.py:6022 FlatCAMApp.py:8105 FlatCAMApp.py:8125 -#: FlatCAMApp.py:8146 FlatCAMApp.py:8168 +#: FlatCAMApp.py:5820 FlatCAMApp.py:6017 FlatCAMApp.py:8103 FlatCAMApp.py:8123 +#: FlatCAMApp.py:8144 FlatCAMApp.py:8166 msgid "[WARNING_NOTCL] No object selected." msgstr "[WARNING_NOTCL] Kein Objekt ausgewählt" -#: FlatCAMApp.py:5826 FlatCAMApp.py:6023 +#: FlatCAMApp.py:5821 FlatCAMApp.py:6018 msgid "Please Select a Geometry object to export" msgstr "Bitte wählen Sie ein Geometrieobjekt zum Exportieren aus" -#: FlatCAMApp.py:5837 +#: FlatCAMApp.py:5832 msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." msgstr "" "[ERROR_NOTCL] Es können nur Geometrie-, Gerber- und CNCJob-Objekte verwendet " "werden." -#: FlatCAMApp.py:5850 FlatCAMApp.py:5854 +#: FlatCAMApp.py:5845 FlatCAMApp.py:5849 msgid "Export SVG" msgstr "SVG exportieren" -#: FlatCAMApp.py:5859 +#: FlatCAMApp.py:5854 msgid "[WARNING_NOTCL] Export SVG cancelled." msgstr "[WARNING_NOTCL] Export SVG abgebrochen." -#: FlatCAMApp.py:5873 +#: FlatCAMApp.py:5868 msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" msgstr "" "[WARNING_NOTCL] Daten müssen ein 3D-Array mit der letzten Dimension 3 oder 4 " "sein" -#: FlatCAMApp.py:5879 FlatCAMApp.py:5883 +#: FlatCAMApp.py:5874 FlatCAMApp.py:5878 msgid "Export PNG Image" msgstr "PNG-Bild exportieren" -#: FlatCAMApp.py:5888 +#: FlatCAMApp.py:5883 msgid "Export PNG cancelled." msgstr "Export PNG abgebrochen." -#: FlatCAMApp.py:5905 +#: FlatCAMApp.py:5900 msgid "" "[WARNING_NOTCL] No object selected. Please select an Gerber object to export." msgstr "" "[WARNING_NOTCL] Kein Objekt ausgewählt. Bitte wählen Sie ein Gerber-Objekt " "aus, das Sie exportieren möchten." -#: FlatCAMApp.py:5910 +#: FlatCAMApp.py:5905 msgid "" "[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." msgstr "" "[ERROR_NOTCL] Fehlgeschlagen. Nur Gerber-Objekte können als Gerber-Dateien " "gespeichert werden ..." -#: FlatCAMApp.py:5922 +#: FlatCAMApp.py:5917 msgid "Save Gerber source file" msgstr "Gerber-Quelldatei speichern" -#: FlatCAMApp.py:5927 +#: FlatCAMApp.py:5922 msgid "[WARNING_NOTCL] Save Gerber source file cancelled." msgstr "[WARNING_NOTCL] Gerber Quelldatei speichern abgebrochen." -#: FlatCAMApp.py:5944 +#: FlatCAMApp.py:5939 msgid "" "[WARNING_NOTCL] No object selected. Please select an Excellon object to " "export." @@ -609,22 +617,22 @@ msgstr "" "[WARNING_NOTCL] Kein Objekt ausgewählt Bitte wählen Sie ein Excellon-Objekt " "zum Exportieren aus." -#: FlatCAMApp.py:5949 FlatCAMApp.py:5988 +#: FlatCAMApp.py:5944 FlatCAMApp.py:5983 msgid "" "[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." msgstr "" "[ERROR_NOTCL] Fehlgeschlagen. Nur Excellon-Objekte können als Excellon-" "Dateien gespeichert werden ..." -#: FlatCAMApp.py:5957 FlatCAMApp.py:5961 +#: FlatCAMApp.py:5952 FlatCAMApp.py:5956 msgid "Save Excellon source file" msgstr "Speichern Sie die Excellon-Quelldatei" -#: FlatCAMApp.py:5966 +#: FlatCAMApp.py:5961 msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." msgstr "[WARNING_NOTCL] Speichern der Excellon-Quelldatei abgebrochen." -#: FlatCAMApp.py:5983 +#: FlatCAMApp.py:5978 msgid "" "[WARNING_NOTCL] No object selected. Please Select an Excellon object to " "export." @@ -632,55 +640,55 @@ msgstr "" "[WARNING_NOTCL] Kein Objekt ausgewählt. Bitte wählen Sie ein Excellon-Objekt " "aus, das Sie exportieren möchten." -#: FlatCAMApp.py:5996 FlatCAMApp.py:6000 +#: FlatCAMApp.py:5991 FlatCAMApp.py:5995 msgid "Export Excellon" msgstr "Excellon exportieren" -#: FlatCAMApp.py:6005 +#: FlatCAMApp.py:6000 msgid "[WARNING_NOTCL] Export Excellon cancelled." msgstr "[WARNING_NOTCL] Export Excellon wurde abgebrochen." -#: FlatCAMApp.py:6033 +#: FlatCAMApp.py:6028 msgid "[ERROR_NOTCL] Only Geometry objects can be used." msgstr "[ERROR_NOTCL] Es können nur Geometrieobjekte verwendet werden." -#: FlatCAMApp.py:6047 FlatCAMApp.py:6051 +#: FlatCAMApp.py:6042 FlatCAMApp.py:6046 msgid "Export DXF" msgstr "DXF exportieren" -#: FlatCAMApp.py:6056 +#: FlatCAMApp.py:6051 msgid "[WARNING_NOTCL] Export DXF cancelled." msgstr "[WARNING_NOTCL] Export DXF wurde abgebrochen." -#: FlatCAMApp.py:6074 FlatCAMApp.py:6077 +#: FlatCAMApp.py:6069 FlatCAMApp.py:6072 msgid "Import SVG" msgstr "SVG importieren" -#: FlatCAMApp.py:6085 +#: FlatCAMApp.py:6080 msgid "[WARNING_NOTCL] Open SVG cancelled." msgstr "[WARNING_NOTCL] Open SVG abgebrochen." -#: FlatCAMApp.py:6104 FlatCAMApp.py:6107 +#: FlatCAMApp.py:6099 FlatCAMApp.py:6102 msgid "Import DXF" msgstr "Importieren Sie DXF" -#: FlatCAMApp.py:6115 +#: FlatCAMApp.py:6110 msgid "[WARNING_NOTCL] Open DXF cancelled." msgstr "[WARNING_NOTCL] Open DXF cancelled." -#: FlatCAMApp.py:6133 +#: FlatCAMApp.py:6128 #, python-format msgid "%s" msgstr "%s" -#: FlatCAMApp.py:6153 +#: FlatCAMApp.py:6148 msgid "" "[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." msgstr "" "[WARNING_NOTCL] Wählen Sie eine Gerber- oder Excellon-Datei aus, um die " "Quelldatei anzuzeigen." -#: FlatCAMApp.py:6160 +#: FlatCAMApp.py:6155 msgid "" "[WARNING_NOTCL] There is no selected object for which to see it's source " "file code." @@ -688,24 +696,24 @@ msgstr "" "[WARNING_NOTCL] Es gibt kein ausgewähltes Objekt, für das man seinen " "Quelldateien sehen kann." -#: FlatCAMApp.py:6168 +#: FlatCAMApp.py:6163 msgid "Source Editor" msgstr "Quelleditor" -#: FlatCAMApp.py:6178 +#: FlatCAMApp.py:6173 #, python-format msgid "[ERROR]App.on_view_source() -->%s" msgstr "[ERROR]App.on_view_source() -->%s" -#: FlatCAMApp.py:6190 FlatCAMApp.py:7211 FlatCAMObj.py:5257 +#: FlatCAMApp.py:6185 FlatCAMApp.py:7206 FlatCAMObj.py:5259 msgid "Code Editor" msgstr "Code-Editor" -#: FlatCAMApp.py:6202 +#: FlatCAMApp.py:6197 msgid "Script Editor" msgstr "Script Editor" -#: FlatCAMApp.py:6205 +#: FlatCAMApp.py:6200 msgid "" "#\n" "# CREATE A NEW FLATCAM TCL SCRIPT\n" @@ -749,85 +757,85 @@ msgstr "" "#\n" "\n" -#: FlatCAMApp.py:6228 FlatCAMApp.py:6231 +#: FlatCAMApp.py:6223 FlatCAMApp.py:6226 msgid "Open TCL script" msgstr "Öffnen Sie das TCL-Skript" -#: FlatCAMApp.py:6239 +#: FlatCAMApp.py:6234 msgid "[WARNING_NOTCL] Open TCL script cancelled." msgstr "[WARNING_NOTCL] Open TCL-Skript wurde abgebrochen." -#: FlatCAMApp.py:6251 +#: FlatCAMApp.py:6246 #, python-format msgid "[ERROR]App.on_fileopenscript() -->%s" msgstr "[ERROR]App.on_fileopenscript() -->%s" -#: FlatCAMApp.py:6277 FlatCAMApp.py:6280 +#: FlatCAMApp.py:6272 FlatCAMApp.py:6275 msgid "Run TCL script" msgstr "Führen Sie das TCL-Skript aus" -#: FlatCAMApp.py:6288 +#: FlatCAMApp.py:6283 msgid "[WARNING_NOTCL] Run TCL script cancelled." msgstr "[WARNING_NOTCL] Das TCL-Skript wird abgebrochen." -#: FlatCAMApp.py:6334 FlatCAMApp.py:6338 +#: FlatCAMApp.py:6329 FlatCAMApp.py:6333 msgid "Save Project As ..." msgstr "Projekt speichern als ..." -#: FlatCAMApp.py:6335 +#: FlatCAMApp.py:6330 #, python-brace-format msgid "{l_save}/Project_{date}" msgstr "{l_save}/Projekt_{date}" -#: FlatCAMApp.py:6343 +#: FlatCAMApp.py:6338 msgid "[WARNING_NOTCL] Save Project cancelled." msgstr "[WARNING_NOTCL] Projekt speichern abgebrochen" -#: FlatCAMApp.py:6388 +#: FlatCAMApp.py:6383 msgid "Exporting SVG" msgstr "SVG exportieren" -#: FlatCAMApp.py:6421 FlatCAMApp.py:6526 FlatCAMApp.py:6640 +#: FlatCAMApp.py:6416 FlatCAMApp.py:6521 FlatCAMApp.py:6635 #, python-format msgid "[success] SVG file exported to %s" msgstr "[success] SVG-Datei in exportiert %s" -#: FlatCAMApp.py:6452 FlatCAMApp.py:6572 +#: FlatCAMApp.py:6447 FlatCAMApp.py:6567 #, python-format msgid "[WARNING_NOTCL] No object Box. Using instead %s" msgstr "[WARNING_NOTCL] Kein Objektfeld. Stattdessen verwenden %s" -#: FlatCAMApp.py:6529 FlatCAMApp.py:6643 +#: FlatCAMApp.py:6524 FlatCAMApp.py:6638 msgid "Generating Film ... Please wait." msgstr "Film wird erstellt ... Bitte warten Sie." -#: FlatCAMApp.py:6790 +#: FlatCAMApp.py:6785 #, python-format msgid "[success] Excellon file exported to %s" msgstr "[success] Excellon-Datei nach exportiert %s" -#: FlatCAMApp.py:6797 +#: FlatCAMApp.py:6792 msgid "Exporting Excellon" msgstr "Excellon exportieren" -#: FlatCAMApp.py:6802 FlatCAMApp.py:6809 +#: FlatCAMApp.py:6797 FlatCAMApp.py:6804 msgid "[ERROR_NOTCL] Could not export Excellon file." msgstr "[ERROR_NOTCL] Excellon-Datei konnte nicht exportiert werden." -#: FlatCAMApp.py:6848 +#: FlatCAMApp.py:6843 #, python-format msgid "[success] DXF file exported to %s" msgstr "[success] DXF-Datei in exportiert %s" -#: FlatCAMApp.py:6854 +#: FlatCAMApp.py:6849 msgid "Exporting DXF" msgstr "DXF exportieren" -#: FlatCAMApp.py:6859 FlatCAMApp.py:6866 +#: FlatCAMApp.py:6854 FlatCAMApp.py:6861 msgid "[[WARNING_NOTCL]] Could not export DXF file." msgstr "[WARNING_NOTCL] DXF-Datei konnte nicht exportiert werden." -#: FlatCAMApp.py:6886 FlatCAMApp.py:6928 FlatCAMApp.py:6969 +#: FlatCAMApp.py:6881 FlatCAMApp.py:6923 FlatCAMApp.py:6964 msgid "" "[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " "Gerber are supported" @@ -835,99 +843,100 @@ msgstr "" "[ERROR_NOTCL] Nicht unterstützte Art wird als Parameter ausgewählt. Nur " "Geometrie und Gerber werden unterstützt" -#: FlatCAMApp.py:6896 +#: FlatCAMApp.py:6891 msgid "Importing SVG" msgstr "SVG importieren" -#: FlatCAMApp.py:6907 FlatCAMApp.py:6949 FlatCAMApp.py:6989 FlatCAMApp.py:7065 -#: FlatCAMApp.py:7132 FlatCAMApp.py:7197 +#: FlatCAMApp.py:6902 FlatCAMApp.py:6944 FlatCAMApp.py:6984 FlatCAMApp.py:7060 +#: FlatCAMApp.py:7127 FlatCAMApp.py:7192 flatcamTools/ToolPDF.py:275 #, python-format msgid "[success] Opened: %s" msgstr "[success] Geöffnet: %s" -#: FlatCAMApp.py:6938 +#: FlatCAMApp.py:6933 msgid "Importing DXF" msgstr "DXF importieren" -#: FlatCAMApp.py:6977 +#: FlatCAMApp.py:6972 msgid "Importing Image" msgstr "Bild importieren" -#: FlatCAMApp.py:7018 FlatCAMApp.py:7020 +#: FlatCAMApp.py:7013 FlatCAMApp.py:7015 #, python-format msgid "[ERROR_NOTCL] Failed to open file: %s" msgstr "[ERROR_NOTCL] Datei konnte nicht geöffnet werden: %s" -#: FlatCAMApp.py:7023 +#: FlatCAMApp.py:7018 #, python-brace-format msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" msgstr "[ERROR_NOTCL] Fehler beim Parsen der Datei: {name}. {error}" -#: FlatCAMApp.py:7029 FlatCAMObj.py:3961 -#: flatcamEditors/FlatCAMExcEditor.py:1927 -#: flatcamEditors/FlatCAMGrbEditor.py:2061 +#: FlatCAMApp.py:7024 FlatCAMObj.py:3963 +#: flatcamEditors/FlatCAMExcEditor.py:1977 +#: flatcamEditors/FlatCAMGrbEditor.py:3018 msgid "[ERROR] An internal error has ocurred. See shell.\n" msgstr "[ERROR] Ein interner Fehler ist aufgetreten. Siehe Shell.\n" -#: FlatCAMApp.py:7038 +#: FlatCAMApp.py:7033 msgid "" "[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." msgstr "" "[ERROR_NOTCL] Objekt ist keine Gerber-Datei oder leer. Abbruch der " "Objekterstellung" -#: FlatCAMApp.py:7046 +#: FlatCAMApp.py:7041 msgid "Opening Gerber" msgstr "Gerber öffnen" -#: FlatCAMApp.py:7056 +#: FlatCAMApp.py:7051 msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." msgstr "" "[ERROR_NOTCL] Gerber öffnen ist fehlgeschlagen. Wahrscheinlich keine Gerber-" "Datei." -#: FlatCAMApp.py:7091 +#: FlatCAMApp.py:7086 flatcamTools/ToolPcbWizard.py:421 msgid "[ERROR_NOTCL] This is not Excellon file." msgstr "[ERROR_NOTCL] Dies ist keine Excellon-Datei." -#: FlatCAMApp.py:7094 +#: FlatCAMApp.py:7089 #, python-format msgid "[ERROR_NOTCL] Cannot open file: %s" msgstr "[ERROR_NOTCL] Kann Datei nicht öffnen: %s" -#: FlatCAMApp.py:7099 +#: FlatCAMApp.py:7094 flatcamTools/ToolPcbWizard.py:429 msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" msgstr "[ERROR_NOTCL] Ein interner Fehler ist aufgetreten. Siehe Shell.\n" -#: FlatCAMApp.py:7115 +#: FlatCAMApp.py:7110 flatcamTools/ToolPDF.py:238 +#: flatcamTools/ToolPcbWizard.py:442 #, python-format msgid "[ERROR_NOTCL] No geometry found in file: %s" msgstr "[ERROR_NOTCL] Keine Geometrie in der Datei gefunden: %s" -#: FlatCAMApp.py:7118 +#: FlatCAMApp.py:7113 msgid "Opening Excellon." msgstr "Eröffnung Excellon." -#: FlatCAMApp.py:7125 +#: FlatCAMApp.py:7120 msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." msgstr "" "[ERROR_NOTCL] Die Excellon-Datei konnte nicht geöffnet werden. " "Wahrscheinlich keine Excellon-Datei." -#: FlatCAMApp.py:7164 +#: FlatCAMApp.py:7159 #, python-format msgid "[ERROR_NOTCL] Failed to open %s" msgstr "[ERROR_NOTCL] Gescheitert zu öffnen %s" -#: FlatCAMApp.py:7174 +#: FlatCAMApp.py:7169 msgid "[ERROR_NOTCL] This is not GCODE" msgstr "[ERROR_NOTCL] Dies ist kein GCODE" -#: FlatCAMApp.py:7180 +#: FlatCAMApp.py:7175 msgid "Opening G-Code." msgstr "G-Code öffnen." -#: FlatCAMApp.py:7188 +#: FlatCAMApp.py:7183 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 " @@ -938,26 +947,26 @@ msgstr "" "Der Versuch, ein FlatCAM-CNCJob-Objekt aus einer G-Code-Datei zu erstellen, " "ist während der Verarbeitung fehlgeschlagen" -#: FlatCAMApp.py:7228 +#: FlatCAMApp.py:7223 #, python-format msgid "[ERROR_NOTCL] Failed to open config file: %s" msgstr "[ERROR_NOTCL] Fehler beim Öffnen der Konfigurationsdatei: %s" -#: FlatCAMApp.py:7253 FlatCAMApp.py:7269 +#: FlatCAMApp.py:7248 FlatCAMApp.py:7264 #, python-format msgid "[ERROR_NOTCL] Failed to open project file: %s" msgstr "[ERROR_NOTCL] Projektdatei konnte nicht geöffnet werden: %s" -#: FlatCAMApp.py:7295 +#: FlatCAMApp.py:7290 #, python-format msgid "[success] Project loaded from: %s" msgstr "[success] Projekt geladen von: %s" -#: FlatCAMApp.py:7425 +#: FlatCAMApp.py:7420 msgid "Available commands:\n" msgstr "Verfügbare Befehle:\n" -#: FlatCAMApp.py:7427 +#: FlatCAMApp.py:7422 msgid "" "\n" "\n" @@ -969,24 +978,24 @@ msgstr "" "Geben Sie help für die Verwendung ein.\n" "Beispiel: help open_gerber" -#: FlatCAMApp.py:7575 +#: FlatCAMApp.py:7570 msgid "Shows list of commands." msgstr "Zeigt eine Liste von Befehlen an." -#: FlatCAMApp.py:7628 +#: FlatCAMApp.py:7626 msgid "[ERROR_NOTCL] Failed to load recent item list." msgstr "[ERROR_NOTCL] Fehler beim Laden der letzten Elementliste." -#: FlatCAMApp.py:7635 +#: FlatCAMApp.py:7633 msgid "[ERROR_NOTCL] Failed to parse recent item list." msgstr "" "[ERROR_NOTCL] Liste der letzten Artikel konnte nicht analysiert werden." -#: FlatCAMApp.py:7696 flatcamGUI/FlatCAMGUI.py:929 +#: FlatCAMApp.py:7694 flatcamGUI/FlatCAMGUI.py:941 msgid "Shortcut Key List" msgstr " Liste der Tastenkombinationen " -#: FlatCAMApp.py:7703 +#: FlatCAMApp.py:7701 msgid "" "\n" "

Selected Tab - Choose an Item from " @@ -1086,27 +1095,27 @@ msgstr "" "strong> oder über eine eigene Tastenkombination: F3. " "

" -#: FlatCAMApp.py:7807 +#: FlatCAMApp.py:7805 msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." msgstr "" "[WARNING_NOTCL] Fehler bei der Suche nach der neuesten Version. Konnte keine " "Verbindung herstellen." -#: FlatCAMApp.py:7814 +#: FlatCAMApp.py:7812 msgid "[ERROR_NOTCL] Could not parse information about latest version." msgstr "" "[ERROR_NOTCL] Informationen zur neuesten Version konnten nicht analysiert " "werden." -#: FlatCAMApp.py:7824 +#: FlatCAMApp.py:7822 msgid "[success] FlatCAM is up to date!" msgstr "[success] FlatCAM ist auf dem neuesten Version!" -#: FlatCAMApp.py:7829 +#: FlatCAMApp.py:7827 msgid "Newer Version Available" msgstr "Neuere Version verfügbar" -#: FlatCAMApp.py:7830 +#: FlatCAMApp.py:7828 msgid "" "There is a newer version of FlatCAM available for download:\n" "\n" @@ -1114,46 +1123,46 @@ msgstr "" "Es gibt eine neuere Version von FlatCAM zum Download:\n" "\n" -#: FlatCAMApp.py:7832 +#: FlatCAMApp.py:7830 msgid "info" msgstr "Info" -#: FlatCAMApp.py:7851 +#: FlatCAMApp.py:7849 msgid "[success] All plots disabled." msgstr "[success] Alle Diagramme sind deaktiviert." -#: FlatCAMApp.py:7857 +#: FlatCAMApp.py:7855 msgid "[success] All non selected plots disabled." msgstr "[success] Alle nicht ausgewählten Diagramme sind deaktiviert." -#: FlatCAMApp.py:7863 +#: FlatCAMApp.py:7861 msgid "[success] All plots enabled." msgstr "[success] Alle Diagramme aktiviert." -#: FlatCAMApp.py:7974 +#: FlatCAMApp.py:7972 msgid "Saving FlatCAM Project" msgstr "FlatCAM-Projekt speichern" -#: FlatCAMApp.py:7995 FlatCAMApp.py:8026 +#: FlatCAMApp.py:7993 FlatCAMApp.py:8024 #, python-format msgid "[success] Project saved to: %s" msgstr "[success] Projekt gespeichert in: %s" -#: FlatCAMApp.py:8013 +#: FlatCAMApp.py:8011 #, python-format msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." msgstr "" "[ERROR_NOTCL] Fehler beim Überprüfen der Projektdatei:%s. Versuchen Sie es " "erneut zu speichern." -#: FlatCAMApp.py:8020 +#: FlatCAMApp.py:8018 #, python-format msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." msgstr "" "[ERROR_NOTCL] Die gespeicherte Projektdatei konnte nicht analysiert werden:" "%s. Versuchen Sie es erneut zu speichern." -#: FlatCAMApp.py:8028 +#: FlatCAMApp.py:8026 #, python-format msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." msgstr "" @@ -1165,11 +1174,11 @@ msgstr "" msgid "[success] Name changed from {old} to {new}" msgstr "[success] Name geändert von {old} zu {new}" -#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5156 +#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5158 msgid "Basic" msgstr "Basic" -#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5162 +#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5164 msgid "Advanced" msgstr "Erweitert" @@ -1182,32 +1191,32 @@ msgstr "[success] Isolationsgeometrie erstellt: %s" msgid "Plotting Apertures" msgstr "Plotten Apertures" -#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1293 +#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1327 msgid "Total Drills" msgstr "Bohrungen insgesamt" -#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1325 +#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1359 msgid "Total Slots" msgstr "Schlitz insgesamt" -#: FlatCAMObj.py:1813 FlatCAMObj.py:3078 FlatCAMObj.py:3384 FlatCAMObj.py:3571 -#: FlatCAMObj.py:3584 FlatCAMObj.py:3701 FlatCAMObj.py:4109 FlatCAMObj.py:4342 -#: FlatCAMObj.py:4748 flatcamEditors/FlatCAMExcEditor.py:1400 +#: FlatCAMObj.py:1813 FlatCAMObj.py:3079 FlatCAMObj.py:3386 FlatCAMObj.py:3573 +#: FlatCAMObj.py:3586 FlatCAMObj.py:3703 FlatCAMObj.py:4111 FlatCAMObj.py:4344 +#: FlatCAMObj.py:4750 flatcamEditors/FlatCAMExcEditor.py:1434 #: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 #: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 #: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 #: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 #: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 -#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:479 -#: flatcamTools/ToolNonCopperClear.py:550 -#: flatcamTools/ToolNonCopperClear.py:626 -#: flatcamTools/ToolNonCopperClear.py:643 flatcamTools/ToolPaint.py:537 -#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:742 -#: flatcamTools/ToolPaint.py:839 flatcamTools/ToolPaint.py:994 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:480 +#: flatcamTools/ToolNonCopperClear.py:551 +#: flatcamTools/ToolNonCopperClear.py:627 +#: flatcamTools/ToolNonCopperClear.py:644 flatcamTools/ToolPaint.py:538 +#: flatcamTools/ToolPaint.py:608 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:840 flatcamTools/ToolPaint.py:995 #: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 #: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 #: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 -#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +#: flatcamTools/ToolSolderPaste.py:756 flatcamTools/ToolSolderPaste.py:827 msgid "[ERROR_NOTCL] Wrong value format entered, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered, use a number." @@ -1230,10 +1239,10 @@ msgid "Tool_nr" msgstr "Werkzeugnummer" #: FlatCAMObj.py:2058 FlatCAMObj.py:2152 FlatCAMObj.py:2263 -#: flatcamEditors/FlatCAMExcEditor.py:753 -#: flatcamEditors/FlatCAMExcEditor.py:1870 flatcamGUI/ObjectUI.py:556 +#: flatcamEditors/FlatCAMExcEditor.py:781 +#: flatcamEditors/FlatCAMExcEditor.py:1920 flatcamGUI/ObjectUI.py:556 #: flatcamTools/ToolNonCopperClear.py:83 flatcamTools/ToolPaint.py:80 -#: flatcamTools/ToolSolderPaste.py:81 +#: flatcamTools/ToolPcbWizard.py:78 flatcamTools/ToolSolderPaste.py:81 msgid "Diameter" msgstr "Durchmesser" @@ -1252,7 +1261,7 @@ msgstr "" "[ERROR_NOTCL] Das Fräswerkzeug für SCHLITZ ist größer als die Lochgröße. " "Abgebrochen." -#: FlatCAMObj.py:2303 FlatCAMObj.py:3997 FlatCAMObj.py:4208 FlatCAMObj.py:4523 +#: FlatCAMObj.py:2303 FlatCAMObj.py:3999 FlatCAMObj.py:4210 FlatCAMObj.py:4525 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"z_pdepth\"] or self." "options[\"z_pdepth\"]" @@ -1260,7 +1269,7 @@ msgstr "" "[ERROR_NOTCL] Falsches Wertformat für self.defaults [\"z_pdepth\"] oder self." "options [\"z_pdepth\"]" -#: FlatCAMObj.py:2315 FlatCAMObj.py:4009 FlatCAMObj.py:4220 FlatCAMObj.py:4535 +#: FlatCAMObj.py:2315 FlatCAMObj.py:4011 FlatCAMObj.py:4222 FlatCAMObj.py:4537 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"feedrate_probe\"] or " "self.options[\"feedrate_probe\"]" @@ -1268,12 +1277,12 @@ msgstr "" "[ERROR_NOTCL] Falsches Wertformat für self.defaults [\"feedrate_probe\"] " "oder self.options [\"feedrate_probe\"]" -#: FlatCAMObj.py:2347 FlatCAMObj.py:4410 FlatCAMObj.py:4415 FlatCAMObj.py:4561 +#: FlatCAMObj.py:2347 FlatCAMObj.py:4412 FlatCAMObj.py:4417 FlatCAMObj.py:4563 msgid "Generating CNC Code" msgstr "CNC-Code generieren" -#: FlatCAMObj.py:2373 FlatCAMObj.py:4707 camlib.py:5141 camlib.py:5577 -#: camlib.py:5848 +#: FlatCAMObj.py:2373 FlatCAMObj.py:4709 camlib.py:5204 camlib.py:5653 +#: camlib.py:5924 msgid "" "[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " "format (x, y) \n" @@ -1283,7 +1292,7 @@ msgstr "" "muss das Format (x, y) haben.\n" "Aber jetzt gibt es nur einen Wert, nicht zwei." -#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3247 +#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3249 msgid "Path" msgstr "Pfad" @@ -1295,15 +1304,15 @@ msgstr "Im" msgid "Out" msgstr "Aus" -#: FlatCAMObj.py:2720 FlatCAMObj.py:3043 FlatCAMObj.py:3616 +#: FlatCAMObj.py:2720 FlatCAMObj.py:3044 FlatCAMObj.py:3618 msgid "Custom" msgstr "Maßgeschneidert" -#: FlatCAMObj.py:2721 FlatCAMObj.py:3627 FlatCAMObj.py:3628 FlatCAMObj.py:3637 +#: FlatCAMObj.py:2721 FlatCAMObj.py:3629 FlatCAMObj.py:3630 FlatCAMObj.py:3639 msgid "Iso" msgstr "Iso" -#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3249 +#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3251 msgid "Rough" msgstr "Rau" @@ -1311,58 +1320,59 @@ msgstr "Rau" msgid "Finish" msgstr "Oberfläche" -#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:512 flatcamGUI/FlatCAMGUI.py:698 -#: flatcamGUI/FlatCAMGUI.py:1536 flatcamGUI/FlatCAMGUI.py:1546 -#: flatcamGUI/FlatCAMGUI.py:1870 flatcamGUI/ObjectUI.py:996 +#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:518 flatcamGUI/FlatCAMGUI.py:710 +#: flatcamGUI/FlatCAMGUI.py:1580 flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1914 flatcamGUI/ObjectUI.py:996 msgid "Copy" msgstr "Kopieren" -#: FlatCAMObj.py:3001 flatcamGUI/FlatCAMGUI.py:513 flatcamGUI/FlatCAMGUI.py:700 -#: flatcamGUI/FlatCAMGUI.py:1537 flatcamGUI/FlatCAMGUI.py:1547 -#: flatcamGUI/FlatCAMGUI.py:1872 flatcamGUI/ObjectUI.py:1004 +#: FlatCAMObj.py:3001 flatcamEditors/FlatCAMGrbEditor.py:1825 +#: flatcamGUI/FlatCAMGUI.py:519 flatcamGUI/FlatCAMGUI.py:712 +#: flatcamGUI/FlatCAMGUI.py:1581 flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1916 flatcamGUI/ObjectUI.py:1004 #: flatcamTools/ToolNonCopperClear.py:146 flatcamTools/ToolPaint.py:143 -#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:481 msgid "Delete" msgstr "Löschen" -#: FlatCAMObj.py:3219 +#: FlatCAMObj.py:3221 msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." msgstr "" "[ERROR_NOTCL] Bitte geben Sie den gewünschten Werkzeugdurchmesser im Real-" "Format ein." -#: FlatCAMObj.py:3294 +#: FlatCAMObj.py:3296 msgid "[success] Tool added in Tool Table." msgstr "[success] Werkzeug in der Werkzeugtabelle hinzugefügt." -#: FlatCAMObj.py:3299 +#: FlatCAMObj.py:3301 msgid "[ERROR_NOTCL] Default Tool added. Wrong value format entered." msgstr "" "[ERROR_NOTCL] Standardwerkzeug hinzugefügt Falsches Wertformat eingegeben." -#: FlatCAMObj.py:3329 FlatCAMObj.py:3339 +#: FlatCAMObj.py:3331 FlatCAMObj.py:3341 msgid "[WARNING_NOTCL] Failed. Select a tool to copy." msgstr "" "[WARNING_NOTCL] Fehlgeschlagen. Wählen Sie ein Werkzeug zum Kopieren aus." -#: FlatCAMObj.py:3368 +#: FlatCAMObj.py:3370 msgid "[success] Tool was copied in Tool Table." msgstr "[success] Das Werkzeug wurde in die Werkzeugtabelle kopiert." -#: FlatCAMObj.py:3401 +#: FlatCAMObj.py:3403 msgid "[success] Tool was edited in Tool Table." msgstr "[success] Das Werkzeug wurde in der Werkzeugtabelle bearbeitet." -#: FlatCAMObj.py:3432 FlatCAMObj.py:3442 +#: FlatCAMObj.py:3434 FlatCAMObj.py:3444 msgid "[WARNING_NOTCL] Failed. Select a tool to delete." msgstr "" "[WARNING_NOTCL] Fehlgeschlagen. Wählen Sie ein Werkzeug zum Löschen aus." -#: FlatCAMObj.py:3466 +#: FlatCAMObj.py:3468 msgid "[success] Tool was deleted in Tool Table." msgstr "[success] Werkzeug wurde in der Werkzeugtabelle gelöscht." -#: FlatCAMObj.py:3880 +#: FlatCAMObj.py:3882 #, python-format msgid "" "[WARNING_NOTCL] This Geometry can't be processed because it is %s geometry." @@ -1370,24 +1380,24 @@ msgstr "" "[WARNING_NOTCL] Diese Geometrie kann nicht verarbeitet werden, da es sich um " "%s Geometrie handelt." -#: FlatCAMObj.py:3897 +#: FlatCAMObj.py:3899 msgid "[ERROR_NOTCL] Wrong Tool Dia value format entered, use a number." msgstr "" "[ERROR_NOTCL] Falsches Werkzeug Dia-Wertformat eingegeben, verwenden Sie " "eine Zahl." -#: FlatCAMObj.py:3924 +#: FlatCAMObj.py:3926 msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." msgstr "" "[ERROR_NOTCL] Gescheitert. Kein Werkzeug in der Werkzeugtabelle " "ausgewählt ..." -#: FlatCAMObj.py:3962 +#: FlatCAMObj.py:3964 #, python-format msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" msgstr "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" -#: FlatCAMObj.py:4118 FlatCAMObj.py:4351 +#: FlatCAMObj.py:4120 FlatCAMObj.py:4353 msgid "" "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" "Add a Tool Offset or change the Offset Type." @@ -1396,22 +1406,22 @@ msgstr "" "jedoch kein Wert angegeben.\n" "Fügen Sie einen Werkzeugversatz hinzu oder ändern Sie den Versatztyp." -#: FlatCAMObj.py:4232 flatcamTools/ToolSolderPaste.py:1106 -#: flatcamTools/ToolSolderPaste.py:1161 +#: FlatCAMObj.py:4234 flatcamTools/ToolSolderPaste.py:1107 +#: flatcamTools/ToolSolderPaste.py:1162 msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." msgstr "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." -#: FlatCAMObj.py:4594 FlatCAMObj.py:4604 camlib.py:3410 camlib.py:3419 +#: FlatCAMObj.py:4596 FlatCAMObj.py:4606 camlib.py:3426 camlib.py:3435 msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." msgstr "" "[ERROR_NOTCL] Der Skalierungsfaktor muss eine Zahl sein: Ganzzahl oder " "Fließkommazahl." -#: FlatCAMObj.py:4642 +#: FlatCAMObj.py:4644 msgid "[success] Geometry Scale done." msgstr "[success] Geometrie Skalierung fertig." -#: FlatCAMObj.py:4659 camlib.py:3481 +#: FlatCAMObj.py:4661 camlib.py:3497 msgid "" "[ERROR_NOTCL] An (x,y) pair of values are needed. Probable you entered only " "one value in the Offset field." @@ -1419,29 +1429,29 @@ msgstr "" "[ERROR_NOTCL] Ein (x, y) Wertepaar wird benötigt. Wahrscheinlich haben Sie " "im Feld Offset nur einen Wert eingegeben." -#: FlatCAMObj.py:4679 +#: FlatCAMObj.py:4681 msgid "[success] Geometry Offset done." msgstr "[success] Geometrie Offset fertig." -#: FlatCAMObj.py:5224 FlatCAMObj.py:5229 flatcamTools/ToolSolderPaste.py:1360 +#: FlatCAMObj.py:5226 FlatCAMObj.py:5231 flatcamTools/ToolSolderPaste.py:1361 msgid "Export Machine Code ..." msgstr "Maschinencode exportieren ..." -#: FlatCAMObj.py:5235 flatcamTools/ToolSolderPaste.py:1363 +#: FlatCAMObj.py:5237 flatcamTools/ToolSolderPaste.py:1364 msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." msgstr "[WARNING_NOTCL] Export Machine Code cancelled ..." -#: FlatCAMObj.py:5246 +#: FlatCAMObj.py:5248 #, python-format msgid "[success] Machine Code file saved to: %s" msgstr "[success] Maschinencode-Datei gespeichert in: %s" -#: FlatCAMObj.py:5268 +#: FlatCAMObj.py:5270 #, python-format msgid "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" msgstr "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" -#: FlatCAMObj.py:5385 +#: FlatCAMObj.py:5387 #, python-format msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed because it is a %s " @@ -1450,11 +1460,11 @@ msgstr "" "[WARNING_NOTCL] Dieses CNC-Auftrag Objekt kann nicht verarbeitet werden, da " "es sich um ein %s CNC-Auftrag Objekt handelt." -#: FlatCAMObj.py:5438 +#: FlatCAMObj.py:5440 msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" msgstr "[ERROR_NOTCL] G-Code hat keinen Einheitencode: entweder G20 oder G21" -#: FlatCAMObj.py:5451 +#: FlatCAMObj.py:5453 msgid "" "[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " "empty." @@ -1462,17 +1472,17 @@ msgstr "" "[ERROR_NOTCL] Abgebrochen. Der benutzerdefinierte Code zum Ändern des " "Werkzeugs ist aktiviert, aber er ist leer." -#: FlatCAMObj.py:5458 +#: FlatCAMObj.py:5460 msgid "[success] Toolchange G-code was replaced by a custom code." msgstr "" "[success] Der Werkzeugwechsel-G-Code wurde durch einen benutzerdefinierten " "Code ersetzt." -#: FlatCAMObj.py:5473 flatcamTools/ToolSolderPaste.py:1389 +#: FlatCAMObj.py:5475 flatcamTools/ToolSolderPaste.py:1390 msgid "[WARNING_NOTCL] No such file or directory" msgstr "[WARNING_NOTCL] Keine solche Datei oder Ordner" -#: FlatCAMObj.py:5492 FlatCAMObj.py:5504 +#: FlatCAMObj.py:5494 FlatCAMObj.py:5506 msgid "" "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " "'toolchange_custom'" @@ -1480,7 +1490,7 @@ msgstr "" "[WARNING_NOTCL] Die verwendete Postprozessor-Datei muss im Namen enthalten " "sein: 'toolchange_custom'" -#: FlatCAMObj.py:5510 +#: FlatCAMObj.py:5512 msgid "[ERROR] There is no postprocessor file." msgstr "[ERROR] Es gibt keine Postprozessor-Datei." @@ -1494,47 +1504,47 @@ msgstr "Objekt umbenannt von {old} zu {new}" msgid "[ERROR] Cause of error: %s" msgstr "[ERROR] Fehlerursache: %s" -#: camlib.py:200 +#: camlib.py:202 msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." msgstr "" "[ERROR_NOTCL] self.solid_geometry ist weder BaseGeometry noch eine Liste." -#: camlib.py:1387 +#: camlib.py:1389 msgid "[success] Object was mirrored ..." msgstr "[success] Objekt wurde gespiegelt ..." -#: camlib.py:1389 +#: camlib.py:1391 msgid "[ERROR_NOTCL] Failed to mirror. No object selected" msgstr "[ERROR_NOTCL] Spiegelung fehlgeschlagen Kein Objekt ausgewählt" -#: camlib.py:1425 +#: camlib.py:1427 msgid "[success] Object was rotated ..." msgstr "[success] Objekt wurde gedreht ..." -#: camlib.py:1427 +#: camlib.py:1429 msgid "[ERROR_NOTCL] Failed to rotate. No object selected" msgstr "[ERROR_NOTCL] Fehler beim Drehen. Kein Objekt ausgewählt" -#: camlib.py:1461 +#: camlib.py:1463 msgid "[success] Object was skewed ..." msgstr "[success] Objekt war schief ..." -#: camlib.py:1463 +#: camlib.py:1465 msgid "[ERROR_NOTCL] Failed to skew. No object selected" msgstr "[ERROR_NOTCL] Fehler beim Neigen Kein Objekt ausgewählt" -#: camlib.py:2728 camlib.py:2832 +#: camlib.py:2733 camlib.py:2837 #, python-format msgid "[WARNING] Coordinates missing, line ignored: %s" msgstr "[WARNING] Koordinaten fehlen, Zeile wird ignoriert: %s" -#: camlib.py:2729 camlib.py:2833 +#: camlib.py:2734 camlib.py:2838 msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" msgstr "" "[WARNING_NOTCL] Die GERBER-Datei könnte CORRUPT sein. Überprüfen Sie die " "Datei !!!" -#: camlib.py:2787 +#: camlib.py:2792 #, python-format msgid "" "[ERROR] Region does not have enough points. File will be processed but there " @@ -1543,7 +1553,7 @@ msgstr "" "[ERROR] Region hat nicht genug Punkte. Die Datei wird verarbeitet, es treten " "jedoch Parserfehler auf. Linien Nummer: %s" -#: camlib.py:3231 +#: camlib.py:3247 #, python-format msgid "" "[ERROR]Gerber Parser ERROR.\n" @@ -1552,20 +1562,37 @@ msgstr "" "[ERROR] Gerber Parser ERROR.\n" "%s:" -#: camlib.py:3448 +#: camlib.py:3464 msgid "[success] Gerber Scale done." msgstr "[success] Gerber-Skalierung abgeschlossen." -#: camlib.py:3505 +#: camlib.py:3521 msgid "[success] Gerber Offset done." msgstr "[success] Gerber Offset fertig." -#: camlib.py:3887 +#: camlib.py:3915 #, python-format msgid "[ERROR_NOTCL] This is GCODE mark: %s" msgstr "[ERROR_NOTCL] Dies ist die GCODE-Marke: %s" -#: camlib.py:4431 +#: camlib.py:4029 +#, 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] Keine Informationen zum Werkzeugdurchmesser. Siehe Shell.\n" +"Ein Werkzeugwechselereignis: T% s wurde gefunden, die Excellon-Datei enthält " +"jedoch keine Informationen zu den Werkzeugdurchmessern. Daher versucht die " +"Anwendung, sie mithilfe einiger 'gefälschter' Durchmesser zu laden.\n" +"Der Benutzer muss das resultierende Excellon-Objekt bearbeiten und die " +"Durchmesser ändern, um die tatsächlichen Durchmesser widerzuspiegeln." + +#: camlib.py:4494 #, python-brace-format msgid "" "[ERROR] Excellon Parser error.\n" @@ -1574,7 +1601,7 @@ msgstr "" "[ERROR] Fehler beim Excellon-Parser.\n" "Parsing fehlgeschlagen. Zeile {l_nr}: {line}\n" -#: camlib.py:4508 +#: camlib.py:4571 msgid "" "[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " "not having a tool associated.\n" @@ -1584,12 +1611,12 @@ msgstr "" "da kein Werkzeug zugeordnet wurde.\n" "Überprüfen Sie den resultierenden GCode." -#: camlib.py:5050 +#: camlib.py:5113 #, python-format msgid "[ERROR] There is no such parameter: %s" msgstr "[ERROR] Es gibt keinen solchen Parameter: %s" -#: camlib.py:5120 +#: camlib.py:5183 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "drill into material.\n" @@ -1604,7 +1631,7 @@ msgstr "" "einen negativen Wert. \n" "Überprüfen Sie den resultierenden CNC-Code (Gcode usw.)." -#: camlib.py:5127 camlib.py:5600 camlib.py:5871 +#: camlib.py:5190 camlib.py:5676 camlib.py:5947 #, python-format msgid "" "[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" @@ -1612,15 +1639,15 @@ msgstr "" "[WARNING] Der Parameter Cut Z ist Null. Es wird kein Schnitt ausgeführt, da " "die %s Datei übersprungen wird" -#: camlib.py:5343 camlib.py:5438 camlib.py:5489 +#: camlib.py:5412 camlib.py:5507 camlib.py:5565 msgid "[ERROR_NOTCL] The loaded Excellon file has no drills ..." msgstr "[ERROR_NOTCL] Die geladene Excellon-Datei hat keine Bohrer ..." -#: camlib.py:5443 +#: camlib.py:5512 msgid "[ERROR_NOTCL] Wrong optimization type selected." msgstr "[ERROR_NOTCL] Falscher Optimierungstyp ausgewählt." -#: camlib.py:5588 camlib.py:5859 +#: camlib.py:5664 camlib.py:5935 msgid "" "[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " "combinations of other parameters." @@ -1628,7 +1655,7 @@ msgstr "" "[ERROR_NOTCL] Der Parameter Cut_Z ist None oder Null. Höchstwahrscheinlich " "eine schlechte Kombination anderer Parameter." -#: camlib.py:5593 camlib.py:5864 +#: camlib.py:5669 camlib.py:5940 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "cut into material.\n" @@ -1643,11 +1670,11 @@ msgstr "" "einen negativen Wert. \n" "Überprüfen Sie den resultierenden CNC-Code (Gcode usw.)." -#: camlib.py:5605 camlib.py:5876 +#: camlib.py:5681 camlib.py:5952 msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." msgstr "[ERROR_NOTCL] Der Parameter für den Travel Z ist Kein oder Null." -#: camlib.py:5609 camlib.py:5880 +#: camlib.py:5685 camlib.py:5956 msgid "" "[WARNING] The Travel Z parameter has negative value. It is the height value " "to travel between cuts.\n" @@ -1661,7 +1688,7 @@ msgstr "" "einen Tippfehler handelt, konvertiert die App den Wert in einen positiven " "Wert. Überprüfen Sie den resultierenden CNC-Code (Gcode usw.)." -#: camlib.py:5616 camlib.py:5887 +#: camlib.py:5692 camlib.py:5963 #, python-format msgid "" "[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" @@ -1669,12 +1696,12 @@ msgstr "" "[WARNING] Der Parameter Z-Weg ist Null. Dies ist gefährlich, da die %s Datei " "übersprungen wird" -#: camlib.py:5746 +#: camlib.py:5822 #, python-format msgid "[ERROR]Expected a Geometry, got %s" msgstr "[ERROR] Eine Geometrie erwartet,%s erhalten" -#: camlib.py:5752 +#: camlib.py:5828 msgid "" "[ERROR_NOTCL] Trying to generate a CNC Job from a Geometry object without " "solid_geometry." @@ -1682,7 +1709,7 @@ msgstr "" "[ERROR_NOTCL] Der Versuch, einen CNC-Auftrag aus einem Geometrieobjekt ohne " "solid_geometry zu generieren." -#: camlib.py:5791 +#: camlib.py:5867 msgid "" "[ERROR_NOTCL] The Tool Offset value is too negative to use for the " "current_geometry.\n" @@ -1692,43 +1719,43 @@ msgstr "" "current_geometry zu verwenden.\n" "Erhöhen Sie den Wert (im Modul) und versuchen Sie es erneut." -#: camlib.py:6013 +#: camlib.py:6089 msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." msgstr "" "[ERROR_NOTCL] In der SolderPaste-Geometrie sind keine Werkzeugdaten " "vorhanden." -#: flatcamEditors/FlatCAMExcEditor.py:44 +#: flatcamEditors/FlatCAMExcEditor.py:46 msgid "[WARNING_NOTCL] To add a drill first select a tool" msgstr "" "[WARNING_NOTCL] Um einen Bohrer hinzuzufügen, wählen Sie zuerst ein Werkzeug " "aus" -#: flatcamEditors/FlatCAMExcEditor.py:53 flatcamEditors/FlatCAMExcEditor.py:143 -#: flatcamEditors/FlatCAMExcEditor.py:420 -#: flatcamEditors/FlatCAMExcEditor.py:445 -#: flatcamEditors/FlatCAMGrbEditor.py:223 -#: flatcamEditors/FlatCAMGrbEditor.py:604 -#: flatcamEditors/FlatCAMGrbEditor.py:628 +#: flatcamEditors/FlatCAMExcEditor.py:62 flatcamEditors/FlatCAMExcEditor.py:164 +#: flatcamEditors/FlatCAMExcEditor.py:446 +#: flatcamEditors/FlatCAMExcEditor.py:471 +#: flatcamEditors/FlatCAMGrbEditor.py:287 +#: flatcamEditors/FlatCAMGrbEditor.py:1447 +#: flatcamEditors/FlatCAMGrbEditor.py:1471 msgid "Click on target location ..." msgstr "Klicken Sie auf den Zielort ..." -#: flatcamEditors/FlatCAMExcEditor.py:93 +#: flatcamEditors/FlatCAMExcEditor.py:107 msgid "[success] Done. Drill added." msgstr "[success] Erledigt. Bohrer hinzugefügt." -#: flatcamEditors/FlatCAMExcEditor.py:135 +#: flatcamEditors/FlatCAMExcEditor.py:149 msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" msgstr "" "[WARNING_NOTCL] Um ein Bohr-Array hinzuzufügen, wählen Sie zunächst ein " "Werkzeug in der Werkzeugtabelle aus" -#: flatcamEditors/FlatCAMExcEditor.py:160 +#: flatcamEditors/FlatCAMExcEditor.py:181 msgid "Click on the Drill Circular Array Start position" msgstr "Klicken Sie auf die Startposition des Bohrkreis-Arrays" -#: flatcamEditors/FlatCAMExcEditor.py:182 -#: flatcamEditors/FlatCAMGrbEditor.py:262 +#: flatcamEditors/FlatCAMExcEditor.py:203 +#: flatcamEditors/FlatCAMGrbEditor.py:330 msgid "" "[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " "separator." @@ -1736,68 +1763,68 @@ msgstr "" "[ERROR_NOTCL] Der Wert ist nicht Real. Überprüfen Sie das Komma anstelle des " "Trennzeichens." -#: flatcamEditors/FlatCAMExcEditor.py:185 -#: flatcamEditors/FlatCAMGrbEditor.py:265 +#: flatcamEditors/FlatCAMExcEditor.py:206 +#: flatcamEditors/FlatCAMGrbEditor.py:333 msgid "[ERROR_NOTCL] The value is mistyped. Check the value." msgstr "" "[ERROR_NOTCL] Der Wert ist falsch geschrieben. Überprüfen Sie den Wert." -#: flatcamEditors/FlatCAMExcEditor.py:278 +#: flatcamEditors/FlatCAMExcEditor.py:304 msgid "[WARNING_NOTCL] Too many drills for the selected spacing angle." msgstr "[WARNING_NOTCL] Zu viele Bohrer für den ausgewählten Abstandswinkel." -#: flatcamEditors/FlatCAMExcEditor.py:295 +#: flatcamEditors/FlatCAMExcEditor.py:321 msgid "[success] Done. Drill Array added." msgstr "[success] Erledigt. Bohrfeld hinzugefügt." -#: flatcamEditors/FlatCAMExcEditor.py:306 +#: flatcamEditors/FlatCAMExcEditor.py:332 msgid "Click on the Drill(s) to resize ..." msgstr "Klicken Sie auf die Bohrer, um die Größe zu ändern ..." -#: flatcamEditors/FlatCAMExcEditor.py:326 +#: flatcamEditors/FlatCAMExcEditor.py:352 msgid "" "[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize." msgstr "" "[ERROR_NOTCL] Die Größe der Bohrer ist fehlgeschlagen. Bitte geben Sie einen " "Durchmesser für die Größenänderung ein." -#: flatcamEditors/FlatCAMExcEditor.py:396 +#: flatcamEditors/FlatCAMExcEditor.py:422 msgid "[success] Done. Drill Resize completed." msgstr "[success] Erledigt. Bohren Sie die Größe neu." -#: flatcamEditors/FlatCAMExcEditor.py:399 +#: flatcamEditors/FlatCAMExcEditor.py:425 msgid "[WARNING_NOTCL] Cancelled. No drills selected for resize ..." msgstr "" "[WARNING_NOTCL] Abgebrochen. Keine Bohrer zur Größenänderung ausgewählt ..." -#: flatcamEditors/FlatCAMExcEditor.py:422 -#: flatcamEditors/FlatCAMGrbEditor.py:606 +#: flatcamEditors/FlatCAMExcEditor.py:448 +#: flatcamEditors/FlatCAMGrbEditor.py:1449 msgid "Click on reference location ..." msgstr "Klicken Sie auf die Referenzposition ..." -#: flatcamEditors/FlatCAMExcEditor.py:477 +#: flatcamEditors/FlatCAMExcEditor.py:503 msgid "[success] Done. Drill(s) Move completed." msgstr "[success] Erledigt. Bohrer Bewegen abgeschlossen." -#: flatcamEditors/FlatCAMExcEditor.py:530 +#: flatcamEditors/FlatCAMExcEditor.py:556 msgid "[success] Done. Drill(s) copied." msgstr "[success] Erledigt. Bohrer kopiert." -#: flatcamEditors/FlatCAMExcEditor.py:712 +#: flatcamEditors/FlatCAMExcEditor.py:754 msgid "Excellon Editor" msgstr "Excellon Editor" -#: flatcamEditors/FlatCAMExcEditor.py:719 -#: flatcamEditors/FlatCAMGrbEditor.py:840 +#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMGrbEditor.py:1705 msgid "Name:" msgstr "Name:" -#: flatcamEditors/FlatCAMExcEditor.py:739 flatcamTools/ToolNonCopperClear.py:72 +#: flatcamEditors/FlatCAMExcEditor.py:767 flatcamTools/ToolNonCopperClear.py:72 #: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 msgid "Tools Table" msgstr "Werkzeugtabelle" -#: flatcamEditors/FlatCAMExcEditor.py:741 flatcamGUI/ObjectUI.py:538 +#: flatcamEditors/FlatCAMExcEditor.py:769 flatcamGUI/ObjectUI.py:538 msgid "" "Tools in this Excellon object\n" "when are used for drilling." @@ -1805,11 +1832,11 @@ msgstr "" "Werkzeuge in diesem Excellon-Objekt\n" "Wann werden zum Bohren verwendet." -#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMExcEditor.py:789 msgid "Add/Delete Tool" msgstr "Werkzeug hinzufügen / löschen" -#: flatcamEditors/FlatCAMExcEditor.py:763 +#: flatcamEditors/FlatCAMExcEditor.py:791 msgid "" "Add/Delete a tool to the tool list\n" "for this Excellon object." @@ -1817,19 +1844,19 @@ msgstr "" "Werkzeug zur Werkzeugliste hinzufügen / löschen\n" "für dieses Excellon-Objekt." -#: flatcamEditors/FlatCAMExcEditor.py:771 flatcamTools/ToolCutOut.py:77 +#: flatcamEditors/FlatCAMExcEditor.py:799 flatcamTools/ToolCutOut.py:77 msgid "Tool Dia:" msgstr "Werkzeugdurchmesser:" -#: flatcamEditors/FlatCAMExcEditor.py:773 flatcamGUI/ObjectUI.py:975 +#: flatcamEditors/FlatCAMExcEditor.py:801 flatcamGUI/ObjectUI.py:975 msgid "Diameter for the new tool" msgstr "Durchmesser für das neue Werkzeug" -#: flatcamEditors/FlatCAMExcEditor.py:782 +#: flatcamEditors/FlatCAMExcEditor.py:810 msgid "Add Tool" msgstr "Werkzeug hinzufügen" -#: flatcamEditors/FlatCAMExcEditor.py:784 +#: flatcamEditors/FlatCAMExcEditor.py:812 msgid "" "Add a new tool to the tool list\n" "with the diameter specified above." @@ -1837,11 +1864,11 @@ msgstr "" "Fügen Sie der Werkzeugliste ein neues Werkzeug hinzu\n" "mit dem oben angegebenen Durchmesser." -#: flatcamEditors/FlatCAMExcEditor.py:794 +#: flatcamEditors/FlatCAMExcEditor.py:822 msgid "Delete Tool" msgstr "Werkzeug löschen" -#: flatcamEditors/FlatCAMExcEditor.py:796 +#: flatcamEditors/FlatCAMExcEditor.py:824 msgid "" "Delete a tool in the tool list\n" "by selecting a row in the tool table." @@ -1849,40 +1876,40 @@ msgstr "" "Löschen Sie ein Werkzeug in der Werkzeugliste\n" "indem Sie eine Zeile in der Werkzeugtabelle auswählen." -#: flatcamEditors/FlatCAMExcEditor.py:814 +#: flatcamEditors/FlatCAMExcEditor.py:842 msgid "Resize Drill(s)" msgstr "Größe der Bohrer ändern" -#: flatcamEditors/FlatCAMExcEditor.py:816 +#: flatcamEditors/FlatCAMExcEditor.py:844 msgid "Resize a drill or a selection of drills." msgstr "Ändern Sie die Größe eines Bohrers oder einer Auswahl von Bohrern." -#: flatcamEditors/FlatCAMExcEditor.py:823 +#: flatcamEditors/FlatCAMExcEditor.py:851 msgid "Resize Dia:" msgstr "Durchmesser ändern:" -#: flatcamEditors/FlatCAMExcEditor.py:825 +#: flatcamEditors/FlatCAMExcEditor.py:853 msgid "Diameter to resize to." msgstr "Durchmesser zur Größenänderung." -#: flatcamEditors/FlatCAMExcEditor.py:833 +#: flatcamEditors/FlatCAMExcEditor.py:861 msgid "Resize" msgstr "Größe ändern" -#: flatcamEditors/FlatCAMExcEditor.py:835 +#: flatcamEditors/FlatCAMExcEditor.py:863 msgid "Resize drill(s)" msgstr "Bohrer verkleinern" -#: flatcamEditors/FlatCAMExcEditor.py:857 flatcamGUI/FlatCAMGUI.py:1542 +#: flatcamEditors/FlatCAMExcEditor.py:885 flatcamGUI/FlatCAMGUI.py:1586 msgid "Add Drill Array" msgstr "Bohrer-Array hinzufügen" -#: flatcamEditors/FlatCAMExcEditor.py:859 +#: flatcamEditors/FlatCAMExcEditor.py:887 msgid "Add an array of drills (linear or circular array)" msgstr "" "Hinzufügen eines Arrays von Bohrern (lineares oder kreisförmiges Array)" -#: flatcamEditors/FlatCAMExcEditor.py:865 +#: flatcamEditors/FlatCAMExcEditor.py:893 msgid "" "Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular" @@ -1890,33 +1917,33 @@ msgstr "" "Wählen Sie den Typ des zu erstellenden Bohrfelds aus.\n" "Es kann lineares X (Y) oder rund sein" -#: flatcamEditors/FlatCAMExcEditor.py:868 -#: flatcamEditors/FlatCAMGrbEditor.py:1077 +#: flatcamEditors/FlatCAMExcEditor.py:896 +#: flatcamEditors/FlatCAMGrbEditor.py:1938 msgid "Linear" msgstr "Linear" -#: flatcamEditors/FlatCAMExcEditor.py:869 -#: flatcamEditors/FlatCAMGrbEditor.py:1078 +#: flatcamEditors/FlatCAMExcEditor.py:897 +#: flatcamEditors/FlatCAMGrbEditor.py:1939 msgid "Circular" msgstr "Kreisförmig" -#: flatcamEditors/FlatCAMExcEditor.py:876 +#: flatcamEditors/FlatCAMExcEditor.py:904 msgid "Nr of drills:" msgstr "Anzahl der Bohrer:" -#: flatcamEditors/FlatCAMExcEditor.py:878 +#: flatcamEditors/FlatCAMExcEditor.py:906 msgid "Specify how many drills to be in the array." msgstr "Geben Sie an, wie viele Drills im Array enthalten sein sollen." -#: flatcamEditors/FlatCAMExcEditor.py:895 -#: flatcamEditors/FlatCAMExcEditor.py:940 -#: flatcamEditors/FlatCAMGrbEditor.py:1104 -#: flatcamEditors/FlatCAMGrbEditor.py:1149 +#: flatcamEditors/FlatCAMExcEditor.py:923 +#: flatcamEditors/FlatCAMExcEditor.py:968 +#: flatcamEditors/FlatCAMGrbEditor.py:1965 +#: flatcamEditors/FlatCAMGrbEditor.py:2010 msgid "Direction:" msgstr "Richtung:" -#: flatcamEditors/FlatCAMExcEditor.py:897 -#: flatcamEditors/FlatCAMGrbEditor.py:1106 +#: flatcamEditors/FlatCAMExcEditor.py:925 +#: flatcamEditors/FlatCAMGrbEditor.py:1967 msgid "" "Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" @@ -1928,32 +1955,32 @@ msgstr "" "- 'Y' - vertikale Achse oder\n" "- 'Winkel' - ein benutzerdefinierter Winkel für die Neigung des Arrays" -#: flatcamEditors/FlatCAMExcEditor.py:906 -#: flatcamEditors/FlatCAMGrbEditor.py:1115 +#: flatcamEditors/FlatCAMExcEditor.py:934 +#: flatcamEditors/FlatCAMGrbEditor.py:1976 msgid "Angle" msgstr "Winkel" -#: flatcamEditors/FlatCAMExcEditor.py:910 -#: flatcamEditors/FlatCAMGrbEditor.py:1119 +#: flatcamEditors/FlatCAMExcEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:1980 msgid "Pitch:" msgstr "Abstand:" -#: flatcamEditors/FlatCAMExcEditor.py:912 -#: flatcamEditors/FlatCAMGrbEditor.py:1121 +#: flatcamEditors/FlatCAMExcEditor.py:940 +#: flatcamEditors/FlatCAMGrbEditor.py:1982 msgid "Pitch = Distance between elements of the array." msgstr "Abstand = Abstand zwischen Elementen des Arrays." -#: flatcamEditors/FlatCAMExcEditor.py:919 -#: flatcamEditors/FlatCAMExcEditor.py:955 -#: flatcamEditors/FlatCAMGeoEditor.py:663 -#: flatcamEditors/FlatCAMGrbEditor.py:1128 -#: flatcamEditors/FlatCAMGrbEditor.py:1164 -#: flatcamEditors/FlatCAMGrbEditor.py:2822 flatcamTools/ToolTransform.py:68 +#: flatcamEditors/FlatCAMExcEditor.py:947 +#: flatcamEditors/FlatCAMExcEditor.py:983 +#: flatcamEditors/FlatCAMGeoEditor.py:664 +#: flatcamEditors/FlatCAMGrbEditor.py:1989 +#: flatcamEditors/FlatCAMGrbEditor.py:2025 +#: flatcamEditors/FlatCAMGrbEditor.py:3833 flatcamTools/ToolTransform.py:68 msgid "Angle:" msgstr "Winkel:" -#: flatcamEditors/FlatCAMExcEditor.py:921 -#: flatcamEditors/FlatCAMGrbEditor.py:1130 +#: flatcamEditors/FlatCAMExcEditor.py:949 +#: flatcamEditors/FlatCAMGrbEditor.py:1991 msgid "" "Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" @@ -1965,8 +1992,8 @@ msgstr "" "Der Mindestwert beträgt -359,99 Grad.\n" "Maximalwert ist: 360.00 Grad." -#: flatcamEditors/FlatCAMExcEditor.py:942 -#: flatcamEditors/FlatCAMGrbEditor.py:1151 +#: flatcamEditors/FlatCAMExcEditor.py:970 +#: flatcamEditors/FlatCAMGrbEditor.py:2012 msgid "" "Direction for circular array.Can be CW = clockwise or CCW = counter " "clockwise." @@ -1974,13 +2001,13 @@ msgstr "" "Richtung für kreisförmige Anordnung. Kann CW = Uhrzeigersinn oder CCW = " "Gegenuhrzeigersinn sein." -#: flatcamEditors/FlatCAMExcEditor.py:957 -#: flatcamEditors/FlatCAMGrbEditor.py:1166 +#: flatcamEditors/FlatCAMExcEditor.py:985 +#: flatcamEditors/FlatCAMGrbEditor.py:2027 msgid "Angle at which each element in circular array is placed." msgstr "" "Winkel, um den jedes Element in einer kreisförmigen Anordnung platziert wird." -#: flatcamEditors/FlatCAMExcEditor.py:1413 +#: flatcamEditors/FlatCAMExcEditor.py:1447 msgid "" "[WARNING_NOTCL] Tool already in the original or actual tool list.\n" "Save and reedit Excellon if you need to add this tool. " @@ -1990,22 +2017,21 @@ msgstr "" "Speichern und korrigieren Sie Excellon, wenn Sie dieses Tool hinzufügen " "möchten." -#: flatcamEditors/FlatCAMExcEditor.py:1422 flatcamGUI/FlatCAMGUI.py:2888 +#: flatcamEditors/FlatCAMExcEditor.py:1456 flatcamGUI/FlatCAMGUI.py:2956 #, python-brace-format msgid "[success] Added new tool with dia: {dia} {units}" msgstr "[success] Neues Werkzeug mit Durchmesser hinzugefügt: {dia} {units}" -#: flatcamEditors/FlatCAMExcEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:1638 +#: flatcamEditors/FlatCAMExcEditor.py:1488 msgid "[WARNING_NOTCL] Select a tool in Tool Table" msgstr "[WARNING_NOTCL] Wählen Sie ein Werkzeug in der Werkzeugtabelle aus" -#: flatcamEditors/FlatCAMExcEditor.py:1486 +#: flatcamEditors/FlatCAMExcEditor.py:1521 #, python-brace-format msgid "[success] Deleted tool with dia: {del_dia} {units}" msgstr "[success] Gelöschtes Werkzeug mit Durchmesser: {del_dia} {units}" -#: flatcamEditors/FlatCAMExcEditor.py:1924 +#: flatcamEditors/FlatCAMExcEditor.py:1974 msgid "" "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " "creation." @@ -2013,36 +2039,38 @@ msgstr "" "[ERROR_NOTCL] Die Datei enthält keine Werkzeugdefinitionen. Abbruch der " "Excellon-Erstellung." -#: flatcamEditors/FlatCAMExcEditor.py:1933 +#: flatcamEditors/FlatCAMExcEditor.py:1983 msgid "Creating Excellon." msgstr "Excellon erstellen." -#: flatcamEditors/FlatCAMExcEditor.py:1942 +#: flatcamEditors/FlatCAMExcEditor.py:1992 msgid "[success] Excellon editing finished." msgstr "[success] Excellon-Bearbeitung abgeschlossen." -#: flatcamEditors/FlatCAMExcEditor.py:1959 +#: flatcamEditors/FlatCAMExcEditor.py:2009 msgid "[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected" msgstr "[WARNING_NOTCL] Abgebrochen. Es ist kein Werkzeug / Bohrer ausgewählt" -#: flatcamEditors/FlatCAMExcEditor.py:2458 +#: flatcamEditors/FlatCAMExcEditor.py:2508 msgid "[success] Done. Drill(s) deleted." msgstr "[success] Erledigt. Bohrer gelöscht." -#: flatcamEditors/FlatCAMExcEditor.py:2528 -#: flatcamEditors/FlatCAMGrbEditor.py:2619 +#: flatcamEditors/FlatCAMExcEditor.py:2578 +#: flatcamEditors/FlatCAMGrbEditor.py:3621 msgid "Click on the circular array Center position" msgstr "Klicken Sie auf die kreisförmige Anordnung in der Mitte" -#: flatcamEditors/FlatCAMGeoEditor.py:77 flatcamEditors/FlatCAMGrbEditor.py:994 +#: flatcamEditors/FlatCAMGeoEditor.py:78 +#: flatcamEditors/FlatCAMGrbEditor.py:1855 msgid "Buffer distance:" msgstr "Pufferabstand:" -#: flatcamEditors/FlatCAMGeoEditor.py:78 flatcamEditors/FlatCAMGrbEditor.py:995 +#: flatcamEditors/FlatCAMGeoEditor.py:79 +#: flatcamEditors/FlatCAMGrbEditor.py:1856 msgid "Buffer corner:" msgstr "Pufferecke:" -#: flatcamEditors/FlatCAMGeoEditor.py:80 +#: flatcamEditors/FlatCAMGeoEditor.py:81 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded for exterior buffer.\n" @@ -2057,45 +2085,45 @@ msgstr "" "  - 'Abgeschrägt:' Die Ecke ist eine Linie, die die Features, die sich in " "der Ecke treffen, direkt verbindet" -#: flatcamEditors/FlatCAMGeoEditor.py:86 -#: flatcamEditors/FlatCAMGrbEditor.py:1003 +#: flatcamEditors/FlatCAMGeoEditor.py:87 +#: flatcamEditors/FlatCAMGrbEditor.py:1864 msgid "Round" msgstr "Runden" -#: flatcamEditors/FlatCAMGeoEditor.py:87 -#: flatcamEditors/FlatCAMGrbEditor.py:1004 +#: flatcamEditors/FlatCAMGeoEditor.py:88 +#: flatcamEditors/FlatCAMGrbEditor.py:1865 msgid "Square" msgstr "Quadrat" -#: flatcamEditors/FlatCAMGeoEditor.py:88 -#: flatcamEditors/FlatCAMGrbEditor.py:1005 +#: flatcamEditors/FlatCAMGeoEditor.py:89 +#: flatcamEditors/FlatCAMGrbEditor.py:1866 msgid "Beveled" msgstr "Abgeschrägt" -#: flatcamEditors/FlatCAMGeoEditor.py:95 +#: flatcamEditors/FlatCAMGeoEditor.py:96 msgid "Buffer Interior" msgstr "Pufferinnenraum" -#: flatcamEditors/FlatCAMGeoEditor.py:97 +#: flatcamEditors/FlatCAMGeoEditor.py:98 msgid "Buffer Exterior" msgstr "Puffer außen" -#: flatcamEditors/FlatCAMGeoEditor.py:103 +#: flatcamEditors/FlatCAMGeoEditor.py:104 msgid "Full Buffer" msgstr "Voller Puffer" -#: flatcamEditors/FlatCAMGeoEditor.py:124 -#: flatcamEditors/FlatCAMGeoEditor.py:2505 +#: flatcamEditors/FlatCAMGeoEditor.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:2594 msgid "Buffer Tool" msgstr "Pufferwerkzeug" -#: flatcamEditors/FlatCAMGeoEditor.py:135 -#: flatcamEditors/FlatCAMGeoEditor.py:152 -#: flatcamEditors/FlatCAMGeoEditor.py:169 -#: flatcamEditors/FlatCAMGeoEditor.py:2523 -#: flatcamEditors/FlatCAMGeoEditor.py:2549 -#: flatcamEditors/FlatCAMGeoEditor.py:2575 -#: flatcamEditors/FlatCAMGrbEditor.py:2662 +#: flatcamEditors/FlatCAMGeoEditor.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:153 +#: flatcamEditors/FlatCAMGeoEditor.py:170 +#: flatcamEditors/FlatCAMGeoEditor.py:2612 +#: flatcamEditors/FlatCAMGeoEditor.py:2638 +#: flatcamEditors/FlatCAMGeoEditor.py:2664 +#: flatcamEditors/FlatCAMGrbEditor.py:3673 msgid "" "[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " "retry." @@ -2103,21 +2131,21 @@ msgstr "" "[WARNING_NOTCL] Pufferabstandswert fehlt oder falsches Format. Fügen Sie es " "hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGeoEditor.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:341 msgid "Text Tool" msgstr "Textwerkzeug" -#: flatcamEditors/FlatCAMGeoEditor.py:398 flatcamGUI/FlatCAMGUI.py:764 +#: flatcamEditors/FlatCAMGeoEditor.py:399 flatcamGUI/FlatCAMGUI.py:776 msgid "Tool" msgstr "Werkzeug" -#: flatcamEditors/FlatCAMGeoEditor.py:429 flatcamGUI/FlatCAMGUI.py:3833 -#: flatcamGUI/FlatCAMGUI.py:5039 flatcamGUI/FlatCAMGUI.py:5315 -#: flatcamGUI/FlatCAMGUI.py:5455 flatcamGUI/ObjectUI.py:260 +#: flatcamEditors/FlatCAMGeoEditor.py:430 flatcamGUI/FlatCAMGUI.py:3922 +#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5544 flatcamGUI/ObjectUI.py:260 msgid "Tool dia:" msgstr "Werkzeugdurchmesser:" -#: flatcamEditors/FlatCAMGeoEditor.py:431 flatcamGUI/FlatCAMGUI.py:5457 +#: flatcamEditors/FlatCAMGeoEditor.py:432 flatcamGUI/FlatCAMGUI.py:5546 msgid "" "Diameter of the tool to\n" "be used in the operation." @@ -2125,13 +2153,13 @@ msgstr "" "Durchmesser des Werkzeugs bis\n" "in der Operation verwendet werden." -#: flatcamEditors/FlatCAMGeoEditor.py:440 flatcamGUI/FlatCAMGUI.py:5221 -#: flatcamGUI/FlatCAMGUI.py:5466 flatcamTools/ToolNonCopperClear.py:165 +#: flatcamEditors/FlatCAMGeoEditor.py:441 flatcamGUI/FlatCAMGUI.py:5310 +#: flatcamGUI/FlatCAMGUI.py:5555 flatcamTools/ToolNonCopperClear.py:165 #: flatcamTools/ToolPaint.py:160 msgid "Overlap Rate:" msgstr "Überlappungsrate:" -#: flatcamEditors/FlatCAMGeoEditor.py:442 flatcamTools/ToolPaint.py:162 +#: flatcamEditors/FlatCAMGeoEditor.py:443 flatcamTools/ToolPaint.py:162 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -2160,14 +2188,14 @@ msgstr "" "Höhere Werte = langsame Bearbeitung und langsame Ausführung auf CNC\n" "wegen zu vieler Wege." -#: flatcamEditors/FlatCAMGeoEditor.py:458 flatcamGUI/FlatCAMGUI.py:5237 -#: flatcamGUI/FlatCAMGUI.py:5323 flatcamGUI/FlatCAMGUI.py:5476 +#: flatcamEditors/FlatCAMGeoEditor.py:459 flatcamGUI/FlatCAMGUI.py:5326 +#: flatcamGUI/FlatCAMGUI.py:5412 flatcamGUI/FlatCAMGUI.py:5565 #: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:181 #: flatcamTools/ToolPaint.py:177 msgid "Margin:" msgstr "Marge:" -#: flatcamEditors/FlatCAMGeoEditor.py:460 flatcamGUI/FlatCAMGUI.py:5478 +#: flatcamEditors/FlatCAMGeoEditor.py:461 flatcamGUI/FlatCAMGUI.py:5567 #: flatcamTools/ToolPaint.py:179 msgid "" "Distance by which to avoid\n" @@ -2178,13 +2206,13 @@ msgstr "" "die Kanten des Polygons bis\n" "gemalt werden." -#: flatcamEditors/FlatCAMGeoEditor.py:469 flatcamGUI/FlatCAMGUI.py:5246 -#: flatcamGUI/FlatCAMGUI.py:5487 flatcamTools/ToolNonCopperClear.py:190 +#: flatcamEditors/FlatCAMGeoEditor.py:470 flatcamGUI/FlatCAMGUI.py:5335 +#: flatcamGUI/FlatCAMGUI.py:5576 flatcamTools/ToolNonCopperClear.py:190 #: flatcamTools/ToolPaint.py:188 msgid "Method:" msgstr "Methode:" -#: flatcamEditors/FlatCAMGeoEditor.py:471 flatcamGUI/FlatCAMGUI.py:5489 +#: flatcamEditors/FlatCAMGeoEditor.py:472 flatcamGUI/FlatCAMGUI.py:5578 msgid "" "Algorithm to paint the polygon:
Standard: Fixed step inwards." "
Seed-based: Outwards from seed." @@ -2192,29 +2220,29 @@ msgstr "" "Algorithmus zum Malen des Polygons:
Standard: Feststehender " "Schritt nach innen.
Samenbasiert: Aus dem Samen heraus." -#: flatcamEditors/FlatCAMGeoEditor.py:477 flatcamGUI/FlatCAMGUI.py:5255 -#: flatcamGUI/FlatCAMGUI.py:5495 +#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5584 msgid "Standard" msgstr "Standard" -#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5256 -#: flatcamGUI/FlatCAMGUI.py:5496 +#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5345 +#: flatcamGUI/FlatCAMGUI.py:5585 msgid "Seed-based" msgstr "Samenbasiert" -#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5257 -#: flatcamGUI/FlatCAMGUI.py:5497 +#: flatcamEditors/FlatCAMGeoEditor.py:480 flatcamGUI/FlatCAMGUI.py:5346 +#: flatcamGUI/FlatCAMGUI.py:5586 msgid "Straight lines" msgstr "Gerade Linien" -#: flatcamEditors/FlatCAMGeoEditor.py:484 flatcamGUI/FlatCAMGUI.py:5262 -#: flatcamGUI/FlatCAMGUI.py:5502 flatcamTools/ToolNonCopperClear.py:206 +#: flatcamEditors/FlatCAMGeoEditor.py:485 flatcamGUI/FlatCAMGUI.py:5351 +#: flatcamGUI/FlatCAMGUI.py:5591 flatcamTools/ToolNonCopperClear.py:206 #: flatcamTools/ToolPaint.py:204 msgid "Connect:" msgstr "Verbinden:" -#: flatcamEditors/FlatCAMGeoEditor.py:486 flatcamGUI/FlatCAMGUI.py:5264 -#: flatcamGUI/FlatCAMGUI.py:5504 flatcamTools/ToolNonCopperClear.py:208 +#: flatcamEditors/FlatCAMGeoEditor.py:487 flatcamGUI/FlatCAMGUI.py:5353 +#: flatcamGUI/FlatCAMGUI.py:5593 flatcamTools/ToolNonCopperClear.py:208 #: flatcamTools/ToolPaint.py:206 msgid "" "Draw lines between resulting\n" @@ -2223,14 +2251,14 @@ msgstr "" "Zeichnen Sie Linien zwischen den Ergebnissen\n" "Segmente, um Werkzeuglifte zu minimieren." -#: flatcamEditors/FlatCAMGeoEditor.py:493 flatcamGUI/FlatCAMGUI.py:5271 -#: flatcamGUI/FlatCAMGUI.py:5512 flatcamTools/ToolNonCopperClear.py:215 +#: flatcamEditors/FlatCAMGeoEditor.py:494 flatcamGUI/FlatCAMGUI.py:5360 +#: flatcamGUI/FlatCAMGUI.py:5601 flatcamTools/ToolNonCopperClear.py:215 #: flatcamTools/ToolPaint.py:213 msgid "Contour:" msgstr "Kontur:" -#: flatcamEditors/FlatCAMGeoEditor.py:495 flatcamGUI/FlatCAMGUI.py:5273 -#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolNonCopperClear.py:217 +#: flatcamEditors/FlatCAMGeoEditor.py:496 flatcamGUI/FlatCAMGUI.py:5362 +#: flatcamGUI/FlatCAMGUI.py:5603 flatcamTools/ToolNonCopperClear.py:217 #: flatcamTools/ToolPaint.py:215 msgid "" "Cut around the perimeter of the polygon\n" @@ -2239,21 +2267,21 @@ msgstr "" "Schneiden Sie um den Umfang des Polygons herum\n" "Ecken und Kanten schneiden." -#: flatcamEditors/FlatCAMGeoEditor.py:507 +#: flatcamEditors/FlatCAMGeoEditor.py:508 msgid "Paint" msgstr "Malen" -#: flatcamEditors/FlatCAMGeoEditor.py:525 flatcamGUI/FlatCAMGUI.py:629 -#: flatcamGUI/FlatCAMGUI.py:1796 flatcamGUI/ObjectUI.py:1308 -#: flatcamTools/ToolPaint.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:526 flatcamGUI/FlatCAMGUI.py:635 +#: flatcamGUI/FlatCAMGUI.py:1840 flatcamGUI/ObjectUI.py:1308 +#: flatcamTools/ToolPaint.py:341 msgid "Paint Tool" msgstr "Werkzeug Malen" -#: flatcamEditors/FlatCAMGeoEditor.py:561 +#: flatcamEditors/FlatCAMGeoEditor.py:562 msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." msgstr "[WARNING_NOTCL] Farbe abgebrochen. Keine Form ausgewählt" -#: flatcamEditors/FlatCAMGeoEditor.py:572 flatcamTools/ToolCutOut.py:352 +#: flatcamEditors/FlatCAMGeoEditor.py:573 flatcamTools/ToolCutOut.py:352 #: flatcamTools/ToolCutOut.py:496 flatcamTools/ToolCutOut.py:616 #: flatcamTools/ToolCutOut.py:721 flatcamTools/ToolDblSided.py:363 msgid "" @@ -2263,14 +2291,14 @@ msgstr "" "[WARNING_NOTCL] Werkzeugdurchmesserwert fehlt oder falsches Format. Fügen " "Sie es hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGeoEditor.py:583 +#: flatcamEditors/FlatCAMGeoEditor.py:584 msgid "" "[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." msgstr "" "[WARNING_NOTCL] Überlappungswert fehlt oder falsches Format. Fügen Sie es " "hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGeoEditor.py:595 +#: flatcamEditors/FlatCAMGeoEditor.py:596 msgid "" "[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " "retry." @@ -2278,63 +2306,63 @@ msgstr "" "[WARNING_NOTCL] Randabstandswert fehlt oder falsches Format. Fügen Sie es " "hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGeoEditor.py:604 -#: flatcamEditors/FlatCAMGeoEditor.py:2530 -#: flatcamEditors/FlatCAMGeoEditor.py:2556 -#: flatcamEditors/FlatCAMGeoEditor.py:2582 flatcamTools/ToolMeasurement.py:202 -#: flatcamTools/ToolNonCopperClear.py:812 flatcamTools/ToolProperties.py:104 +#: flatcamEditors/FlatCAMGeoEditor.py:605 +#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2645 +#: flatcamEditors/FlatCAMGeoEditor.py:2671 +#: flatcamTools/ToolNonCopperClear.py:813 flatcamTools/ToolProperties.py:104 msgid "Tools" msgstr "Werkzeuge" -#: flatcamEditors/FlatCAMGeoEditor.py:615 -#: flatcamEditors/FlatCAMGeoEditor.py:988 -#: flatcamEditors/FlatCAMGrbEditor.py:2774 -#: flatcamEditors/FlatCAMGrbEditor.py:3158 flatcamGUI/FlatCAMGUI.py:638 -#: flatcamGUI/FlatCAMGUI.py:1807 flatcamTools/ToolTransform.py:398 +#: flatcamEditors/FlatCAMGeoEditor.py:616 +#: flatcamEditors/FlatCAMGeoEditor.py:989 +#: flatcamEditors/FlatCAMGrbEditor.py:3785 +#: flatcamEditors/FlatCAMGrbEditor.py:4169 flatcamGUI/FlatCAMGUI.py:644 +#: flatcamGUI/FlatCAMGUI.py:1851 flatcamTools/ToolTransform.py:398 msgid "Transform Tool" msgstr "Werkzeug Umwandeln" -#: flatcamEditors/FlatCAMGeoEditor.py:616 -#: flatcamEditors/FlatCAMGeoEditor.py:677 -#: flatcamEditors/FlatCAMGrbEditor.py:2775 -#: flatcamEditors/FlatCAMGrbEditor.py:2836 flatcamTools/ToolTransform.py:24 +#: flatcamEditors/FlatCAMGeoEditor.py:617 +#: flatcamEditors/FlatCAMGeoEditor.py:678 +#: flatcamEditors/FlatCAMGrbEditor.py:3786 +#: flatcamEditors/FlatCAMGrbEditor.py:3847 flatcamTools/ToolTransform.py:24 #: flatcamTools/ToolTransform.py:82 msgid "Rotate" msgstr "Drehen" -#: flatcamEditors/FlatCAMGeoEditor.py:617 -#: flatcamEditors/FlatCAMGrbEditor.py:2776 flatcamTools/ToolTransform.py:25 +#: flatcamEditors/FlatCAMGeoEditor.py:618 +#: flatcamEditors/FlatCAMGrbEditor.py:3787 flatcamTools/ToolTransform.py:25 msgid "Skew/Shear" msgstr "Neigung/Schere" -#: flatcamEditors/FlatCAMGeoEditor.py:618 -#: flatcamEditors/FlatCAMGrbEditor.py:1049 -#: flatcamEditors/FlatCAMGrbEditor.py:2777 flatcamGUI/FlatCAMGUI.py:696 -#: flatcamGUI/FlatCAMGUI.py:1868 flatcamGUI/ObjectUI.py:100 +#: flatcamEditors/FlatCAMGeoEditor.py:619 +#: flatcamEditors/FlatCAMGrbEditor.py:1910 +#: flatcamEditors/FlatCAMGrbEditor.py:3788 flatcamGUI/FlatCAMGUI.py:708 +#: flatcamGUI/FlatCAMGUI.py:1912 flatcamGUI/ObjectUI.py:100 #: flatcamTools/ToolTransform.py:26 msgid "Scale" msgstr "Skalieren" -#: flatcamEditors/FlatCAMGeoEditor.py:619 -#: flatcamEditors/FlatCAMGrbEditor.py:2778 flatcamTools/ToolTransform.py:27 +#: flatcamEditors/FlatCAMGeoEditor.py:620 +#: flatcamEditors/FlatCAMGrbEditor.py:3789 flatcamTools/ToolTransform.py:27 msgid "Mirror (Flip)" msgstr "Spiegeln (Flip)" -#: flatcamEditors/FlatCAMGeoEditor.py:620 -#: flatcamEditors/FlatCAMGrbEditor.py:2779 flatcamGUI/ObjectUI.py:127 +#: flatcamEditors/FlatCAMGeoEditor.py:621 +#: flatcamEditors/FlatCAMGrbEditor.py:3790 flatcamGUI/ObjectUI.py:127 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 #: flatcamTools/ToolTransform.py:28 msgid "Offset" msgstr "Versatz" -#: flatcamEditors/FlatCAMGeoEditor.py:631 -#: flatcamEditors/FlatCAMGrbEditor.py:2790 +#: flatcamEditors/FlatCAMGeoEditor.py:632 +#: flatcamEditors/FlatCAMGrbEditor.py:3801 #, python-format msgid "Editor %s" msgstr "Editor %s" -#: flatcamEditors/FlatCAMGeoEditor.py:665 -#: flatcamEditors/FlatCAMGrbEditor.py:2824 flatcamTools/ToolTransform.py:70 +#: flatcamEditors/FlatCAMGeoEditor.py:666 +#: flatcamEditors/FlatCAMGrbEditor.py:3835 flatcamTools/ToolTransform.py:70 msgid "" "Angle for Rotation action, in degrees.\n" "Float number between -360 and 359.\n" @@ -2346,8 +2374,8 @@ msgstr "" "Positive Zahlen für CW-Bewegung.\n" "Negative Zahlen für CCW-Bewegung." -#: flatcamEditors/FlatCAMGeoEditor.py:679 -#: flatcamEditors/FlatCAMGrbEditor.py:2838 +#: flatcamEditors/FlatCAMGeoEditor.py:680 +#: flatcamEditors/FlatCAMGrbEditor.py:3849 msgid "" "Rotate the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2357,15 +2385,15 @@ msgstr "" "Der Bezugspunkt ist die Mitte von\n" "der Begrenzungsrahmen für alle ausgewählten Formen." -#: flatcamEditors/FlatCAMGeoEditor.py:702 -#: flatcamEditors/FlatCAMGrbEditor.py:2861 flatcamTools/ToolTransform.py:107 +#: flatcamEditors/FlatCAMGeoEditor.py:703 +#: flatcamEditors/FlatCAMGrbEditor.py:3872 flatcamTools/ToolTransform.py:107 msgid "Angle X:" msgstr "Winkel X:" -#: flatcamEditors/FlatCAMGeoEditor.py:704 -#: flatcamEditors/FlatCAMGeoEditor.py:722 -#: flatcamEditors/FlatCAMGrbEditor.py:2863 -#: flatcamEditors/FlatCAMGrbEditor.py:2881 flatcamTools/ToolTransform.py:109 +#: flatcamEditors/FlatCAMGeoEditor.py:705 +#: flatcamEditors/FlatCAMGeoEditor.py:723 +#: flatcamEditors/FlatCAMGrbEditor.py:3874 +#: flatcamEditors/FlatCAMGrbEditor.py:3892 flatcamTools/ToolTransform.py:109 #: flatcamTools/ToolTransform.py:127 msgid "" "Angle for Skew action, in degrees.\n" @@ -2374,15 +2402,15 @@ msgstr "" "Winkel für die Schräglage in Grad.\n" "Float-Nummer zwischen -360 und 359." -#: flatcamEditors/FlatCAMGeoEditor.py:713 -#: flatcamEditors/FlatCAMGrbEditor.py:2872 flatcamTools/ToolTransform.py:118 +#: flatcamEditors/FlatCAMGeoEditor.py:714 +#: flatcamEditors/FlatCAMGrbEditor.py:3883 flatcamTools/ToolTransform.py:118 msgid "Skew X" msgstr "Neigung X" -#: flatcamEditors/FlatCAMGeoEditor.py:715 -#: flatcamEditors/FlatCAMGeoEditor.py:733 -#: flatcamEditors/FlatCAMGrbEditor.py:2874 -#: flatcamEditors/FlatCAMGrbEditor.py:2892 +#: flatcamEditors/FlatCAMGeoEditor.py:716 +#: flatcamEditors/FlatCAMGeoEditor.py:734 +#: flatcamEditors/FlatCAMGrbEditor.py:3885 +#: flatcamEditors/FlatCAMGrbEditor.py:3903 msgid "" "Skew/shear the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2392,35 +2420,35 @@ msgstr "" "Der Bezugspunkt ist die Mitte von\n" "der Begrenzungsrahmen für alle ausgewählten Formen." -#: flatcamEditors/FlatCAMGeoEditor.py:720 -#: flatcamEditors/FlatCAMGrbEditor.py:2879 flatcamTools/ToolTransform.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:721 +#: flatcamEditors/FlatCAMGrbEditor.py:3890 flatcamTools/ToolTransform.py:125 msgid "Angle Y:" msgstr "Winkel Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:731 -#: flatcamEditors/FlatCAMGrbEditor.py:2890 flatcamTools/ToolTransform.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:732 +#: flatcamEditors/FlatCAMGrbEditor.py:3901 flatcamTools/ToolTransform.py:136 msgid "Skew Y" msgstr "Neigung Y" -#: flatcamEditors/FlatCAMGeoEditor.py:759 -#: flatcamEditors/FlatCAMGrbEditor.py:2918 flatcamTools/ToolTransform.py:164 +#: flatcamEditors/FlatCAMGeoEditor.py:760 +#: flatcamEditors/FlatCAMGrbEditor.py:3929 flatcamTools/ToolTransform.py:164 msgid "Factor X:" msgstr "Faktor X:" -#: flatcamEditors/FlatCAMGeoEditor.py:761 -#: flatcamEditors/FlatCAMGrbEditor.py:2920 flatcamTools/ToolTransform.py:166 +#: flatcamEditors/FlatCAMGeoEditor.py:762 +#: flatcamEditors/FlatCAMGrbEditor.py:3931 flatcamTools/ToolTransform.py:166 msgid "Factor for Scale action over X axis." msgstr "Faktor für die Skalierungsaktion über der X-Achse." -#: flatcamEditors/FlatCAMGeoEditor.py:769 -#: flatcamEditors/FlatCAMGrbEditor.py:2928 flatcamTools/ToolTransform.py:174 +#: flatcamEditors/FlatCAMGeoEditor.py:770 +#: flatcamEditors/FlatCAMGrbEditor.py:3939 flatcamTools/ToolTransform.py:174 msgid "Scale X" msgstr "Maßstab X" -#: flatcamEditors/FlatCAMGeoEditor.py:771 -#: flatcamEditors/FlatCAMGeoEditor.py:788 -#: flatcamEditors/FlatCAMGrbEditor.py:2930 -#: flatcamEditors/FlatCAMGrbEditor.py:2947 +#: flatcamEditors/FlatCAMGeoEditor.py:772 +#: flatcamEditors/FlatCAMGeoEditor.py:789 +#: flatcamEditors/FlatCAMGrbEditor.py:3941 +#: flatcamEditors/FlatCAMGrbEditor.py:3958 msgid "" "Scale the selected shape(s).\n" "The point of reference depends on \n" @@ -2430,29 +2458,29 @@ msgstr "" "Der Bezugspunkt hängt von ab\n" "das Kontrollkästchen Skalenreferenz." -#: flatcamEditors/FlatCAMGeoEditor.py:776 -#: flatcamEditors/FlatCAMGrbEditor.py:2935 flatcamTools/ToolTransform.py:181 +#: flatcamEditors/FlatCAMGeoEditor.py:777 +#: flatcamEditors/FlatCAMGrbEditor.py:3946 flatcamTools/ToolTransform.py:181 msgid "Factor Y:" msgstr "Faktor Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:778 -#: flatcamEditors/FlatCAMGrbEditor.py:2937 flatcamTools/ToolTransform.py:183 +#: flatcamEditors/FlatCAMGeoEditor.py:779 +#: flatcamEditors/FlatCAMGrbEditor.py:3948 flatcamTools/ToolTransform.py:183 msgid "Factor for Scale action over Y axis." msgstr "Faktor für die Skalierungsaktion über der Y-Achse." -#: flatcamEditors/FlatCAMGeoEditor.py:786 -#: flatcamEditors/FlatCAMGrbEditor.py:2945 flatcamTools/ToolTransform.py:191 +#: flatcamEditors/FlatCAMGeoEditor.py:787 +#: flatcamEditors/FlatCAMGrbEditor.py:3956 flatcamTools/ToolTransform.py:191 msgid "Scale Y" msgstr "Maßstab Y" -#: flatcamEditors/FlatCAMGeoEditor.py:795 -#: flatcamEditors/FlatCAMGrbEditor.py:2954 flatcamGUI/FlatCAMGUI.py:5861 +#: flatcamEditors/FlatCAMGeoEditor.py:796 +#: flatcamEditors/FlatCAMGrbEditor.py:3965 flatcamGUI/FlatCAMGUI.py:5950 #: flatcamTools/ToolTransform.py:200 msgid "Link" msgstr "Verknüpfung" -#: flatcamEditors/FlatCAMGeoEditor.py:797 -#: flatcamEditors/FlatCAMGrbEditor.py:2956 +#: flatcamEditors/FlatCAMGeoEditor.py:798 +#: flatcamEditors/FlatCAMGrbEditor.py:3967 msgid "" "Scale the selected shape(s)\n" "using the Scale Factor X for both axis." @@ -2460,14 +2488,14 @@ msgstr "" "Skalieren der ausgewählten Form (en)\n" "Verwenden des Skalierungsfaktors X für beide Achsen." -#: flatcamEditors/FlatCAMGeoEditor.py:803 -#: flatcamEditors/FlatCAMGrbEditor.py:2962 flatcamGUI/FlatCAMGUI.py:5869 +#: flatcamEditors/FlatCAMGeoEditor.py:804 +#: flatcamEditors/FlatCAMGrbEditor.py:3973 flatcamGUI/FlatCAMGUI.py:5958 #: flatcamTools/ToolTransform.py:208 msgid "Scale Reference" msgstr "Skalenreferenz" -#: flatcamEditors/FlatCAMGeoEditor.py:805 -#: flatcamEditors/FlatCAMGrbEditor.py:2964 +#: flatcamEditors/FlatCAMGeoEditor.py:806 +#: flatcamEditors/FlatCAMGrbEditor.py:3975 msgid "" "Scale the selected shape(s)\n" "using the origin reference when checked,\n" @@ -2479,25 +2507,25 @@ msgstr "" "und die Mitte der größten Begrenzungsbox\n" "der ausgewählten Formen, wenn nicht markiert." -#: flatcamEditors/FlatCAMGeoEditor.py:833 -#: flatcamEditors/FlatCAMGrbEditor.py:2993 flatcamTools/ToolTransform.py:238 +#: flatcamEditors/FlatCAMGeoEditor.py:834 +#: flatcamEditors/FlatCAMGrbEditor.py:4004 flatcamTools/ToolTransform.py:238 msgid "Value X:" msgstr "Wert X:" -#: flatcamEditors/FlatCAMGeoEditor.py:835 -#: flatcamEditors/FlatCAMGrbEditor.py:2995 flatcamTools/ToolTransform.py:240 +#: flatcamEditors/FlatCAMGeoEditor.py:836 +#: flatcamEditors/FlatCAMGrbEditor.py:4006 flatcamTools/ToolTransform.py:240 msgid "Value for Offset action on X axis." msgstr "Wert für die Offset-Aktion auf der X-Achse." -#: flatcamEditors/FlatCAMGeoEditor.py:843 -#: flatcamEditors/FlatCAMGrbEditor.py:3003 flatcamTools/ToolTransform.py:248 +#: flatcamEditors/FlatCAMGeoEditor.py:844 +#: flatcamEditors/FlatCAMGrbEditor.py:4014 flatcamTools/ToolTransform.py:248 msgid "Offset X" msgstr "Versatz X" -#: flatcamEditors/FlatCAMGeoEditor.py:845 -#: flatcamEditors/FlatCAMGeoEditor.py:863 -#: flatcamEditors/FlatCAMGrbEditor.py:3005 -#: flatcamEditors/FlatCAMGrbEditor.py:3023 +#: flatcamEditors/FlatCAMGeoEditor.py:846 +#: flatcamEditors/FlatCAMGeoEditor.py:864 +#: flatcamEditors/FlatCAMGrbEditor.py:4016 +#: flatcamEditors/FlatCAMGrbEditor.py:4034 msgid "" "Offset the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2507,30 +2535,30 @@ msgstr "" "Der Bezugspunkt ist die Mitte von\n" "der Begrenzungsrahmen für alle ausgewählten Formen.\n" -#: flatcamEditors/FlatCAMGeoEditor.py:851 -#: flatcamEditors/FlatCAMGrbEditor.py:3011 flatcamTools/ToolTransform.py:255 +#: flatcamEditors/FlatCAMGeoEditor.py:852 +#: flatcamEditors/FlatCAMGrbEditor.py:4022 flatcamTools/ToolTransform.py:255 msgid "Value Y:" msgstr "Wert Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:853 -#: flatcamEditors/FlatCAMGrbEditor.py:3013 flatcamTools/ToolTransform.py:257 +#: flatcamEditors/FlatCAMGeoEditor.py:854 +#: flatcamEditors/FlatCAMGrbEditor.py:4024 flatcamTools/ToolTransform.py:257 msgid "Value for Offset action on Y axis." msgstr "Wert für die Offset-Aktion auf der Y-Achse." -#: flatcamEditors/FlatCAMGeoEditor.py:861 -#: flatcamEditors/FlatCAMGrbEditor.py:3021 flatcamTools/ToolTransform.py:265 +#: flatcamEditors/FlatCAMGeoEditor.py:862 +#: flatcamEditors/FlatCAMGrbEditor.py:4032 flatcamTools/ToolTransform.py:265 msgid "Offset Y" msgstr "Versatz Y" -#: flatcamEditors/FlatCAMGeoEditor.py:892 -#: flatcamEditors/FlatCAMGrbEditor.py:3052 flatcamTools/ToolTransform.py:295 +#: flatcamEditors/FlatCAMGeoEditor.py:893 +#: flatcamEditors/FlatCAMGrbEditor.py:4063 flatcamTools/ToolTransform.py:295 msgid "Flip on X" msgstr "Flip auf X" -#: flatcamEditors/FlatCAMGeoEditor.py:894 -#: flatcamEditors/FlatCAMGeoEditor.py:902 -#: flatcamEditors/FlatCAMGrbEditor.py:3054 -#: flatcamEditors/FlatCAMGrbEditor.py:3062 +#: flatcamEditors/FlatCAMGeoEditor.py:895 +#: flatcamEditors/FlatCAMGeoEditor.py:903 +#: flatcamEditors/FlatCAMGrbEditor.py:4065 +#: flatcamEditors/FlatCAMGrbEditor.py:4073 msgid "" "Flip the selected shape(s) over the X axis.\n" "Does not create a new shape." @@ -2538,18 +2566,18 @@ msgstr "" "Kippen Sie die ausgewählte Form (en) über die X-Achse.\n" "Erzeugt keine neue Form." -#: flatcamEditors/FlatCAMGeoEditor.py:900 -#: flatcamEditors/FlatCAMGrbEditor.py:3060 flatcamTools/ToolTransform.py:303 +#: flatcamEditors/FlatCAMGeoEditor.py:901 +#: flatcamEditors/FlatCAMGrbEditor.py:4071 flatcamTools/ToolTransform.py:303 msgid "Flip on Y" msgstr "Flip auf Y" -#: flatcamEditors/FlatCAMGeoEditor.py:909 -#: flatcamEditors/FlatCAMGrbEditor.py:3069 flatcamTools/ToolTransform.py:312 +#: flatcamEditors/FlatCAMGeoEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:4080 flatcamTools/ToolTransform.py:312 msgid "Ref Pt" msgstr "Ref. Pt" -#: flatcamEditors/FlatCAMGeoEditor.py:911 -#: flatcamEditors/FlatCAMGrbEditor.py:3071 +#: flatcamEditors/FlatCAMGeoEditor.py:912 +#: flatcamEditors/FlatCAMGrbEditor.py:4082 msgid "" "Flip the selected shape(s)\n" "around the point in Point Entry Field.\n" @@ -2572,13 +2600,13 @@ msgstr "" "Oder geben Sie die Koordinaten im Format (x, y) in ein\n" "Punkt-Eingabefeld und klicken Sie auf X (Y) drehen" -#: flatcamEditors/FlatCAMGeoEditor.py:923 -#: flatcamEditors/FlatCAMGrbEditor.py:3083 flatcamTools/ToolTransform.py:325 +#: flatcamEditors/FlatCAMGeoEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:4094 flatcamTools/ToolTransform.py:325 msgid "Point:" msgstr "Punkt:" -#: flatcamEditors/FlatCAMGeoEditor.py:925 -#: flatcamEditors/FlatCAMGrbEditor.py:3085 +#: flatcamEditors/FlatCAMGeoEditor.py:926 +#: flatcamEditors/FlatCAMGrbEditor.py:4096 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" @@ -2589,17 +2617,18 @@ msgstr "" "Das 'x' in (x, y) wird verwendet, wenn Sie bei X und\n" "Das 'y' in (x, y) wird verwendet, wenn Flip auf Y verwendet wird." -#: flatcamEditors/FlatCAMGeoEditor.py:935 -#: flatcamEditors/FlatCAMGrbEditor.py:3095 flatcamGUI/ObjectUI.py:988 +#: flatcamEditors/FlatCAMGeoEditor.py:936 +#: flatcamEditors/FlatCAMGrbEditor.py:1820 +#: flatcamEditors/FlatCAMGrbEditor.py:4106 flatcamGUI/ObjectUI.py:988 #: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 #: flatcamTools/ToolNonCopperClear.py:134 flatcamTools/ToolPaint.py:131 -#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:479 #: flatcamTools/ToolTransform.py:337 msgid "Add" msgstr "Hinzufügen" -#: flatcamEditors/FlatCAMGeoEditor.py:937 -#: flatcamEditors/FlatCAMGrbEditor.py:3097 flatcamTools/ToolTransform.py:339 +#: flatcamEditors/FlatCAMGeoEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:4108 flatcamTools/ToolTransform.py:339 msgid "" "The point coordinates can be captured by\n" "left click on canvas together with pressing\n" @@ -2610,345 +2639,402 @@ msgstr "" "Shift Taste. Klicken Sie dann auf die Schaltfläche Hinzufügen, um sie " "einzufügen." -#: flatcamEditors/FlatCAMGeoEditor.py:1052 -#: flatcamEditors/FlatCAMGrbEditor.py:3222 +#: flatcamEditors/FlatCAMGeoEditor.py:1053 +#: flatcamEditors/FlatCAMGrbEditor.py:4233 msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." msgstr "[WARNING_NOTCL] Transformation abgebrochen Keine Form ausgewählt" -#: flatcamEditors/FlatCAMGeoEditor.py:1073 -#: flatcamEditors/FlatCAMGrbEditor.py:3242 flatcamTools/ToolTransform.py:468 +#: flatcamEditors/FlatCAMGeoEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:4253 flatcamTools/ToolTransform.py:468 msgid "[ERROR_NOTCL] Wrong value format entered for Rotate, use a number." msgstr "" "[ERROR_NOTCL] Falsches Werteformat für Drehen eingegeben, verwenden Sie eine " "Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1110 -#: flatcamEditors/FlatCAMGrbEditor.py:3279 flatcamTools/ToolTransform.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:1111 +#: flatcamEditors/FlatCAMGrbEditor.py:4290 flatcamTools/ToolTransform.py:502 msgid "[ERROR_NOTCL] Wrong value format entered for Skew X, use a number." msgstr "" "[ERROR_NOTCL] Falsches Werteformat für Skew X eingegeben, verwenden Sie eine " "Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1131 -#: flatcamEditors/FlatCAMGrbEditor.py:3300 flatcamTools/ToolTransform.py:520 +#: flatcamEditors/FlatCAMGeoEditor.py:1132 +#: flatcamEditors/FlatCAMGrbEditor.py:4311 flatcamTools/ToolTransform.py:520 msgid "[ERROR_NOTCL] Wrong value format entered for Skew Y, use a number." msgstr "" "[ERROR_NOTCL] Falsches Werteformat für Skew Y eingegeben, verwenden Sie eine " "Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1152 -#: flatcamEditors/FlatCAMGrbEditor.py:3321 flatcamTools/ToolTransform.py:538 +#: flatcamEditors/FlatCAMGeoEditor.py:1153 +#: flatcamEditors/FlatCAMGrbEditor.py:4332 flatcamTools/ToolTransform.py:538 msgid "[ERROR_NOTCL] Wrong value format entered for Scale X, use a number." msgstr "" "[ERROR_NOTCL] Falsches Wertformat für Waage X eingegeben, verwenden Sie eine " "Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1189 -#: flatcamEditors/FlatCAMGrbEditor.py:3358 flatcamTools/ToolTransform.py:572 +#: flatcamEditors/FlatCAMGeoEditor.py:1190 +#: flatcamEditors/FlatCAMGrbEditor.py:4369 flatcamTools/ToolTransform.py:572 msgid "[ERROR_NOTCL] Wrong value format entered for Scale Y, use a number." msgstr "" "[ERROR_NOTCL] Falsches Werteformat für Skala Y eingegeben, verwenden Sie " "eine Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1221 -#: flatcamEditors/FlatCAMGrbEditor.py:3390 flatcamTools/ToolTransform.py:601 +#: flatcamEditors/FlatCAMGeoEditor.py:1222 +#: flatcamEditors/FlatCAMGrbEditor.py:4401 flatcamTools/ToolTransform.py:601 msgid "[ERROR_NOTCL] Wrong value format entered for Offset X, use a number." msgstr "" "[ERROR_NOTCL] Falsches Wertformat für Offset X eingegeben, verwenden Sie " "eine Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1242 -#: flatcamEditors/FlatCAMGrbEditor.py:3411 flatcamTools/ToolTransform.py:619 +#: flatcamEditors/FlatCAMGeoEditor.py:1243 +#: flatcamEditors/FlatCAMGrbEditor.py:4422 flatcamTools/ToolTransform.py:619 msgid "[ERROR_NOTCL] Wrong value format entered for Offset Y, use a number." msgstr "" "[ERROR_NOTCL] Falsches Wertformat für Offset Y eingegeben, verwenden Sie " "eine Zahl." -#: flatcamEditors/FlatCAMGeoEditor.py:1260 -#: flatcamEditors/FlatCAMGrbEditor.py:3429 +#: flatcamEditors/FlatCAMGeoEditor.py:1261 +#: flatcamEditors/FlatCAMGrbEditor.py:4440 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" msgstr "" "[WARNING_NOTCL] Keine Form ausgewählt Bitte wählen Sie eine Form zum Drehen " "aus!" -#: flatcamEditors/FlatCAMGeoEditor.py:1263 -#: flatcamEditors/FlatCAMGrbEditor.py:3432 flatcamTools/ToolTransform.py:640 +#: flatcamEditors/FlatCAMGeoEditor.py:1264 +#: flatcamEditors/FlatCAMGrbEditor.py:4443 flatcamTools/ToolTransform.py:640 msgid "Appying Rotate" msgstr "Anwenden Drehen" -#: flatcamEditors/FlatCAMGeoEditor.py:1291 -#: flatcamEditors/FlatCAMGrbEditor.py:3460 +#: flatcamEditors/FlatCAMGeoEditor.py:1292 +#: flatcamEditors/FlatCAMGrbEditor.py:4471 msgid "[success] Done. Rotate completed." msgstr "[success] Erledigt. Drehen abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:1307 -#: flatcamEditors/FlatCAMGrbEditor.py:3476 +#: flatcamEditors/FlatCAMGeoEditor.py:1308 +#: flatcamEditors/FlatCAMGrbEditor.py:4487 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" msgstr "" "[WARNING_NOTCL] Keine Form ausgewählt Bitte wähle eine Form zum Umdrehen!" -#: flatcamEditors/FlatCAMGeoEditor.py:1310 -#: flatcamEditors/FlatCAMGrbEditor.py:3479 flatcamTools/ToolTransform.py:692 +#: flatcamEditors/FlatCAMGeoEditor.py:1311 +#: flatcamEditors/FlatCAMGrbEditor.py:4490 flatcamTools/ToolTransform.py:692 msgid "Applying Flip" msgstr "Flip anwenden" -#: flatcamEditors/FlatCAMGeoEditor.py:1340 -#: flatcamEditors/FlatCAMGrbEditor.py:3509 flatcamTools/ToolTransform.py:735 +#: flatcamEditors/FlatCAMGeoEditor.py:1341 +#: flatcamEditors/FlatCAMGrbEditor.py:4520 flatcamTools/ToolTransform.py:735 msgid "[success] Flip on the Y axis done ..." msgstr "[success] Flip auf der Y-Achse erledigt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1343 -#: flatcamEditors/FlatCAMGrbEditor.py:3512 flatcamTools/ToolTransform.py:745 +#: flatcamEditors/FlatCAMGeoEditor.py:1344 +#: flatcamEditors/FlatCAMGrbEditor.py:4523 flatcamTools/ToolTransform.py:745 msgid "[success] Flip on the X axis done ..." msgstr "[success] Flip auf der X-Achse erledigt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1362 -#: flatcamEditors/FlatCAMGrbEditor.py:3531 +#: flatcamEditors/FlatCAMGeoEditor.py:1363 +#: flatcamEditors/FlatCAMGrbEditor.py:4542 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" msgstr "" "[WARNING_NOTCL] Keine Form ausgewählt. Bitte wählen Sie eine Form zum " "Scheren / Schrägstellen!" -#: flatcamEditors/FlatCAMGeoEditor.py:1365 -#: flatcamEditors/FlatCAMGrbEditor.py:3534 flatcamTools/ToolTransform.py:762 +#: flatcamEditors/FlatCAMGeoEditor.py:1366 +#: flatcamEditors/FlatCAMGrbEditor.py:4545 flatcamTools/ToolTransform.py:762 msgid "Applying Skew" msgstr "Anwenden von Skew" -#: flatcamEditors/FlatCAMGeoEditor.py:1390 -#: flatcamEditors/FlatCAMGrbEditor.py:3559 flatcamTools/ToolTransform.py:793 +#: flatcamEditors/FlatCAMGeoEditor.py:1391 +#: flatcamEditors/FlatCAMGrbEditor.py:4570 flatcamTools/ToolTransform.py:793 #, python-format msgid "[success] Skew on the %s axis done ..." msgstr "[success] Neigung auf der %s Achse abgeschlossen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1394 -#: flatcamEditors/FlatCAMGrbEditor.py:3563 flatcamTools/ToolTransform.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:1395 +#: flatcamEditors/FlatCAMGrbEditor.py:4574 flatcamTools/ToolTransform.py:797 #, python-format msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." msgstr "" "[ERROR_NOTCL] Aufgrund von %s wurde die Neigung-Aktion nicht ausgeführt." -#: flatcamEditors/FlatCAMGeoEditor.py:1405 -#: flatcamEditors/FlatCAMGrbEditor.py:3574 +#: flatcamEditors/FlatCAMGeoEditor.py:1406 +#: flatcamEditors/FlatCAMGrbEditor.py:4585 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" msgstr "" "[WARNING_NOTCL] Keine Form ausgewählt. Bitte wählen Sie eine zu skalierende " "Form!" -#: flatcamEditors/FlatCAMGeoEditor.py:1408 -#: flatcamEditors/FlatCAMGrbEditor.py:3577 flatcamTools/ToolTransform.py:811 +#: flatcamEditors/FlatCAMGeoEditor.py:1409 +#: flatcamEditors/FlatCAMGrbEditor.py:4588 flatcamTools/ToolTransform.py:811 msgid "Applying Scale" msgstr "Maßstab anwenden" -#: flatcamEditors/FlatCAMGeoEditor.py:1441 -#: flatcamEditors/FlatCAMGrbEditor.py:3610 flatcamTools/ToolTransform.py:849 +#: flatcamEditors/FlatCAMGeoEditor.py:1442 +#: flatcamEditors/FlatCAMGrbEditor.py:4621 flatcamTools/ToolTransform.py:849 #, python-format msgid "[success] Scale on the %s axis done ..." msgstr "[success] Skalieren auf der %s Achse fertig ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1444 -#: flatcamEditors/FlatCAMGrbEditor.py:3613 flatcamTools/ToolTransform.py:852 +#: flatcamEditors/FlatCAMGeoEditor.py:1445 +#: flatcamEditors/FlatCAMGrbEditor.py:4624 flatcamTools/ToolTransform.py:852 #, python-format msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." msgstr "" "[ERROR_NOTCL] Aufgrund von %s wurde die Skalieren Aktion nicht ausgeführt." -#: flatcamEditors/FlatCAMGeoEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:3622 +#: flatcamEditors/FlatCAMGeoEditor.py:1454 +#: flatcamEditors/FlatCAMGrbEditor.py:4633 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" msgstr "" "[WARNING_NOTCL] Keine Form ausgewählt. Bitte wählen Sie eine Form zum " "Versetzen!" -#: flatcamEditors/FlatCAMGeoEditor.py:1456 -#: flatcamEditors/FlatCAMGrbEditor.py:3625 flatcamTools/ToolTransform.py:864 +#: flatcamEditors/FlatCAMGeoEditor.py:1457 +#: flatcamEditors/FlatCAMGrbEditor.py:4636 flatcamTools/ToolTransform.py:864 msgid "Applying Offset" msgstr "Offsetdruck anwenden" -#: flatcamEditors/FlatCAMGeoEditor.py:1480 -#: flatcamEditors/FlatCAMGrbEditor.py:3649 flatcamTools/ToolTransform.py:894 +#: flatcamEditors/FlatCAMGeoEditor.py:1481 +#: flatcamEditors/FlatCAMGrbEditor.py:4660 flatcamTools/ToolTransform.py:894 #, python-format msgid "[success] Offset on the %s axis done ..." msgstr "[success] Offsetdruck auf der %s Achse fertiggestellt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1484 -#: flatcamEditors/FlatCAMGrbEditor.py:3653 flatcamTools/ToolTransform.py:898 +#: flatcamEditors/FlatCAMGeoEditor.py:1485 +#: flatcamEditors/FlatCAMGrbEditor.py:4664 flatcamTools/ToolTransform.py:898 #, python-format msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." msgstr "" "[ERROR_NOTCL] Aufgrund von %s wurde die Offsetdruck Aktion nicht ausgeführt." -#: flatcamEditors/FlatCAMGeoEditor.py:1488 -#: flatcamEditors/FlatCAMGrbEditor.py:3657 +#: flatcamEditors/FlatCAMGeoEditor.py:1489 +#: flatcamEditors/FlatCAMGrbEditor.py:4668 msgid "Rotate ..." msgstr "Drehen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1489 -#: flatcamEditors/FlatCAMGeoEditor.py:1546 -#: flatcamEditors/FlatCAMGeoEditor.py:1563 -#: flatcamEditors/FlatCAMGrbEditor.py:3658 -#: flatcamEditors/FlatCAMGrbEditor.py:3715 -#: flatcamEditors/FlatCAMGrbEditor.py:3732 +#: flatcamEditors/FlatCAMGeoEditor.py:1490 +#: flatcamEditors/FlatCAMGeoEditor.py:1547 +#: flatcamEditors/FlatCAMGeoEditor.py:1564 +#: flatcamEditors/FlatCAMGrbEditor.py:4669 +#: flatcamEditors/FlatCAMGrbEditor.py:4726 +#: flatcamEditors/FlatCAMGrbEditor.py:4743 msgid "Enter an Angle Value (degrees):" msgstr "Geben Sie einen Winkelwert (Grad) ein:" -#: flatcamEditors/FlatCAMGeoEditor.py:1498 -#: flatcamEditors/FlatCAMGrbEditor.py:3667 +#: flatcamEditors/FlatCAMGeoEditor.py:1499 +#: flatcamEditors/FlatCAMGrbEditor.py:4678 msgid "[success] Geometry shape rotate done..." msgstr "[success] Geometrieform drehen fertig ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1503 -#: flatcamEditors/FlatCAMGrbEditor.py:3672 +#: flatcamEditors/FlatCAMGeoEditor.py:1504 +#: flatcamEditors/FlatCAMGrbEditor.py:4683 msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." msgstr "[WARNING_NOTCL] Geometrieform drehen abgebrochen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1509 -#: flatcamEditors/FlatCAMGrbEditor.py:3678 +#: flatcamEditors/FlatCAMGeoEditor.py:1510 +#: flatcamEditors/FlatCAMGrbEditor.py:4689 msgid "Offset on X axis ..." msgstr "Versatz auf der X-Achse ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1510 -#: flatcamEditors/FlatCAMGeoEditor.py:1529 -#: flatcamEditors/FlatCAMGrbEditor.py:3679 -#: flatcamEditors/FlatCAMGrbEditor.py:3698 +#: flatcamEditors/FlatCAMGeoEditor.py:1511 +#: flatcamEditors/FlatCAMGeoEditor.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:4690 +#: flatcamEditors/FlatCAMGrbEditor.py:4709 #, python-format msgid "Enter a distance Value (%s):" msgstr "Geben Sie einen Abstand ein (%s):" -#: flatcamEditors/FlatCAMGeoEditor.py:1519 -#: flatcamEditors/FlatCAMGrbEditor.py:3688 +#: flatcamEditors/FlatCAMGeoEditor.py:1520 +#: flatcamEditors/FlatCAMGrbEditor.py:4699 msgid "[success] Geometry shape offset on X axis done..." msgstr "[success] Geometrieformversatz auf der X-Achse erfolgt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1523 -#: flatcamEditors/FlatCAMGrbEditor.py:3692 +#: flatcamEditors/FlatCAMGeoEditor.py:1524 +#: flatcamEditors/FlatCAMGrbEditor.py:4703 msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." msgstr "[WARNING_NOTCL] Geometrieformversatz X abgebrochen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1528 -#: flatcamEditors/FlatCAMGrbEditor.py:3697 +#: flatcamEditors/FlatCAMGeoEditor.py:1529 +#: flatcamEditors/FlatCAMGrbEditor.py:4708 msgid "Offset on Y axis ..." msgstr "Versatz auf der Y-Achse ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1538 -#: flatcamEditors/FlatCAMGrbEditor.py:3707 +#: flatcamEditors/FlatCAMGeoEditor.py:1539 +#: flatcamEditors/FlatCAMGrbEditor.py:4718 msgid "[success] Geometry shape offset on Y axis done..." msgstr "[success] Geometrieformversatz auf Y-Achse erfolgt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1542 -#: flatcamEditors/FlatCAMGrbEditor.py:3711 +#: flatcamEditors/FlatCAMGeoEditor.py:1543 +#: flatcamEditors/FlatCAMGrbEditor.py:4722 msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." msgstr "[WARNING_NOTCL] Geometrieformversatz Y abgebrochen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1545 -#: flatcamEditors/FlatCAMGrbEditor.py:3714 +#: flatcamEditors/FlatCAMGeoEditor.py:1546 +#: flatcamEditors/FlatCAMGrbEditor.py:4725 msgid "Skew on X axis ..." msgstr "Neigung auf der X-Achse ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1555 -#: flatcamEditors/FlatCAMGrbEditor.py:3724 +#: flatcamEditors/FlatCAMGeoEditor.py:1556 +#: flatcamEditors/FlatCAMGrbEditor.py:4735 msgid "[success] Geometry shape skew on X axis done..." msgstr "[success] Geometrieformversatz auf X-Achse ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1559 -#: flatcamEditors/FlatCAMGrbEditor.py:3728 +#: flatcamEditors/FlatCAMGeoEditor.py:1560 +#: flatcamEditors/FlatCAMGrbEditor.py:4739 msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." msgstr "[WARNING_NOTCL] Geometrieformversatz X abgebrochen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1562 -#: flatcamEditors/FlatCAMGrbEditor.py:3731 +#: flatcamEditors/FlatCAMGeoEditor.py:1563 +#: flatcamEditors/FlatCAMGrbEditor.py:4742 msgid "Skew on Y axis ..." msgstr "Neigung auf der Y-Achse ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1572 -#: flatcamEditors/FlatCAMGrbEditor.py:3741 +#: flatcamEditors/FlatCAMGeoEditor.py:1573 +#: flatcamEditors/FlatCAMGrbEditor.py:4752 msgid "[success] Geometry shape skew on Y axis done..." msgstr "[success] Geometrieformversatz auf Y-Achse erfolgt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1576 -#: flatcamEditors/FlatCAMGrbEditor.py:3745 +#: flatcamEditors/FlatCAMGeoEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:4756 msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." msgstr "[WARNING_NOTCL] Geometrieformversatz Y abgebrochen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1934 -#: flatcamEditors/FlatCAMGeoEditor.py:1973 -msgid "Click on CENTER ..." -msgstr "Klicken Sie auf MITTE ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1942 +#: flatcamEditors/FlatCAMGeoEditor.py:1943 +#: flatcamEditors/FlatCAMGeoEditor.py:1987 +#: flatcamEditors/FlatCAMGeoEditor.py:1988 +#: flatcamEditors/FlatCAMGrbEditor.py:1081 +#: flatcamEditors/FlatCAMGrbEditor.py:1082 +#: flatcamEditors/FlatCAMGrbEditor.py:1135 +#: flatcamEditors/FlatCAMGrbEditor.py:1136 +msgid "Click on Center point ..." +msgstr "Klicken Sie auf Mittelpunkt." -#: flatcamEditors/FlatCAMGeoEditor.py:1941 -msgid "Click on Circle perimeter point to complete ..." -msgstr "Klicken Sie auf Kreisumfangspunkt, um den Vorgang abzuschließen." +#: flatcamEditors/FlatCAMGeoEditor.py:1950 +#: flatcamEditors/FlatCAMGrbEditor.py:1090 +msgid "Click on Perimeter point to complete ..." +msgstr "Klicken Sie auf Umfangspunkt, um den Vorgang abzuschließen." -#: flatcamEditors/FlatCAMGeoEditor.py:1965 +#: flatcamEditors/FlatCAMGeoEditor.py:1979 msgid "[success] Done. Adding Circle completed." msgstr "[success] Erledigt. Hinzufügen des Kreises abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:1992 -msgid "Click on Start arc point ..." -msgstr "Klicken Sie auf Bogenstartpunkt ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2008 +#: flatcamEditors/FlatCAMGrbEditor.py:1161 +msgid "Click on Start point ..." +msgstr "Klicken Sie auf Startpunkt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1996 -msgid "Click on End arc point to complete ..." -msgstr "Klicken Sie auf Bogenende beenden, um den Vorgang abzuschließen..." +#: flatcamEditors/FlatCAMGeoEditor.py:2010 +#: flatcamEditors/FlatCAMGrbEditor.py:1163 +msgid "Click on Point3 ..." +msgstr "Klicken Sie auf Punkt3 ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2151 +#: flatcamEditors/FlatCAMGeoEditor.py:2012 +#: flatcamEditors/FlatCAMGrbEditor.py:1165 +msgid "Click on Stop point ..." +msgstr "Klicken Sie auf Haltepunkt ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2017 +#: flatcamEditors/FlatCAMGrbEditor.py:1170 +msgid "Click on Stop point to complete ..." +msgstr "Klicken Sie auf Stopp, um den Vorgang abzuschließen." + +#: flatcamEditors/FlatCAMGeoEditor.py:2019 +#: flatcamEditors/FlatCAMGrbEditor.py:1172 +msgid "Click on Point2 to complete ..." +msgstr "Klicken Sie auf Punkt2, um den Vorgang abzuschließen." + +#: flatcamEditors/FlatCAMGeoEditor.py:2021 +#: flatcamEditors/FlatCAMGrbEditor.py:1174 +msgid "Click on Center point to complete ..." +msgstr "Klicken Sie auf Mittelpunkt, um den Vorgang abzuschließen." + +#: flatcamEditors/FlatCAMGeoEditor.py:2033 +#: flatcamEditors/FlatCAMGrbEditor.py:1186 +#, python-format +msgid "Direction: %s" +msgstr "Richtung: %s" + +#: flatcamEditors/FlatCAMGeoEditor.py:2043 +#: flatcamEditors/FlatCAMGrbEditor.py:1196 +msgid "Mode: Start -> Stop -> Center. Click on Start point ..." +msgstr "Modus: Start -> Stopp -> Zentrieren. Klicken Sie auf Startpunkt ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2046 +#: flatcamEditors/FlatCAMGrbEditor.py:1199 +msgid "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..." +msgstr "Modus: Punkt 1 -> Punkt 3 -> Punkt 2. Klicken Sie auf Punkt1 ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2049 +#: flatcamEditors/FlatCAMGrbEditor.py:1202 +msgid "Mode: Center -> Start -> Stop. Click on Center point ..." +msgstr "Modus: Mitte -> Start -> Stopp. Klicken Sie auf Mittelpunkt." + +#: flatcamEditors/FlatCAMGeoEditor.py:2187 msgid "[success] Done. Arc completed." msgstr "[success] Erledigt. Bogen abgeschlossen" -#: flatcamEditors/FlatCAMGeoEditor.py:2163 +#: flatcamEditors/FlatCAMGeoEditor.py:2206 msgid "Click on 1st corner ..." msgstr "Klicken Sie auf die 1. Ecke ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2191 +#: flatcamEditors/FlatCAMGeoEditor.py:2239 msgid "[success] Done. Rectangle completed." msgstr "[success] Erledigt. Rechteck fertiggestellt." -#: flatcamEditors/FlatCAMGeoEditor.py:2203 -#: flatcamEditors/FlatCAMGrbEditor.py:452 +#: flatcamEditors/FlatCAMGeoEditor.py:2258 +#: flatcamEditors/FlatCAMGrbEditor.py:627 msgid "Click on 1st point ..." msgstr "Klicken Sie auf den 1. Punkt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2210 -#: flatcamEditors/FlatCAMGrbEditor.py:459 +#: flatcamEditors/FlatCAMGeoEditor.py:2265 +#: flatcamEditors/FlatCAMGrbEditor.py:637 +#: flatcamEditors/FlatCAMGrbEditor.py:904 msgid "Click on next Point or click Right mouse button to complete ..." msgstr "" "Klicken Sie auf den nächsten Punkt oder klicken Sie mit der rechten " "Maustaste, um den Vorgang abzuschließen." -#: flatcamEditors/FlatCAMGeoEditor.py:2233 +#: flatcamEditors/FlatCAMGeoEditor.py:2293 msgid "[success] Done. Polygon completed." msgstr "[success] Erledigt. Polygon abgeschlossen" -#: flatcamEditors/FlatCAMGeoEditor.py:2252 -#: flatcamEditors/FlatCAMGrbEditor.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:2303 +#: flatcamEditors/FlatCAMGeoEditor.py:2349 +#: flatcamEditors/FlatCAMGrbEditor.py:808 +#: flatcamEditors/FlatCAMGrbEditor.py:981 +msgid "Backtracked one point ..." +msgstr "Einen Punkt zurückverfolgt ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2331 msgid "[success] Done. Path completed." msgstr "[success] Erledigt. Pfad abgeschlossen" -#: flatcamEditors/FlatCAMGeoEditor.py:2354 -#: flatcamEditors/FlatCAMGeoEditor.py:3442 +#: flatcamEditors/FlatCAMGeoEditor.py:2443 +#: flatcamEditors/FlatCAMGeoEditor.py:3539 msgid "[WARNING_NOTCL] Move cancelled. No shape selected." msgstr "[WARNING_NOTCL] Umzug abgebrochen. Keine Form ausgewählt." -#: flatcamEditors/FlatCAMGeoEditor.py:2358 +#: flatcamEditors/FlatCAMGeoEditor.py:2447 msgid "Click on reference point." msgstr "Klicken Sie auf den Referenzpunkt." -#: flatcamEditors/FlatCAMGeoEditor.py:2361 +#: flatcamEditors/FlatCAMGeoEditor.py:2450 msgid "Click on destination point." msgstr "Klicken Sie auf den Zielpunkt." -#: flatcamEditors/FlatCAMGeoEditor.py:2392 +#: flatcamEditors/FlatCAMGeoEditor.py:2481 msgid "[success] Done. Geometry(s) Move completed." msgstr "[success] Erledigt. Geometrie(n) Bewegung abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:2437 +#: flatcamEditors/FlatCAMGeoEditor.py:2526 msgid "[success] Done. Geometry(s) Copy completed." msgstr "[success] Erledigt. Geometrie(n) Kopieren abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:2449 +#: flatcamEditors/FlatCAMGeoEditor.py:2538 msgid "Click on the Destination point..." msgstr "Klicken Sie auf den Zielpunkt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2463 +#: flatcamEditors/FlatCAMGeoEditor.py:2552 #, python-format msgid "" "[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " @@ -2957,67 +3043,61 @@ msgstr "" "[ERROR] Schrift wird nicht unterstützt. Es werden nur Regular, Bold, Italic " "und BoldItalic unterstützt. Error: %s" -#: flatcamEditors/FlatCAMGeoEditor.py:2473 +#: flatcamEditors/FlatCAMGeoEditor.py:2562 msgid "[success] Done. Adding Text completed." msgstr "[success] Erledigt. Hinzufügen von Text abgeschlossen" -#: flatcamEditors/FlatCAMGeoEditor.py:2501 +#: flatcamEditors/FlatCAMGeoEditor.py:2590 msgid "Create buffer geometry ..." msgstr "Puffergeometrie erstellen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2512 -#: flatcamEditors/FlatCAMGeoEditor.py:2538 -#: flatcamEditors/FlatCAMGeoEditor.py:2564 +#: flatcamEditors/FlatCAMGeoEditor.py:2601 +#: flatcamEditors/FlatCAMGeoEditor.py:2627 +#: flatcamEditors/FlatCAMGeoEditor.py:2653 msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." msgstr "[WARNING_NOTCL] Puffer abgebrochen. Keine Form ausgewählt." -#: flatcamEditors/FlatCAMGeoEditor.py:2534 -#: flatcamEditors/FlatCAMGrbEditor.py:2698 +#: flatcamEditors/FlatCAMGeoEditor.py:2623 +#: flatcamEditors/FlatCAMGrbEditor.py:3709 msgid "[success] Done. Buffer Tool completed." msgstr "[success] Erledigt. Pufferwerkzeug abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:2560 +#: flatcamEditors/FlatCAMGeoEditor.py:2649 msgid "[success] Done. Buffer Int Tool completed." msgstr "[success] Erledigt. Innenpufferwerkzeug abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:2586 +#: flatcamEditors/FlatCAMGeoEditor.py:2675 msgid "[success] Done. Buffer Ext Tool completed." msgstr "[success] Erledigt. Außenpufferwerkzeug abgeschlossen." -#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2708 msgid "Create Paint geometry ..." msgstr "Malen geometrie erstellen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2633 -#: flatcamEditors/FlatCAMGrbEditor.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:2722 +#: flatcamEditors/FlatCAMGrbEditor.py:1657 msgid "Shape transformations ..." msgstr "Formtransformationen ..." -#: flatcamEditors/FlatCAMGeoEditor.py:3077 +#: flatcamEditors/FlatCAMGeoEditor.py:3174 #, python-brace-format msgid "[WARNING] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}" msgstr "" "[WARNING] Bearbeiten von MultiGeo-Geometrie, Werkzeug: {tool} mit " "Durchmesser: {dia}" -#: flatcamEditors/FlatCAMGeoEditor.py:3316 -#: flatcamEditors/FlatCAMGrbEditor.py:2267 flatcamGUI/FlatCAMGUI.py:2320 -#: flatcamGUI/FlatCAMGUI.py:2332 -msgid "[success] Done." -msgstr "[success] Erledigt." - -#: flatcamEditors/FlatCAMGeoEditor.py:3449 +#: flatcamEditors/FlatCAMGeoEditor.py:3546 msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." msgstr "[WARNING_NOTCL] Kopieren abgebrochen Keine Form ausgewählt" -#: flatcamEditors/FlatCAMGeoEditor.py:3456 flatcamGUI/FlatCAMGUI.py:2623 -#: flatcamGUI/FlatCAMGUI.py:2657 flatcamGUI/FlatCAMGUI.py:2675 -#: flatcamGUI/FlatCAMGUI.py:2813 flatcamGUI/FlatCAMGUI.py:2825 -#: flatcamGUI/FlatCAMGUI.py:2859 +#: flatcamEditors/FlatCAMGeoEditor.py:3553 flatcamGUI/FlatCAMGUI.py:2686 +#: flatcamGUI/FlatCAMGUI.py:2732 flatcamGUI/FlatCAMGUI.py:2750 +#: flatcamGUI/FlatCAMGUI.py:2881 flatcamGUI/FlatCAMGUI.py:2893 +#: flatcamGUI/FlatCAMGUI.py:2927 msgid "Click on target point." msgstr "Klicken Sie auf den Zielpunkt." -#: flatcamEditors/FlatCAMGeoEditor.py:3699 +#: flatcamEditors/FlatCAMGeoEditor.py:3796 msgid "" "[WARNING_NOTCL] A selection of at least 2 geo items is required to do " "Intersection." @@ -3025,9 +3105,9 @@ msgstr "" "[WARNING_NOTCL] Eine Auswahl von mindestens 2 Geo-Elementen ist " "erforderlich, um die Kreuzung durchzuführen." -#: flatcamEditors/FlatCAMGeoEditor.py:3737 -#: flatcamEditors/FlatCAMGeoEditor.py:3774 -#: flatcamEditors/FlatCAMGeoEditor.py:3850 +#: flatcamEditors/FlatCAMGeoEditor.py:3834 +#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3947 msgid "" "[ERROR_NOTCL] Negative buffer value is not accepted. Use Buffer interior to " "generate an 'inside' shape" @@ -3035,54 +3115,54 @@ msgstr "" "[ERROR_NOTCL] Negativer Pufferwert wird nicht akzeptiert. Verwenden Sie den " "Pufferinnenraum, um eine Innenform zu erzeugen" -#: flatcamEditors/FlatCAMGeoEditor.py:3745 -#: flatcamEditors/FlatCAMGeoEditor.py:3783 -#: flatcamEditors/FlatCAMGeoEditor.py:3858 +#: flatcamEditors/FlatCAMGeoEditor.py:3842 +#: flatcamEditors/FlatCAMGeoEditor.py:3880 +#: flatcamEditors/FlatCAMGeoEditor.py:3955 msgid "[WARNING_NOTCL] Nothing selected for buffering." msgstr "[WARNING_NOTCL] Nichts ist für die Pufferung ausgewählt." -#: flatcamEditors/FlatCAMGeoEditor.py:3749 -#: flatcamEditors/FlatCAMGeoEditor.py:3787 -#: flatcamEditors/FlatCAMGeoEditor.py:3862 +#: flatcamEditors/FlatCAMGeoEditor.py:3846 +#: flatcamEditors/FlatCAMGeoEditor.py:3884 +#: flatcamEditors/FlatCAMGeoEditor.py:3959 msgid "[WARNING_NOTCL] Invalid distance for buffering." msgstr "[WARNING_NOTCL] Ungültige Entfernung für die Pufferung" -#: flatcamEditors/FlatCAMGeoEditor.py:3759 -#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3856 +#: flatcamEditors/FlatCAMGeoEditor.py:3968 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value." msgstr "" "[ERROR_NOTCL] Fehlgeschlagen, das Ergebnis ist leer. Wählen Sie einen " "anderen Pufferwert." -#: flatcamEditors/FlatCAMGeoEditor.py:3767 +#: flatcamEditors/FlatCAMGeoEditor.py:3864 msgid "[success] Full buffer geometry created." msgstr "[success] Volle Puffergeometrie erstellt." -#: flatcamEditors/FlatCAMGeoEditor.py:3797 +#: flatcamEditors/FlatCAMGeoEditor.py:3894 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value." msgstr "" "[ERROR_NOTCL] Fehlgeschlagen, das Ergebnis ist leer. Wählen Sie einen " "kleineren Pufferwert." -#: flatcamEditors/FlatCAMGeoEditor.py:3812 +#: flatcamEditors/FlatCAMGeoEditor.py:3909 msgid "[success] Interior buffer geometry created." msgstr "[success] Innere Puffergeometrie erstellt." -#: flatcamEditors/FlatCAMGeoEditor.py:3883 +#: flatcamEditors/FlatCAMGeoEditor.py:3980 msgid "[success] Exterior buffer geometry created." msgstr "[success] Außenpuffergeometrie erstellt." -#: flatcamEditors/FlatCAMGeoEditor.py:3947 +#: flatcamEditors/FlatCAMGeoEditor.py:4044 msgid "[WARNING_NOTCL] Nothing selected for painting." msgstr "[WARNING_NOTCL] Nichts zum Malen ausgewählt." -#: flatcamEditors/FlatCAMGeoEditor.py:3953 +#: flatcamEditors/FlatCAMGeoEditor.py:4050 msgid "[WARNING] Invalid value for {}" msgstr "[WARNING] Ungültiger Wert für {}" -#: flatcamEditors/FlatCAMGeoEditor.py:3959 +#: flatcamEditors/FlatCAMGeoEditor.py:4056 msgid "" "[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " "(100%)." @@ -3090,7 +3170,7 @@ msgstr "" "[ERROR_NOTCL] Kann nicht Malen machen. Der Überlappungswert muss unter 1,00 " "(100%) liegen." -#: flatcamEditors/FlatCAMGeoEditor.py:4018 +#: flatcamEditors/FlatCAMGeoEditor.py:4115 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -3101,115 +3181,188 @@ msgstr "" "Kombination von Parametern. Oder eine andere Methode von Malen\n" "%s" -#: flatcamEditors/FlatCAMGeoEditor.py:4029 +#: flatcamEditors/FlatCAMGeoEditor.py:4126 msgid "[success] Paint done." msgstr "[success] Malen Sie fertig." -#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:63 +#: flatcamEditors/FlatCAMGrbEditor.py:52 +msgid "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table" +msgstr "" +"[WARNING_NOTCL] Um ein Pad hinzuzufügen, wählen Sie zunächst eine Blende in " +"der Aperture Table aus" + +#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:232 +msgid "" +"[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero." +msgstr "" +"[WARNING_NOTCL] Die Größe der Blende ist Null. Es muss größer als Null sein." + +#: flatcamEditors/FlatCAMGrbEditor.py:81 flatcamEditors/FlatCAMGrbEditor.py:86 msgid "Click to place ..." msgstr "Zum Platzieren klicken ..." -#: flatcamEditors/FlatCAMGrbEditor.py:149 -#: flatcamEditors/FlatCAMGrbEditor.py:386 +#: flatcamEditors/FlatCAMGrbEditor.py:191 +#: flatcamEditors/FlatCAMGrbEditor.py:469 msgid "" "Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'." msgstr "" "Inkompatibler Blendentyp. Wählen Sie eine Blende mit dem Typ 'C', 'R' oder " "'O'." -#: flatcamEditors/FlatCAMGrbEditor.py:161 +#: flatcamEditors/FlatCAMGrbEditor.py:203 msgid "[success] Done. Adding Pad completed." msgstr "[success] Erledigt. Hinzufügen von Pad abgeschlossen." -#: flatcamEditors/FlatCAMGrbEditor.py:215 -msgid "[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table" +#: flatcamEditors/FlatCAMGrbEditor.py:225 +msgid "" +"[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table" msgstr "" -"[WARNING_NOTCL] Um ein Pad-Array hinzuzufügen, wählen Sie zunächst ein " -"Werkzeug in der Werkzeugtabelle aus" +"[WARNING_NOTCL] Um ein Pad-Array hinzuzufügen, wählen Sie zunächst eine " +"Blende in der Aperture-Tabelle aus" -#: flatcamEditors/FlatCAMGrbEditor.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:304 msgid "Click on the Pad Circular Array Start position" msgstr "Klicken Sie auf die Startposition des Pad-Kreis-Arrays" -#: flatcamEditors/FlatCAMGrbEditor.py:411 +#: flatcamEditors/FlatCAMGrbEditor.py:494 msgid "[WARNING_NOTCL] Too many Pads for the selected spacing angle." msgstr "[WARNING_NOTCL] Zu viele Pad für den ausgewählten Abstandswinkel." -#: flatcamEditors/FlatCAMGrbEditor.py:433 +#: flatcamEditors/FlatCAMGrbEditor.py:516 msgid "[success] Done. Pad Array added." msgstr "[success] Erledigt. Pad Array hinzugefügt." -#: flatcamEditors/FlatCAMGrbEditor.py:482 -msgid "[success] Done. Region completed." -msgstr "[success] Erledigt. Region abgeschlossen." +#: flatcamEditors/FlatCAMGrbEditor.py:537 +msgid "Select shape(s) and then click ..." +msgstr "Wählen Sie die Form (en) aus und klicken Sie dann auf ..." -#: flatcamEditors/FlatCAMGrbEditor.py:527 +#: flatcamEditors/FlatCAMGrbEditor.py:548 +msgid "[ERROR_NOTCL] Failed. Nothing selected." +msgstr "[ERROR_NOTCL] ist fehlgeschlagen. Nichts ausgewählt." + +#: flatcamEditors/FlatCAMGrbEditor.py:575 +msgid "[success] Done. Poligonize completed." +msgstr "[Erfolg] Fertig. Poligonize abgeschlossen." + +#: flatcamEditors/FlatCAMGrbEditor.py:625 +#: flatcamEditors/FlatCAMGrbEditor.py:825 +#: flatcamEditors/FlatCAMGrbEditor.py:849 +msgid "Corner Mode 1: 45 degrees ..." +msgstr "Eckmodus 1: 45 Grad ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:813 +#: flatcamEditors/FlatCAMGrbEditor.py:846 +msgid "Corner Mode 2: Reverse 45 degrees ..." +msgstr "Eckmodus 2: 45 Grad umkehren ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:816 +#: flatcamEditors/FlatCAMGrbEditor.py:843 +msgid "Corner Mode 3: 90 degrees ..." +msgstr "Eckmodus 3: 90 Grad ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:819 +#: flatcamEditors/FlatCAMGrbEditor.py:840 +msgid "Corner Mode 4: Reverse 90 degrees ..." +msgstr "Eckmodus 4: Um 90 Grad umkehren ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:822 +#: flatcamEditors/FlatCAMGrbEditor.py:837 +msgid "Corner Mode 5: Free angle ..." +msgstr "Eckmodus 5: Freiwinkel ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:875 +#: flatcamEditors/FlatCAMGrbEditor.py:1012 +#: flatcamEditors/FlatCAMGrbEditor.py:1050 +msgid "Track Mode 1: 45 degrees ..." +msgstr "Spurmodus 1: 45 Grad ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:992 +#: flatcamEditors/FlatCAMGrbEditor.py:1045 +msgid "Track Mode 2: Reverse 45 degrees ..." +msgstr "Spurmodus 2: 45 Grad umkehren ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1040 +msgid "Track Mode 3: 90 degrees ..." +msgstr "Spurmodus 3: 90 Grad ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1002 +#: flatcamEditors/FlatCAMGrbEditor.py:1035 +msgid "Track Mode 4: Reverse 90 degrees ..." +msgstr "Spurmodus 4: Um 90 Grad umkehren ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1007 +#: flatcamEditors/FlatCAMGrbEditor.py:1030 +msgid "Track Mode 5: Free angle ..." +msgstr "Spurmodus 5: Freiwinkel ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1360 msgid "Scale the selected Gerber apertures ..." msgstr "Skalieren Sie die ausgewählten Gerber-Öffnungen ..." -#: flatcamEditors/FlatCAMGrbEditor.py:564 +#: flatcamEditors/FlatCAMGrbEditor.py:1402 msgid "Buffer the selected apertures ..." msgstr "Die ausgewählten Öffnungen puffern ..." -#: flatcamEditors/FlatCAMGrbEditor.py:660 +#: flatcamEditors/FlatCAMGrbEditor.py:1503 msgid "[success] Done. Apertures Move completed." msgstr "[success] Erledigt. Öffnungsbewegung abgeschlossen." -#: flatcamEditors/FlatCAMGrbEditor.py:710 +#: flatcamEditors/FlatCAMGrbEditor.py:1558 msgid "[success] Done. Apertures copied." msgstr "[success] Erledigt. Blende kopiert." -#: flatcamEditors/FlatCAMGrbEditor.py:833 flatcamGUI/FlatCAMGUI.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:1698 flatcamGUI/FlatCAMGUI.py:1574 msgid "Gerber Editor" msgstr "Gerber-Editor" -#: flatcamEditors/FlatCAMGrbEditor.py:852 flatcamGUI/ObjectUI.py:192 +#: flatcamEditors/FlatCAMGrbEditor.py:1717 flatcamGUI/ObjectUI.py:192 msgid "Apertures:" msgstr " Blenden: " -#: flatcamEditors/FlatCAMGrbEditor.py:854 flatcamGUI/ObjectUI.py:194 +#: flatcamEditors/FlatCAMGrbEditor.py:1719 flatcamGUI/ObjectUI.py:194 msgid "Apertures Table for the Gerber Object." msgstr "Blendentabelle für das Gerberobjekt." -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Code" msgstr "Code" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 msgid "Type" msgstr "Typ" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Size" msgstr "Größe" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Dim" msgstr "Maße" -#: flatcamEditors/FlatCAMGrbEditor.py:869 flatcamGUI/ObjectUI.py:232 +#: flatcamEditors/FlatCAMGrbEditor.py:1734 flatcamGUI/ObjectUI.py:232 msgid "Index" msgstr "Index" -#: flatcamEditors/FlatCAMGrbEditor.py:871 flatcamGUI/ObjectUI.py:234 +#: flatcamEditors/FlatCAMGrbEditor.py:1736 flatcamGUI/ObjectUI.py:234 msgid "Aperture Code" msgstr "Öffnungscode" -#: flatcamEditors/FlatCAMGrbEditor.py:873 flatcamGUI/ObjectUI.py:236 +#: flatcamEditors/FlatCAMGrbEditor.py:1738 flatcamGUI/ObjectUI.py:236 msgid "Type of aperture: circular, rectangle, macros etc" msgstr "Öffnungsart: kreisförmig, rechteckig, Makros usw" -#: flatcamEditors/FlatCAMGrbEditor.py:875 -#: flatcamEditors/FlatCAMGrbEditor.py:908 flatcamGUI/ObjectUI.py:238 +#: flatcamEditors/FlatCAMGrbEditor.py:1740 +#: flatcamEditors/FlatCAMGrbEditor.py:1773 flatcamGUI/ObjectUI.py:238 msgid "Aperture Size:" msgstr "Öffnungsgröße:" -#: flatcamEditors/FlatCAMGrbEditor.py:877 flatcamGUI/ObjectUI.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:1742 flatcamGUI/ObjectUI.py:240 msgid "" "Aperture Dimensions:\n" " - (width, height) for R, O type.\n" @@ -3219,15 +3372,15 @@ msgstr "" "  - (Breite, Höhe) für R, O-Typ.\n" "  - (dia, nVertices) für P-Typ" -#: flatcamEditors/FlatCAMGrbEditor.py:898 +#: flatcamEditors/FlatCAMGrbEditor.py:1763 msgid "Aperture Code:" msgstr "Öffnungscode:" -#: flatcamEditors/FlatCAMGrbEditor.py:900 +#: flatcamEditors/FlatCAMGrbEditor.py:1765 msgid "Code for the new aperture" msgstr "Code für die neue Blende" -#: flatcamEditors/FlatCAMGrbEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:1775 msgid "" "Size for the new aperture.\n" "If aperture type is 'R' or 'O' then\n" @@ -3241,11 +3394,11 @@ msgstr "" "berechnet als:\n" "Quadrat (Breite ** 2 + Höhe ** 2)" -#: flatcamEditors/FlatCAMGrbEditor.py:922 +#: flatcamEditors/FlatCAMGrbEditor.py:1787 msgid "Aperture Type:" msgstr "Blendentyp:" -#: flatcamEditors/FlatCAMGrbEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:1789 msgid "" "Select the type of new aperture. Can be:\n" "C = circular\n" @@ -3257,11 +3410,11 @@ msgstr "" "R = rechteckig\n" "O = länglich" -#: flatcamEditors/FlatCAMGrbEditor.py:935 +#: flatcamEditors/FlatCAMGrbEditor.py:1800 msgid "Aperture Dim:" msgstr "Öffnungsmaße:" -#: flatcamEditors/FlatCAMGrbEditor.py:937 +#: flatcamEditors/FlatCAMGrbEditor.py:1802 msgid "" "Dimensions for the new aperture.\n" "Active only for rectangular apertures (type R).\n" @@ -3271,48 +3424,31 @@ msgstr "" "Aktiv nur für rechteckige Öffnungen (Typ R).\n" "Das Format ist (Breite, Höhe)" -#: flatcamEditors/FlatCAMGrbEditor.py:946 -msgid "Add Aperture:" -msgstr "Blende hinzufügen:" +#: flatcamEditors/FlatCAMGrbEditor.py:1811 +msgid "Add/Delete Aperture:" +msgstr "Blende hinzufügen / löschen:" -#: flatcamEditors/FlatCAMGrbEditor.py:948 -msgid "Add an aperture to the aperture list" -msgstr "Fügen Sie der Blendenliste eine Blende hinzu" +#: flatcamEditors/FlatCAMGrbEditor.py:1813 +msgid "Add/Delete an aperture in the aperture table" +msgstr "Eine Blende in der Blendentabelle hinzufügen / löschen" -#: flatcamEditors/FlatCAMGrbEditor.py:952 -#: flatcamEditors/FlatCAMGrbEditor.py:965 -msgid "Go" -msgstr "Gehen" - -#: flatcamEditors/FlatCAMGrbEditor.py:954 +#: flatcamEditors/FlatCAMGrbEditor.py:1822 msgid "Add a new aperture to the aperture list." msgstr "Fügen Sie der Blendenliste eine neue Blende hinzu." -#: flatcamEditors/FlatCAMGrbEditor.py:958 -msgid "Del Aperture:" -msgstr "Blende löschen:" - -#: flatcamEditors/FlatCAMGrbEditor.py:960 -msgid "" -"Delete a aperture in the aperture list.\n" -"It will delete also the associated geometry." -msgstr "" -"Löschen Sie eine Blende in der Blendenliste.\n" -"Es wird auch die zugehörige Geometrie gelöscht." - -#: flatcamEditors/FlatCAMGrbEditor.py:967 +#: flatcamEditors/FlatCAMGrbEditor.py:1827 msgid "Delete a aperture in the aperture list" msgstr "Löschen Sie eine Blende in der Blendenliste" -#: flatcamEditors/FlatCAMGrbEditor.py:982 +#: flatcamEditors/FlatCAMGrbEditor.py:1843 msgid "Buffer Aperture:" msgstr "Pufferblende:" -#: flatcamEditors/FlatCAMGrbEditor.py:984 +#: flatcamEditors/FlatCAMGrbEditor.py:1845 msgid "Buffer a aperture in the aperture list" msgstr "Puffern Sie eine Blende in der Blendenliste" -#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1858 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded.\n" @@ -3326,24 +3462,24 @@ msgstr "" "  - 'Abgeschrägt:' Die Ecke ist eine Linie, die die Features, die sich in " "der Ecke treffen, direkt verbindet" -#: flatcamEditors/FlatCAMGrbEditor.py:1012 flatcamGUI/FlatCAMGUI.py:695 -#: flatcamGUI/FlatCAMGUI.py:1867 +#: flatcamEditors/FlatCAMGrbEditor.py:1873 flatcamGUI/FlatCAMGUI.py:707 +#: flatcamGUI/FlatCAMGUI.py:1911 msgid "Buffer" msgstr "Puffer" -#: flatcamEditors/FlatCAMGrbEditor.py:1026 +#: flatcamEditors/FlatCAMGrbEditor.py:1887 msgid "Scale Aperture:" msgstr "Skalenöffnung:" -#: flatcamEditors/FlatCAMGrbEditor.py:1028 +#: flatcamEditors/FlatCAMGrbEditor.py:1889 msgid "Scale a aperture in the aperture list" msgstr "Skalieren Sie eine Blende in der Blendenliste" -#: flatcamEditors/FlatCAMGrbEditor.py:1036 +#: flatcamEditors/FlatCAMGrbEditor.py:1897 msgid "Scale factor:" msgstr "Skalierungsfaktor:" -#: flatcamEditors/FlatCAMGrbEditor.py:1038 +#: flatcamEditors/FlatCAMGrbEditor.py:1899 msgid "" "The factor by which to scale the selected aperture.\n" "Values can be between 0.0000 and 999.9999" @@ -3351,16 +3487,16 @@ msgstr "" "Der Faktor, um den die ausgewählte Blende skaliert werden soll.\n" "Die Werte können zwischen 0,0000 und 999,9999 liegen" -#: flatcamEditors/FlatCAMGrbEditor.py:1066 flatcamGUI/FlatCAMGUI.py:690 -#: flatcamGUI/FlatCAMGUI.py:1862 +#: flatcamEditors/FlatCAMGrbEditor.py:1927 flatcamGUI/FlatCAMGUI.py:696 +#: flatcamGUI/FlatCAMGUI.py:1906 msgid "Add Pad Array" msgstr "Pad-Array hinzufügen" -#: flatcamEditors/FlatCAMGrbEditor.py:1068 +#: flatcamEditors/FlatCAMGrbEditor.py:1929 msgid "Add an array of pads (linear or circular array)" msgstr "Hinzufügen eines Arrays von Pads (lineares oder kreisförmiges Array)" -#: flatcamEditors/FlatCAMGrbEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:1935 msgid "" "Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular" @@ -3368,16 +3504,16 @@ msgstr "" "Wählen Sie den zu erstellenden Pad-Array-Typ aus.\n" "Es kann lineares X (Y) oder rund sein" -#: flatcamEditors/FlatCAMGrbEditor.py:1085 +#: flatcamEditors/FlatCAMGrbEditor.py:1946 msgid "Nr of pads:" msgstr "Anzahl der Pads:" -#: flatcamEditors/FlatCAMGrbEditor.py:1087 +#: flatcamEditors/FlatCAMGrbEditor.py:1948 msgid "Specify how many pads to be in the array." msgstr "Geben Sie an, wie viele Pads sich im Array befinden sollen." -#: flatcamEditors/FlatCAMGrbEditor.py:1536 -#: flatcamEditors/FlatCAMGrbEditor.py:1540 +#: flatcamEditors/FlatCAMGrbEditor.py:2420 +#: flatcamEditors/FlatCAMGrbEditor.py:2424 msgid "" "[WARNING_NOTCL] Aperture code value is missing or wrong format. Add it and " "retry." @@ -3385,7 +3521,7 @@ msgstr "" "[WARNING_NOTCL] Blendencodewert fehlt oder falsches Format. Fügen Sie es " "hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGrbEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:2461 msgid "" "[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. Add it " "in format (width, height) and retry." @@ -3393,7 +3529,7 @@ msgstr "" "[WARNING_NOTCL] Wert für Blendenmaße fehlt oder falsches Format. Fügen Sie " "es im Format (Breite, Höhe) hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGrbEditor.py:1589 +#: flatcamEditors/FlatCAMGrbEditor.py:2473 msgid "" "[WARNING_NOTCL] Aperture size value is missing or wrong format. Add it and " "retry." @@ -3401,26 +3537,31 @@ msgstr "" "[WARNING_NOTCL] Blendengrößenwert fehlt oder falsches Format. Fügen Sie es " "hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGrbEditor.py:1601 +#: flatcamEditors/FlatCAMGrbEditor.py:2485 msgid "[WARNING_NOTCL] Aperture already in the aperture table." msgstr "[WARNING_NOTCL] Blende bereits in der Blendentabelle." -#: flatcamEditors/FlatCAMGrbEditor.py:1608 +#: flatcamEditors/FlatCAMGrbEditor.py:2492 #, python-brace-format msgid "[success] Added new aperture with code: {apid}" msgstr "[success] Neue Blende mit Code hinzugefügt: {apid}" -#: flatcamEditors/FlatCAMGrbEditor.py:1660 +#: flatcamEditors/FlatCAMGrbEditor.py:2521 +#: flatcamEditors/FlatCAMGrbEditor.py:2527 +msgid "[WARNING_NOTCL] Select an aperture in Aperture Table" +msgstr "[WARNING_NOTCL] Wählen Sie in Blende Table eine Blende aus" + +#: flatcamEditors/FlatCAMGrbEditor.py:2550 #, python-brace-format msgid "[success] Deleted aperture with code: {del_dia}" msgstr "[success] Blende mit Code gelöscht: {del_dia}" -#: flatcamEditors/FlatCAMGrbEditor.py:1902 +#: flatcamEditors/FlatCAMGrbEditor.py:2851 #, python-format msgid "Adding aperture: %s geo ..." msgstr "Blende hinzufügen:%s geo ..." -#: flatcamEditors/FlatCAMGrbEditor.py:2058 +#: flatcamEditors/FlatCAMGrbEditor.py:3015 msgid "" "[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber " "creation." @@ -3428,23 +3569,28 @@ msgstr "" "[ERROR_NOTCL] Die Datei enthält keine Aperture-Definitionen. Abbruch der " "Gerber-Erstellung." -#: flatcamEditors/FlatCAMGrbEditor.py:2067 +#: flatcamEditors/FlatCAMGrbEditor.py:3024 msgid "Creating Gerber." msgstr "Gerber erstellen." -#: flatcamEditors/FlatCAMGrbEditor.py:2075 +#: flatcamEditors/FlatCAMGrbEditor.py:3032 msgid "[success] Gerber editing finished." msgstr "[success] Gerber-Bearbeitung ist beendet." -#: flatcamEditors/FlatCAMGrbEditor.py:2092 +#: flatcamEditors/FlatCAMGrbEditor.py:3049 msgid "[WARNING_NOTCL] Cancelled. No aperture is selected" msgstr "[WARNING_NOTCL] Abgebrochen. Es ist keine Blende ausgewählt" -#: flatcamEditors/FlatCAMGrbEditor.py:2555 -msgid "[success] Done. Apertures deleted." -msgstr "[success] Erledigt. Blenden gelöscht" +#: flatcamEditors/FlatCAMGrbEditor.py:3549 +msgid "[ERROR_NOTCL] Failed. No aperture geometry is selected." +msgstr "" +"[ERROR_NOTCL] ist fehlgeschlagen. Es ist keine Blendengeometrie ausgewählt." -#: flatcamEditors/FlatCAMGrbEditor.py:2683 +#: flatcamEditors/FlatCAMGrbEditor.py:3557 +msgid "[success] Done. Apertures geometry deleted." +msgstr "[success] Fertig. Blendengeometrie gelöscht." + +#: flatcamEditors/FlatCAMGrbEditor.py:3694 msgid "" "[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try " "again." @@ -3452,7 +3598,7 @@ msgstr "" "[WARNING_NOTCL] Keine Blende zum Puffern Wählen Sie mindestens eine Blende " "und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGrbEditor.py:2712 +#: flatcamEditors/FlatCAMGrbEditor.py:3723 msgid "" "[WARNING_NOTCL] Scale factor value is missing or wrong format. Add it and " "retry." @@ -3460,7 +3606,7 @@ msgstr "" "[WARNING_NOTCL] Der Skalierungsfaktor ist nicht vorhanden oder das Format " "ist falsch. Fügen Sie es hinzu und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGrbEditor.py:2730 +#: flatcamEditors/FlatCAMGrbEditor.py:3741 msgid "" "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " "again." @@ -3468,7 +3614,7 @@ msgstr "" "[WARNING_NOTCL] Keine zu skalierende Blende Wählen Sie mindestens eine " "Blende und versuchen Sie es erneut." -#: flatcamEditors/FlatCAMGrbEditor.py:2746 +#: flatcamEditors/FlatCAMGrbEditor.py:3757 msgid "[success] Done. Scale Tool completed." msgstr "[success] Erledigt. Skalierungswerkzeug abgeschlossen." @@ -3512,7 +3658,8 @@ msgstr "Excellon\tL" msgid "Will create a new, empty Excellon Object." msgstr "Erzeugt ein neues, leeres Excellon-Objekt." -#: flatcamGUI/FlatCAMGUI.py:78 +#: flatcamGUI/FlatCAMGUI.py:78 flatcamTools/ToolPcbWizard.py:63 +#: flatcamTools/ToolPcbWizard.py:71 msgid "Open" msgstr "Öffnen" @@ -3630,7 +3777,7 @@ msgstr "" msgid "Save &Defaults" msgstr "Standardeinstellungen speichern" -#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:514 +#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:520 msgid "Save" msgstr "Speichern" @@ -3924,7 +4071,7 @@ msgstr "Geometrie kopieren\tC" msgid "Delete Shape\tDEL" msgstr "Form löschen\tDEL" -#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:489 +#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:495 msgid "Move\tM" msgstr "Bewegung\tM" @@ -3960,11 +4107,11 @@ msgstr "Bohrer hinzufügen\tD" msgid "Resize Drill(S)\tR" msgstr "Bohrer verkleinern\tR" -#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:482 +#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:488 msgid "Copy\tC" msgstr "Kopieren\tC" -#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:484 +#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:490 msgid "Delete\tDEL" msgstr "Löschen\tDEL" @@ -3993,291 +4140,316 @@ msgid "Add Region\tN" msgstr "Region hinzufügen\tN" #: flatcamGUI/FlatCAMGUI.py:474 +msgid "Poligonize\tALT+N" +msgstr "Polygonisieren\tALT+N" + +#: flatcamGUI/FlatCAMGUI.py:476 +msgid "Add SemiDisc\tE" +msgstr "Halbschibe hinzufügen\tE" + +#: flatcamGUI/FlatCAMGUI.py:478 +#| msgid "Add Drill\tD" +msgid "Add Disc\tD" +msgstr "Schibe hinzufügen\tD" + +#: flatcamGUI/FlatCAMGUI.py:480 msgid "Buffer\tB" msgstr "Puffer\tB" -#: flatcamGUI/FlatCAMGUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:482 msgid "Scale\tS" msgstr "Skalieren\tS" -#: flatcamGUI/FlatCAMGUI.py:478 +#: flatcamGUI/FlatCAMGUI.py:484 msgid "Transform\tALT+R" msgstr "Transformationswerkzeug\tSTRG+R" -#: flatcamGUI/FlatCAMGUI.py:505 +#: flatcamGUI/FlatCAMGUI.py:511 msgid "Enable Plot" msgstr "Diagramm aktivieren" -#: flatcamGUI/FlatCAMGUI.py:506 +#: flatcamGUI/FlatCAMGUI.py:512 msgid "Disable Plot" msgstr "Diagramm deaktivieren" -#: flatcamGUI/FlatCAMGUI.py:508 +#: flatcamGUI/FlatCAMGUI.py:514 msgid "Generate CNC" msgstr "CNC generieren" -#: flatcamGUI/FlatCAMGUI.py:509 +#: flatcamGUI/FlatCAMGUI.py:515 msgid "View Source" msgstr "Quelltext anzeigen" -#: flatcamGUI/FlatCAMGUI.py:511 flatcamGUI/FlatCAMGUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1592 msgid "Edit" msgstr "Bearbeiten" -#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:523 flatcamGUI/FlatCAMGUI.py:1598 #: flatcamTools/ToolProperties.py:25 msgid "Properties" msgstr "Eigenschaften" -#: flatcamGUI/FlatCAMGUI.py:546 +#: flatcamGUI/FlatCAMGUI.py:552 msgid "File Toolbar" msgstr "Dateisymbolleiste" -#: flatcamGUI/FlatCAMGUI.py:550 +#: flatcamGUI/FlatCAMGUI.py:556 msgid "Edit Toolbar" msgstr "Symbolleiste bearbeiten" -#: flatcamGUI/FlatCAMGUI.py:554 +#: flatcamGUI/FlatCAMGUI.py:560 msgid "View Toolbar" msgstr "Symbolleiste anzeigen" -#: flatcamGUI/FlatCAMGUI.py:558 +#: flatcamGUI/FlatCAMGUI.py:564 msgid "Shell Toolbar" msgstr "Shell-Symbolleiste" -#: flatcamGUI/FlatCAMGUI.py:562 +#: flatcamGUI/FlatCAMGUI.py:568 msgid "Tools Toolbar" msgstr "Werkzeugleiste" -#: flatcamGUI/FlatCAMGUI.py:566 +#: flatcamGUI/FlatCAMGUI.py:572 msgid "Excellon Editor Toolbar" msgstr "Excellon Editor-Symbolleiste" -#: flatcamGUI/FlatCAMGUI.py:570 +#: flatcamGUI/FlatCAMGUI.py:576 msgid "Geometry Editor Toolbar" msgstr "Geometrie Editor-Symbolleiste" -#: flatcamGUI/FlatCAMGUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:580 msgid "Gerber Editor Toolbar" msgstr "Gerber Editor-Symbolleiste" -#: flatcamGUI/FlatCAMGUI.py:578 +#: flatcamGUI/FlatCAMGUI.py:584 msgid "Grid Toolbar" msgstr "Raster-Symbolleiste" -#: flatcamGUI/FlatCAMGUI.py:597 flatcamGUI/FlatCAMGUI.py:1765 +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1809 msgid "Open project" msgstr "Offenes Projekt" -#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1766 +#: flatcamGUI/FlatCAMGUI.py:604 flatcamGUI/FlatCAMGUI.py:1810 msgid "Save project" msgstr "Projekt speichern" -#: flatcamGUI/FlatCAMGUI.py:601 flatcamGUI/FlatCAMGUI.py:1769 +#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1813 msgid "New Blank Geometry" msgstr "Neue leere Geometrie" -#: flatcamGUI/FlatCAMGUI.py:602 +#: flatcamGUI/FlatCAMGUI.py:608 msgid "New Blank Gerber" msgstr "Neue leere Gerber" -#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1770 +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1814 msgid "New Blank Excellon" msgstr "Neuer unbelegter Excellon" -#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1772 +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1816 msgid "Editor" msgstr "Editor" -#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1774 +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1818 msgid "Save Object and close the Editor" msgstr "Speichern Sie das Objekt und schließen Sie den Editor" -#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1778 +#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1822 msgid "&Delete" msgstr "&Löschen" -#: flatcamGUI/FlatCAMGUI.py:614 flatcamGUI/FlatCAMGUI.py:1781 +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1825 msgid "&Replot" msgstr "&Replotieren" -#: flatcamGUI/FlatCAMGUI.py:615 flatcamGUI/FlatCAMGUI.py:1782 +#: flatcamGUI/FlatCAMGUI.py:621 flatcamGUI/FlatCAMGUI.py:1826 msgid "&Clear plot" msgstr "&Plot klar löschen" -#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1783 +#: flatcamGUI/FlatCAMGUI.py:622 flatcamGUI/FlatCAMGUI.py:1827 msgid "Zoom In" msgstr "Hineinzoomen" -#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1784 +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1828 msgid "Zoom Out" msgstr "Rauszoomen" -#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1518 -#: flatcamGUI/FlatCAMGUI.py:1785 +#: flatcamGUI/FlatCAMGUI.py:624 flatcamGUI/FlatCAMGUI.py:1562 +#: flatcamGUI/FlatCAMGUI.py:1829 msgid "Zoom Fit" msgstr "Passenzoomen" -#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1790 +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1834 msgid "&Command Line" msgstr "Befehlszeile" -#: flatcamGUI/FlatCAMGUI.py:626 flatcamGUI/FlatCAMGUI.py:1793 +#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1837 msgid "2Sided Tool" msgstr "2Seitiges Werkzeug" -#: flatcamGUI/FlatCAMGUI.py:627 flatcamGUI/FlatCAMGUI.py:1794 +#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1838 msgid "&Cutout Tool" msgstr "Ausschnittwerkzeug" -#: flatcamGUI/FlatCAMGUI.py:628 flatcamGUI/FlatCAMGUI.py:1795 -#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:284 +#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:285 msgid "NCC Tool" msgstr "NCC Werkzeug" -#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1799 +#: flatcamGUI/FlatCAMGUI.py:638 flatcamGUI/FlatCAMGUI.py:1843 msgid "Panel Tool" msgstr "Platte Werkzeug" -#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1800 +#: flatcamGUI/FlatCAMGUI.py:639 flatcamGUI/FlatCAMGUI.py:1844 #: flatcamTools/ToolFilm.py:204 msgid "Film Tool" msgstr "Filmwerkzeug" -#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1802 +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1846 msgid "SolderPaste Tool" msgstr "Lötpaste-Werkzeug" -#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1806 +#: flatcamGUI/FlatCAMGUI.py:643 flatcamGUI/FlatCAMGUI.py:1850 msgid "Calculators Tool" msgstr "Rechnerwerkzeug" -#: flatcamGUI/FlatCAMGUI.py:641 flatcamGUI/FlatCAMGUI.py:655 -#: flatcamGUI/FlatCAMGUI.py:688 flatcamGUI/FlatCAMGUI.py:1810 -#: flatcamGUI/FlatCAMGUI.py:1860 +#: flatcamGUI/FlatCAMGUI.py:647 flatcamGUI/FlatCAMGUI.py:661 +#: flatcamGUI/FlatCAMGUI.py:694 flatcamGUI/FlatCAMGUI.py:1854 +#: flatcamGUI/FlatCAMGUI.py:1904 msgid "Select" msgstr "Wählen" -#: flatcamGUI/FlatCAMGUI.py:642 flatcamGUI/FlatCAMGUI.py:1811 +#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1855 msgid "Add Drill Hole" msgstr "Bohrloch hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:644 flatcamGUI/FlatCAMGUI.py:1813 +#: flatcamGUI/FlatCAMGUI.py:650 flatcamGUI/FlatCAMGUI.py:1857 msgid "Add Drill Hole Array" msgstr "Bohrlochfeld hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1814 +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1858 msgid "Resize Drill" msgstr "Bohrergröße ändern" -#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1817 +#: flatcamGUI/FlatCAMGUI.py:654 flatcamGUI/FlatCAMGUI.py:1861 msgid "Copy Drill" msgstr "Bohrer kopieren" -#: flatcamGUI/FlatCAMGUI.py:649 flatcamGUI/FlatCAMGUI.py:1819 +#: flatcamGUI/FlatCAMGUI.py:655 flatcamGUI/FlatCAMGUI.py:1863 msgid "Delete Drill" msgstr "Bohrer löschen" -#: flatcamGUI/FlatCAMGUI.py:652 flatcamGUI/FlatCAMGUI.py:1822 +#: flatcamGUI/FlatCAMGUI.py:658 flatcamGUI/FlatCAMGUI.py:1866 msgid "Move Drill" msgstr "Bohrer bewegen" -#: flatcamGUI/FlatCAMGUI.py:656 flatcamGUI/FlatCAMGUI.py:1826 +#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1870 msgid "Add Circle" msgstr "Kreis hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1827 +#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1871 msgid "Add Arc" msgstr "Bogen hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:659 flatcamGUI/FlatCAMGUI.py:1829 +#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1873 msgid "Add Rectangle" msgstr "Rechteck hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1832 +#: flatcamGUI/FlatCAMGUI.py:668 flatcamGUI/FlatCAMGUI.py:1876 msgid "Add Path" msgstr "Pfad hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1834 +#: flatcamGUI/FlatCAMGUI.py:669 flatcamGUI/FlatCAMGUI.py:1878 msgid "Add Polygon" msgstr "Polygon hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1836 +#: flatcamGUI/FlatCAMGUI.py:671 flatcamGUI/FlatCAMGUI.py:1880 msgid "Add Text" msgstr "Text hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:666 flatcamGUI/FlatCAMGUI.py:1838 +#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1882 msgid "Add Buffer" msgstr "Puffer hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:667 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/FlatCAMGUI.py:673 flatcamGUI/FlatCAMGUI.py:1883 msgid "Paint Shape" msgstr "Malen Form" -#: flatcamGUI/FlatCAMGUI.py:670 flatcamGUI/FlatCAMGUI.py:1842 +#: flatcamGUI/FlatCAMGUI.py:676 flatcamGUI/FlatCAMGUI.py:1886 msgid "Polygon Union" msgstr "Polygon-Vereinigung" -#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1844 +#: flatcamGUI/FlatCAMGUI.py:678 flatcamGUI/FlatCAMGUI.py:1888 msgid "Polygon Intersection" msgstr "Polygonschnitt" -#: flatcamGUI/FlatCAMGUI.py:674 flatcamGUI/FlatCAMGUI.py:1846 +#: flatcamGUI/FlatCAMGUI.py:680 flatcamGUI/FlatCAMGUI.py:1890 msgid "Polygon Subtraction" msgstr "Polygon-Subtraktion" -#: flatcamGUI/FlatCAMGUI.py:677 flatcamGUI/FlatCAMGUI.py:1849 +#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:1893 msgid "Cut Path" msgstr "Pfad ausschneiden" -#: flatcamGUI/FlatCAMGUI.py:678 +#: flatcamGUI/FlatCAMGUI.py:684 msgid "Copy Shape(s)" msgstr "Form kopieren" -#: flatcamGUI/FlatCAMGUI.py:681 +#: flatcamGUI/FlatCAMGUI.py:687 msgid "Delete Shape '-'" msgstr "Form löschen" -#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:702 -#: flatcamGUI/FlatCAMGUI.py:1854 flatcamGUI/FlatCAMGUI.py:1874 +#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:714 +#: flatcamGUI/FlatCAMGUI.py:1898 flatcamGUI/FlatCAMGUI.py:1918 msgid "Transformations" msgstr "Transformationen" -#: flatcamGUI/FlatCAMGUI.py:685 +#: flatcamGUI/FlatCAMGUI.py:691 msgid "Move Objects " msgstr "Objekte verschieben " -#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:1861 +#: flatcamGUI/FlatCAMGUI.py:695 flatcamGUI/FlatCAMGUI.py:1905 msgid "Add Pad" msgstr "Pad hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:691 flatcamGUI/FlatCAMGUI.py:1863 +#: flatcamGUI/FlatCAMGUI.py:697 flatcamGUI/FlatCAMGUI.py:1907 msgid "Add Track" msgstr "Track hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:692 flatcamGUI/FlatCAMGUI.py:1864 +#: flatcamGUI/FlatCAMGUI.py:698 flatcamGUI/FlatCAMGUI.py:1908 msgid "Add Region" msgstr "Region hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:704 flatcamGUI/FlatCAMGUI.py:1528 -#: flatcamGUI/FlatCAMGUI.py:1538 flatcamGUI/FlatCAMGUI.py:1553 -#: flatcamGUI/FlatCAMGUI.py:1876 flatcamTools/ToolMove.py:26 +#: flatcamGUI/FlatCAMGUI.py:700 +msgid "Poligonize" +msgstr "Polygonisieren" + +#: flatcamGUI/FlatCAMGUI.py:703 +msgid "SemiDisc" +msgstr "Halbscheibe" + +#: flatcamGUI/FlatCAMGUI.py:704 +msgid "Disc" +msgstr "Scheibe" + +#: flatcamGUI/FlatCAMGUI.py:716 flatcamGUI/FlatCAMGUI.py:1572 +#: flatcamGUI/FlatCAMGUI.py:1582 flatcamGUI/FlatCAMGUI.py:1597 +#: flatcamGUI/FlatCAMGUI.py:1920 flatcamTools/ToolMove.py:26 msgid "Move" msgstr "Bewegung" -#: flatcamGUI/FlatCAMGUI.py:710 flatcamGUI/FlatCAMGUI.py:1882 +#: flatcamGUI/FlatCAMGUI.py:722 flatcamGUI/FlatCAMGUI.py:1926 msgid "Snap to grid" msgstr "Am Raster ausrichten" -#: flatcamGUI/FlatCAMGUI.py:713 flatcamGUI/FlatCAMGUI.py:1885 +#: flatcamGUI/FlatCAMGUI.py:725 flatcamGUI/FlatCAMGUI.py:1929 msgid "Grid X snapping distance" msgstr "Raster X Fangdistanz" -#: flatcamGUI/FlatCAMGUI.py:718 flatcamGUI/FlatCAMGUI.py:1890 +#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1934 msgid "Grid Y snapping distance" msgstr "Raster Y Fangdistanz" -#: flatcamGUI/FlatCAMGUI.py:724 flatcamGUI/FlatCAMGUI.py:1896 +#: flatcamGUI/FlatCAMGUI.py:736 flatcamGUI/FlatCAMGUI.py:1940 msgid "" "When active, value on Grid_X\n" "is copied to the Grid_Y value." @@ -4285,64 +4457,64 @@ msgstr "" "Wenn aktiv, Wert auf Grid_X\n" "wird in den Wert von Grid_Y kopiert." -#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1902 +#: flatcamGUI/FlatCAMGUI.py:742 flatcamGUI/FlatCAMGUI.py:1946 msgid "Snap to corner" msgstr "In der Ecke ausrichten" -#: flatcamGUI/FlatCAMGUI.py:734 flatcamGUI/FlatCAMGUI.py:1906 -#: flatcamGUI/FlatCAMGUI.py:3197 +#: flatcamGUI/FlatCAMGUI.py:746 flatcamGUI/FlatCAMGUI.py:1950 +#: flatcamGUI/FlatCAMGUI.py:3286 msgid "Max. magnet distance" msgstr "Max. Magnetabstand" -#: flatcamGUI/FlatCAMGUI.py:748 flatcamGUI/FlatCAMGUI.py:1512 +#: flatcamGUI/FlatCAMGUI.py:760 flatcamGUI/FlatCAMGUI.py:1556 msgid "Project" msgstr "Projekt" -#: flatcamGUI/FlatCAMGUI.py:757 +#: flatcamGUI/FlatCAMGUI.py:769 msgid "Selected" msgstr "Ausgewählt" -#: flatcamGUI/FlatCAMGUI.py:776 flatcamGUI/FlatCAMGUI.py:784 +#: flatcamGUI/FlatCAMGUI.py:788 flatcamGUI/FlatCAMGUI.py:796 msgid "Plot Area" msgstr "Grundstücksfläche" -#: flatcamGUI/FlatCAMGUI.py:808 +#: flatcamGUI/FlatCAMGUI.py:820 msgid "General" msgstr "Allgemeines" -#: flatcamGUI/FlatCAMGUI.py:817 +#: flatcamGUI/FlatCAMGUI.py:829 msgid "APP. DEFAULTS" msgstr "Anwendungsvorgaben" -#: flatcamGUI/FlatCAMGUI.py:818 +#: flatcamGUI/FlatCAMGUI.py:830 msgid "PROJ. OPTIONS " msgstr "Projektoptionen" -#: flatcamGUI/FlatCAMGUI.py:829 +#: flatcamGUI/FlatCAMGUI.py:841 msgid "GERBER" msgstr "GERBER" -#: flatcamGUI/FlatCAMGUI.py:838 +#: flatcamGUI/FlatCAMGUI.py:850 msgid "EXCELLON" msgstr "EXCELLON" -#: flatcamGUI/FlatCAMGUI.py:847 +#: flatcamGUI/FlatCAMGUI.py:859 msgid "GEOMETRY" msgstr "GEOMETRY" -#: flatcamGUI/FlatCAMGUI.py:857 +#: flatcamGUI/FlatCAMGUI.py:869 msgid "CNC-JOB" msgstr "CNC-Auftrag" -#: flatcamGUI/FlatCAMGUI.py:866 +#: flatcamGUI/FlatCAMGUI.py:878 msgid "TOOLS" msgstr "WERKZEUGE" -#: flatcamGUI/FlatCAMGUI.py:883 +#: flatcamGUI/FlatCAMGUI.py:895 msgid "Import Preferences" msgstr "Importeinstellungen" -#: flatcamGUI/FlatCAMGUI.py:886 +#: flatcamGUI/FlatCAMGUI.py:898 msgid "" "Import a full set of FlatCAM settings from a file\n" "previously saved on HDD.\n" @@ -4357,11 +4529,11 @@ msgstr "" "FlatCAM speichert automatisch eine 'factory_defaults'-Datei\n" "beim ersten Start. Löschen Sie diese Datei nicht." -#: flatcamGUI/FlatCAMGUI.py:893 +#: flatcamGUI/FlatCAMGUI.py:905 msgid "Export Preferences" msgstr "Voreinstellungen exportieren" -#: flatcamGUI/FlatCAMGUI.py:896 +#: flatcamGUI/FlatCAMGUI.py:908 msgid "" "Export a full set of FlatCAM settings in a file\n" "that is saved on HDD." @@ -4370,20 +4542,20 @@ msgstr "" "Datei\n" "das ist auf der Festplatte gespeichert." -#: flatcamGUI/FlatCAMGUI.py:901 +#: flatcamGUI/FlatCAMGUI.py:913 msgid "Open Pref Folder" msgstr "Öffnen Sie den Ordner \"Einstellungen\"" -#: flatcamGUI/FlatCAMGUI.py:904 +#: flatcamGUI/FlatCAMGUI.py:916 msgid "Open the folder where FlatCAM save the preferences files." msgstr "" "Öffnen Sie den Ordner, in dem FlatCAM die Voreinstellungsdateien speichert." -#: flatcamGUI/FlatCAMGUI.py:912 +#: flatcamGUI/FlatCAMGUI.py:924 msgid "Save Preferences" msgstr "Voreinstellungen speichern" -#: flatcamGUI/FlatCAMGUI.py:915 +#: flatcamGUI/FlatCAMGUI.py:927 msgid "" "Save the current settings in the 'current_defaults' file\n" "which is the file storing the working default preferences." @@ -4391,7 +4563,7 @@ msgstr "" "Speichern Sie die aktuellen Einstellungen in der Datei 'current_defaults'\n" "Dies ist die Datei, in der die Arbeitseinstellungen gespeichert sind." -#: flatcamGUI/FlatCAMGUI.py:941 +#: flatcamGUI/FlatCAMGUI.py:953 msgid "" "General Shortcut list
\n" "  \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4601,6 +4777,10 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4700,6 +4880,10 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4878,6 +5062,10 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4944,7 +5132,7 @@ msgstr "" " \n" " " -#: flatcamGUI/FlatCAMGUI.py:1218 +#: flatcamGUI/FlatCAMGUI.py:1238 msgid "" "Editor Shortcut list
\n" "
\n" @@ -4968,6 +5156,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4988,6 +5181,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5172,6 +5370,14 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5188,6 +5394,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5196,6 +5407,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5253,6 +5469,11 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5273,6 +5494,11 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5458,6 +5684,14 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5475,6 +5709,11 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5483,6 +5722,11 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -5518,105 +5762,105 @@ msgstr "" "
B New Gerber
E Edit Object (if selected)
 Paint Area Tool
ALT+Q PDF Import Tool
ALT+R Transformations Tool
 
B Neue Gerber-Datei
E Objekt bearbeiten (falls ausgewählt)
 Paint Werkzeug
ALT+Q PDF-Importwerkzeug
ALT+R Transformationen\" Werkzeug
 Copy Geo Item
D Within Add Arc will toogle the ARC " +"direction: CW or CCW
E Polygon Intersection Tool
 Move Geo Item
M Within Add Arc will cycle through the ARC " +"modes
N Draw a Polygon
 Copy
D Add Disc
E Add SemiDisc
J Jump to Location (x, y)
 Add Pad
R Within Track & Region Tools will cycle in " +"REVERSE the bend modes
S Scale
 Add Track
T Within Track & Region Tools will cycle " +"FORWARD the bend modes
  
 Geo-Element kopieren
D Innerhalb des Arc hinzufügen-Werkzeugs " +"wird die ARC-Richtung gesegelt: CW oder CCW
E Polygonschnitt-Werkzeug
 Geo-Element verschieben
M Innerhalb des Arc hinzufügen-Werkzeugs " +"werden die ARC-Modi durchlaufen
N Zeichnen Sie ein Polygon
C Kopieren
D Scheibe hinzufügen
E HalbScheibe hinzufügen
J Zum Standort springen (x, y) Pad hinzufügen
R Innerhalb von Track & Region wechseln die " +"Werkzeuge die Biegemodi
S Skalieren
 Track hinzufügen
T Innerhalb von Track & Region schalten die " +"Werkzeuge die Biegemodi vorwärts
  
\n" " " -#: flatcamGUI/FlatCAMGUI.py:1506 +#: flatcamGUI/FlatCAMGUI.py:1550 msgid "Disable" msgstr "Deaktivieren" -#: flatcamGUI/FlatCAMGUI.py:1508 +#: flatcamGUI/FlatCAMGUI.py:1552 msgid "New" msgstr "Neu" -#: flatcamGUI/FlatCAMGUI.py:1509 +#: flatcamGUI/FlatCAMGUI.py:1553 msgid "Geometry" msgstr "Geometrie" -#: flatcamGUI/FlatCAMGUI.py:1510 +#: flatcamGUI/FlatCAMGUI.py:1554 msgid "Excellon" msgstr "Excellon" -#: flatcamGUI/FlatCAMGUI.py:1515 +#: flatcamGUI/FlatCAMGUI.py:1559 msgid "Grids" msgstr "Raster" -#: flatcamGUI/FlatCAMGUI.py:1517 +#: flatcamGUI/FlatCAMGUI.py:1561 msgid "View" msgstr "Aussicht" -#: flatcamGUI/FlatCAMGUI.py:1519 +#: flatcamGUI/FlatCAMGUI.py:1563 msgid "Clear Plot" msgstr "Plot klar löschen" -#: flatcamGUI/FlatCAMGUI.py:1520 +#: flatcamGUI/FlatCAMGUI.py:1564 msgid "Replot" msgstr "Replotieren" -#: flatcamGUI/FlatCAMGUI.py:1523 +#: flatcamGUI/FlatCAMGUI.py:1567 msgid "Geo Editor" msgstr "Geo-Editor" -#: flatcamGUI/FlatCAMGUI.py:1524 +#: flatcamGUI/FlatCAMGUI.py:1568 msgid "Line" msgstr "Linie" -#: flatcamGUI/FlatCAMGUI.py:1525 +#: flatcamGUI/FlatCAMGUI.py:1569 msgid "Rectangle" msgstr "Rechteck" -#: flatcamGUI/FlatCAMGUI.py:1526 flatcamGUI/FlatCAMGUI.py:5021 +#: flatcamGUI/FlatCAMGUI.py:1570 flatcamGUI/FlatCAMGUI.py:5110 #: flatcamGUI/ObjectUI.py:1360 msgid "Cut" msgstr "Schnitt" -#: flatcamGUI/FlatCAMGUI.py:1531 +#: flatcamGUI/FlatCAMGUI.py:1575 msgid "Pad" msgstr "Pad" -#: flatcamGUI/FlatCAMGUI.py:1532 +#: flatcamGUI/FlatCAMGUI.py:1576 msgid "Pad Array" msgstr "Pad-Array" -#: flatcamGUI/FlatCAMGUI.py:1533 +#: flatcamGUI/FlatCAMGUI.py:1577 msgid "Track" msgstr "Track" -#: flatcamGUI/FlatCAMGUI.py:1534 +#: flatcamGUI/FlatCAMGUI.py:1578 msgid "Region" msgstr "Region" -#: flatcamGUI/FlatCAMGUI.py:1540 +#: flatcamGUI/FlatCAMGUI.py:1584 msgid "Exc Editor" msgstr "Exc-Editor" -#: flatcamGUI/FlatCAMGUI.py:1541 +#: flatcamGUI/FlatCAMGUI.py:1585 msgid "Add Drill" msgstr "Bohrer hinzufügen" -#: flatcamGUI/FlatCAMGUI.py:1543 +#: flatcamGUI/FlatCAMGUI.py:1587 msgid "Copy Drill(s)" msgstr "Bohrer kopieren" -#: flatcamGUI/FlatCAMGUI.py:1574 +#: flatcamGUI/FlatCAMGUI.py:1618 msgid "Print Preview" msgstr "Druckvorschau" -#: flatcamGUI/FlatCAMGUI.py:1575 +#: flatcamGUI/FlatCAMGUI.py:1619 msgid "Print Code" msgstr "Code drucken" -#: flatcamGUI/FlatCAMGUI.py:1576 +#: flatcamGUI/FlatCAMGUI.py:1620 msgid "Find in Code" msgstr "Im Code suchen" -#: flatcamGUI/FlatCAMGUI.py:1581 +#: flatcamGUI/FlatCAMGUI.py:1625 msgid "Replace With" msgstr "Ersetzen mit" -#: flatcamGUI/FlatCAMGUI.py:1585 flatcamGUI/FlatCAMGUI.py:5019 -#: flatcamGUI/FlatCAMGUI.py:5529 flatcamGUI/ObjectUI.py:1358 +#: flatcamGUI/FlatCAMGUI.py:1629 flatcamGUI/FlatCAMGUI.py:5108 +#: flatcamGUI/FlatCAMGUI.py:5618 flatcamGUI/ObjectUI.py:1358 msgid "All" msgstr "Alles" -#: flatcamGUI/FlatCAMGUI.py:1587 +#: flatcamGUI/FlatCAMGUI.py:1631 msgid "" "When checked it will replace all instances in the 'Find' box\n" "with the text in the 'Replace' box.." @@ -5625,15 +5869,15 @@ msgstr "" "ersetzt\n" "mit dem Text im Feld \"Ersetzen\" .." -#: flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1634 msgid "Open Code" msgstr "Code öffnen" -#: flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1635 msgid "Save Code" msgstr "Code speichern" -#: flatcamGUI/FlatCAMGUI.py:1626 +#: flatcamGUI/FlatCAMGUI.py:1670 msgid "" "Relative neasurement.\n" "Reference is last click position" @@ -5641,7 +5885,7 @@ msgstr "" "Relative Messung\n" "Referenz ist Position des letzten Klicks" -#: flatcamGUI/FlatCAMGUI.py:1632 +#: flatcamGUI/FlatCAMGUI.py:1676 msgid "" "Absolute neasurement.\n" "Reference is (X=0, Y= 0) position" @@ -5649,23 +5893,23 @@ msgstr "" "Absolute Messung.\n" "Referenz ist (X = 0, Y = 0)" -#: flatcamGUI/FlatCAMGUI.py:1825 +#: flatcamGUI/FlatCAMGUI.py:1869 msgid "Select 'Esc'" msgstr "Wählen" -#: flatcamGUI/FlatCAMGUI.py:1850 +#: flatcamGUI/FlatCAMGUI.py:1894 msgid "Copy Objects" msgstr "Objekte kopieren" -#: flatcamGUI/FlatCAMGUI.py:1852 +#: flatcamGUI/FlatCAMGUI.py:1896 msgid "Delete Shape" msgstr "Form löschen" -#: flatcamGUI/FlatCAMGUI.py:1857 +#: flatcamGUI/FlatCAMGUI.py:1901 msgid "Move Objects" msgstr "Objekte verschieben" -#: flatcamGUI/FlatCAMGUI.py:2266 +#: flatcamGUI/FlatCAMGUI.py:2319 msgid "" "Please first select a geometry item to be cutted\n" "then select the geometry item that will be cutted\n" @@ -5677,17 +5921,17 @@ msgstr "" "aus dem ersten Artikel. Zum Schluss drücken Sie die Taste ~ X ~ oder\n" "die Symbolleisten-Schaltfläche." -#: flatcamGUI/FlatCAMGUI.py:2273 flatcamGUI/FlatCAMGUI.py:2405 -#: flatcamGUI/FlatCAMGUI.py:2464 flatcamGUI/FlatCAMGUI.py:2484 +#: flatcamGUI/FlatCAMGUI.py:2326 flatcamGUI/FlatCAMGUI.py:2463 +#: flatcamGUI/FlatCAMGUI.py:2522 flatcamGUI/FlatCAMGUI.py:2542 msgid "Warning" msgstr "Warnung" -#: flatcamGUI/FlatCAMGUI.py:2340 flatcamGUI/FlatCAMGUI.py:2537 -#: flatcamGUI/FlatCAMGUI.py:2735 +#: flatcamGUI/FlatCAMGUI.py:2393 flatcamGUI/FlatCAMGUI.py:2592 +#: flatcamGUI/FlatCAMGUI.py:2803 msgid "[WARNING_NOTCL] Cancelled." msgstr "[WARNING_NOTCL] Abgebrochen." -#: flatcamGUI/FlatCAMGUI.py:2400 +#: flatcamGUI/FlatCAMGUI.py:2458 msgid "" "Please select geometry items \n" "on which to perform Intersection Tool." @@ -5695,7 +5939,7 @@ msgstr "" "Bitte wählen Sie Geometrieelemente aus\n" "auf dem das Verschneidungswerkzeug ausgeführt werden soll." -#: flatcamGUI/FlatCAMGUI.py:2459 +#: flatcamGUI/FlatCAMGUI.py:2517 msgid "" "Please select geometry items \n" "on which to perform Substraction Tool." @@ -5703,7 +5947,7 @@ msgstr "" "Bitte wählen Sie Geometrieelemente aus\n" "auf dem das Subtraktionswerkzeug ausgeführt werden soll." -#: flatcamGUI/FlatCAMGUI.py:2479 +#: flatcamGUI/FlatCAMGUI.py:2537 msgid "" "Please select geometry items \n" "on which to perform union." @@ -5711,51 +5955,55 @@ msgstr "" "Bitte wählen Sie Geometrieelemente aus\n" "auf dem die Polygonverbindung ausgeführt werden soll." -#: flatcamGUI/FlatCAMGUI.py:2552 flatcamGUI/FlatCAMGUI.py:2752 +#: flatcamGUI/FlatCAMGUI.py:2608 flatcamGUI/FlatCAMGUI.py:2820 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to delete." msgstr "[WARNING_NOTCL] Abgebrochen. Nichts zum Löschen ausgewählt." -#: flatcamGUI/FlatCAMGUI.py:2629 flatcamGUI/FlatCAMGUI.py:2819 +#: flatcamGUI/FlatCAMGUI.py:2692 flatcamGUI/FlatCAMGUI.py:2887 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to copy." msgstr "[WARNING_NOTCL] Abgebrochen. Nichts zum Kopieren ausgewählt." -#: flatcamGUI/FlatCAMGUI.py:2663 flatcamGUI/FlatCAMGUI.py:2865 +#: flatcamGUI/FlatCAMGUI.py:2738 flatcamGUI/FlatCAMGUI.py:2933 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to move." msgstr "[WARNING_NOTCL] Abgebrochen. Nichts ausgewählt, um sich zu bewegen." -#: flatcamGUI/FlatCAMGUI.py:2879 +#: flatcamGUI/FlatCAMGUI.py:2947 msgid "New Tool ..." msgstr "Neues Werkzeug ..." -#: flatcamGUI/FlatCAMGUI.py:2880 +#: flatcamGUI/FlatCAMGUI.py:2948 msgid "Enter a Tool Diameter:" msgstr "Geben Sie einen Werkzeugdurchmesser ein:" -#: flatcamGUI/FlatCAMGUI.py:3182 +#: flatcamGUI/FlatCAMGUI.py:2990 +msgid "Measurement Tool exit..." +msgstr "Messwerkzeug beenden ..." + +#: flatcamGUI/FlatCAMGUI.py:3271 msgid "Grid X value:" msgstr "Raster X-Wert:" -#: flatcamGUI/FlatCAMGUI.py:3184 +#: flatcamGUI/FlatCAMGUI.py:3273 msgid "This is the Grid snap value on X axis." msgstr "Dies ist der Rasterfangwert auf der X-Achse." -#: flatcamGUI/FlatCAMGUI.py:3189 +#: flatcamGUI/FlatCAMGUI.py:3278 msgid "Grid Y value:" msgstr "Raster Y-Wert:" -#: flatcamGUI/FlatCAMGUI.py:3191 +#: flatcamGUI/FlatCAMGUI.py:3280 msgid "This is the Grid snap value on Y axis." msgstr "Dies ist der Rasterfangwert auf der Y-Achse." -#: flatcamGUI/FlatCAMGUI.py:3196 +#: flatcamGUI/FlatCAMGUI.py:3285 msgid "Snap Max:" msgstr "Maximalwert:" -#: flatcamGUI/FlatCAMGUI.py:3201 +#: flatcamGUI/FlatCAMGUI.py:3290 msgid "Workspace:" msgstr "Arbeitsplatz:" -#: flatcamGUI/FlatCAMGUI.py:3203 +#: flatcamGUI/FlatCAMGUI.py:3292 msgid "" "Draw a delimiting rectangle on canvas.\n" "The purpose is to illustrate the limits for our work." @@ -5763,11 +6011,11 @@ msgstr "" "Zeichnen Sie ein begrenzendes Rechteck auf die Leinwand.\n" "Ziel ist es, die Grenzen unserer Arbeit aufzuzeigen." -#: flatcamGUI/FlatCAMGUI.py:3206 +#: flatcamGUI/FlatCAMGUI.py:3295 msgid "Wk. format:" msgstr "Arbeitsbereichformat:" -#: flatcamGUI/FlatCAMGUI.py:3208 +#: flatcamGUI/FlatCAMGUI.py:3297 msgid "" "Select the type of rectangle to be used on canvas,\n" "as valid workspace." @@ -5775,11 +6023,11 @@ msgstr "" "Wählen Sie den Typ des Rechtecks für die Leinwand aus.\n" "als gültiger Arbeitsbereich." -#: flatcamGUI/FlatCAMGUI.py:3221 +#: flatcamGUI/FlatCAMGUI.py:3310 msgid "Plot Fill:" msgstr "Plot füllen:" -#: flatcamGUI/FlatCAMGUI.py:3223 +#: flatcamGUI/FlatCAMGUI.py:3312 msgid "" "Set the fill color for plotted objects.\n" "First 6 digits are the color and the last 2\n" @@ -5789,28 +6037,28 @@ msgstr "" "Die ersten 6 Ziffern sind die Farbe und die letzten 2\n" "Ziffern sind für Alpha (Transparenz)." -#: flatcamGUI/FlatCAMGUI.py:3237 flatcamGUI/FlatCAMGUI.py:3287 -#: flatcamGUI/FlatCAMGUI.py:3337 +#: flatcamGUI/FlatCAMGUI.py:3326 flatcamGUI/FlatCAMGUI.py:3376 +#: flatcamGUI/FlatCAMGUI.py:3426 msgid "Alpha Level:" msgstr "Alpha-Ebene:" -#: flatcamGUI/FlatCAMGUI.py:3239 +#: flatcamGUI/FlatCAMGUI.py:3328 msgid "Set the fill transparency for plotted objects." msgstr "Legen Sie die Füllungstransparenz für geplottete Objekte fest." -#: flatcamGUI/FlatCAMGUI.py:3256 +#: flatcamGUI/FlatCAMGUI.py:3345 msgid "Plot Line:" msgstr "Handlungsstrang:" -#: flatcamGUI/FlatCAMGUI.py:3258 +#: flatcamGUI/FlatCAMGUI.py:3347 msgid "Set the line color for plotted objects." msgstr "Legen Sie die Linienfarbe für geplottete Objekte fest." -#: flatcamGUI/FlatCAMGUI.py:3270 +#: flatcamGUI/FlatCAMGUI.py:3359 msgid "Sel. Fill:" msgstr "Ausgewählte Füllung:" -#: flatcamGUI/FlatCAMGUI.py:3272 +#: flatcamGUI/FlatCAMGUI.py:3361 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from left to right.\n" @@ -5822,26 +6070,26 @@ msgstr "" "Die ersten 6 Ziffern sind die Farbe und die letzten 2\n" "Ziffern sind für Alpha (Transparenz)." -#: flatcamGUI/FlatCAMGUI.py:3289 +#: flatcamGUI/FlatCAMGUI.py:3378 msgid "Set the fill transparency for the 'left to right' selection box." msgstr "" "Legen Sie die Füllungstransparenz für das Auswahlfeld \"von links nach rechts" "\" fest." -#: flatcamGUI/FlatCAMGUI.py:3306 +#: flatcamGUI/FlatCAMGUI.py:3395 msgid "Sel. Line:" msgstr "Auswahlzeile:" -#: flatcamGUI/FlatCAMGUI.py:3308 +#: flatcamGUI/FlatCAMGUI.py:3397 msgid "Set the line color for the 'left to right' selection box." msgstr "" "Legen Sie die Linienfarbe für das Auswahlfeld \"von links nach rechts\" fest." -#: flatcamGUI/FlatCAMGUI.py:3320 +#: flatcamGUI/FlatCAMGUI.py:3409 msgid "Sel2. Fill:" msgstr "Auswahl2 Füllung:" -#: flatcamGUI/FlatCAMGUI.py:3322 +#: flatcamGUI/FlatCAMGUI.py:3411 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from right to left.\n" @@ -5853,45 +6101,45 @@ msgstr "" "Die ersten 6 Ziffern sind die Farbe und die letzten 2\n" "Ziffern sind für Alpha (Transparenz)." -#: flatcamGUI/FlatCAMGUI.py:3339 +#: flatcamGUI/FlatCAMGUI.py:3428 msgid "Set the fill transparency for selection 'right to left' box." msgstr "" "Legen Sie die Füllungstransparenz für die Auswahl von rechts nach links fest." -#: flatcamGUI/FlatCAMGUI.py:3356 +#: flatcamGUI/FlatCAMGUI.py:3445 msgid "Sel2. Line:" msgstr "Auswahl 2 Zeile:" -#: flatcamGUI/FlatCAMGUI.py:3358 +#: flatcamGUI/FlatCAMGUI.py:3447 msgid "Set the line color for the 'right to left' selection box." msgstr "" "Legen Sie die Linienfarbe für das Auswahlfeld 'von rechts nach links' fest." -#: flatcamGUI/FlatCAMGUI.py:3370 +#: flatcamGUI/FlatCAMGUI.py:3459 msgid "Editor Draw:" msgstr "Editor zeichnen:" -#: flatcamGUI/FlatCAMGUI.py:3372 +#: flatcamGUI/FlatCAMGUI.py:3461 msgid "Set the color for the shape." msgstr "Legen Sie die Farbe für die Form fest." -#: flatcamGUI/FlatCAMGUI.py:3384 +#: flatcamGUI/FlatCAMGUI.py:3473 msgid "Editor Draw Sel.:" msgstr "Editor Draw Sel.:" -#: flatcamGUI/FlatCAMGUI.py:3386 +#: flatcamGUI/FlatCAMGUI.py:3475 msgid "Set the color of the shape when selected." msgstr "Legt die Farbe der Form fest, wenn sie ausgewählt wird." -#: flatcamGUI/FlatCAMGUI.py:3433 +#: flatcamGUI/FlatCAMGUI.py:3522 msgid "GUI Settings" msgstr "GUI-Einstellungen" -#: flatcamGUI/FlatCAMGUI.py:3440 +#: flatcamGUI/FlatCAMGUI.py:3529 msgid "Layout:" msgstr "Layout:" -#: flatcamGUI/FlatCAMGUI.py:3442 +#: flatcamGUI/FlatCAMGUI.py:3531 msgid "" "Select an layout for FlatCAM.\n" "It is applied immediately." @@ -5899,11 +6147,11 @@ msgstr "" "Wählen Sie ein Layout für FlatCAM.\n" "Es wird sofort angewendet." -#: flatcamGUI/FlatCAMGUI.py:3458 +#: flatcamGUI/FlatCAMGUI.py:3547 msgid "Style:" msgstr "Stil:" -#: flatcamGUI/FlatCAMGUI.py:3460 +#: flatcamGUI/FlatCAMGUI.py:3549 msgid "" "Select an style for FlatCAM.\n" "It will be applied at the next app start." @@ -5911,11 +6159,11 @@ msgstr "" "Wählen Sie einen Stil für FlatCAM.\n" "Es wird beim nächsten Start der App angewendet." -#: flatcamGUI/FlatCAMGUI.py:3471 +#: flatcamGUI/FlatCAMGUI.py:3560 msgid "HDPI Support:" msgstr "HDPI-Unterstützung:" -#: flatcamGUI/FlatCAMGUI.py:3473 +#: flatcamGUI/FlatCAMGUI.py:3562 msgid "" "Enable High DPI support for FlatCAM.\n" "It will be applied at the next app start." @@ -5923,11 +6171,11 @@ msgstr "" "Aktivieren Sie die High DPI-Unterstützung für FlatCAM.\n" "Es wird beim nächsten Start der App angewendet." -#: flatcamGUI/FlatCAMGUI.py:3486 +#: flatcamGUI/FlatCAMGUI.py:3575 msgid "Clear GUI Settings:" msgstr "GUI-Einstellungen löschen:" -#: flatcamGUI/FlatCAMGUI.py:3488 +#: flatcamGUI/FlatCAMGUI.py:3577 msgid "" "Clear the GUI settings for FlatCAM,\n" "such as: layout, gui state, style, hdpi support etc." @@ -5935,15 +6183,15 @@ msgstr "" "Löschen Sie die GUI-Einstellungen für FlatCAM.\n" "wie zum Beispiel: Layout, GUI-Status, Stil, HDPI-Unterstützung usw." -#: flatcamGUI/FlatCAMGUI.py:3491 +#: flatcamGUI/FlatCAMGUI.py:3580 msgid "Clear" msgstr "Klären" -#: flatcamGUI/FlatCAMGUI.py:3495 +#: flatcamGUI/FlatCAMGUI.py:3584 msgid "Hover Shape:" msgstr "Schwebeflug-Form:" -#: flatcamGUI/FlatCAMGUI.py:3497 +#: flatcamGUI/FlatCAMGUI.py:3586 msgid "" "Enable display of a hover shape for FlatCAM objects.\n" "It is displayed whenever the mouse cursor is hovering\n" @@ -5953,23 +6201,23 @@ msgstr "" "Es wird angezeigt, wenn sich der Mauszeiger in der Maus befindet\n" "über jede Art von nicht ausgewähltem Objekt." -#: flatcamGUI/FlatCAMGUI.py:3537 +#: flatcamGUI/FlatCAMGUI.py:3626 msgid "Are you sure you want to delete the GUI Settings? \n" msgstr "Möchten Sie die GUI-Einstellungen wirklich löschen?\n" -#: flatcamGUI/FlatCAMGUI.py:3540 +#: flatcamGUI/FlatCAMGUI.py:3629 msgid "Clear GUI Settings" msgstr "Löschen Sie die GUI-Einstellungen" -#: flatcamGUI/FlatCAMGUI.py:3561 +#: flatcamGUI/FlatCAMGUI.py:3650 msgid "App Preferences" msgstr "App-Einstellungen" -#: flatcamGUI/FlatCAMGUI.py:3567 +#: flatcamGUI/FlatCAMGUI.py:3656 msgid "Units:" msgstr "Einheiten:" -#: flatcamGUI/FlatCAMGUI.py:3568 +#: flatcamGUI/FlatCAMGUI.py:3657 msgid "" "The default value for FlatCAM units.\n" "Whatever is selected here is set every time\n" @@ -5979,11 +6227,11 @@ msgstr "" "Was hier ausgewählt wird, wird jedes Mal eingestellt\n" "FLatCAM wird gestartet." -#: flatcamGUI/FlatCAMGUI.py:3575 +#: flatcamGUI/FlatCAMGUI.py:3664 msgid "APP. LEVEL:" msgstr "Bewerbungsebene:" -#: flatcamGUI/FlatCAMGUI.py:3576 +#: flatcamGUI/FlatCAMGUI.py:3665 msgid "" "Choose the default level of usage for FlatCAM.\n" "BASIC level -> reduced functionality, best for beginner's.\n" @@ -5999,31 +6247,31 @@ msgstr "" "Die Auswahl hier beeinflusst die Parameter in\n" "Die Registerkarte Ausgewählt für alle Arten von FlatCAM-Objekten." -#: flatcamGUI/FlatCAMGUI.py:3581 flatcamGUI/FlatCAMGUI.py:4206 +#: flatcamGUI/FlatCAMGUI.py:3670 flatcamGUI/FlatCAMGUI.py:4295 msgid "Basic" msgstr "Basic" -#: flatcamGUI/FlatCAMGUI.py:3582 +#: flatcamGUI/FlatCAMGUI.py:3671 msgid "Advanced" msgstr "Erweitert" -#: flatcamGUI/FlatCAMGUI.py:3585 +#: flatcamGUI/FlatCAMGUI.py:3674 msgid "Languages:" msgstr "Sprachen:" -#: flatcamGUI/FlatCAMGUI.py:3586 +#: flatcamGUI/FlatCAMGUI.py:3675 msgid "Set the language used throughout FlatCAM." msgstr "Stellen Sie die Sprache ein, die in FlatCAM verwendet wird." -#: flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:3678 msgid "Apply Language" msgstr "Sprache anwenden" -#: flatcamGUI/FlatCAMGUI.py:3592 +#: flatcamGUI/FlatCAMGUI.py:3681 msgid "Shell at StartUp:" msgstr "Shell beim Start:" -#: flatcamGUI/FlatCAMGUI.py:3594 flatcamGUI/FlatCAMGUI.py:3599 +#: flatcamGUI/FlatCAMGUI.py:3683 flatcamGUI/FlatCAMGUI.py:3688 msgid "" "Check this box if you want the shell to\n" "start automatically at startup." @@ -6031,11 +6279,11 @@ msgstr "" "Aktivieren Sie dieses Kontrollkästchen, wenn die Shell gewünscht wird\n" "automatisch beim Start starten" -#: flatcamGUI/FlatCAMGUI.py:3604 +#: flatcamGUI/FlatCAMGUI.py:3693 msgid "Version Check:" msgstr "Versionsprüfung:" -#: flatcamGUI/FlatCAMGUI.py:3606 flatcamGUI/FlatCAMGUI.py:3611 +#: flatcamGUI/FlatCAMGUI.py:3695 flatcamGUI/FlatCAMGUI.py:3700 msgid "" "Check this box if you want to check\n" "for a new version automatically at startup." @@ -6044,11 +6292,11 @@ msgstr "" "wenn Sie das Kontrollkästchen aktivieren möchten\n" "für eine neue Version automatisch beim Start." -#: flatcamGUI/FlatCAMGUI.py:3616 +#: flatcamGUI/FlatCAMGUI.py:3705 msgid "Send Stats:" msgstr "Statistiken senden:" -#: flatcamGUI/FlatCAMGUI.py:3618 flatcamGUI/FlatCAMGUI.py:3623 +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:3712 msgid "" "Check this box if you agree to send anonymous\n" "stats automatically at startup, to help improve FlatCAM." @@ -6057,11 +6305,11 @@ msgstr "" "zustimmen\n" "wird beim Start automatisch aktualisiert, um FlatCAM zu verbessern." -#: flatcamGUI/FlatCAMGUI.py:3630 +#: flatcamGUI/FlatCAMGUI.py:3719 msgid "Pan Button:" msgstr "Pan-Taste:" -#: flatcamGUI/FlatCAMGUI.py:3631 +#: flatcamGUI/FlatCAMGUI.py:3720 msgid "" "Select the mouse button to use for panning:\n" "- MMB --> Middle Mouse Button\n" @@ -6071,35 +6319,35 @@ msgstr "" "- MMB -> Mittlere Maustaste\n" "- RMB -> Rechte Maustaste" -#: flatcamGUI/FlatCAMGUI.py:3634 +#: flatcamGUI/FlatCAMGUI.py:3723 msgid "MMB" msgstr "MMB" -#: flatcamGUI/FlatCAMGUI.py:3635 +#: flatcamGUI/FlatCAMGUI.py:3724 msgid "RMB" msgstr "RMB" -#: flatcamGUI/FlatCAMGUI.py:3638 +#: flatcamGUI/FlatCAMGUI.py:3727 msgid "Multiple Sel:" msgstr "Mehrfachauswahl:" -#: flatcamGUI/FlatCAMGUI.py:3639 +#: flatcamGUI/FlatCAMGUI.py:3728 msgid "Select the key used for multiple selection." msgstr "Wählen Sie den Schlüssel für die Mehrfachauswahl aus." -#: flatcamGUI/FlatCAMGUI.py:3640 +#: flatcamGUI/FlatCAMGUI.py:3729 msgid "CTRL" msgstr "CTRL" -#: flatcamGUI/FlatCAMGUI.py:3641 +#: flatcamGUI/FlatCAMGUI.py:3730 msgid "SHIFT" msgstr "SHIFT" -#: flatcamGUI/FlatCAMGUI.py:3644 +#: flatcamGUI/FlatCAMGUI.py:3733 msgid "Project at StartUp:" msgstr "Projekt beim Start:" -#: flatcamGUI/FlatCAMGUI.py:3646 flatcamGUI/FlatCAMGUI.py:3651 +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:3740 msgid "" "Check this box if you want the project/selected/tool tab area to\n" "to be shown automatically at startup." @@ -6109,11 +6357,11 @@ msgstr "" "angezeigt werden soll\n" "beim Start automatisch angezeigt werden." -#: flatcamGUI/FlatCAMGUI.py:3656 +#: flatcamGUI/FlatCAMGUI.py:3745 msgid "Project AutoHide:" msgstr "Projekt autoausblenden:" -#: flatcamGUI/FlatCAMGUI.py:3658 flatcamGUI/FlatCAMGUI.py:3664 +#: flatcamGUI/FlatCAMGUI.py:3747 flatcamGUI/FlatCAMGUI.py:3753 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" @@ -6125,11 +6373,11 @@ msgstr "" "keine Objekte geladen sind und anzeigen, wenn ein \n" "neues Objekt erstellt wird." -#: flatcamGUI/FlatCAMGUI.py:3670 +#: flatcamGUI/FlatCAMGUI.py:3759 msgid "Enable ToolTips:" msgstr " QuickInfos aktivieren: " -#: flatcamGUI/FlatCAMGUI.py:3672 flatcamGUI/FlatCAMGUI.py:3677 +#: flatcamGUI/FlatCAMGUI.py:3761 flatcamGUI/FlatCAMGUI.py:3766 msgid "" "Check this box if you want to have toolTips displayed\n" "when hovering with mouse over items throughout the App." @@ -6138,11 +6386,11 @@ msgstr "" "sollen\n" "wenn Sie mit der Maus über Elemente in der App fahren." -#: flatcamGUI/FlatCAMGUI.py:3680 +#: flatcamGUI/FlatCAMGUI.py:3769 msgid "Workers number:" msgstr "Arbeiter Nummer:" -#: flatcamGUI/FlatCAMGUI.py:3682 flatcamGUI/FlatCAMGUI.py:3691 +#: flatcamGUI/FlatCAMGUI.py:3771 flatcamGUI/FlatCAMGUI.py:3780 msgid "" "The number of Qthreads made available to the App.\n" "A bigger number may finish the jobs more quickly but\n" @@ -6158,11 +6406,11 @@ msgstr "" "Der Standardwert ist 2.\n" "Nach dem Ändern wird es beim nächsten Start der App angewendet." -#: flatcamGUI/FlatCAMGUI.py:3732 +#: flatcamGUI/FlatCAMGUI.py:3821 msgid "Save Compressed Project" msgstr "Speichern Sie das komprimierte Projekt" -#: flatcamGUI/FlatCAMGUI.py:3734 +#: flatcamGUI/FlatCAMGUI.py:3823 msgid "" "Whether to save a compressed or uncompressed project.\n" "When checked it will save a compressed FlatCAM project." @@ -6172,11 +6420,11 @@ msgstr "" "Wenn diese Option aktiviert ist, wird ein komprimiertes FlatCAM-Projekt " "gespeichert." -#: flatcamGUI/FlatCAMGUI.py:3745 +#: flatcamGUI/FlatCAMGUI.py:3834 msgid "Compression Level:" msgstr "Kompressionsstufe:" -#: flatcamGUI/FlatCAMGUI.py:3747 +#: flatcamGUI/FlatCAMGUI.py:3836 msgid "" "The level of compression used when saving\n" "a FlatCAM project. Higher value means better compression\n" @@ -6186,47 +6434,47 @@ msgstr "" "ein FlatCAM-Projekt. Ein höherer Wert bedeutet eine bessere Komprimierung\n" "erfordern jedoch mehr RAM-Auslastung und mehr Verarbeitungszeit." -#: flatcamGUI/FlatCAMGUI.py:3773 flatcamGUI/FlatCAMGUI.py:4014 -#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/FlatCAMGUI.py:4993 +#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/FlatCAMGUI.py:4103 +#: flatcamGUI/FlatCAMGUI.py:4758 flatcamGUI/FlatCAMGUI.py:5082 #: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:505 #: flatcamGUI/ObjectUI.py:830 flatcamGUI/ObjectUI.py:1344 msgid "Plot Options:" msgstr " Diagrammoptionen: " -#: flatcamGUI/FlatCAMGUI.py:3780 flatcamGUI/FlatCAMGUI.py:4026 +#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/FlatCAMGUI.py:4115 #: flatcamGUI/ObjectUI.py:506 msgid "Solid" msgstr "Solide" -#: flatcamGUI/FlatCAMGUI.py:3782 flatcamGUI/ObjectUI.py:158 +#: flatcamGUI/FlatCAMGUI.py:3871 flatcamGUI/ObjectUI.py:158 msgid "Solid color polygons." msgstr "Einfarbige Polygone." -#: flatcamGUI/FlatCAMGUI.py:3787 +#: flatcamGUI/FlatCAMGUI.py:3876 msgid "M-Color" msgstr "M-farbig" -#: flatcamGUI/FlatCAMGUI.py:3789 flatcamGUI/ObjectUI.py:166 +#: flatcamGUI/FlatCAMGUI.py:3878 flatcamGUI/ObjectUI.py:166 msgid "Draw polygons in different colors." msgstr "Zeichnen Sie Polygone in verschiedenen Farben." -#: flatcamGUI/FlatCAMGUI.py:3794 flatcamGUI/FlatCAMGUI.py:4020 -#: flatcamGUI/FlatCAMGUI.py:4673 flatcamGUI/ObjectUI.py:172 +#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:4109 +#: flatcamGUI/FlatCAMGUI.py:4762 flatcamGUI/ObjectUI.py:172 msgid "Plot" msgstr "Zeichn" -#: flatcamGUI/FlatCAMGUI.py:3796 flatcamGUI/FlatCAMGUI.py:4675 +#: flatcamGUI/FlatCAMGUI.py:3885 flatcamGUI/FlatCAMGUI.py:4764 #: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:546 #: flatcamGUI/ObjectUI.py:876 flatcamGUI/ObjectUI.py:1431 msgid "Plot (show) this object." msgstr "Plotten (zeigen) dieses Objekt." -#: flatcamGUI/FlatCAMGUI.py:3801 flatcamGUI/FlatCAMGUI.py:4682 -#: flatcamGUI/FlatCAMGUI.py:5029 +#: flatcamGUI/FlatCAMGUI.py:3890 flatcamGUI/FlatCAMGUI.py:4771 +#: flatcamGUI/FlatCAMGUI.py:5118 msgid "Circle Steps:" msgstr "Kreisschritte:" -#: flatcamGUI/FlatCAMGUI.py:3803 +#: flatcamGUI/FlatCAMGUI.py:3892 msgid "" "The number of circle steps for Gerber \n" "circular aperture linear approximation." @@ -6234,15 +6482,15 @@ msgstr "" "Die Anzahl der Kreisschritte für Gerber\n" "lineare Approximation mit kreisförmiger Apertur." -#: flatcamGUI/FlatCAMGUI.py:3818 +#: flatcamGUI/FlatCAMGUI.py:3907 msgid "Gerber Options" msgstr "Gerber-Optionen" -#: flatcamGUI/FlatCAMGUI.py:3822 flatcamGUI/ObjectUI.py:251 +#: flatcamGUI/FlatCAMGUI.py:3911 flatcamGUI/ObjectUI.py:251 msgid "Isolation Routing:" msgstr " Isolierungsrouting: " -#: flatcamGUI/FlatCAMGUI.py:3824 flatcamGUI/ObjectUI.py:253 +#: flatcamGUI/FlatCAMGUI.py:3913 flatcamGUI/ObjectUI.py:253 msgid "" "Create a Geometry object with\n" "toolpaths to cut outside polygons." @@ -6251,17 +6499,17 @@ msgstr "" "Werkzeugwege zum Schneiden von \n" "äußeren Polygonen." -#: flatcamGUI/FlatCAMGUI.py:3835 flatcamGUI/FlatCAMGUI.py:4392 -#: flatcamGUI/FlatCAMGUI.py:5317 flatcamGUI/ObjectUI.py:785 +#: flatcamGUI/FlatCAMGUI.py:3924 flatcamGUI/FlatCAMGUI.py:4481 +#: flatcamGUI/FlatCAMGUI.py:5406 flatcamGUI/ObjectUI.py:785 #: flatcamGUI/ObjectUI.py:801 msgid "Diameter of the cutting tool." msgstr "Durchmesser des Schneidewerkzeugs." -#: flatcamGUI/FlatCAMGUI.py:3842 +#: flatcamGUI/FlatCAMGUI.py:3931 msgid "Width (# passes):" msgstr "Breite (# passt):" -#: flatcamGUI/FlatCAMGUI.py:3844 flatcamGUI/ObjectUI.py:275 +#: flatcamGUI/FlatCAMGUI.py:3933 flatcamGUI/ObjectUI.py:275 msgid "" "Width of the isolation gap in\n" "number (integer) of tool widths." @@ -6269,11 +6517,11 @@ msgstr "" "Breite der Isolationslücke in\n" "Anzahl (Ganzzahl) der Werkzeugbreiten." -#: flatcamGUI/FlatCAMGUI.py:3852 flatcamGUI/ObjectUI.py:283 +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:283 msgid "Pass overlap:" msgstr "Passüberlappung:" -#: flatcamGUI/FlatCAMGUI.py:3854 flatcamGUI/ObjectUI.py:285 +#: flatcamGUI/FlatCAMGUI.py:3943 flatcamGUI/ObjectUI.py:285 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -6287,11 +6535,11 @@ msgstr "" "Ein Wert von 0,25 bedeutet hier eine Überlappung von 25% \n" "vom oben angegebenen Werkzeugdurchmesser." -#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/ObjectUI.py:295 +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:295 msgid "Milling Type:" msgstr "Fräsart:" -#: flatcamGUI/FlatCAMGUI.py:3864 flatcamGUI/ObjectUI.py:297 +#: flatcamGUI/FlatCAMGUI.py:3953 flatcamGUI/ObjectUI.py:297 msgid "" "Milling type:\n" "- climb / best for precision milling and to reduce tool usage\n" @@ -6302,27 +6550,27 @@ msgstr "" "Werkzeugverbrauchs\n" "- konventionell / nützlich, wenn kein Spielausgleich vorliegt" -#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/ObjectUI.py:302 +#: flatcamGUI/FlatCAMGUI.py:3958 flatcamGUI/ObjectUI.py:302 msgid "Climb" msgstr "Steigen" -#: flatcamGUI/FlatCAMGUI.py:3870 flatcamGUI/ObjectUI.py:303 +#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:303 msgid "Conv." msgstr "Konv." -#: flatcamGUI/FlatCAMGUI.py:3874 +#: flatcamGUI/FlatCAMGUI.py:3963 msgid "Combine Passes" msgstr "Kombinieren Sie Pässe" -#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/ObjectUI.py:309 +#: flatcamGUI/FlatCAMGUI.py:3965 flatcamGUI/ObjectUI.py:309 msgid "Combine all passes into one object" msgstr "Kombinieren Sie alle Durchgänge in einem Objekt" -#: flatcamGUI/FlatCAMGUI.py:3881 +#: flatcamGUI/FlatCAMGUI.py:3970 msgid "Clear non-copper:" msgstr " Nicht-Kupfer löschen: " -#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:5205 +#: flatcamGUI/FlatCAMGUI.py:3972 flatcamGUI/FlatCAMGUI.py:5294 #: flatcamGUI/ObjectUI.py:386 msgid "" "Create a Geometry object with\n" @@ -6331,12 +6579,12 @@ msgstr "" "Erstellen Sie ein Geometrieobjekt mit\n" "Werkzeugwege, um alle Nicht-Kupfer-Bereiche zu schneiden." -#: flatcamGUI/FlatCAMGUI.py:3892 flatcamGUI/FlatCAMGUI.py:3918 +#: flatcamGUI/FlatCAMGUI.py:3981 flatcamGUI/FlatCAMGUI.py:4007 #: flatcamGUI/ObjectUI.py:430 flatcamGUI/ObjectUI.py:464 msgid "Boundary Margin:" msgstr "Grenzmarge:" -#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/ObjectUI.py:432 +#: flatcamGUI/FlatCAMGUI.py:3983 flatcamGUI/ObjectUI.py:432 msgid "" "Specify the edge of the PCB\n" "by drawing a box around all\n" @@ -6348,11 +6596,11 @@ msgstr "" "Objekte mit diesem Minimum\n" "Entfernung." -#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:3927 +#: flatcamGUI/FlatCAMGUI.py:3993 flatcamGUI/FlatCAMGUI.py:4016 msgid "Rounded corners" msgstr "Abgerundete Ecken" -#: flatcamGUI/FlatCAMGUI.py:3906 +#: flatcamGUI/FlatCAMGUI.py:3995 msgid "" "Creates a Geometry objects with polygons\n" "covering the copper-free areas of the PCB." @@ -6360,11 +6608,11 @@ msgstr "" "Erzeugt ein Geometrieobjekt mit Polygonen\n" "bedeckt die kupferfreien Bereiche der Leiterplatte." -#: flatcamGUI/FlatCAMGUI.py:3912 flatcamGUI/ObjectUI.py:454 +#: flatcamGUI/FlatCAMGUI.py:4001 flatcamGUI/ObjectUI.py:454 msgid "Bounding Box:" msgstr " Begrenzungsbox: " -#: flatcamGUI/FlatCAMGUI.py:3920 flatcamGUI/ObjectUI.py:466 +#: flatcamGUI/FlatCAMGUI.py:4009 flatcamGUI/ObjectUI.py:466 msgid "" "Distance of the edges of the box\n" "to the nearest polygon." @@ -6372,7 +6620,7 @@ msgstr "" "Abstand der Kanten der Box\n" "zum nächsten Polygon." -#: flatcamGUI/FlatCAMGUI.py:3929 flatcamGUI/ObjectUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/ObjectUI.py:476 msgid "" "If the bounding box is \n" "to have rounded corners\n" @@ -6384,15 +6632,15 @@ msgstr "" "ihr Radius ist gleich\n" "der Abstand." -#: flatcamGUI/FlatCAMGUI.py:3943 +#: flatcamGUI/FlatCAMGUI.py:4032 msgid "Gerber Adv. Options" msgstr "Erweiterte Optionen von Gerber" -#: flatcamGUI/FlatCAMGUI.py:3947 +#: flatcamGUI/FlatCAMGUI.py:4036 msgid "Advanced Param.:" msgstr "Erweiterte Parameter:" -#: flatcamGUI/FlatCAMGUI.py:3949 +#: flatcamGUI/FlatCAMGUI.py:4038 msgid "" "A list of Gerber advanced parameters.\n" "Those parameters are available only for\n" @@ -6402,11 +6650,11 @@ msgstr "" "Diese Parameter sind nur für verfügbar\n" "Fortgeschrittene Anwendungsebene." -#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:314 +#: flatcamGUI/FlatCAMGUI.py:4048 flatcamGUI/ObjectUI.py:314 msgid "\"Follow\"" msgstr "\"Folgen\"" -#: flatcamGUI/FlatCAMGUI.py:3961 flatcamGUI/ObjectUI.py:316 +#: flatcamGUI/FlatCAMGUI.py:4050 flatcamGUI/ObjectUI.py:316 msgid "" "Generate a 'Follow' geometry.\n" "This means that it will cut through\n" @@ -6416,11 +6664,11 @@ msgstr "" "Dies bedeutet, dass es durchschneiden wird\n" "die Mitte der Spur" -#: flatcamGUI/FlatCAMGUI.py:3969 +#: flatcamGUI/FlatCAMGUI.py:4058 msgid "Table Show/Hide" msgstr "Tabelle anzeigen / ausblenden" -#: flatcamGUI/FlatCAMGUI.py:3971 +#: flatcamGUI/FlatCAMGUI.py:4060 msgid "" "Toggle the display of the Gerber Apertures Table.\n" "Also, on hide, it will delete all mark shapes\n" @@ -6430,11 +6678,11 @@ msgstr "" "Beim Ausblenden werden auch alle Markierungsformen gelöscht\n" "das sind auf leinwand gezeichnet." -#: flatcamGUI/FlatCAMGUI.py:3979 +#: flatcamGUI/FlatCAMGUI.py:4068 msgid "Ap. Scale Factor:" msgstr "Öffnungsmaßstab:" -#: flatcamGUI/FlatCAMGUI.py:3981 +#: flatcamGUI/FlatCAMGUI.py:4070 msgid "" "Change the size of the selected apertures.\n" "Factor by which to multiply\n" @@ -6444,11 +6692,11 @@ msgstr "" "Faktor, mit dem sich multiplizieren soll\n" "geometrische Merkmale dieses Objekts." -#: flatcamGUI/FlatCAMGUI.py:3991 +#: flatcamGUI/FlatCAMGUI.py:4080 msgid "Ap. Buffer Factor:" msgstr "Blendenpufferfaktor:" -#: flatcamGUI/FlatCAMGUI.py:3993 +#: flatcamGUI/FlatCAMGUI.py:4082 msgid "" "Change the size of the selected apertures.\n" "Factor by which to expand/shrink\n" @@ -6458,15 +6706,15 @@ msgstr "" "Faktor, um den / das erweitert / verkleinert werden soll\n" "geometrische Merkmale dieses Objekts." -#: flatcamGUI/FlatCAMGUI.py:4011 +#: flatcamGUI/FlatCAMGUI.py:4100 msgid "Excellon General" msgstr "Excellon Allgemeines" -#: flatcamGUI/FlatCAMGUI.py:4033 +#: flatcamGUI/FlatCAMGUI.py:4122 msgid "Excellon Format:" msgstr "Excellon-Format:" -#: flatcamGUI/FlatCAMGUI.py:4035 +#: flatcamGUI/FlatCAMGUI.py:4124 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -6508,16 +6756,16 @@ msgstr "" "Sprint-Layout 2: 4 ZOLL LZ\n" "KiCAD 3: 5 ZOLL TZ" -#: flatcamGUI/FlatCAMGUI.py:4060 +#: flatcamGUI/FlatCAMGUI.py:4149 msgid "INCH:" msgstr "ZOLL:" -#: flatcamGUI/FlatCAMGUI.py:4063 +#: flatcamGUI/FlatCAMGUI.py:4152 msgid "Default values for INCH are 2:4" msgstr "Die Standardwerte für ZOLL sind 2: 4" -#: flatcamGUI/FlatCAMGUI.py:4071 flatcamGUI/FlatCAMGUI.py:4104 -#: flatcamGUI/FlatCAMGUI.py:4581 +#: flatcamGUI/FlatCAMGUI.py:4160 flatcamGUI/FlatCAMGUI.py:4193 +#: flatcamGUI/FlatCAMGUI.py:4670 msgid "" "This numbers signify the number of digits in\n" "the whole part of Excellon coordinates." @@ -6525,8 +6773,8 @@ msgstr "" "Diese Zahlen geben die Anzahl der Ziffern in an\n" "der gesamte Teil der Excellon-Koordinaten." -#: flatcamGUI/FlatCAMGUI.py:4085 flatcamGUI/FlatCAMGUI.py:4118 -#: flatcamGUI/FlatCAMGUI.py:4595 +#: flatcamGUI/FlatCAMGUI.py:4174 flatcamGUI/FlatCAMGUI.py:4207 +#: flatcamGUI/FlatCAMGUI.py:4684 msgid "" "This numbers signify the number of digits in\n" "the decimal part of Excellon coordinates." @@ -6534,19 +6782,19 @@ msgstr "" "Diese Zahlen geben die Anzahl der Ziffern in an\n" "der Dezimalteil der Excellon-Koordinaten." -#: flatcamGUI/FlatCAMGUI.py:4093 +#: flatcamGUI/FlatCAMGUI.py:4182 msgid "METRIC:" msgstr "METRISCH:" -#: flatcamGUI/FlatCAMGUI.py:4096 +#: flatcamGUI/FlatCAMGUI.py:4185 msgid "Default values for METRIC are 3:3" msgstr "Die Standardwerte für METRISCH sind 3: 3" -#: flatcamGUI/FlatCAMGUI.py:4127 +#: flatcamGUI/FlatCAMGUI.py:4216 msgid "Default Zeros:" msgstr "Standard Nullen:" -#: flatcamGUI/FlatCAMGUI.py:4130 flatcamGUI/FlatCAMGUI.py:4630 +#: flatcamGUI/FlatCAMGUI.py:4219 flatcamGUI/FlatCAMGUI.py:4719 msgid "" "This sets the type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -6560,15 +6808,15 @@ msgstr "" "Wenn TZ aktiviert ist, werden nachfolgende Nullen beibehalten\n" "und führende Nullen werden entfernt." -#: flatcamGUI/FlatCAMGUI.py:4138 flatcamGUI/FlatCAMGUI.py:4637 +#: flatcamGUI/FlatCAMGUI.py:4227 flatcamGUI/FlatCAMGUI.py:4726 msgid "LZ" msgstr "LZ" -#: flatcamGUI/FlatCAMGUI.py:4139 flatcamGUI/FlatCAMGUI.py:4638 +#: flatcamGUI/FlatCAMGUI.py:4228 flatcamGUI/FlatCAMGUI.py:4727 msgid "TZ" msgstr "TZ" -#: flatcamGUI/FlatCAMGUI.py:4141 +#: flatcamGUI/FlatCAMGUI.py:4230 msgid "" "This sets the default type of Excellon zeros.\n" "If it is not detected in the parsed file the value here\n" @@ -6584,11 +6832,11 @@ msgstr "" "Wenn TZ aktiviert ist, werden nachfolgende Nullen beibehalten\n" "und führende Nullen werden entfernt." -#: flatcamGUI/FlatCAMGUI.py:4155 +#: flatcamGUI/FlatCAMGUI.py:4244 msgid "Default Units:" msgstr "Standard einheiten:" -#: flatcamGUI/FlatCAMGUI.py:4158 +#: flatcamGUI/FlatCAMGUI.py:4247 msgid "" "This sets the default units of Excellon files.\n" "If it is not detected in the parsed file the value here\n" @@ -6600,15 +6848,15 @@ msgstr "" "wird verwendet. Einige Excellon-Dateien haben keinen Header\n" "Daher wird dieser Parameter verwendet." -#: flatcamGUI/FlatCAMGUI.py:4166 flatcamGUI/FlatCAMGUI.py:4557 +#: flatcamGUI/FlatCAMGUI.py:4255 flatcamGUI/FlatCAMGUI.py:4646 msgid "INCH" msgstr "ZOLL" -#: flatcamGUI/FlatCAMGUI.py:4167 flatcamGUI/FlatCAMGUI.py:4558 +#: flatcamGUI/FlatCAMGUI.py:4256 flatcamGUI/FlatCAMGUI.py:4647 msgid "MM" msgstr "MM" -#: flatcamGUI/FlatCAMGUI.py:4169 +#: flatcamGUI/FlatCAMGUI.py:4258 msgid "" "This sets the units of Excellon files.\n" "Some Excellon files don't have an header\n" @@ -6618,15 +6866,15 @@ msgstr "" "Einige Excellon-Dateien haben keinen Header\n" "Daher wird dieser Parameter verwendet." -#: flatcamGUI/FlatCAMGUI.py:4185 +#: flatcamGUI/FlatCAMGUI.py:4274 msgid "Excellon Optimization:" msgstr "Optimierung der Excellons:" -#: flatcamGUI/FlatCAMGUI.py:4192 +#: flatcamGUI/FlatCAMGUI.py:4281 msgid "Algorithm: " msgstr "Algorithmus:" -#: flatcamGUI/FlatCAMGUI.py:4195 flatcamGUI/FlatCAMGUI.py:4208 +#: flatcamGUI/FlatCAMGUI.py:4284 flatcamGUI/FlatCAMGUI.py:4297 msgid "" "This sets the optimization type for the Excellon drill path.\n" "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" @@ -6650,15 +6898,15 @@ msgstr "" "Wenn DEAKTIVIERT, arbeitet FlatCAM im 32-Bit-Modus und verwendet es\n" "Traveling Salesman-Algorithmus zur Pfadoptimierung." -#: flatcamGUI/FlatCAMGUI.py:4205 +#: flatcamGUI/FlatCAMGUI.py:4294 msgid "MH" msgstr "MH" -#: flatcamGUI/FlatCAMGUI.py:4220 +#: flatcamGUI/FlatCAMGUI.py:4309 msgid "Optimization Time: " msgstr "Optimierungszeit:" -#: flatcamGUI/FlatCAMGUI.py:4223 +#: flatcamGUI/FlatCAMGUI.py:4312 msgid "" "When OR-Tools Metaheuristic (MH) is enabled there is a\n" "maximum threshold for how much time is spent doing the\n" @@ -6670,15 +6918,15 @@ msgstr "" "Pfadoptimierung. Diese maximale Dauer wird hier eingestellt.\n" "In Sekunden." -#: flatcamGUI/FlatCAMGUI.py:4264 +#: flatcamGUI/FlatCAMGUI.py:4353 msgid "Excellon Options" msgstr "Excellon-Optionen" -#: flatcamGUI/FlatCAMGUI.py:4267 flatcamGUI/ObjectUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:4356 flatcamGUI/ObjectUI.py:584 msgid "Create CNC Job" msgstr "CNC-Job erstellen" -#: flatcamGUI/FlatCAMGUI.py:4269 +#: flatcamGUI/FlatCAMGUI.py:4358 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object." @@ -6686,13 +6934,13 @@ msgstr "" "Parameter, die zum Erstellen eines CNC-Auftragsobjekts verwendet werden\n" "für dieses Bohrobjekt." -#: flatcamGUI/FlatCAMGUI.py:4277 flatcamGUI/FlatCAMGUI.py:4733 -#: flatcamGUI/FlatCAMGUI.py:5741 flatcamGUI/ObjectUI.py:595 +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/FlatCAMGUI.py:4822 +#: flatcamGUI/FlatCAMGUI.py:5830 flatcamGUI/ObjectUI.py:595 #: flatcamGUI/ObjectUI.py:1059 flatcamTools/ToolCalculators.py:108 msgid "Cut Z:" msgstr "Schnitt Z:" -#: flatcamGUI/FlatCAMGUI.py:4279 flatcamGUI/ObjectUI.py:597 +#: flatcamGUI/FlatCAMGUI.py:4368 flatcamGUI/ObjectUI.py:597 msgid "" "Drill depth (negative)\n" "below the copper surface." @@ -6700,12 +6948,12 @@ msgstr "" "Bohrtiefe (negativ)\n" "unter der Kupferoberfläche." -#: flatcamGUI/FlatCAMGUI.py:4286 flatcamGUI/FlatCAMGUI.py:4766 +#: flatcamGUI/FlatCAMGUI.py:4375 flatcamGUI/FlatCAMGUI.py:4855 #: flatcamGUI/ObjectUI.py:605 flatcamGUI/ObjectUI.py:1095 msgid "Travel Z:" msgstr "Reise Z:" -#: flatcamGUI/FlatCAMGUI.py:4288 flatcamGUI/ObjectUI.py:607 +#: flatcamGUI/FlatCAMGUI.py:4377 flatcamGUI/ObjectUI.py:607 msgid "" "Tool height when travelling\n" "across the XY plane." @@ -6713,11 +6961,11 @@ msgstr "" "Werkzeughöhe auf Reisen\n" "über die XY-Ebene." -#: flatcamGUI/FlatCAMGUI.py:4296 flatcamGUI/FlatCAMGUI.py:4776 +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/FlatCAMGUI.py:4865 msgid "Tool change:" msgstr "Werkzeugwechsel:" -#: flatcamGUI/FlatCAMGUI.py:4298 flatcamGUI/FlatCAMGUI.py:4778 +#: flatcamGUI/FlatCAMGUI.py:4387 flatcamGUI/FlatCAMGUI.py:4867 #: flatcamGUI/ObjectUI.py:617 msgid "" "Include tool-change sequence\n" @@ -6726,19 +6974,19 @@ msgstr "" "Werkzeugwechselfolge einbeziehen\n" "im G-Code (Pause für Werkzeugwechsel)." -#: flatcamGUI/FlatCAMGUI.py:4305 flatcamGUI/FlatCAMGUI.py:4786 +#: flatcamGUI/FlatCAMGUI.py:4394 flatcamGUI/FlatCAMGUI.py:4875 msgid "Toolchange Z:" msgstr "Werkzeugwechsel Z:" -#: flatcamGUI/FlatCAMGUI.py:4307 flatcamGUI/FlatCAMGUI.py:4788 +#: flatcamGUI/FlatCAMGUI.py:4396 flatcamGUI/FlatCAMGUI.py:4877 msgid "Toolchange Z position." msgstr "Toolchange Z position." -#: flatcamGUI/FlatCAMGUI.py:4313 +#: flatcamGUI/FlatCAMGUI.py:4402 msgid "Feedrate:" msgstr "Vorschubgeschwindigkeit:" -#: flatcamGUI/FlatCAMGUI.py:4315 +#: flatcamGUI/FlatCAMGUI.py:4404 msgid "" "Tool speed while drilling\n" "(in units per minute)." @@ -6746,11 +6994,11 @@ msgstr "" "Werkzeuggeschwindigkeit beim Bohren\n" "(in Einheiten pro Minute)." -#: flatcamGUI/FlatCAMGUI.py:4323 +#: flatcamGUI/FlatCAMGUI.py:4412 msgid "Spindle Speed:" msgstr "Spulengeschwindigkeit:" -#: flatcamGUI/FlatCAMGUI.py:4325 flatcamGUI/FlatCAMGUI.py:4818 +#: flatcamGUI/FlatCAMGUI.py:4414 flatcamGUI/FlatCAMGUI.py:4907 #: flatcamGUI/ObjectUI.py:681 msgid "" "Speed of the spindle\n" @@ -6759,12 +7007,12 @@ msgstr "" "Geschwindigkeit der Spindel\n" "in RPM (optional)" -#: flatcamGUI/FlatCAMGUI.py:4333 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:4422 flatcamGUI/FlatCAMGUI.py:4915 #: flatcamGUI/ObjectUI.py:689 flatcamGUI/ObjectUI.py:1218 msgid "Dwell:" msgstr "Wohnen:" -#: flatcamGUI/FlatCAMGUI.py:4335 flatcamGUI/FlatCAMGUI.py:4828 +#: flatcamGUI/FlatCAMGUI.py:4424 flatcamGUI/FlatCAMGUI.py:4917 #: flatcamGUI/ObjectUI.py:691 flatcamGUI/ObjectUI.py:1221 msgid "" "Pause to allow the spindle to reach its\n" @@ -6773,21 +7021,21 @@ msgstr "" "Pause, damit die Spindel ihre erreichen kann\n" "Geschwindigkeit vor dem Schneiden." -#: flatcamGUI/FlatCAMGUI.py:4338 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:4427 flatcamGUI/FlatCAMGUI.py:4920 msgid "Duration:" msgstr "Dauer:" -#: flatcamGUI/FlatCAMGUI.py:4340 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:4429 flatcamGUI/FlatCAMGUI.py:4922 #: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1228 msgid "Number of milliseconds for spindle to dwell." msgstr "Anzahl der Millisekunden, die die Spindel halten soll." -#: flatcamGUI/FlatCAMGUI.py:4352 flatcamGUI/FlatCAMGUI.py:4843 +#: flatcamGUI/FlatCAMGUI.py:4441 flatcamGUI/FlatCAMGUI.py:4932 #: flatcamGUI/ObjectUI.py:704 msgid "Postprocessor:" msgstr "Postprozessor:" -#: flatcamGUI/FlatCAMGUI.py:4354 +#: flatcamGUI/FlatCAMGUI.py:4443 msgid "" "The postprocessor file that dictates\n" "gcode output." @@ -6795,11 +7043,11 @@ msgstr "" "Die Postprozessor-Datei, die diktiert\n" "gcode ausgabe." -#: flatcamGUI/FlatCAMGUI.py:4364 +#: flatcamGUI/FlatCAMGUI.py:4453 msgid "Gcode: " msgstr "Gcode:" -#: flatcamGUI/FlatCAMGUI.py:4366 +#: flatcamGUI/FlatCAMGUI.py:4455 msgid "" "Choose what to use for GCode generation:\n" "'Drills', 'Slots' or 'Both'.\n" @@ -6812,37 +7060,37 @@ msgstr "" "angezeigt\n" "in Bohrer umgewandelt." -#: flatcamGUI/FlatCAMGUI.py:4371 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4460 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:752 msgid "Drills" msgstr "Bohrer" -#: flatcamGUI/FlatCAMGUI.py:4372 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4461 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:753 msgid "Slots" msgstr "Schlüssel" -#: flatcamGUI/FlatCAMGUI.py:4373 flatcamGUI/ObjectUI.py:754 +#: flatcamGUI/FlatCAMGUI.py:4462 flatcamGUI/ObjectUI.py:754 msgid "Both" msgstr "Both" -#: flatcamGUI/FlatCAMGUI.py:4382 flatcamGUI/ObjectUI.py:769 +#: flatcamGUI/FlatCAMGUI.py:4471 flatcamGUI/ObjectUI.py:769 msgid "Mill Holes" msgstr " Löcher bohren " -#: flatcamGUI/FlatCAMGUI.py:4384 flatcamGUI/ObjectUI.py:771 +#: flatcamGUI/FlatCAMGUI.py:4473 flatcamGUI/ObjectUI.py:771 msgid "Create Geometry for milling holes." msgstr "Erstellen Sie Geometrie zum Fräsen von Löchern." -#: flatcamGUI/FlatCAMGUI.py:4390 +#: flatcamGUI/FlatCAMGUI.py:4479 msgid "Drill Tool dia:" msgstr "Bohrwerkzeug Durchmesser:" -#: flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/FlatCAMGUI.py:4486 msgid "Slot Tool dia:" msgstr "Schlitzwerkzeug Durchmesser:" -#: flatcamGUI/FlatCAMGUI.py:4399 +#: flatcamGUI/FlatCAMGUI.py:4488 msgid "" "Diameter of the cutting tool\n" "when milling slots." @@ -6850,19 +7098,19 @@ msgstr "" "Durchmesser des Schneidewerkzeugs\n" "beim Fräsen von Schlitzen." -#: flatcamGUI/FlatCAMGUI.py:4411 +#: flatcamGUI/FlatCAMGUI.py:4500 msgid "Defaults" msgstr "Standardwerte" -#: flatcamGUI/FlatCAMGUI.py:4424 +#: flatcamGUI/FlatCAMGUI.py:4513 msgid "Excellon Adv. Options" msgstr "Excellon erweiterte Optionen" -#: flatcamGUI/FlatCAMGUI.py:4430 flatcamGUI/FlatCAMGUI.py:4866 +#: flatcamGUI/FlatCAMGUI.py:4519 flatcamGUI/FlatCAMGUI.py:4955 msgid "Advanced Options:" msgstr "Erweiterte Optionen:" -#: flatcamGUI/FlatCAMGUI.py:4432 +#: flatcamGUI/FlatCAMGUI.py:4521 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object that are shown when App Level is Advanced." @@ -6871,11 +7119,11 @@ msgstr "" "für dieses Drill-Objekt, das angezeigt wird, wenn die App-Ebene Erweitert " "ist." -#: flatcamGUI/FlatCAMGUI.py:4440 +#: flatcamGUI/FlatCAMGUI.py:4529 msgid "Offset Z:" msgstr "Versatz Z:" -#: flatcamGUI/FlatCAMGUI.py:4442 flatcamGUI/ObjectUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:4531 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" @@ -6886,20 +7134,20 @@ msgstr "" "erzeugen.\n" "Der Wert hier kann den Parameter Cut Z ausgleichen." -#: flatcamGUI/FlatCAMGUI.py:4449 flatcamGUI/FlatCAMGUI.py:4877 +#: flatcamGUI/FlatCAMGUI.py:4538 flatcamGUI/FlatCAMGUI.py:4966 msgid "Toolchange X,Y:" msgstr "Werkzeugwechsel X, Y:" -#: flatcamGUI/FlatCAMGUI.py:4451 flatcamGUI/FlatCAMGUI.py:4879 +#: flatcamGUI/FlatCAMGUI.py:4540 flatcamGUI/FlatCAMGUI.py:4968 msgid "Toolchange X,Y position." msgstr "Werkzeugwechsel X, Y Position." -#: flatcamGUI/FlatCAMGUI.py:4457 flatcamGUI/FlatCAMGUI.py:4886 +#: flatcamGUI/FlatCAMGUI.py:4546 flatcamGUI/FlatCAMGUI.py:4975 #: flatcamGUI/ObjectUI.py:634 msgid "Start move Z:" msgstr "Startbewegung Z:" -#: flatcamGUI/FlatCAMGUI.py:4459 +#: flatcamGUI/FlatCAMGUI.py:4548 msgid "" "Height of the tool just after start.\n" "Delete the value if you don't need this feature." @@ -6907,12 +7155,12 @@ msgstr "" "Höhe des Werkzeugs gleich nach dem Start.\n" "Löschen Sie den Wert, wenn Sie diese Funktion nicht benötigen." -#: flatcamGUI/FlatCAMGUI.py:4466 flatcamGUI/FlatCAMGUI.py:4896 +#: flatcamGUI/FlatCAMGUI.py:4555 flatcamGUI/FlatCAMGUI.py:4985 #: flatcamGUI/ObjectUI.py:644 flatcamGUI/ObjectUI.py:1141 msgid "End move Z:" msgstr "Bewegung beenden Z:" -#: flatcamGUI/FlatCAMGUI.py:4468 flatcamGUI/FlatCAMGUI.py:4898 +#: flatcamGUI/FlatCAMGUI.py:4557 flatcamGUI/FlatCAMGUI.py:4987 msgid "" "Height of the tool after\n" "the last move at the end of the job." @@ -6920,12 +7168,12 @@ msgstr "" "Höhe des Werkzeugs nach\n" "die letzte Bewegung am Ende des Jobs." -#: flatcamGUI/FlatCAMGUI.py:4475 flatcamGUI/FlatCAMGUI.py:4906 +#: flatcamGUI/FlatCAMGUI.py:4564 flatcamGUI/FlatCAMGUI.py:4995 #: flatcamGUI/ObjectUI.py:665 msgid "Feedrate Rapids:" msgstr "Vorschubgeschwindigkeit:" -#: flatcamGUI/FlatCAMGUI.py:4477 flatcamGUI/ObjectUI.py:667 +#: flatcamGUI/FlatCAMGUI.py:4566 flatcamGUI/ObjectUI.py:667 msgid "" "Tool speed while drilling\n" "(in units per minute).\n" @@ -6939,12 +7187,12 @@ msgstr "" "Es ist nur für Marlin nützlich,\n" "für andere Fälle ignorieren." -#: flatcamGUI/FlatCAMGUI.py:4488 flatcamGUI/FlatCAMGUI.py:4930 +#: flatcamGUI/FlatCAMGUI.py:4577 flatcamGUI/FlatCAMGUI.py:5019 #: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1250 msgid "Probe Z depth:" msgstr "Sonde Z Tiefe:" -#: flatcamGUI/FlatCAMGUI.py:4490 flatcamGUI/FlatCAMGUI.py:4932 +#: flatcamGUI/FlatCAMGUI.py:4579 flatcamGUI/FlatCAMGUI.py:5021 #: flatcamGUI/ObjectUI.py:717 flatcamGUI/ObjectUI.py:1253 msgid "" "The maximum depth that the probe is allowed\n" @@ -6953,21 +7201,21 @@ msgstr "" "Die maximale Tiefe, in der die Sonde zulässig ist\n" "zu untersuchen. Negativer Wert in aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:4498 flatcamGUI/FlatCAMGUI.py:4940 +#: flatcamGUI/FlatCAMGUI.py:4587 flatcamGUI/FlatCAMGUI.py:5029 #: flatcamGUI/ObjectUI.py:727 flatcamGUI/ObjectUI.py:1264 msgid "Feedrate Probe:" msgstr "Vorschubsonde:" -#: flatcamGUI/FlatCAMGUI.py:4500 flatcamGUI/FlatCAMGUI.py:4942 +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/FlatCAMGUI.py:5031 #: flatcamGUI/ObjectUI.py:729 flatcamGUI/ObjectUI.py:1267 msgid "The feedrate used while the probe is probing." msgstr "Der Vorschub während der Sondenmessung." -#: flatcamGUI/FlatCAMGUI.py:4506 flatcamGUI/FlatCAMGUI.py:4949 +#: flatcamGUI/FlatCAMGUI.py:4595 flatcamGUI/FlatCAMGUI.py:5038 msgid "Fast Plunge:" msgstr "Schneller Sprung:" -#: flatcamGUI/FlatCAMGUI.py:4508 flatcamGUI/FlatCAMGUI.py:4951 +#: flatcamGUI/FlatCAMGUI.py:4597 flatcamGUI/FlatCAMGUI.py:5040 msgid "" "By checking this, the vertical move from\n" "Z_Toolchange to Z_move is done with G0,\n" @@ -6979,11 +7227,11 @@ msgstr "" "Das bedeutet die schnellste verfügbare Geschwindigkeit.\n" "WARNUNG: Die Verschiebung erfolgt bei Toolchange X, Y-Koordinaten." -#: flatcamGUI/FlatCAMGUI.py:4517 +#: flatcamGUI/FlatCAMGUI.py:4606 msgid "Fast Retract:" msgstr "Schneller Rückzug:" -#: flatcamGUI/FlatCAMGUI.py:4519 +#: flatcamGUI/FlatCAMGUI.py:4608 msgid "" "Exit hole strategy.\n" " - When uncheked, while exiting the drilled hole the drill bit\n" @@ -6999,15 +7247,15 @@ msgstr "" "  - Wenn Sie den Weg von Z-Schnitt (Schnitttiefe) nach Z_Move prüfen\n" "(Fahrhöhe) erfolgt so schnell wie möglich (G0) in einem Zug." -#: flatcamGUI/FlatCAMGUI.py:4538 +#: flatcamGUI/FlatCAMGUI.py:4627 msgid "Excellon Export" msgstr "Excellon Export" -#: flatcamGUI/FlatCAMGUI.py:4541 +#: flatcamGUI/FlatCAMGUI.py:4630 msgid "Export Options:" msgstr "Exportoptionen:" -#: flatcamGUI/FlatCAMGUI.py:4543 +#: flatcamGUI/FlatCAMGUI.py:4632 msgid "" "The parameters set here are used in the file exported\n" "when using the File -> Export -> Export Excellon menu entry." @@ -7016,19 +7264,19 @@ msgstr "" "bei Verwendung des Menüeintrags Datei -> Exportieren -> Exportieren von " "Excellon." -#: flatcamGUI/FlatCAMGUI.py:4552 +#: flatcamGUI/FlatCAMGUI.py:4641 msgid "Units:" msgstr "Einheiten:" -#: flatcamGUI/FlatCAMGUI.py:4554 flatcamGUI/FlatCAMGUI.py:4560 +#: flatcamGUI/FlatCAMGUI.py:4643 flatcamGUI/FlatCAMGUI.py:4649 msgid "The units used in the Excellon file." msgstr "Die in der Excellon-Datei verwendeten Einheiten." -#: flatcamGUI/FlatCAMGUI.py:4566 +#: flatcamGUI/FlatCAMGUI.py:4655 msgid "Int/Decimals:" msgstr "Ganzzahl / Dezimalzahl:" -#: flatcamGUI/FlatCAMGUI.py:4568 +#: flatcamGUI/FlatCAMGUI.py:4657 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -7040,11 +7288,11 @@ msgstr "" "Hier legen wir das verwendete Format fest\n" "Koordinaten verwenden keine Periode." -#: flatcamGUI/FlatCAMGUI.py:4604 +#: flatcamGUI/FlatCAMGUI.py:4693 msgid "Format:" msgstr "Format:" -#: flatcamGUI/FlatCAMGUI.py:4606 flatcamGUI/FlatCAMGUI.py:4616 +#: flatcamGUI/FlatCAMGUI.py:4695 flatcamGUI/FlatCAMGUI.py:4705 msgid "" "Select the kind of coordinates format used.\n" "Coordinates can be saved with decimal point or without.\n" @@ -7061,19 +7309,19 @@ msgstr "" "Es muss auch angegeben werden, wenn LZ = führende Nullen beibehalten werden\n" "oder TZ = nachfolgende Nullen bleiben erhalten." -#: flatcamGUI/FlatCAMGUI.py:4613 +#: flatcamGUI/FlatCAMGUI.py:4702 msgid "Decimal" msgstr "Dezimal" -#: flatcamGUI/FlatCAMGUI.py:4614 +#: flatcamGUI/FlatCAMGUI.py:4703 msgid "No-Decimal" msgstr "Keine Dezimalzahl" -#: flatcamGUI/FlatCAMGUI.py:4627 +#: flatcamGUI/FlatCAMGUI.py:4716 msgid "Zeros:" msgstr "Nullen:" -#: flatcamGUI/FlatCAMGUI.py:4640 +#: flatcamGUI/FlatCAMGUI.py:4729 msgid "" "This sets the default type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -7087,11 +7335,11 @@ msgstr "" "Wenn TZ aktiviert ist, werden nachfolgende Nullen beibehalten\n" "und führende Nullen werden entfernt." -#: flatcamGUI/FlatCAMGUI.py:4666 +#: flatcamGUI/FlatCAMGUI.py:4755 msgid "Geometry General" msgstr "Geometrie Allgemein" -#: flatcamGUI/FlatCAMGUI.py:4684 +#: flatcamGUI/FlatCAMGUI.py:4773 msgid "" "The number of circle steps for Geometry \n" "circle and arc shapes linear approximation." @@ -7099,15 +7347,15 @@ msgstr "" "Die Anzahl der Kreisschritte für die Geometrie\n" "Kreis- und Bogenformen lineare Annäherung." -#: flatcamGUI/FlatCAMGUI.py:4692 +#: flatcamGUI/FlatCAMGUI.py:4781 msgid "Tools" msgstr "Werkzeuge" -#: flatcamGUI/FlatCAMGUI.py:4699 +#: flatcamGUI/FlatCAMGUI.py:4788 msgid "Tool dia: " msgstr "Werkzeugdurchmesser:" -#: flatcamGUI/FlatCAMGUI.py:4701 +#: flatcamGUI/FlatCAMGUI.py:4790 msgid "" "The diameter of the cutting\n" "tool.." @@ -7115,15 +7363,15 @@ msgstr "" "Der Durchmesser des Schnitts\n" "Werkzeug.." -#: flatcamGUI/FlatCAMGUI.py:4716 +#: flatcamGUI/FlatCAMGUI.py:4805 msgid "Geometry Options" msgstr "Geometrieoptionen" -#: flatcamGUI/FlatCAMGUI.py:4721 +#: flatcamGUI/FlatCAMGUI.py:4810 msgid "Create CNC Job:" msgstr "CNC-Auftrag erstellen:" -#: flatcamGUI/FlatCAMGUI.py:4723 +#: flatcamGUI/FlatCAMGUI.py:4812 msgid "" "Create a CNC Job object\n" "tracing the contours of this\n" @@ -7133,7 +7381,7 @@ msgstr "" "die Konturen davon nachzeichnen\n" "Geometrieobjekt." -#: flatcamGUI/FlatCAMGUI.py:4735 flatcamGUI/ObjectUI.py:1062 +#: flatcamGUI/FlatCAMGUI.py:4824 flatcamGUI/ObjectUI.py:1062 msgid "" "Cutting depth (negative)\n" "below the copper surface." @@ -7141,19 +7389,19 @@ msgstr "" "Schnitttiefe (negativ)\n" "unter der Kupferoberfläche." -#: flatcamGUI/FlatCAMGUI.py:4743 +#: flatcamGUI/FlatCAMGUI.py:4832 msgid "Multidepth" msgstr "Mehrere tiefe" -#: flatcamGUI/FlatCAMGUI.py:4745 +#: flatcamGUI/FlatCAMGUI.py:4834 msgid "Multidepth usage: True or False." msgstr "Mehrere Tiefe-Nutzung: Richtig oder Falsch." -#: flatcamGUI/FlatCAMGUI.py:4750 +#: flatcamGUI/FlatCAMGUI.py:4839 msgid "Depth/Pass:" msgstr "Tiefe / Pass:" -#: flatcamGUI/FlatCAMGUI.py:4752 +#: flatcamGUI/FlatCAMGUI.py:4841 msgid "" "The depth to cut on each pass,\n" "when multidepth is enabled.\n" @@ -7167,7 +7415,7 @@ msgstr "" "es ist ein Bruch aus der Tiefe\n" "was einen negativen Wert hat." -#: flatcamGUI/FlatCAMGUI.py:4768 flatcamGUI/ObjectUI.py:1098 +#: flatcamGUI/FlatCAMGUI.py:4857 flatcamGUI/ObjectUI.py:1098 msgid "" "Height of the tool when\n" "moving without cutting." @@ -7175,11 +7423,11 @@ msgstr "" "Höhe des Werkzeugs, wenn\n" "bewegen ohne zu schneiden" -#: flatcamGUI/FlatCAMGUI.py:4795 flatcamGUI/ObjectUI.py:1153 +#: flatcamGUI/FlatCAMGUI.py:4884 flatcamGUI/ObjectUI.py:1153 msgid "Feed Rate X-Y:" msgstr "Vorschubrate X-Y:" -#: flatcamGUI/FlatCAMGUI.py:4797 flatcamGUI/ObjectUI.py:1156 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:1156 msgid "" "Cutting speed in the XY\n" "plane in units per minute" @@ -7187,11 +7435,11 @@ msgstr "" "Schnittgeschwindigkeit im XY\n" "Flugzeug in Einheiten pro Minute" -#: flatcamGUI/FlatCAMGUI.py:4805 +#: flatcamGUI/FlatCAMGUI.py:4894 msgid "Feed Rate Z:" msgstr "Vorschubrate Z:" -#: flatcamGUI/FlatCAMGUI.py:4807 +#: flatcamGUI/FlatCAMGUI.py:4896 msgid "" "Cutting speed in the XY\n" "plane in units per minute.\n" @@ -7201,12 +7449,12 @@ msgstr "" "Flugzeug in Einheiten pro Minute.\n" "Es heißt auch Sturz." -#: flatcamGUI/FlatCAMGUI.py:4816 flatcamGUI/ObjectUI.py:679 +#: flatcamGUI/FlatCAMGUI.py:4905 flatcamGUI/ObjectUI.py:679 #: flatcamGUI/ObjectUI.py:1205 msgid "Spindle speed:" msgstr "Spulengeschwindigkeit:" -#: flatcamGUI/FlatCAMGUI.py:4845 +#: flatcamGUI/FlatCAMGUI.py:4934 msgid "" "The postprocessor file that dictates\n" "Machine Code output." @@ -7214,11 +7462,11 @@ msgstr "" "Die Postprozessor-Datei, die diktiert\n" "Maschinencode-Ausgabe." -#: flatcamGUI/FlatCAMGUI.py:4861 +#: flatcamGUI/FlatCAMGUI.py:4950 msgid "Geometry Adv. Options" msgstr "Geometrie Erw. Optionen" -#: flatcamGUI/FlatCAMGUI.py:4868 +#: flatcamGUI/FlatCAMGUI.py:4957 msgid "" "Parameters to create a CNC Job object\n" "tracing the contours of a Geometry object." @@ -7226,7 +7474,7 @@ msgstr "" "Parameter zum Erstellen eines CNC-Auftragsobjekts\n" "Verfolgung der Konturen eines Geometrieobjekts." -#: flatcamGUI/FlatCAMGUI.py:4888 +#: flatcamGUI/FlatCAMGUI.py:4977 msgid "" "Height of the tool just after starting the work.\n" "Delete the value if you don't need this feature." @@ -7234,7 +7482,7 @@ msgstr "" "Höhe des Werkzeugs unmittelbar nach Beginn der Arbeit.\n" "Löschen Sie den Wert, wenn Sie diese Funktion nicht benötigen." -#: flatcamGUI/FlatCAMGUI.py:4908 +#: flatcamGUI/FlatCAMGUI.py:4997 msgid "" "Cutting speed in the XY plane\n" "(in units per minute).\n" @@ -7248,11 +7496,11 @@ msgstr "" "Es ist nur für Marlin nützlich,\n" "für andere Fälle ignorieren." -#: flatcamGUI/FlatCAMGUI.py:4920 +#: flatcamGUI/FlatCAMGUI.py:5009 msgid "Re-cut 1st pt." msgstr "1. Punkt erneut schneiden" -#: flatcamGUI/FlatCAMGUI.py:4922 flatcamGUI/ObjectUI.py:1196 +#: flatcamGUI/FlatCAMGUI.py:5011 flatcamGUI/ObjectUI.py:1196 msgid "" "In order to remove possible\n" "copper leftovers where first cut\n" @@ -7264,11 +7512,11 @@ msgstr "" "Beim letzten Schnitt treffen wir einen\n" "verlängerter Schnitt über dem ersten Schnittabschnitt." -#: flatcamGUI/FlatCAMGUI.py:4961 +#: flatcamGUI/FlatCAMGUI.py:5050 msgid "Seg. X size:" msgstr "Seg. X Größe:" -#: flatcamGUI/FlatCAMGUI.py:4963 +#: flatcamGUI/FlatCAMGUI.py:5052 msgid "" "The size of the trace segment on the X axis.\n" "Useful for auto-leveling.\n" @@ -7278,11 +7526,11 @@ msgstr "" "Nützlich für die automatische Nivellierung.\n" "Ein Wert von 0 bedeutet keine Segmentierung auf der X-Achse." -#: flatcamGUI/FlatCAMGUI.py:4972 +#: flatcamGUI/FlatCAMGUI.py:5061 msgid "Seg. Y size:" msgstr "Seg. Y Größe:" -#: flatcamGUI/FlatCAMGUI.py:4974 +#: flatcamGUI/FlatCAMGUI.py:5063 msgid "" "The size of the trace segment on the Y axis.\n" "Useful for auto-leveling.\n" @@ -7292,20 +7540,20 @@ msgstr "" "Nützlich für die automatische Nivellierung.\n" "Ein Wert von 0 bedeutet keine Segmentierung auf der Y-Achse." -#: flatcamGUI/FlatCAMGUI.py:4990 +#: flatcamGUI/FlatCAMGUI.py:5079 msgid "CNC Job General" msgstr "CNC-Job Allgemein" -#: flatcamGUI/FlatCAMGUI.py:5003 flatcamGUI/ObjectUI.py:544 +#: flatcamGUI/FlatCAMGUI.py:5092 flatcamGUI/ObjectUI.py:544 #: flatcamGUI/ObjectUI.py:874 flatcamGUI/ObjectUI.py:1428 msgid "Plot Object" msgstr "Plotobjekt" -#: flatcamGUI/FlatCAMGUI.py:5010 +#: flatcamGUI/FlatCAMGUI.py:5099 msgid "Plot kind:" msgstr "Darstellungsart:" -#: flatcamGUI/FlatCAMGUI.py:5012 flatcamGUI/ObjectUI.py:1350 +#: flatcamGUI/FlatCAMGUI.py:5101 flatcamGUI/ObjectUI.py:1350 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" @@ -7318,11 +7566,11 @@ msgstr "" "über dem Werkstück oder es kann vom Typ 'Ausschneiden' sein,\n" "was bedeutet, dass die Bewegungen, die in das Material geschnitten werden." -#: flatcamGUI/FlatCAMGUI.py:5020 flatcamGUI/ObjectUI.py:1359 +#: flatcamGUI/FlatCAMGUI.py:5109 flatcamGUI/ObjectUI.py:1359 msgid "Travel" msgstr "Reise" -#: flatcamGUI/FlatCAMGUI.py:5031 +#: flatcamGUI/FlatCAMGUI.py:5120 msgid "" "The number of circle steps for GCode \n" "circle and arc shapes linear approximation." @@ -7330,7 +7578,7 @@ msgstr "" "Die Anzahl der Kreisschritte für GCode\n" "Kreis- und Bogenformen lineare Annäherung." -#: flatcamGUI/FlatCAMGUI.py:5041 +#: flatcamGUI/FlatCAMGUI.py:5130 msgid "" "Diameter of the tool to be\n" "rendered in the plot." @@ -7338,11 +7586,11 @@ msgstr "" "Durchmesser des Werkzeugs sein\n" "in der Handlung gerendert." -#: flatcamGUI/FlatCAMGUI.py:5049 +#: flatcamGUI/FlatCAMGUI.py:5138 msgid "Coords dec.:" msgstr "Koordinate Dezimalzahlen:" -#: flatcamGUI/FlatCAMGUI.py:5051 +#: flatcamGUI/FlatCAMGUI.py:5140 msgid "" "The number of decimals to be used for \n" "the X, Y, Z coordinates in CNC code (GCODE, etc.)" @@ -7350,11 +7598,11 @@ msgstr "" "Die Anzahl der Dezimalstellen, für die verwendet werden soll\n" "die X-, Y-, Z-Koordinaten im CNC-Code (GCODE usw.)" -#: flatcamGUI/FlatCAMGUI.py:5059 +#: flatcamGUI/FlatCAMGUI.py:5148 msgid "Feedrate dec.:" msgstr "Vorschub-Nachkommastellen:" -#: flatcamGUI/FlatCAMGUI.py:5061 +#: flatcamGUI/FlatCAMGUI.py:5150 msgid "" "The number of decimals to be used for \n" "the Feedrate parameter in CNC code (GCODE, etc.)" @@ -7362,15 +7610,15 @@ msgstr "" "Die Anzahl der Dezimalstellen, für die verwendet werden soll\n" "der Vorschubparameter im CNC-Code (GCODE usw.)" -#: flatcamGUI/FlatCAMGUI.py:5076 +#: flatcamGUI/FlatCAMGUI.py:5165 msgid "CNC Job Options" msgstr "CNC-Auftragsoptionen" -#: flatcamGUI/FlatCAMGUI.py:5079 flatcamGUI/FlatCAMGUI.py:5120 +#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/FlatCAMGUI.py:5209 msgid "Export G-Code:" msgstr "G-Code exportieren:" -#: flatcamGUI/FlatCAMGUI.py:5081 flatcamGUI/FlatCAMGUI.py:5122 +#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/FlatCAMGUI.py:5211 #: flatcamGUI/ObjectUI.py:1464 msgid "" "Export and save G-Code to\n" @@ -7379,11 +7627,11 @@ msgstr "" "Exportieren und speichern Sie den G-Code nach\n" "Machen Sie dieses Objekt in eine Datei." -#: flatcamGUI/FlatCAMGUI.py:5087 +#: flatcamGUI/FlatCAMGUI.py:5176 msgid "Prepend to G-Code:" msgstr "Voranstellen an G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5089 +#: flatcamGUI/FlatCAMGUI.py:5178 msgid "" "Type here any G-Code commands you would\n" "like to add at the beginning of the G-Code file." @@ -7391,11 +7639,11 @@ msgstr "" "Geben Sie hier alle G-Code-Befehle ein\n" "gerne am Anfang der G-Code-Datei hinzufügen." -#: flatcamGUI/FlatCAMGUI.py:5098 +#: flatcamGUI/FlatCAMGUI.py:5187 msgid "Append to G-Code:" msgstr "An G-Code anhängen:" -#: flatcamGUI/FlatCAMGUI.py:5100 flatcamGUI/ObjectUI.py:1486 +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamGUI/ObjectUI.py:1486 msgid "" "Type here any G-Code commands you would\n" "like to append to the generated file.\n" @@ -7405,15 +7653,15 @@ msgstr "" "gerne an die generierte Datei anhängen.\n" "I.e .: M2 (Programmende)" -#: flatcamGUI/FlatCAMGUI.py:5117 +#: flatcamGUI/FlatCAMGUI.py:5206 msgid "CNC Job Adv. Options" msgstr "Erw. CNC-Joboptionen" -#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/ObjectUI.py:1504 +#: flatcamGUI/FlatCAMGUI.py:5217 flatcamGUI/ObjectUI.py:1504 msgid "Toolchange G-Code:" msgstr "Werkzeugwechsel G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5130 +#: flatcamGUI/FlatCAMGUI.py:5219 msgid "" "Type here any G-Code commands you would\n" "like to be executed when Toolchange event is encountered.\n" @@ -7425,11 +7673,11 @@ msgstr "" "Dies stellt einen benutzerdefinierten Werkzeugwechsel-GCode dar.\n" "oder ein Werkzeugwechsel-Makro." -#: flatcamGUI/FlatCAMGUI.py:5144 flatcamGUI/ObjectUI.py:1526 +#: flatcamGUI/FlatCAMGUI.py:5233 flatcamGUI/ObjectUI.py:1526 msgid "Use Toolchange Macro" msgstr "Verwenden Sie das Werkzeug zum Ändern des Makros" -#: flatcamGUI/FlatCAMGUI.py:5146 flatcamGUI/ObjectUI.py:1529 +#: flatcamGUI/FlatCAMGUI.py:5235 flatcamGUI/ObjectUI.py:1529 msgid "" "Check this box if you want to use\n" "a Custom Toolchange GCode (macro)." @@ -7437,7 +7685,7 @@ msgstr "" "Aktivieren Sie dieses Kontrollkästchen, wenn Sie verwenden möchten\n" "ein benutzerdefiniertes Werkzeug ändert GCode (Makro)." -#: flatcamGUI/FlatCAMGUI.py:5158 flatcamGUI/ObjectUI.py:1538 +#: flatcamGUI/FlatCAMGUI.py:5247 flatcamGUI/ObjectUI.py:1538 msgid "" "A list of the FlatCAM variables that can be used\n" "in the Toolchange event.\n" @@ -7447,80 +7695,80 @@ msgstr "" "im Werkzeugwechselereignis.\n" "Sie müssen mit dem \"%\" -Symbol umgeben sein" -#: flatcamGUI/FlatCAMGUI.py:5165 flatcamGUI/ObjectUI.py:1545 +#: flatcamGUI/FlatCAMGUI.py:5254 flatcamGUI/ObjectUI.py:1545 msgid "Parameters" msgstr "Parameters" -#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/ObjectUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:5257 flatcamGUI/ObjectUI.py:1548 msgid "FlatCAM CNC parameters" msgstr "FlatCAM CNC-Parameter" -#: flatcamGUI/FlatCAMGUI.py:5169 flatcamGUI/ObjectUI.py:1549 +#: flatcamGUI/FlatCAMGUI.py:5258 flatcamGUI/ObjectUI.py:1549 msgid "tool = tool number" msgstr "tool = Werkzeugnummer" -#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/ObjectUI.py:1550 +#: flatcamGUI/FlatCAMGUI.py:5259 flatcamGUI/ObjectUI.py:1550 msgid "tooldia = tool diameter" msgstr "tooldia = Werkzeugdurchmesser" -#: flatcamGUI/FlatCAMGUI.py:5171 flatcamGUI/ObjectUI.py:1551 +#: flatcamGUI/FlatCAMGUI.py:5260 flatcamGUI/ObjectUI.py:1551 msgid "t_drills = for Excellon, total number of drills" msgstr "t_drills = für Excellon die Gesamtzahl der Bohrer" -#: flatcamGUI/FlatCAMGUI.py:5172 flatcamGUI/ObjectUI.py:1552 +#: flatcamGUI/FlatCAMGUI.py:5261 flatcamGUI/ObjectUI.py:1552 msgid "x_toolchange = X coord for Toolchange" msgstr "x_toolchange = X-Koord für Werkzeugwechsel" -#: flatcamGUI/FlatCAMGUI.py:5173 flatcamGUI/ObjectUI.py:1553 +#: flatcamGUI/FlatCAMGUI.py:5262 flatcamGUI/ObjectUI.py:1553 msgid "y_toolchange = Y coord for Toolchange" msgstr "y_toolchange = Y-Koord für Werkzeugwechsel" -#: flatcamGUI/FlatCAMGUI.py:5174 flatcamGUI/ObjectUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:5263 flatcamGUI/ObjectUI.py:1554 msgid "z_toolchange = Z coord for Toolchange" msgstr "z_toolchange = Z-Koord für Werkzeugwechsel" -#: flatcamGUI/FlatCAMGUI.py:5175 +#: flatcamGUI/FlatCAMGUI.py:5264 msgid "z_cut = Z depth for the cut" msgstr "z_cut = Z Tiefe für den Schnitt" -#: flatcamGUI/FlatCAMGUI.py:5176 +#: flatcamGUI/FlatCAMGUI.py:5265 msgid "z_move = Z height for travel" msgstr "z_move = Z Höhe für die Reise" -#: flatcamGUI/FlatCAMGUI.py:5177 flatcamGUI/ObjectUI.py:1557 +#: flatcamGUI/FlatCAMGUI.py:5266 flatcamGUI/ObjectUI.py:1557 msgid "z_depthpercut = the step value for multidepth cut" msgstr "z_depthpercut =der Schrittwert für den mehrstufigen Schnitt" -#: flatcamGUI/FlatCAMGUI.py:5178 flatcamGUI/ObjectUI.py:1558 +#: flatcamGUI/FlatCAMGUI.py:5267 flatcamGUI/ObjectUI.py:1558 msgid "spindlesspeed = the value for the spindle speed" msgstr "spindlesspeed =der Wert für die Spindeldrehzahl" -#: flatcamGUI/FlatCAMGUI.py:5179 flatcamGUI/ObjectUI.py:1559 +#: flatcamGUI/FlatCAMGUI.py:5268 flatcamGUI/ObjectUI.py:1559 msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" msgstr "" "dwelltime = Zeit zum Verweilen, damit die Spindel ihre eingestellte Drehzahl " "erreicht" -#: flatcamGUI/FlatCAMGUI.py:5200 +#: flatcamGUI/FlatCAMGUI.py:5289 msgid "NCC Tool Options" msgstr "NCC-Tooloptionen" -#: flatcamGUI/FlatCAMGUI.py:5203 flatcamGUI/FlatCAMGUI.py:5304 -#: flatcamGUI/FlatCAMGUI.py:5383 flatcamGUI/FlatCAMGUI.py:5442 -#: flatcamGUI/FlatCAMGUI.py:5545 flatcamGUI/FlatCAMGUI.py:5606 -#: flatcamGUI/FlatCAMGUI.py:5805 flatcamGUI/FlatCAMGUI.py:5932 +#: flatcamGUI/FlatCAMGUI.py:5292 flatcamGUI/FlatCAMGUI.py:5393 +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamGUI/FlatCAMGUI.py:5531 +#: flatcamGUI/FlatCAMGUI.py:5634 flatcamGUI/FlatCAMGUI.py:5695 +#: flatcamGUI/FlatCAMGUI.py:5894 flatcamGUI/FlatCAMGUI.py:6021 msgid "Parameters:" msgstr "Parameter:" -#: flatcamGUI/FlatCAMGUI.py:5213 flatcamGUI/FlatCAMGUI.py:5943 +#: flatcamGUI/FlatCAMGUI.py:5302 flatcamGUI/FlatCAMGUI.py:6032 msgid "Tools dia:" msgstr "Werkzeug durchmesser:" -#: flatcamGUI/FlatCAMGUI.py:5215 +#: flatcamGUI/FlatCAMGUI.py:5304 msgid "Diameters of the cutting tools, separated by ','" msgstr "Durchmesser der Schneidwerkzeuge, getrennt durch ','" -#: flatcamGUI/FlatCAMGUI.py:5223 flatcamTools/ToolNonCopperClear.py:167 +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolNonCopperClear.py:167 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -7549,11 +7797,11 @@ msgstr "" "Höhere Werte = langsame Bearbeitung und langsame Ausführung auf der CNC\n" "wegen zu vieler Wege." -#: flatcamGUI/FlatCAMGUI.py:5239 flatcamTools/ToolNonCopperClear.py:183 +#: flatcamGUI/FlatCAMGUI.py:5328 flatcamTools/ToolNonCopperClear.py:183 msgid "Bounding box margin." msgstr "Begrenzungsrahmenrand." -#: flatcamGUI/FlatCAMGUI.py:5248 flatcamTools/ToolNonCopperClear.py:192 +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolNonCopperClear.py:192 #: flatcamTools/ToolPaint.py:190 msgid "" "Algorithm for non-copper clearing:
Standard: Fixed step inwards." @@ -7564,12 +7812,12 @@ msgstr "" "Schritt nach innen. Seed-based : Ausgehend vom Saatgut.
" "Line-based: Parallele Linien." -#: flatcamGUI/FlatCAMGUI.py:5280 flatcamTools/ToolNonCopperClear.py:224 +#: flatcamGUI/FlatCAMGUI.py:5369 flatcamTools/ToolNonCopperClear.py:224 #: flatcamTools/ToolPaint.py:222 msgid "Rest M.:" msgstr "Rest M.:" -#: flatcamGUI/FlatCAMGUI.py:5282 +#: flatcamGUI/FlatCAMGUI.py:5371 msgid "" "If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" @@ -7585,11 +7833,11 @@ msgstr "" "konnte nicht mit dem vorherigen Tool gelöscht werden.\n" "Wenn nicht aktiviert, verwenden Sie den Standardalgorithmus." -#: flatcamGUI/FlatCAMGUI.py:5301 +#: flatcamGUI/FlatCAMGUI.py:5390 msgid "Cutout Tool Options" msgstr "Ausschnittwerkzeug-Optionen" -#: flatcamGUI/FlatCAMGUI.py:5306 flatcamGUI/ObjectUI.py:402 +#: flatcamGUI/FlatCAMGUI.py:5395 flatcamGUI/ObjectUI.py:402 msgid "" "Create toolpaths to cut around\n" "the PCB and separate it from\n" @@ -7599,7 +7847,7 @@ msgstr "" "die PCB und trennen Sie es von\n" "das ursprüngliche Brett." -#: flatcamGUI/FlatCAMGUI.py:5325 +#: flatcamGUI/FlatCAMGUI.py:5414 msgid "" "Distance from objects at which\n" "to draw the cutout." @@ -7607,11 +7855,11 @@ msgstr "" "Entfernung von Objekten bei denen\n" "den Ausschnitt zeichnen." -#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCutOut.py:96 +#: flatcamGUI/FlatCAMGUI.py:5421 flatcamTools/ToolCutOut.py:96 msgid "Gap size:" msgstr "Spaltgröße:" -#: flatcamGUI/FlatCAMGUI.py:5334 +#: flatcamGUI/FlatCAMGUI.py:5423 msgid "" "Size of the gaps in the toolpath\n" "that will remain to hold the\n" @@ -7621,11 +7869,11 @@ msgstr "" "das wird bleiben, um das zu halten\n" "Board an Ort und Stelle." -#: flatcamGUI/FlatCAMGUI.py:5342 flatcamTools/ToolCutOut.py:133 +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolCutOut.py:133 msgid "Gaps:" msgstr "Spalt:" -#: flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5433 msgid "" "Number of bridge gaps used for the cutout.\n" "There can be maximum 8 bridges/gaps.\n" @@ -7647,19 +7895,19 @@ msgstr "" "- 2 tb \t- 2 * oben + 2 * unten\n" "- 8 \t- 2 * links + 2 * rechts + 2 * oben + 2 * unten" -#: flatcamGUI/FlatCAMGUI.py:5365 flatcamTools/ToolCutOut.py:115 +#: flatcamGUI/FlatCAMGUI.py:5454 flatcamTools/ToolCutOut.py:115 msgid "Convex Sh.:" msgstr "Konvexe Form .:" -#: flatcamGUI/FlatCAMGUI.py:5367 flatcamTools/ToolCutOut.py:117 +#: flatcamGUI/FlatCAMGUI.py:5456 flatcamTools/ToolCutOut.py:117 msgid "Create a convex shape surrounding the entire PCB." msgstr "Erstellen Sie eine konvexe Form, die die gesamte Leiterplatte umgibt." -#: flatcamGUI/FlatCAMGUI.py:5380 +#: flatcamGUI/FlatCAMGUI.py:5469 msgid "2Sided Tool Options" msgstr "2Seitige Werkzeugoptionen" -#: flatcamGUI/FlatCAMGUI.py:5385 +#: flatcamGUI/FlatCAMGUI.py:5474 msgid "" "A tool to help in creating a double sided\n" "PCB using alignment holes." @@ -7667,44 +7915,44 @@ msgstr "" "Ein Werkzeug, das beim Erstellen eines doppelseitigen Dokuments hilft\n" "PCB mit Ausrichtungslöchern." -#: flatcamGUI/FlatCAMGUI.py:5395 flatcamTools/ToolDblSided.py:235 +#: flatcamGUI/FlatCAMGUI.py:5484 flatcamTools/ToolDblSided.py:235 msgid "Drill diam.:" msgstr "Bohrdurchmesser:" -#: flatcamGUI/FlatCAMGUI.py:5397 flatcamTools/ToolDblSided.py:226 +#: flatcamGUI/FlatCAMGUI.py:5486 flatcamTools/ToolDblSided.py:226 #: flatcamTools/ToolDblSided.py:237 msgid "Diameter of the drill for the alignment holes." msgstr "Durchmesser des Bohrers für die Ausrichtungslöcher." -#: flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5493 msgid "X" msgstr "X" -#: flatcamGUI/FlatCAMGUI.py:5405 +#: flatcamGUI/FlatCAMGUI.py:5494 msgid "Y" msgstr "Y" -#: flatcamGUI/FlatCAMGUI.py:5406 flatcamTools/ToolDblSided.py:120 +#: flatcamGUI/FlatCAMGUI.py:5495 flatcamTools/ToolDblSided.py:120 msgid "Mirror Axis:" msgstr "Spiegelachse:" -#: flatcamGUI/FlatCAMGUI.py:5408 flatcamTools/ToolDblSided.py:122 +#: flatcamGUI/FlatCAMGUI.py:5497 flatcamTools/ToolDblSided.py:122 msgid "Mirror vertically (X) or horizontally (Y)." msgstr "Vertikal spiegeln (X) oder horizontal (Y)." -#: flatcamGUI/FlatCAMGUI.py:5417 +#: flatcamGUI/FlatCAMGUI.py:5506 msgid "Point" msgstr "Punkt" -#: flatcamGUI/FlatCAMGUI.py:5418 +#: flatcamGUI/FlatCAMGUI.py:5507 msgid "Box" msgstr "Box" -#: flatcamGUI/FlatCAMGUI.py:5419 flatcamTools/ToolDblSided.py:133 +#: flatcamGUI/FlatCAMGUI.py:5508 flatcamTools/ToolDblSided.py:133 msgid "Axis Ref:" msgstr "Achsenreferenz:" -#: flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamGUI/FlatCAMGUI.py:5510 msgid "" "The axis should pass through a point or cut\n" " a specified box (in a Geometry object) in \n" @@ -7714,11 +7962,11 @@ msgstr "" "ein angegebenes Feld (in einem Geometrieobjekt) in\n" "die Mitte." -#: flatcamGUI/FlatCAMGUI.py:5437 +#: flatcamGUI/FlatCAMGUI.py:5526 msgid "Paint Tool Options" msgstr "Optionen für das Paint werkzeug" -#: flatcamGUI/FlatCAMGUI.py:5444 flatcamGUI/ObjectUI.py:1299 +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamGUI/ObjectUI.py:1299 msgid "" "Creates tool paths to cover the\n" "whole area of a polygon (remove\n" @@ -7730,7 +7978,7 @@ msgstr "" "alles Kupfer). Du wirst gefragt\n" "Klicken Sie auf das gewünschte Polygon." -#: flatcamGUI/FlatCAMGUI.py:5468 +#: flatcamGUI/FlatCAMGUI.py:5557 msgid "" "How much (fraction) of the tool\n" "width to overlap each tool pass." @@ -7738,23 +7986,23 @@ msgstr "" "Wie viel (Bruchteil) des Werkzeugs\n" "Breite, um jeden Werkzeugdurchgang zu überlappen." -#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolPaint.py:237 +#: flatcamGUI/FlatCAMGUI.py:5611 flatcamTools/ToolPaint.py:237 msgid "Selection:" msgstr "Auswahl:" -#: flatcamGUI/FlatCAMGUI.py:5524 +#: flatcamGUI/FlatCAMGUI.py:5613 msgid "How to select the polygons to paint." msgstr "So wählen Sie die Polygone zum Malen aus." -#: flatcamGUI/FlatCAMGUI.py:5528 +#: flatcamGUI/FlatCAMGUI.py:5617 msgid "Single" msgstr "Single" -#: flatcamGUI/FlatCAMGUI.py:5542 +#: flatcamGUI/FlatCAMGUI.py:5631 msgid "Film Tool Options" msgstr "Filmwerkzeugoptionen" -#: flatcamGUI/FlatCAMGUI.py:5547 +#: flatcamGUI/FlatCAMGUI.py:5636 msgid "" "Create a PCB film from a Gerber or Geometry\n" "FlatCAM object.\n" @@ -7764,19 +8012,19 @@ msgstr "" "FlatCAM-Objekt\n" "Die Datei wird im SVG-Format gespeichert." -#: flatcamGUI/FlatCAMGUI.py:5556 +#: flatcamGUI/FlatCAMGUI.py:5645 msgid "Pos" msgstr "Positiv" -#: flatcamGUI/FlatCAMGUI.py:5557 +#: flatcamGUI/FlatCAMGUI.py:5646 msgid "Neg" msgstr "Negativ" -#: flatcamGUI/FlatCAMGUI.py:5558 flatcamTools/ToolFilm.py:116 +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolFilm.py:116 msgid "Film Type:" msgstr "Filmtyp:" -#: flatcamGUI/FlatCAMGUI.py:5560 flatcamTools/ToolFilm.py:118 +#: flatcamGUI/FlatCAMGUI.py:5649 flatcamTools/ToolFilm.py:118 msgid "" "Generate a Positive black film or a Negative film.\n" "Positive means that it will print the features\n" @@ -7792,11 +8040,11 @@ msgstr "" "mit weiß auf einer schwarzen leinwand.\n" "Das Filmformat ist SVG." -#: flatcamGUI/FlatCAMGUI.py:5571 flatcamTools/ToolFilm.py:130 +#: flatcamGUI/FlatCAMGUI.py:5660 flatcamTools/ToolFilm.py:130 msgid "Border:" msgstr "Rand:" -#: flatcamGUI/FlatCAMGUI.py:5573 flatcamTools/ToolFilm.py:132 +#: flatcamGUI/FlatCAMGUI.py:5662 flatcamTools/ToolFilm.py:132 msgid "" "Specify a border around the object.\n" "Only for negative film.\n" @@ -7816,11 +8064,11 @@ msgstr "" "weiße Farbe wie der Rest und die mit der verwechseln kann\n" "Umgebung, wenn nicht für diese Grenze." -#: flatcamGUI/FlatCAMGUI.py:5586 flatcamTools/ToolFilm.py:144 +#: flatcamGUI/FlatCAMGUI.py:5675 flatcamTools/ToolFilm.py:144 msgid "Scale Stroke:" msgstr "Skalierungshub:" -#: flatcamGUI/FlatCAMGUI.py:5588 flatcamTools/ToolFilm.py:146 +#: flatcamGUI/FlatCAMGUI.py:5677 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 " @@ -7832,11 +8080,11 @@ msgstr "" "dünner ist.\n" "Daher können die Feinheiten von diesem Parameter stärker beeinflusst werden." -#: flatcamGUI/FlatCAMGUI.py:5603 +#: flatcamGUI/FlatCAMGUI.py:5692 msgid "Panelize Tool Options" msgstr "Panelize Werkzeugoptionen" -#: flatcamGUI/FlatCAMGUI.py:5608 +#: flatcamGUI/FlatCAMGUI.py:5697 msgid "" "Create an object that contains an array of (x, y) elements,\n" "each element is a copy of the source object spaced\n" @@ -7846,11 +8094,11 @@ msgstr "" "Jedes Element ist eine Kopie des Quellobjekts\n" "in einem X-Abstand, Y-Abstand voneinander." -#: flatcamGUI/FlatCAMGUI.py:5619 flatcamTools/ToolPanelize.py:113 +#: flatcamGUI/FlatCAMGUI.py:5708 flatcamTools/ToolPanelize.py:113 msgid "Spacing cols:" msgstr "Abstandspalten:" -#: flatcamGUI/FlatCAMGUI.py:5621 flatcamTools/ToolPanelize.py:115 +#: flatcamGUI/FlatCAMGUI.py:5710 flatcamTools/ToolPanelize.py:115 msgid "" "Spacing between columns of the desired panel.\n" "In current units." @@ -7858,11 +8106,11 @@ msgstr "" "Abstand zwischen den Spalten des gewünschten Bereichs.\n" "In aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:5629 flatcamTools/ToolPanelize.py:122 +#: flatcamGUI/FlatCAMGUI.py:5718 flatcamTools/ToolPanelize.py:122 msgid "Spacing rows:" msgstr "Abstand Reihen:" -#: flatcamGUI/FlatCAMGUI.py:5631 flatcamTools/ToolPanelize.py:124 +#: flatcamGUI/FlatCAMGUI.py:5720 flatcamTools/ToolPanelize.py:124 msgid "" "Spacing between rows of the desired panel.\n" "In current units." @@ -7870,35 +8118,35 @@ msgstr "" "Abstand zwischen den Reihen des gewünschten Feldes.\n" "In aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:5639 flatcamTools/ToolPanelize.py:131 +#: flatcamGUI/FlatCAMGUI.py:5728 flatcamTools/ToolPanelize.py:131 msgid "Columns:" msgstr "Säulen:" -#: flatcamGUI/FlatCAMGUI.py:5641 flatcamTools/ToolPanelize.py:133 +#: flatcamGUI/FlatCAMGUI.py:5730 flatcamTools/ToolPanelize.py:133 msgid "Number of columns of the desired panel" msgstr "Anzahl der Spalten des gewünschten Bereichs" -#: flatcamGUI/FlatCAMGUI.py:5648 flatcamTools/ToolPanelize.py:139 +#: flatcamGUI/FlatCAMGUI.py:5737 flatcamTools/ToolPanelize.py:139 msgid "Rows:" msgstr "Reihen:" -#: flatcamGUI/FlatCAMGUI.py:5650 flatcamTools/ToolPanelize.py:141 +#: flatcamGUI/FlatCAMGUI.py:5739 flatcamTools/ToolPanelize.py:141 msgid "Number of rows of the desired panel" msgstr "Anzahl der Zeilen des gewünschten Panels" -#: flatcamGUI/FlatCAMGUI.py:5656 +#: flatcamGUI/FlatCAMGUI.py:5745 msgid "Gerber" msgstr "Gerber" -#: flatcamGUI/FlatCAMGUI.py:5657 +#: flatcamGUI/FlatCAMGUI.py:5746 msgid "Geo" msgstr "Geo" -#: flatcamGUI/FlatCAMGUI.py:5658 flatcamTools/ToolPanelize.py:148 +#: flatcamGUI/FlatCAMGUI.py:5747 flatcamTools/ToolPanelize.py:148 msgid "Panel Type:" msgstr "Panel-Typ:" -#: flatcamGUI/FlatCAMGUI.py:5660 +#: flatcamGUI/FlatCAMGUI.py:5749 msgid "" "Choose the type of object for the panel object:\n" "- Gerber\n" @@ -7908,11 +8156,11 @@ msgstr "" "- Gerber\n" "- Geometrie" -#: flatcamGUI/FlatCAMGUI.py:5669 +#: flatcamGUI/FlatCAMGUI.py:5758 msgid "Constrain within:" msgstr "Beschränkung innerhalb:" -#: flatcamGUI/FlatCAMGUI.py:5671 flatcamTools/ToolPanelize.py:160 +#: flatcamGUI/FlatCAMGUI.py:5760 flatcamTools/ToolPanelize.py:160 msgid "" "Area define by DX and DY within to constrain the panel.\n" "DX and DY values are in current units.\n" @@ -7926,11 +8174,11 @@ msgstr "" "Das letzte Panel enthält so viele Spalten und Zeilen wie\n" "Sie passen vollständig in den ausgewählten Bereich." -#: flatcamGUI/FlatCAMGUI.py:5680 flatcamTools/ToolPanelize.py:169 +#: flatcamGUI/FlatCAMGUI.py:5769 flatcamTools/ToolPanelize.py:169 msgid "Width (DX):" msgstr "Breite (DX):" -#: flatcamGUI/FlatCAMGUI.py:5682 flatcamTools/ToolPanelize.py:171 +#: flatcamGUI/FlatCAMGUI.py:5771 flatcamTools/ToolPanelize.py:171 msgid "" "The width (DX) within which the panel must fit.\n" "In current units." @@ -7938,11 +8186,11 @@ msgstr "" "Die Breite (DX), in die das Panel passen muss.\n" "In aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:5689 flatcamTools/ToolPanelize.py:177 +#: flatcamGUI/FlatCAMGUI.py:5778 flatcamTools/ToolPanelize.py:177 msgid "Height (DY):" msgstr "Höhe (DY):" -#: flatcamGUI/FlatCAMGUI.py:5691 flatcamTools/ToolPanelize.py:179 +#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolPanelize.py:179 msgid "" "The height (DY)within which the panel must fit.\n" "In current units." @@ -7950,15 +8198,15 @@ msgstr "" "Die Höhe (DY), in die die Platte passen muss.\n" "In aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:5705 +#: flatcamGUI/FlatCAMGUI.py:5794 msgid "Calculators Tool Options" msgstr "Rechner-Tool-Optionen" -#: flatcamGUI/FlatCAMGUI.py:5708 +#: flatcamGUI/FlatCAMGUI.py:5797 msgid "V-Shape Tool Calculator:" msgstr " V-Shape-Werkzeug Rechner: " -#: flatcamGUI/FlatCAMGUI.py:5710 +#: flatcamGUI/FlatCAMGUI.py:5799 msgid "" "Calculate the tool diameter for a given V-shape tool,\n" "having the tip diameter, tip angle and\n" @@ -7969,11 +8217,11 @@ msgstr "" "mit dem Spitzendurchmesser, Spitzenwinkel und\n" "Schnitttiefe als Parameter." -#: flatcamGUI/FlatCAMGUI.py:5721 flatcamTools/ToolCalculators.py:94 +#: flatcamGUI/FlatCAMGUI.py:5810 flatcamTools/ToolCalculators.py:94 msgid "Tip Diameter:" msgstr "Spitzendurchmesser" -#: flatcamGUI/FlatCAMGUI.py:5723 +#: flatcamGUI/FlatCAMGUI.py:5812 msgid "" "This is the tool tip diameter.\n" "It is specified by manufacturer." @@ -7981,11 +8229,11 @@ msgstr "" "Dies ist der Werkzeugspitzendurchmesser.\n" "Es wird vom Hersteller angegeben." -#: flatcamGUI/FlatCAMGUI.py:5731 +#: flatcamGUI/FlatCAMGUI.py:5820 msgid "Tip angle:" msgstr "Spitzenwinkel:" -#: flatcamGUI/FlatCAMGUI.py:5733 +#: flatcamGUI/FlatCAMGUI.py:5822 msgid "" "This is the angle on the tip of the tool.\n" "It is specified by manufacturer." @@ -7993,7 +8241,7 @@ msgstr "" "Dies ist der Winkel an der Spitze des Werkzeugs.\n" "Es wird vom Hersteller angegeben." -#: flatcamGUI/FlatCAMGUI.py:5743 +#: flatcamGUI/FlatCAMGUI.py:5832 msgid "" "This is depth to cut into material.\n" "In the CNCJob object it is the CutZ parameter." @@ -8001,11 +8249,11 @@ msgstr "" "Dies ist die Tiefe zum Schneiden in Material.\n" "Im CNCJob-Objekt ist dies der Parameter CutZ." -#: flatcamGUI/FlatCAMGUI.py:5750 +#: flatcamGUI/FlatCAMGUI.py:5839 msgid "ElectroPlating Calculator:" msgstr " Galvano-Rechner: " -#: flatcamGUI/FlatCAMGUI.py:5752 flatcamTools/ToolCalculators.py:152 +#: flatcamGUI/FlatCAMGUI.py:5841 flatcamTools/ToolCalculators.py:152 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 " @@ -8016,27 +8264,27 @@ msgstr "" "unter Verwendung einer Methode wie Grahit-Tinte oder Calcium-Hypophosphit-" "Tinte oder Palladiumchlorid." -#: flatcamGUI/FlatCAMGUI.py:5762 flatcamTools/ToolCalculators.py:161 +#: flatcamGUI/FlatCAMGUI.py:5851 flatcamTools/ToolCalculators.py:161 msgid "Board Length:" msgstr "PCB Länge:" -#: flatcamGUI/FlatCAMGUI.py:5764 flatcamTools/ToolCalculators.py:165 +#: flatcamGUI/FlatCAMGUI.py:5853 flatcamTools/ToolCalculators.py:165 msgid "This is the board length. In centimeters." msgstr "Dies ist die Boardlänge. In Zentimeter" -#: flatcamGUI/FlatCAMGUI.py:5770 flatcamTools/ToolCalculators.py:167 +#: flatcamGUI/FlatCAMGUI.py:5859 flatcamTools/ToolCalculators.py:167 msgid "Board Width:" msgstr "PCB Breite:" -#: flatcamGUI/FlatCAMGUI.py:5772 flatcamTools/ToolCalculators.py:171 +#: flatcamGUI/FlatCAMGUI.py:5861 flatcamTools/ToolCalculators.py:171 msgid "This is the board width.In centimeters." msgstr "Dies ist die Breite der Platte in Zentimetern." -#: flatcamGUI/FlatCAMGUI.py:5777 flatcamTools/ToolCalculators.py:173 +#: flatcamGUI/FlatCAMGUI.py:5866 flatcamTools/ToolCalculators.py:173 msgid "Current Density:" msgstr "Stromdichte:" -#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolCalculators.py:177 +#: flatcamGUI/FlatCAMGUI.py:5869 flatcamTools/ToolCalculators.py:177 msgid "" "Current density to pass through the board. \n" "In Amps per Square Feet ASF." @@ -8044,11 +8292,11 @@ msgstr "" "Stromdichte durch die Platine.\n" "In Ampere pro Quadratfuß ASF." -#: flatcamGUI/FlatCAMGUI.py:5786 flatcamTools/ToolCalculators.py:181 +#: flatcamGUI/FlatCAMGUI.py:5875 flatcamTools/ToolCalculators.py:181 msgid "Copper Growth:" msgstr "Kupferwachstum:" -#: flatcamGUI/FlatCAMGUI.py:5789 flatcamTools/ToolCalculators.py:185 +#: flatcamGUI/FlatCAMGUI.py:5878 flatcamTools/ToolCalculators.py:185 msgid "" "How thick the copper growth is intended to be.\n" "In microns." @@ -8056,11 +8304,11 @@ msgstr "" "Wie dick soll das Kupferwachstum sein.\n" "In Mikrometern" -#: flatcamGUI/FlatCAMGUI.py:5802 +#: flatcamGUI/FlatCAMGUI.py:5891 msgid "Transform Tool Options" msgstr "Optionen für das Umwandlungswerkzeug" -#: flatcamGUI/FlatCAMGUI.py:5807 +#: flatcamGUI/FlatCAMGUI.py:5896 msgid "" "Various transformations that can be applied\n" "on a FlatCAM object." @@ -8068,47 +8316,47 @@ msgstr "" "Verschiedene Transformationen, die angewendet werden können\n" "auf einem FlatCAM-Objekt." -#: flatcamGUI/FlatCAMGUI.py:5817 +#: flatcamGUI/FlatCAMGUI.py:5906 msgid "Rotate Angle:" msgstr "Winkel drehen:" -#: flatcamGUI/FlatCAMGUI.py:5819 +#: flatcamGUI/FlatCAMGUI.py:5908 msgid "Angle for rotation. In degrees." msgstr "Drehwinkel. In grad." -#: flatcamGUI/FlatCAMGUI.py:5826 +#: flatcamGUI/FlatCAMGUI.py:5915 msgid "Skew_X angle:" msgstr "Neigungswinkel X:" -#: flatcamGUI/FlatCAMGUI.py:5828 +#: flatcamGUI/FlatCAMGUI.py:5917 msgid "Angle for Skew/Shear on X axis. In degrees." msgstr "Winkel für Neigung / Scherung auf der X-Achse. In grad." -#: flatcamGUI/FlatCAMGUI.py:5835 +#: flatcamGUI/FlatCAMGUI.py:5924 msgid "Skew_Y angle:" msgstr "Neigungswinkel Y:" -#: flatcamGUI/FlatCAMGUI.py:5837 +#: flatcamGUI/FlatCAMGUI.py:5926 msgid "Angle for Skew/Shear on Y axis. In degrees." msgstr "Winkel für Neigung / Scherung auf der Y-Achse. In grad." -#: flatcamGUI/FlatCAMGUI.py:5844 +#: flatcamGUI/FlatCAMGUI.py:5933 msgid "Scale_X factor:" msgstr "Skalierung des X-Faktors:" -#: flatcamGUI/FlatCAMGUI.py:5846 +#: flatcamGUI/FlatCAMGUI.py:5935 msgid "Factor for scaling on X axis." msgstr "Faktor für die Skalierung auf der X-Achse." -#: flatcamGUI/FlatCAMGUI.py:5853 +#: flatcamGUI/FlatCAMGUI.py:5942 msgid "Scale_Y factor:" msgstr "Skalierung des Y-Faktors:" -#: flatcamGUI/FlatCAMGUI.py:5855 +#: flatcamGUI/FlatCAMGUI.py:5944 msgid "Factor for scaling on Y axis." msgstr "Faktor für die Skalierung auf der Y-Achse." -#: flatcamGUI/FlatCAMGUI.py:5863 +#: flatcamGUI/FlatCAMGUI.py:5952 msgid "" "Scale the selected object(s)\n" "using the Scale_X factor for both axis." @@ -8116,7 +8364,7 @@ msgstr "" "Skalieren Sie die ausgewählten Objekte\n" "Verwenden des Skalierungsfaktors X für beide Achsen." -#: flatcamGUI/FlatCAMGUI.py:5871 flatcamTools/ToolTransform.py:210 +#: flatcamGUI/FlatCAMGUI.py:5960 flatcamTools/ToolTransform.py:210 msgid "" "Scale the selected object(s)\n" "using the origin reference when checked,\n" @@ -8128,27 +8376,27 @@ msgstr "" "und die Mitte der größten Begrenzungsbox\n" "der ausgewählten Objekte, wenn sie nicht markiert sind." -#: flatcamGUI/FlatCAMGUI.py:5880 +#: flatcamGUI/FlatCAMGUI.py:5969 msgid "Offset_X val:" msgstr "Offset X Wert:" -#: flatcamGUI/FlatCAMGUI.py:5882 +#: flatcamGUI/FlatCAMGUI.py:5971 msgid "Distance to offset on X axis. In current units." msgstr "Abstand zum Offset auf der X-Achse. In aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:5889 +#: flatcamGUI/FlatCAMGUI.py:5978 msgid "Offset_Y val:" msgstr "Offset Y-Wert:" -#: flatcamGUI/FlatCAMGUI.py:5891 +#: flatcamGUI/FlatCAMGUI.py:5980 msgid "Distance to offset on Y axis. In current units." msgstr "Abstand zum Offset auf der Y-Achse. In aktuellen Einheiten." -#: flatcamGUI/FlatCAMGUI.py:5897 +#: flatcamGUI/FlatCAMGUI.py:5986 msgid "Mirror Reference" msgstr "Spiegelreferenz" -#: flatcamGUI/FlatCAMGUI.py:5899 flatcamTools/ToolTransform.py:314 +#: flatcamGUI/FlatCAMGUI.py:5988 flatcamTools/ToolTransform.py:314 msgid "" "Flip the selected object(s)\n" "around the point in Point Entry Field.\n" @@ -8171,11 +8419,11 @@ msgstr "" "Oder geben Sie die Koordinaten im Format (x, y) in ein\n" "Punkt-Eingabefeld und klicken Sie auf X (Y) drehen" -#: flatcamGUI/FlatCAMGUI.py:5910 +#: flatcamGUI/FlatCAMGUI.py:5999 msgid " Mirror Ref. Point:" msgstr "Spiegelref. Punkt:" -#: flatcamGUI/FlatCAMGUI.py:5912 flatcamTools/ToolTransform.py:327 +#: flatcamGUI/FlatCAMGUI.py:6001 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" @@ -8186,11 +8434,11 @@ msgstr "" "Das 'x' in (x, y) wird verwendet, wenn Sie bei X und\n" "Das 'y' in (x, y) wird verwendet, wenn Flip auf Y und verwendet wird" -#: flatcamGUI/FlatCAMGUI.py:5929 +#: flatcamGUI/FlatCAMGUI.py:6018 msgid "SolderPaste Tool Options" msgstr "Optionen für das Lötpaste-Werkzeug" -#: flatcamGUI/FlatCAMGUI.py:5934 +#: flatcamGUI/FlatCAMGUI.py:6023 msgid "" "A tool to create GCode for dispensing\n" "solder paste onto a PCB." @@ -8198,49 +8446,49 @@ msgstr "" "Ein Werkzeug zum Erstellen von GCode für die Ausgabe\n" "Lotpaste auf eine Leiterplatte." -#: flatcamGUI/FlatCAMGUI.py:5945 +#: flatcamGUI/FlatCAMGUI.py:6034 msgid "Diameters of nozzle tools, separated by ','" msgstr "Durchmesser der Düsenwerkzeuge, getrennt durch ','" -#: flatcamGUI/FlatCAMGUI.py:5952 +#: flatcamGUI/FlatCAMGUI.py:6041 msgid "New Nozzle Dia:" msgstr " Neuer Düsendurchmesser: " -#: flatcamGUI/FlatCAMGUI.py:5954 flatcamTools/ToolSolderPaste.py:103 +#: flatcamGUI/FlatCAMGUI.py:6043 flatcamTools/ToolSolderPaste.py:103 msgid "Diameter for the new Nozzle tool to add in the Tool Table" msgstr "" "Durchmesser für das neue Düsenwerkzeug, das in die Werkzeugtabelle eingefügt " "werden soll" -#: flatcamGUI/FlatCAMGUI.py:5962 flatcamTools/ToolSolderPaste.py:166 +#: flatcamGUI/FlatCAMGUI.py:6051 flatcamTools/ToolSolderPaste.py:166 msgid "Z Dispense Start:" msgstr "Z Dosierbeginn:" -#: flatcamGUI/FlatCAMGUI.py:5964 flatcamTools/ToolSolderPaste.py:168 +#: flatcamGUI/FlatCAMGUI.py:6053 flatcamTools/ToolSolderPaste.py:168 msgid "The height (Z) when solder paste dispensing starts." msgstr "Die Höhe (Z) bei der Lotpastendosierung." -#: flatcamGUI/FlatCAMGUI.py:5971 flatcamTools/ToolSolderPaste.py:174 +#: flatcamGUI/FlatCAMGUI.py:6060 flatcamTools/ToolSolderPaste.py:174 msgid "Z Dispense:" msgstr "Z-Abgabe:" -#: flatcamGUI/FlatCAMGUI.py:5973 flatcamTools/ToolSolderPaste.py:176 +#: flatcamGUI/FlatCAMGUI.py:6062 flatcamTools/ToolSolderPaste.py:176 msgid "The height (Z) when doing solder paste dispensing." msgstr "Die Höhe (Z) bei der Lotpastendosierung." -#: flatcamGUI/FlatCAMGUI.py:5980 flatcamTools/ToolSolderPaste.py:183 +#: flatcamGUI/FlatCAMGUI.py:6069 flatcamTools/ToolSolderPaste.py:183 msgid "Z Dispense Stop:" msgstr "Z Abgabestopp:" -#: flatcamGUI/FlatCAMGUI.py:5982 flatcamTools/ToolSolderPaste.py:185 +#: flatcamGUI/FlatCAMGUI.py:6071 flatcamTools/ToolSolderPaste.py:185 msgid "The height (Z) when solder paste dispensing stops." msgstr "Die Höhe (Z) bei der Lotpastendosierung stoppt." -#: flatcamGUI/FlatCAMGUI.py:5989 flatcamTools/ToolSolderPaste.py:191 +#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:191 msgid "Z Travel:" msgstr "Z Reise:" -#: flatcamGUI/FlatCAMGUI.py:5991 flatcamTools/ToolSolderPaste.py:193 +#: flatcamGUI/FlatCAMGUI.py:6080 flatcamTools/ToolSolderPaste.py:193 msgid "" "The height (Z) for travel between pads\n" "(without dispensing solder paste)." @@ -8248,19 +8496,19 @@ msgstr "" "Die Höhe (Z) für den Weg zwischen Pads\n" "(ohne Lotpaste zu dosieren)." -#: flatcamGUI/FlatCAMGUI.py:5999 flatcamTools/ToolSolderPaste.py:200 +#: flatcamGUI/FlatCAMGUI.py:6088 flatcamTools/ToolSolderPaste.py:200 msgid "Z Toolchange:" msgstr "Z Werkzeugwechsel:" -#: flatcamGUI/FlatCAMGUI.py:6001 flatcamTools/ToolSolderPaste.py:202 +#: flatcamGUI/FlatCAMGUI.py:6090 flatcamTools/ToolSolderPaste.py:202 msgid "The height (Z) for tool (nozzle) change." msgstr "Die Höhe (Z) für Werkzeug (Düse) ändert sich." -#: flatcamGUI/FlatCAMGUI.py:6008 flatcamTools/ToolSolderPaste.py:208 +#: flatcamGUI/FlatCAMGUI.py:6097 flatcamTools/ToolSolderPaste.py:208 msgid "XY Toolchange:" msgstr "XY-Werkzeugwechsel:" -#: flatcamGUI/FlatCAMGUI.py:6010 flatcamTools/ToolSolderPaste.py:210 +#: flatcamGUI/FlatCAMGUI.py:6099 flatcamTools/ToolSolderPaste.py:210 msgid "" "The X,Y location for tool (nozzle) change.\n" "The format is (x, y) where x and y are real numbers." @@ -8268,19 +8516,19 @@ msgstr "" "Die X, Y-Position für Werkzeug (Düse) ändert sich.\n" "Das Format ist (x, y), wobei x und y reelle Zahlen sind." -#: flatcamGUI/FlatCAMGUI.py:6018 flatcamTools/ToolSolderPaste.py:217 +#: flatcamGUI/FlatCAMGUI.py:6107 flatcamTools/ToolSolderPaste.py:217 msgid "Feedrate X-Y:" msgstr "Vorschub X-Y:" -#: flatcamGUI/FlatCAMGUI.py:6020 flatcamTools/ToolSolderPaste.py:219 +#: flatcamGUI/FlatCAMGUI.py:6109 flatcamTools/ToolSolderPaste.py:219 msgid "Feedrate (speed) while moving on the X-Y plane." msgstr "Vorschub (Geschwindigkeit) während der Bewegung auf der X-Y-Ebene." -#: flatcamGUI/FlatCAMGUI.py:6027 flatcamTools/ToolSolderPaste.py:225 +#: flatcamGUI/FlatCAMGUI.py:6116 flatcamTools/ToolSolderPaste.py:225 msgid "Feedrate Z:" msgstr "Vorschub Z:" -#: flatcamGUI/FlatCAMGUI.py:6029 flatcamTools/ToolSolderPaste.py:227 +#: flatcamGUI/FlatCAMGUI.py:6118 flatcamTools/ToolSolderPaste.py:227 msgid "" "Feedrate (speed) while moving vertically\n" "(on Z plane)." @@ -8288,11 +8536,11 @@ msgstr "" "Vorschub (Geschwindigkeit) bei vertikaler Bewegung\n" "(auf der Z-Ebene)." -#: flatcamGUI/FlatCAMGUI.py:6037 flatcamTools/ToolSolderPaste.py:234 +#: flatcamGUI/FlatCAMGUI.py:6126 flatcamTools/ToolSolderPaste.py:234 msgid "Feedrate Z Dispense:" msgstr "Vorschub Z Dosierung:" -#: flatcamGUI/FlatCAMGUI.py:6039 flatcamTools/ToolSolderPaste.py:236 +#: flatcamGUI/FlatCAMGUI.py:6128 flatcamTools/ToolSolderPaste.py:236 msgid "" "Feedrate (speed) while moving up vertically\n" " to Dispense position (on Z plane)." @@ -8300,11 +8548,11 @@ msgstr "" "Vorschub (Geschwindigkeit) bei vertikaler Bewegung\n" "  zur Ausgabeposition (auf der Z-Ebene)." -#: flatcamGUI/FlatCAMGUI.py:6047 flatcamTools/ToolSolderPaste.py:243 +#: flatcamGUI/FlatCAMGUI.py:6136 flatcamTools/ToolSolderPaste.py:243 msgid "Spindle Speed FWD:" msgstr "Spindeldrehzahl FWD:" -#: flatcamGUI/FlatCAMGUI.py:6049 flatcamTools/ToolSolderPaste.py:245 +#: flatcamGUI/FlatCAMGUI.py:6138 flatcamTools/ToolSolderPaste.py:245 msgid "" "The dispenser speed while pushing solder paste\n" "through the dispenser nozzle." @@ -8312,19 +8560,19 @@ msgstr "" "Die Spendergeschwindigkeit beim Schieben der Lötpaste\n" "durch die Spenderdüse." -#: flatcamGUI/FlatCAMGUI.py:6057 flatcamTools/ToolSolderPaste.py:252 +#: flatcamGUI/FlatCAMGUI.py:6146 flatcamTools/ToolSolderPaste.py:252 msgid "Dwell FWD:" msgstr "Verweilzeit FWD:" -#: flatcamGUI/FlatCAMGUI.py:6059 flatcamTools/ToolSolderPaste.py:254 +#: flatcamGUI/FlatCAMGUI.py:6148 flatcamTools/ToolSolderPaste.py:254 msgid "Pause after solder dispensing." msgstr "Pause nach dem Löten." -#: flatcamGUI/FlatCAMGUI.py:6066 flatcamTools/ToolSolderPaste.py:260 +#: flatcamGUI/FlatCAMGUI.py:6155 flatcamTools/ToolSolderPaste.py:260 msgid "Spindle Speed REV:" msgstr "Spindeldrehzahl REV:" -#: flatcamGUI/FlatCAMGUI.py:6068 flatcamTools/ToolSolderPaste.py:262 +#: flatcamGUI/FlatCAMGUI.py:6157 flatcamTools/ToolSolderPaste.py:262 msgid "" "The dispenser speed while retracting solder paste\n" "through the dispenser nozzle." @@ -8332,11 +8580,11 @@ msgstr "" "Die Spendergeschwindigkeit beim Einfahren der Lötpaste\n" "durch die Spenderdüse." -#: flatcamGUI/FlatCAMGUI.py:6076 flatcamTools/ToolSolderPaste.py:269 +#: flatcamGUI/FlatCAMGUI.py:6165 flatcamTools/ToolSolderPaste.py:269 msgid "Dwell REV:" msgstr "Verweilen REV:" -#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:271 +#: flatcamGUI/FlatCAMGUI.py:6167 flatcamTools/ToolSolderPaste.py:271 msgid "" "Pause after solder paste dispenser retracted,\n" "to allow pressure equilibrium." @@ -8344,23 +8592,23 @@ msgstr "" "Pause nachdem Lotpastendispenser eingefahren wurde,\n" "das Druckgleichgewicht zu ermöglichen." -#: flatcamGUI/FlatCAMGUI.py:6085 flatcamTools/ToolSolderPaste.py:277 +#: flatcamGUI/FlatCAMGUI.py:6174 flatcamTools/ToolSolderPaste.py:277 msgid "PostProcessors:" msgstr "Postprozessoren:" -#: flatcamGUI/FlatCAMGUI.py:6087 flatcamTools/ToolSolderPaste.py:279 +#: flatcamGUI/FlatCAMGUI.py:6176 flatcamTools/ToolSolderPaste.py:279 msgid "Files that control the GCode generation." msgstr "Dateien, die die GCode-Generierung steuern." -#: flatcamGUI/FlatCAMGUI.py:6117 flatcamGUI/FlatCAMGUI.py:6123 +#: flatcamGUI/FlatCAMGUI.py:6206 flatcamGUI/FlatCAMGUI.py:6212 msgid "Idle." msgstr "Untätig" -#: flatcamGUI/FlatCAMGUI.py:6147 +#: flatcamGUI/FlatCAMGUI.py:6236 msgid "Application started ..." msgstr "Bewerbung gestartet ..." -#: flatcamGUI/FlatCAMGUI.py:6148 +#: flatcamGUI/FlatCAMGUI.py:6237 msgid "Hello!" msgstr "Hello!" @@ -9064,6 +9312,12 @@ msgid "" "To the right, input the depth of \n" "each pass (positive value)." msgstr "" +"Verwenden Sie zum Begrenzen mehrere Durchläufe\n" +"die Schnitttiefe in jedem Durchgang. Wille\n" +"mehrmals schneiden, bis Cut Z ist\n" +"erreicht.\n" +"Geben Sie rechts die Tiefe von ein\n" +"jeder Durchlauf (positiver Wert)." #: flatcamGUI/ObjectUI.py:1087 msgid "Depth of each pass (positive)." @@ -9623,7 +9877,7 @@ msgstr "" "das Geometrieobjekt, das als Ausschnittsgeometrie verwendet wird." #: flatcamTools/ToolCutOut.py:338 flatcamTools/ToolCutOut.py:483 -#: flatcamTools/ToolNonCopperClear.py:665 flatcamTools/ToolPaint.py:763 +#: flatcamTools/ToolNonCopperClear.py:666 flatcamTools/ToolPaint.py:764 #: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 #, python-format msgid "[ERROR_NOTCL] Could not retrieve object: %s" @@ -9693,7 +9947,7 @@ msgstr "" msgid "[success] Any form CutOut operation finished." msgstr "[success] Jede Form CutOut-Operation ist abgeschlossen." -#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:767 +#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:768 #: flatcamTools/ToolPanelize.py:299 #, python-format msgid "[ERROR_NOTCL] Object not found: %s" @@ -10284,23 +10538,19 @@ msgstr "Dies ist die Punkt-zu-Punkt-Euklidische Entfernung." msgid "Measure" msgstr "Messen" -#: flatcamTools/ToolMeasurement.py:126 +#: flatcamTools/ToolMeasurement.py:132 msgid "Meas. Tool" msgstr "Messgerät" -#: flatcamTools/ToolMeasurement.py:221 +#: flatcamTools/ToolMeasurement.py:177 msgid "MEASURING: Click on the Start point ..." msgstr "MESSEN: Klicken Sie auf den Startpunkt ..." -#: flatcamTools/ToolMeasurement.py:231 -msgid "Measurement Tool exit..." -msgstr "Messwerkzeug beenden ..." - -#: flatcamTools/ToolMeasurement.py:258 +#: flatcamTools/ToolMeasurement.py:270 msgid "MEASURING: Click on the Destination point ..." msgstr "MESSEN: Klicken Sie auf den Zielpunkt ..." -#: flatcamTools/ToolMeasurement.py:276 +#: flatcamTools/ToolMeasurement.py:278 #, python-brace-format msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" msgstr "MESSEN: Ergebnis D (x) = {d_x} | D (y) = {d_y} | Abstand = {d_z}" @@ -10450,29 +10700,29 @@ msgstr "" msgid "Generate Geometry" msgstr "Geometrie erzeugen" -#: flatcamTools/ToolNonCopperClear.py:484 flatcamTools/ToolPaint.py:543 -#: flatcamTools/ToolSolderPaste.py:760 +#: flatcamTools/ToolNonCopperClear.py:485 flatcamTools/ToolPaint.py:544 +#: flatcamTools/ToolSolderPaste.py:761 msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." msgstr "" "[WARNING_NOTCL] Bitte geben Sie einen hinzuzufügenden Werkzeugdurchmesser im " "Float-Format an." -#: flatcamTools/ToolNonCopperClear.py:512 flatcamTools/ToolPaint.py:567 +#: flatcamTools/ToolNonCopperClear.py:513 flatcamTools/ToolPaint.py:568 msgid "[WARNING_NOTCL] Adding tool cancelled. Tool already in Tool Table." msgstr "" "[WARNING_NOTCL] Das Hinzufügen des Tools wurde abgebrochen. Werkzeug bereits " "in der Werkzeugtabelle." -#: flatcamTools/ToolNonCopperClear.py:517 flatcamTools/ToolPaint.py:572 +#: flatcamTools/ToolNonCopperClear.py:518 flatcamTools/ToolPaint.py:573 msgid "[success] New tool added to Tool Table." msgstr "[success] Neues Werkzeug zur Werkzeugtabelle hinzugefügt." -#: flatcamTools/ToolNonCopperClear.py:559 flatcamTools/ToolPaint.py:615 +#: flatcamTools/ToolNonCopperClear.py:560 flatcamTools/ToolPaint.py:616 msgid "[success] Tool from Tool Table was edited." msgstr "[success] Werkzeug aus Werkzeugtabelle wurde bearbeitet." -#: flatcamTools/ToolNonCopperClear.py:570 flatcamTools/ToolPaint.py:626 -#: flatcamTools/ToolSolderPaste.py:846 +#: flatcamTools/ToolNonCopperClear.py:571 flatcamTools/ToolPaint.py:627 +#: flatcamTools/ToolSolderPaste.py:847 msgid "" "[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " "Table." @@ -10480,48 +10730,48 @@ msgstr "" "[WARNING_NOTCL] Bearbeitung abgebrochen. Neuer Durchmesserwert befindet sich " "bereits in der Werkzeugtabelle." -#: flatcamTools/ToolNonCopperClear.py:609 flatcamTools/ToolPaint.py:723 +#: flatcamTools/ToolNonCopperClear.py:610 flatcamTools/ToolPaint.py:724 msgid "[WARNING_NOTCL] Delete failed. Select a tool to delete." msgstr "" "[WARNING_NOTCL] Löschen fehlgeschlagen. Wählen Sie ein Werkzeug zum Löschen " "aus." -#: flatcamTools/ToolNonCopperClear.py:614 flatcamTools/ToolPaint.py:728 +#: flatcamTools/ToolNonCopperClear.py:615 flatcamTools/ToolPaint.py:729 msgid "[success] Tool(s) deleted from Tool Table." msgstr "[success] Werkzeug(e) aus der Werkzeugtabelle gelöscht." -#: flatcamTools/ToolNonCopperClear.py:632 flatcamTools/ToolPaint.py:747 +#: flatcamTools/ToolNonCopperClear.py:633 flatcamTools/ToolPaint.py:748 msgid "" "[ERROR_NOTCL] Overlap value must be between 0 (inclusive) and 1 (exclusive), " msgstr "" "[ERROR_NOTCL] Der Überlappungswert muss zwischen 0 (einschließlich) und 1 " "(exklusiv) liegen." -#: flatcamTools/ToolNonCopperClear.py:672 +#: flatcamTools/ToolNonCopperClear.py:673 msgid "[ERROR_NOTCL] No Gerber file available." msgstr "[ERROR_NOTCL] Keine Gerber-Datei verfügbar." -#: flatcamTools/ToolNonCopperClear.py:710 -#: flatcamTools/ToolNonCopperClear.py:832 +#: flatcamTools/ToolNonCopperClear.py:711 +#: flatcamTools/ToolNonCopperClear.py:833 msgid "Clearing Non-Copper areas." msgstr "Nicht kupferne Bereiche entfernen." -#: flatcamTools/ToolNonCopperClear.py:728 +#: flatcamTools/ToolNonCopperClear.py:729 #, python-format msgid "[success] Non-Copper Clearing with ToolDia = %s started." msgstr "" "[success] Nicht-Kupfer-Clearing mit Werkzeugdurchmesser = %s gestartet." -#: flatcamTools/ToolNonCopperClear.py:797 +#: flatcamTools/ToolNonCopperClear.py:798 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" -#: flatcamTools/ToolNonCopperClear.py:802 +#: flatcamTools/ToolNonCopperClear.py:803 msgid "[success] NCC Tool finished." msgstr "[success] NCC-Tool fertiggestellt." -#: flatcamTools/ToolNonCopperClear.py:804 +#: flatcamTools/ToolNonCopperClear.py:805 msgid "" "[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " "cleared. Check the result." @@ -10529,18 +10779,18 @@ msgstr "" "[WARNING_NOTCL] NCC-Tool fertiggestellt, einige PCB-Funktionen konnten " "jedoch nicht gelöscht werden. Überprüfen Sie das Ergebnis." -#: flatcamTools/ToolNonCopperClear.py:850 +#: flatcamTools/ToolNonCopperClear.py:851 #, python-format msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." msgstr "" "[success] Nicht-Kupfer-Restklärung mit Werkzeugdurchmesser =%s gestartet." -#: flatcamTools/ToolNonCopperClear.py:948 +#: flatcamTools/ToolNonCopperClear.py:949 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" -#: flatcamTools/ToolNonCopperClear.py:956 +#: flatcamTools/ToolNonCopperClear.py:957 msgid "" "[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " "settings." @@ -10548,6 +10798,32 @@ msgstr "" "[ERROR_NOTCL] NCC-Tool wurde beendet, das Objekt konnte jedoch nicht mit den " "aktuellen Einstellungen gelöscht werden." +#: flatcamTools/ToolPDF.py:37 +msgid "PDF Import Tool" +msgstr "PDF-Importwerkzeug" + +#: flatcamTools/ToolPDF.py:142 flatcamTools/ToolPDF.py:146 +msgid "Open PDF" +msgstr "PDF öffnen" + +#: flatcamTools/ToolPDF.py:149 +msgid "[WARNING_NOTCL] Open PDF cancelled." +msgstr "[WARNING_NOTCL] Open PDF abgebrochen." + +#: flatcamTools/ToolPDF.py:170 +msgid "Parsing PDF file ..." +msgstr "PDF-Datei wird analysiert ..." + +#: flatcamTools/ToolPDF.py:266 +#, python-format +#| msgid "Generating Film ..." +msgid "Rendering PDF layer #%d ..." +msgstr "PDF-Ebene rendern #%d ..." + +#: flatcamTools/ToolPDF.py:270 +msgid "[ERROR_NOTCL] Open PDF file failed." +msgstr "[ERROR_NOTCL] Fehler beim Öffnen der PDF-Datei." + #: flatcamTools/ToolPaint.py:24 msgid "Paint Area" msgstr "Paint Bereich" @@ -10634,35 +10910,35 @@ msgstr "" "ausgewählt ist, wird der Paint nach dem Klicken gestartet.
Ein neues " "Geometrieobjekt mit den Werkzeugpfaden wird erstellt." -#: flatcamTools/ToolPaint.py:732 +#: flatcamTools/ToolPaint.py:733 msgid "geometry_on_paint_button" msgstr "geometry_on_paint_button" -#: flatcamTools/ToolPaint.py:751 flatcamTools/ToolPaint.py:786 +#: flatcamTools/ToolPaint.py:752 flatcamTools/ToolPaint.py:787 msgid "[WARNING_NOTCL] Click inside the desired polygon." msgstr "[WARNING_NOTCL] Klicken Sie in das gewünschte Polygon." -#: flatcamTools/ToolPaint.py:773 +#: flatcamTools/ToolPaint.py:774 msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." msgstr "[ERROR_NOTCL] \"Paint\" für MultiGeo-Geometrien nicht möglich ..." -#: flatcamTools/ToolPaint.py:795 flatcamTools/ToolPaint.py:998 +#: flatcamTools/ToolPaint.py:796 flatcamTools/ToolPaint.py:999 msgid "Painting polygon..." msgstr "Polygon malen ..." -#: flatcamTools/ToolPaint.py:846 +#: flatcamTools/ToolPaint.py:847 msgid "[WARNING] No polygon found." msgstr "[WARNING] Kein Polygon gefunden." -#: flatcamTools/ToolPaint.py:849 +#: flatcamTools/ToolPaint.py:850 msgid "Painting polygon." msgstr "Polygon malen." -#: flatcamTools/ToolPaint.py:891 +#: flatcamTools/ToolPaint.py:892 msgid "[ERROR_NOTCL] Geometry could not be painted completely" msgstr "[ERROR_NOTCL] Geometrie konnte nicht vollständig gezeichnet werden" -#: flatcamTools/ToolPaint.py:917 +#: flatcamTools/ToolPaint.py:918 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -10673,16 +10949,16 @@ msgstr "" "Kombination von Parametern. Oder eine andere Farbstrategie\n" "%s" -#: flatcamTools/ToolPaint.py:959 +#: flatcamTools/ToolPaint.py:960 #, python-format msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" msgstr "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" -#: flatcamTools/ToolPaint.py:965 flatcamTools/ToolPaint.py:1258 +#: flatcamTools/ToolPaint.py:966 flatcamTools/ToolPaint.py:1259 msgid "Polygon Paint started ..." msgstr "Polygonfarbe gestartet ..." -#: flatcamTools/ToolPaint.py:1114 flatcamTools/ToolPaint.py:1203 +#: flatcamTools/ToolPaint.py:1115 flatcamTools/ToolPaint.py:1204 #, python-format msgid "" "[ERROR] Could not do Paint All. Try a different combination of parameters. " @@ -10693,7 +10969,7 @@ msgstr "" "Parametern. Oder eine andere Farbmethode\n" "%s" -#: flatcamTools/ToolPaint.py:1138 +#: flatcamTools/ToolPaint.py:1139 msgid "" "[ERROR] There is no Painting Geometry in the file.\n" "Usually it means that the tool diameter is too big for the painted " @@ -10705,11 +10981,11 @@ msgstr "" "Geometrie zu groß ist.\n" "Ändern Sie die Malparameter und versuchen Sie es erneut." -#: flatcamTools/ToolPaint.py:1147 +#: flatcamTools/ToolPaint.py:1148 msgid "[success] Paint All Done." msgstr "[success] 'Paint' Sie alles fertig." -#: flatcamTools/ToolPaint.py:1233 +#: flatcamTools/ToolPaint.py:1234 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 " @@ -10721,7 +10997,7 @@ msgstr "" "Geometrie zu groß ist.\n" "Ändern Sie die Malparameter und versuchen Sie es erneut." -#: flatcamTools/ToolPaint.py:1242 +#: flatcamTools/ToolPaint.py:1243 msgid "[success] Paint All with Rest-Machining done." msgstr "[success] Paint All with Rest-Machining erledigt." @@ -10831,6 +11107,164 @@ msgstr "" msgid "[success] Panel created successfully." msgstr "[success] Panel erfolgreich erstellt" +#: flatcamTools/ToolPcbWizard.py:32 +msgid "PcbWizard Import Tool" +msgstr "PCBWizard Werkzeug importieren" + +#: flatcamTools/ToolPcbWizard.py:40 +msgid "Import 2-file Excellon" +msgstr "Importieren Sie 2-Datei-Excellon" + +#: flatcamTools/ToolPcbWizard.py:57 +msgid "Excellon file:" +msgstr "Excellon-Datei:" + +#: flatcamTools/ToolPcbWizard.py:59 +msgid "" +"Load the Excellon file.\n" +"Usually it has a .DRL extension" +msgstr "" +"Laden Sie die Excellon-Datei.\n" +"Normalerweise hat es die Erweiterung .DRL" + +#: flatcamTools/ToolPcbWizard.py:66 +msgid "INF file:" +msgstr "INF-Datei:" + +#: flatcamTools/ToolPcbWizard.py:68 +msgid "Load the INF file." +msgstr "Laden Sie die INF-Datei." + +#: flatcamTools/ToolPcbWizard.py:81 +msgid "Tool Number" +msgstr "Werkzeugnummer" + +#: flatcamTools/ToolPcbWizard.py:83 +msgid "Tool diameter in file units." +msgstr "Werkzeugdurchmesser in Feileneinheiten." + +#: flatcamTools/ToolPcbWizard.py:97 +msgid "Int. digits:" +msgstr "Ganzzahlige Ziffern:" + +#: flatcamTools/ToolPcbWizard.py:99 +msgid "The number of digits for the integral part of the coordinates." +msgstr "Die Anzahl der Ziffern für den integralen Teil der Koordinaten." + +#: flatcamTools/ToolPcbWizard.py:106 +msgid "Frac. digits:" +msgstr "Nachkommastellen:" + +#: flatcamTools/ToolPcbWizard.py:108 +msgid "The number of digits for the fractional part of the coordinates." +msgstr "Die Anzahl der Stellen für den gebrochenen Teil der Koordinaten." + +#: flatcamTools/ToolPcbWizard.py:116 +msgid "Zeros supp.:" +msgstr "Unterdrückung von Nullen .:" + +#: flatcamTools/ToolPcbWizard.py:118 +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 "" +"Die Art der Unterdrückung von Nullen.\n" +"Kann vom Typ sein:\n" +"- LZ = führende Nullen werden beibehalten\n" +"- TZ = nachfolgende Nullen bleiben erhalten\n" +"- Keine Unterdrückung = keine Nullunterdrückung" + +#: flatcamTools/ToolPcbWizard.py:129 +msgid "Units" +msgstr "Einheiten" + +#: flatcamTools/ToolPcbWizard.py:131 +msgid "" +"The type of units that the coordinates and tool\n" +"diameters are using. Can be INCH or MM." +msgstr "" +"Die Art der Einheiten, die die Koordinaten und das Werkzeug haben\n" +"Durchmesser verwenden. Kann INCH oder MM sein." + +#: flatcamTools/ToolPcbWizard.py:138 +msgid "Import Excellon" +msgstr "Excellon importieren" + +#: flatcamTools/ToolPcbWizard.py:140 +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 "" +"Importieren Sie in FlatCAM eine Excellon-Datei\n" +"das speichert seine Informationen in 2 Dateien.\n" +"Normalerweise hat man eine .DRL-Erweiterung\n" +"der andere hat die Erweiterung .INF." + +#: flatcamTools/ToolPcbWizard.py:194 +msgid "PCBWizard Tool" +msgstr "PCBWizard Werkzeug" + +#: flatcamTools/ToolPcbWizard.py:288 flatcamTools/ToolPcbWizard.py:292 +msgid "Load PcbWizard Excellon file" +msgstr "PcbWizard Excellon-Datei laden" + +#: flatcamTools/ToolPcbWizard.py:312 flatcamTools/ToolPcbWizard.py:316 +msgid "Load PcbWizard INF file" +msgstr "Laden Sie die PcbWizard INF-Datei" + +#: flatcamTools/ToolPcbWizard.py:363 +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 "" +"[ERROR] Die INF-Datei enthält keine Werkzeugtabelle.\n" +"Versuchen Sie, die Excellon-Datei über Datei -> Öffnen -> Excellon zu " +"öffnen\n" +"und bearbeiten Sie die Bohrerdurchmesser manuell." + +#: flatcamTools/ToolPcbWizard.py:383 +msgid "[success] PcbWizard .INF file loaded." +msgstr "[success] PcbWizard-INF-Datei wurde geladen." + +#: flatcamTools/ToolPcbWizard.py:387 +msgid "[success] Main PcbWizard Excellon file loaded." +msgstr "[success] Haupt-PcbWizard Excellon-Datei geladen." + +#: flatcamTools/ToolPcbWizard.py:424 +#, python-format +msgid "[ERROR_NOTCL] Cannot parse file: %s" +msgstr "[ERROR_NOTCL] Datei kann nicht analysiert werden: %s" + +#: flatcamTools/ToolPcbWizard.py:447 +msgid "Importing Excellon." +msgstr "Excellon importieren." + +#: flatcamTools/ToolPcbWizard.py:454 +msgid "[ERROR_NOTCL] Import Excellon file failed." +msgstr "[ERROR_NOTCL] Import der Excellon-Datei ist fehlgeschlagen." + +#: flatcamTools/ToolPcbWizard.py:461 +#, python-format +#| msgid "[success] Created: %s" +msgid "[success] Imported: %s" +msgstr "[success] Importiert: %s" + +#: flatcamTools/ToolPcbWizard.py:464 +msgid "[WARNING_NOTCL] Excellon merging is in progress. Please wait..." +msgstr "" +"[WARNING_NOTCL] Das Zusammenführen von Excellon wird ausgeführt. Warten Sie " +"mal..." + +#: flatcamTools/ToolPcbWizard.py:466 +msgid "[ERROR_NOTCL] The imported Excellon file is None." +msgstr "[ERROR_NOTCL] Die importierte Excellon-Datei ist Keine." + #: flatcamTools/ToolProperties.py:103 msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." msgstr "" @@ -11043,48 +11477,48 @@ msgstr "" msgid "Delete Object" msgstr "Objekt löschen" -#: flatcamTools/ToolSolderPaste.py:788 +#: flatcamTools/ToolSolderPaste.py:789 msgid "" "[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." msgstr "" "[WARNING_NOTCL] Hinzufügen des Düsenwerkzeugs abgebrochen. Werkzeug bereits " "in der Werkzeugtabelle." -#: flatcamTools/ToolSolderPaste.py:793 +#: flatcamTools/ToolSolderPaste.py:794 msgid "[success] New Nozzle tool added to Tool Table." msgstr "[success] Neues Düsenwerkzeug zur Werkzeugtabelle hinzugefügt." -#: flatcamTools/ToolSolderPaste.py:835 +#: flatcamTools/ToolSolderPaste.py:836 msgid "[success] Nozzle tool from Tool Table was edited." msgstr "[success] Das Düsenwerkzeug aus der Werkzeugtabelle wurde bearbeitet." -#: flatcamTools/ToolSolderPaste.py:891 +#: flatcamTools/ToolSolderPaste.py:892 msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." msgstr "" "[WARNING_NOTCL] Löschen fehlgeschlagen. Wählen Sie ein Düsenwerkzeug zum " "Löschen aus." -#: flatcamTools/ToolSolderPaste.py:896 +#: flatcamTools/ToolSolderPaste.py:897 msgid "[success] Nozzle tool(s) deleted from Tool Table." msgstr "[success] Düsenwerkzeug (e) aus der Werkzeugtabelle gelöscht." -#: flatcamTools/ToolSolderPaste.py:951 +#: flatcamTools/ToolSolderPaste.py:952 msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." msgstr "[WARNING_NOTCL] Keine Lötpastenmaske Gerber-Objekt geladen." -#: flatcamTools/ToolSolderPaste.py:968 +#: flatcamTools/ToolSolderPaste.py:969 msgid "Creating Solder Paste dispensing geometry." msgstr "Erstellen einer Lotpastenspendergeometrie." -#: flatcamTools/ToolSolderPaste.py:980 +#: flatcamTools/ToolSolderPaste.py:981 msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." msgstr "[WARNING_NOTCL] Nein Düsenwerkzeuge in der Werkzeugtabelle." -#: flatcamTools/ToolSolderPaste.py:1109 +#: flatcamTools/ToolSolderPaste.py:1110 msgid "[success] Solder Paste geometry generated successfully..." msgstr "[success] Lotpastengeometrie erfolgreich generiert ..." -#: flatcamTools/ToolSolderPaste.py:1115 +#: flatcamTools/ToolSolderPaste.py:1116 msgid "" "[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " "diameters..." @@ -11092,15 +11526,15 @@ msgstr "" "[WARNING_NOTCL] Einige oder alle Pads haben wegen unzureichender " "Düsendurchmesser keine Lötstellen ..." -#: flatcamTools/ToolSolderPaste.py:1129 +#: flatcamTools/ToolSolderPaste.py:1130 msgid "Generating Solder Paste dispensing geometry..." msgstr "Lötpasten-Dosiergeometrie erzeugen ..." -#: flatcamTools/ToolSolderPaste.py:1149 +#: flatcamTools/ToolSolderPaste.py:1150 msgid "[WARNING_NOTCL] There is no Geometry object available." msgstr "[WARNING_NOTCL] Es ist kein Geometrieobjekt verfügbar." -#: flatcamTools/ToolSolderPaste.py:1153 +#: flatcamTools/ToolSolderPaste.py:1154 msgid "" "[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " "geometry." @@ -11108,13 +11542,13 @@ msgstr "" "[WARNING_NOTCL] Diese Geometrie kann nicht verarbeitet werden. KEINE " "Geometrie \"Lötpaste_Tool\"." -#: flatcamTools/ToolSolderPaste.py:1258 +#: flatcamTools/ToolSolderPaste.py:1259 #, python-format msgid "[success] ToolSolderPaste CNCjob created: %s" msgstr "[success] ToolSolderPaste CNCjob erstellt: %s" -#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 -#: flatcamTools/ToolSolderPaste.py:1345 +#: flatcamTools/ToolSolderPaste.py:1291 flatcamTools/ToolSolderPaste.py:1295 +#: flatcamTools/ToolSolderPaste.py:1346 msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " "solder_paste_tool CNCJob object." @@ -11122,20 +11556,20 @@ msgstr "" "[WARNING_NOTCL] Dieses CNCJob-Objekt kann nicht verarbeitet werden. KEIN " "lot_paste_tool CNCJob Objekt." -#: flatcamTools/ToolSolderPaste.py:1317 +#: flatcamTools/ToolSolderPaste.py:1318 msgid "[ERROR_NOTCL] No Gcode in the object..." msgstr "[ERROR_NOTCL] Kein Gcode im Objekt ..." -#: flatcamTools/ToolSolderPaste.py:1326 +#: flatcamTools/ToolSolderPaste.py:1327 #, python-format msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" msgstr "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" -#: flatcamTools/ToolSolderPaste.py:1355 +#: flatcamTools/ToolSolderPaste.py:1356 msgid "Export GCode ..." msgstr "GCode exportieren ..." -#: flatcamTools/ToolSolderPaste.py:1393 +#: flatcamTools/ToolSolderPaste.py:1394 #, python-format msgid "[success] Solder paste dispenser GCode file saved to: %s" msgstr "[success] GCode-Datei für Lötpastendispenser in gespeichert: %s" @@ -11256,6 +11690,31 @@ msgstr "" msgid "CNCJob objects can't be offseted." msgstr "CNCJob-Objekte können nicht versetzt werden." +#~ msgid "Done." +#~ msgstr "Gemacht." + +#~ msgid "Click on CENTER ..." +#~ msgstr "Klicken Sie auf MITTE ..." + +#~ msgid "[success] Done. Region completed." +#~ msgstr "[success] Erledigt. Region abgeschlossen." + +#~ msgid "Add an aperture to the aperture list" +#~ msgstr "Fügen Sie der Blendenliste eine Blende hinzu" + +#~ msgid "Go" +#~ msgstr "Gehen" + +#~ msgid "Del Aperture:" +#~ msgstr "Blende löschen:" + +#~ msgid "" +#~ "Delete a aperture in the aperture list.\n" +#~ "It will delete also the associated geometry." +#~ msgstr "" +#~ "Löschen Sie eine Blende in der Blendenliste.\n" +#~ "Es wird auch die zugehörige Geometrie gelöscht." + #~ msgid "" #~ "[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." #~ msgstr "" @@ -11266,12 +11725,6 @@ msgstr "CNCJob-Objekte können nicht versetzt werden." #~ msgstr "" #~ "[ERROR_NOTCL] Der Aperturepufferwert fehlt oder hat ein falsches Format." -#~ msgid "[ERROR_NOTCL] Creation of Gerber failed." -#~ msgstr "[ERROR_NOTCL] Erstellung von Gerber ist fehlgeschlagen." - -#~ msgid "[success] Created: %s" -#~ msgstr "[success] Erstellt: %s" - #, fuzzy #~ msgid "" #~ "Editor Shortcut list
\n" diff --git a/locale/en/LC_MESSAGES/strings.mo b/locale/en/LC_MESSAGES/strings.mo index b27ffd8b2d7d223b44be4a5cf197603d95736a6b..60a2dbf56729eb992194dfb2259466124e0ab2ec 100644 GIT binary patch delta 44383 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�CmNn@8?VCMJ?2be%a^50CgMM- z9sGXy(awDB|9D)4KZ9{{+6FpN;uB{Y+bLDprT=goqS9#$qwI1lWiJx)L#O)CUVPHe zlK+%;f6+~lAIo0+GI>8ye+Bv1^!#5$AU0=j+lY$-@wj+z(yDS+`=Rk@wv(IiE9tYy z|Ko>_ZX~TXd7(Igb~2H_i1DL{QD6=qxzeo-;YnUlZLd{oU2H$OnE=rD{9+3M%q9M_v5Th*_q^fZxSiQ8JkFY z3Y4bsO3uqP!XJP7{s_7(g*$NS=!CI3zfh(X@jTRPh&PnUv7dNJ>gB*JxDyj_rX&30 z5rb*DuJxDYhdXd+^bv*qNZZBvk_(mQtYB*r5i?35l=prfuLl;kv%h$@5gjmVAyGIhWJa z3eKjKZovKIB-|Z`Q}$O*9WjYdp;aB{DfbQU)0JYRB_dBp3F6f#AI8~~^nX;Bv@qIh zL7m}tpE{|i@RrP46k1B=V9J40j?*Fiy1h^v63f`eZ;%#)?A0pBF_Z?E(Rd>hbq-VS zs10Yb^%XrsdNS%v`r4nxY#+=@r?X__Tu4$b@U@|4-F=? z@iF)>@%-d%CLEh^Q^GA&nB$VcnTHLj8?1d&ic`n0_To#3rzdl=z3?}j%Z1}nrV)42 zmWD%!AF_AVh5SFMGl}|ZIotSJ```cRZ9DxvP7YIEz^i#Djj3 z4V1+)#9vT(Hk~+U8~NUF4gwizs~PU*{Eu@7@vFAn66)xf%lQxOaPapC38bPxM+)wu zKu3GA4|Jpm@!sUc@|FGH|2b$oIROWd-wZF~ZqDyVB;mfct-D;Kvb}g;uJfAH9L)ds znakmi$Gec_S!X&o+LAOdaiLOh7n;zQX26ilH7J;J&pWCp)_1n$3qHNq|7tIb4h$talKUOX43reHEM zQjT zD5b6c3)UfC)7H@gZwF^7>U_}rx3L+1B>YTcI>yHcdE<>t=)eHtVc#1iUc#2$Oyk|@a9{ky z`P8OQrp>aH&r7_E{v7c?TX{N#*K$^)kry=Tq0;xG43%<_H;cT3gtrscF_pNEV1v_} zw!%3tl0S%YI;wM_t+aK>ws(NM?UY$V`a1nRlC}iOkXR1$nL5r_3Y;O_&R*yV@oqFw zi*p#^isTI;+>;K(qfC3k7diXb@@giSa`R|231>mdEkhk=NiWD*gYtv)DXZVp&J*E2QMoqSWztc|vL$La#r3uiib{ghXzM?Z%~b=v-fWQn8X6RMRe%e zD{54*E4Mr9cpg`6Pt?Hzu3YhA1(yDwo;)q%niV-M$dx8II9BCefqgr4?i|>t4IIfr~zeN!=gp<|0Z8Ks$peU0heDy z*EYdXU0Cw=V-2osH4qX`J+c=%;U-F?EsGN3Q$DbvA0`5Lcuts`xP1aChXz5w1f~8%Da$ zdLmm#xD!OJ9qT&dii#ZPiWxiVV5F;{C(1R)RV8E8iM_5Fo~W9KTz)AdTm0o}9Cht4 z*V5=w=^ncL{GzfwalMNfmGiBuv0r4gB<@vF$3M9y`b7=;=4u!-GJZ^VNYtc1J)2xn z)nmKw_(jzYa5r^F-Am~9ixpKYt=m6F)Y#1Kub#-z9PVgQr?R`p#futL)cwI7d9b)U zS>&|h?#q!2OSr2?#f|P)G+N~CGVV-KbIQ60`9}p+ac6QzcCPBK;AzvYLuA*g?sQR` zs=EFCBG1%t4~iO4lV978{1Wbt9(6a|ohMq1y!it2{name}{name}" -#: FlatCAMApp.py:3039 +#: FlatCAMApp.py:3038 #, python-brace-format msgid "" "FlatCAM
Version {version} {beta} ({date}) - " @@ -188,31 +188,31 @@ msgstr "" "a>
DOWNLOAD area here.
" -#: FlatCAMApp.py:3192 +#: FlatCAMApp.py:3191 msgid "[success] Defaults saved." msgstr "[success] Defaults saved." -#: FlatCAMApp.py:3213 +#: FlatCAMApp.py:3212 msgid "[ERROR_NOTCL] Could not load factory defaults file." msgstr "[ERROR_NOTCL] Could not load factory defaults file." -#: FlatCAMApp.py:3222 +#: FlatCAMApp.py:3221 msgid "[ERROR_NOTCL] Failed to parse factory defaults file." msgstr "[ERROR_NOTCL] Failed to parse factory defaults file." -#: FlatCAMApp.py:3236 +#: FlatCAMApp.py:3235 msgid "[ERROR_NOTCL] Failed to write factory defaults to file." msgstr "[ERROR_NOTCL] Failed to write factory defaults to file." -#: FlatCAMApp.py:3240 +#: FlatCAMApp.py:3239 msgid "Factory defaults saved." msgstr "Factory defaults saved." -#: FlatCAMApp.py:3245 flatcamGUI/FlatCAMGUI.py:2974 +#: FlatCAMApp.py:3244 flatcamGUI/FlatCAMGUI.py:3063 msgid "[WARNING_NOTCL] Application is saving the project. Please wait ..." msgstr "[WARNING_NOTCL] Application is saving the project. Please wait ..." -#: FlatCAMApp.py:3250 +#: FlatCAMApp.py:3249 msgid "" "There are files/objects modified in FlatCAM. \n" "Do you want to Save the project?" @@ -220,11 +220,11 @@ msgstr "" "There are files/objects modified in FlatCAM. \n" "Do you want to Save the project?" -#: FlatCAMApp.py:3253 FlatCAMApp.py:5562 +#: FlatCAMApp.py:3252 FlatCAMApp.py:5557 msgid "Save changes" msgstr "Save changes" -#: FlatCAMApp.py:3320 +#: FlatCAMApp.py:3319 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 " @@ -240,68 +240,68 @@ msgstr "" "be lost and the result may not be what was expected. \n" "Check the generated GCODE." -#: FlatCAMApp.py:3361 +#: FlatCAMApp.py:3360 msgid "[ERROR_NOTCL] Failed. Excellon joining works only on Excellon objects." msgstr "[ERROR_NOTCL] Failed. Excellon joining works only on Excellon objects." -#: FlatCAMApp.py:3383 +#: FlatCAMApp.py:3382 msgid "[ERROR_NOTCL] Failed. Gerber joining works only on Gerber objects." msgstr "[ERROR_NOTCL] Failed. Gerber joining works only on Gerber objects." -#: FlatCAMApp.py:3398 FlatCAMApp.py:3423 +#: FlatCAMApp.py:3397 FlatCAMApp.py:3422 msgid "[ERROR_NOTCL] Failed. Select a Geometry Object and try again." msgstr "[ERROR_NOTCL] Failed. Select a Geometry Object and try again." -#: FlatCAMApp.py:3402 FlatCAMApp.py:3427 +#: FlatCAMApp.py:3401 FlatCAMApp.py:3426 #, python-format msgid "[ERROR_NOTCL] Expected a FlatCAMGeometry, got %s" msgstr "[ERROR_NOTCL] Expected a FlatCAMGeometry, got %s" -#: FlatCAMApp.py:3415 +#: FlatCAMApp.py:3414 msgid "[success] A Geometry object was converted to MultiGeo type." msgstr "[success] A Geometry object was converted to MultiGeo type." -#: FlatCAMApp.py:3441 +#: FlatCAMApp.py:3440 msgid "[success] A Geometry object was converted to SingleGeo type." msgstr "[success] A Geometry object was converted to SingleGeo type." -#: FlatCAMApp.py:3588 FlatCAMApp.py:4353 FlatCAMApp.py:5829 FlatCAMApp.py:5840 -#: FlatCAMApp.py:6026 FlatCAMApp.py:6036 +#: FlatCAMApp.py:3587 FlatCAMApp.py:4352 FlatCAMApp.py:5824 FlatCAMApp.py:5835 +#: FlatCAMApp.py:6021 FlatCAMApp.py:6031 msgid "Ok" -msgstr "" +msgstr "Ok" -#: FlatCAMApp.py:3629 +#: FlatCAMApp.py:3628 #, python-format msgid "[success] Converted units to %s" msgstr "[success] Converted units to %s" -#: FlatCAMApp.py:3640 +#: FlatCAMApp.py:3639 msgid "[WARNING_NOTCL] Units conversion cancelled." msgstr "[WARNING_NOTCL] Units conversion cancelled." -#: FlatCAMApp.py:4222 +#: FlatCAMApp.py:4221 msgid "Open file" msgstr "Open file" -#: FlatCAMApp.py:4253 FlatCAMApp.py:4258 +#: FlatCAMApp.py:4252 FlatCAMApp.py:4257 msgid "Export G-Code ..." msgstr "Export G-Code ..." -#: FlatCAMApp.py:4261 +#: FlatCAMApp.py:4260 msgid "[WARNING_NOTCL] Export Code cancelled." msgstr "[WARNING_NOTCL] Export Code cancelled." -#: FlatCAMApp.py:4271 +#: FlatCAMApp.py:4270 msgid "[WARNING] No such file or directory" msgstr "[WARNING] No such file or directory" -#: FlatCAMApp.py:4278 +#: FlatCAMApp.py:4277 #, python-format msgid "Saved to: %s" msgstr "Saved to: %s" -#: FlatCAMApp.py:4341 FlatCAMApp.py:4374 FlatCAMApp.py:4385 FlatCAMApp.py:4396 -#: flatcamTools/ToolNonCopperClear.py:488 flatcamTools/ToolSolderPaste.py:764 +#: FlatCAMApp.py:4340 FlatCAMApp.py:4373 FlatCAMApp.py:4384 FlatCAMApp.py:4395 +#: flatcamTools/ToolNonCopperClear.py:489 flatcamTools/ToolSolderPaste.py:765 msgid "" "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " "format." @@ -309,12 +309,12 @@ msgstr "" "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " "format." -#: FlatCAMApp.py:4346 FlatCAMApp.py:4379 FlatCAMApp.py:4390 FlatCAMApp.py:4401 -#: flatcamGUI/FlatCAMGUI.py:2891 +#: FlatCAMApp.py:4345 FlatCAMApp.py:4378 FlatCAMApp.py:4389 FlatCAMApp.py:4400 +#: flatcamGUI/FlatCAMGUI.py:2959 msgid "[WARNING_NOTCL] Adding Tool cancelled ..." msgstr "[WARNING_NOTCL] Adding Tool cancelled ..." -#: FlatCAMApp.py:4349 +#: FlatCAMApp.py:4348 msgid "" "Adding Tool works only when Advanced is checked.\n" "Go to Preferences -> General - Show Advanced Options." @@ -322,108 +322,115 @@ msgstr "" "Adding Tool works only when Advanced is checked.\n" "Go to Preferences -> General - Show Advanced Options." -#: FlatCAMApp.py:4455 +#: FlatCAMApp.py:4454 msgid "Object(s) deleted ..." msgstr "Object(s) deleted ..." -#: FlatCAMApp.py:4459 +#: FlatCAMApp.py:4458 msgid "Failed. No object(s) selected..." msgstr "Failed. No object(s) selected..." -#: FlatCAMApp.py:4461 +#: FlatCAMApp.py:4460 msgid "Save the work in Editor and try again ..." msgstr "Save the work in Editor and try again ..." -#: FlatCAMApp.py:4474 +#: FlatCAMApp.py:4473 msgid "Click to set the origin ..." msgstr "Click to set the origin ..." -#: FlatCAMApp.py:4487 +#: FlatCAMApp.py:4485 msgid "Jump to ..." msgstr "Jump to ..." -#: FlatCAMApp.py:4488 +#: FlatCAMApp.py:4486 msgid "Enter the coordinates in format X,Y:" msgstr "Enter the coordinates in format X,Y:" -#: FlatCAMApp.py:4495 +#: FlatCAMApp.py:4493 msgid "Wrong coordinates. Enter coordinates in format: X,Y" msgstr "Wrong coordinates. Enter coordinates in format: X,Y" -#: FlatCAMApp.py:4513 -msgid "Done." -msgstr "Done." +#: FlatCAMApp.py:4511 flatcamEditors/FlatCAMGeoEditor.py:3413 +#: flatcamEditors/FlatCAMGrbEditor.py:790 +#: flatcamEditors/FlatCAMGrbEditor.py:885 +#: flatcamEditors/FlatCAMGrbEditor.py:1122 +#: flatcamEditors/FlatCAMGrbEditor.py:1343 +#: flatcamEditors/FlatCAMGrbEditor.py:3235 +#: flatcamEditors/FlatCAMGrbEditor.py:3248 flatcamGUI/FlatCAMGUI.py:2373 +#: flatcamGUI/FlatCAMGUI.py:2385 +msgid "[success] Done." +msgstr "[success] Done." -#: FlatCAMApp.py:4672 +#: FlatCAMApp.py:4670 msgid "[success] Origin set ..." msgstr "[success] Origin set ..." -#: FlatCAMApp.py:4690 +#: FlatCAMApp.py:4688 msgid "Preferences" msgstr "Preferences" -#: FlatCAMApp.py:4710 +#: FlatCAMApp.py:4708 msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." msgstr "[WARNING_NOTCL] No object selected to Flip on Y axis." -#: FlatCAMApp.py:4735 +#: FlatCAMApp.py:4733 msgid "[success] Flip on Y axis done." msgstr "[success] Flip on Y axis done." -#: FlatCAMApp.py:4737 FlatCAMApp.py:4777 -#: flatcamEditors/FlatCAMGeoEditor.py:1353 -#: flatcamEditors/FlatCAMGrbEditor.py:3522 flatcamTools/ToolTransform.py:750 +#: FlatCAMApp.py:4735 FlatCAMApp.py:4775 +#: flatcamEditors/FlatCAMGeoEditor.py:1354 +#: flatcamEditors/FlatCAMGrbEditor.py:4533 flatcamTools/ToolTransform.py:750 #, python-format msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." msgstr "[ERROR_NOTCL] Due of %s, Flip action was not executed." -#: FlatCAMApp.py:4750 +#: FlatCAMApp.py:4748 msgid "[WARNING_NOTCL] No object selected to Flip on X axis." msgstr "[WARNING_NOTCL] No object selected to Flip on X axis." -#: FlatCAMApp.py:4775 +#: FlatCAMApp.py:4773 msgid "[success] Flip on X axis done." msgstr "[success] Flip on X axis done." -#: FlatCAMApp.py:4790 +#: FlatCAMApp.py:4788 msgid "[WARNING_NOTCL] No object selected to Rotate." msgstr "[WARNING_NOTCL] No object selected to Rotate." -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Transform" msgstr "Transform" -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Enter the Angle value:" msgstr "Enter the Angle value:" -#: FlatCAMApp.py:4823 +#: FlatCAMApp.py:4821 msgid "[success] Rotation done." msgstr "[success] Rotation done." -#: FlatCAMApp.py:4825 flatcamEditors/FlatCAMGeoEditor.py:1296 -#: flatcamEditors/FlatCAMGrbEditor.py:3465 flatcamTools/ToolTransform.py:678 +#: FlatCAMApp.py:4823 flatcamEditors/FlatCAMGeoEditor.py:1297 +#: flatcamEditors/FlatCAMGrbEditor.py:4476 flatcamTools/ToolTransform.py:678 #, python-format msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." msgstr "[ERROR_NOTCL] Due of %s, rotation movement was not executed." -#: FlatCAMApp.py:4836 +#: FlatCAMApp.py:4834 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." msgstr "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." -#: FlatCAMApp.py:4857 +#: FlatCAMApp.py:4855 msgid "[success] Skew on X axis done." msgstr "[success] Skew on X axis done." -#: FlatCAMApp.py:4867 +#: FlatCAMApp.py:4865 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." msgstr "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." -#: FlatCAMApp.py:4888 +#: FlatCAMApp.py:4886 msgid "[success] Skew on Y axis done." msgstr "[success] Skew on Y axis done." -#: FlatCAMApp.py:4984 FlatCAMApp.py:5011 +#: FlatCAMApp.py:4982 FlatCAMApp.py:5009 msgid "" "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " "format." @@ -431,48 +438,48 @@ msgstr "" "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " "format." -#: FlatCAMApp.py:4990 +#: FlatCAMApp.py:4988 msgid "[success] New Grid added ..." msgstr "[success] New Grid added ..." -#: FlatCAMApp.py:4993 +#: FlatCAMApp.py:4991 msgid "[WARNING_NOTCL] Grid already exists ..." msgstr "[WARNING_NOTCL] Grid already exists ..." -#: FlatCAMApp.py:4996 +#: FlatCAMApp.py:4994 msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." msgstr "[WARNING_NOTCL] Adding New Grid cancelled ..." -#: FlatCAMApp.py:5018 +#: FlatCAMApp.py:5016 msgid "[ERROR_NOTCL] Grid Value does not exist ..." msgstr "[ERROR_NOTCL] Grid Value does not exist ..." -#: FlatCAMApp.py:5021 +#: FlatCAMApp.py:5019 msgid "[success] Grid Value deleted ..." msgstr "[success] Grid Value deleted ..." -#: FlatCAMApp.py:5024 +#: FlatCAMApp.py:5022 msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." msgstr "[WARNING_NOTCL] Delete Grid value cancelled ..." -#: FlatCAMApp.py:5063 +#: FlatCAMApp.py:5061 msgid "[WARNING_NOTCL] No object selected to copy it's name" msgstr "[WARNING_NOTCL] No object selected to copy it's name" -#: FlatCAMApp.py:5067 +#: FlatCAMApp.py:5065 msgid "Name copied on clipboard ..." msgstr "Name copied on clipboard ..." -#: FlatCAMApp.py:5362 FlatCAMApp.py:5365 FlatCAMApp.py:5368 FlatCAMApp.py:5371 -#: FlatCAMApp.py:5385 FlatCAMApp.py:5388 FlatCAMApp.py:5391 FlatCAMApp.py:5394 -#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 FlatCAMApp.py:5439 FlatCAMApp.py:5442 +#: FlatCAMApp.py:5357 FlatCAMApp.py:5360 FlatCAMApp.py:5363 FlatCAMApp.py:5366 +#: FlatCAMApp.py:5380 FlatCAMApp.py:5383 FlatCAMApp.py:5386 FlatCAMApp.py:5389 +#: FlatCAMApp.py:5428 FlatCAMApp.py:5431 FlatCAMApp.py:5434 FlatCAMApp.py:5437 #: ObjectCollection.py:711 ObjectCollection.py:714 ObjectCollection.py:717 #: ObjectCollection.py:720 #, python-brace-format msgid "[selected]{name} selected" msgstr "[selected]{name} selected" -#: FlatCAMApp.py:5559 +#: FlatCAMApp.py:5554 msgid "" "There are files/objects opened in FlatCAM.\n" "Creating a New project will delete them.\n" @@ -482,106 +489,106 @@ msgstr "" "Creating a New project will delete them.\n" "Do you want to Save the project?" -#: FlatCAMApp.py:5580 +#: FlatCAMApp.py:5575 msgid "[success] New Project created..." msgstr "[success] New Project created..." -#: FlatCAMApp.py:5688 FlatCAMApp.py:5691 flatcamGUI/FlatCAMGUI.py:594 -#: flatcamGUI/FlatCAMGUI.py:1762 +#: FlatCAMApp.py:5683 FlatCAMApp.py:5686 flatcamGUI/FlatCAMGUI.py:600 +#: flatcamGUI/FlatCAMGUI.py:1806 msgid "Open Gerber" msgstr "Open Gerber" -#: FlatCAMApp.py:5696 +#: FlatCAMApp.py:5691 msgid "[WARNING_NOTCL] Open Gerber cancelled." msgstr "[WARNING_NOTCL] Open Gerber cancelled." -#: FlatCAMApp.py:5717 FlatCAMApp.py:5720 flatcamGUI/FlatCAMGUI.py:595 -#: flatcamGUI/FlatCAMGUI.py:1763 +#: FlatCAMApp.py:5712 FlatCAMApp.py:5715 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1807 msgid "Open Excellon" msgstr "Open Excellon" -#: FlatCAMApp.py:5725 +#: FlatCAMApp.py:5720 msgid "[WARNING_NOTCL] Open Excellon cancelled." msgstr "[WARNING_NOTCL] Open Excellon cancelled." -#: FlatCAMApp.py:5747 FlatCAMApp.py:5750 +#: FlatCAMApp.py:5742 FlatCAMApp.py:5745 msgid "Open G-Code" msgstr "Open G-Code" -#: FlatCAMApp.py:5755 +#: FlatCAMApp.py:5750 msgid "[WARNING_NOTCL] Open G-Code cancelled." msgstr "[WARNING_NOTCL] Open G-Code cancelled." -#: FlatCAMApp.py:5773 FlatCAMApp.py:5776 +#: FlatCAMApp.py:5768 FlatCAMApp.py:5771 msgid "Open Project" msgstr "Open Project" -#: FlatCAMApp.py:5784 +#: FlatCAMApp.py:5779 msgid "[WARNING_NOTCL] Open Project cancelled." msgstr "[WARNING_NOTCL] Open Project cancelled." -#: FlatCAMApp.py:5803 FlatCAMApp.py:5806 +#: FlatCAMApp.py:5798 FlatCAMApp.py:5801 msgid "Open Configuration File" msgstr "Open Configuration File" -#: FlatCAMApp.py:5810 +#: FlatCAMApp.py:5805 msgid "[WARNING_NOTCL Open Config cancelled." msgstr "[WARNING_NOTCL Open Config cancelled." -#: FlatCAMApp.py:5825 FlatCAMApp.py:6022 FlatCAMApp.py:8105 FlatCAMApp.py:8125 -#: FlatCAMApp.py:8146 FlatCAMApp.py:8168 +#: FlatCAMApp.py:5820 FlatCAMApp.py:6017 FlatCAMApp.py:8103 FlatCAMApp.py:8123 +#: FlatCAMApp.py:8144 FlatCAMApp.py:8166 msgid "[WARNING_NOTCL] No object selected." msgstr "[WARNING_NOTCL] No object selected." -#: FlatCAMApp.py:5826 FlatCAMApp.py:6023 +#: FlatCAMApp.py:5821 FlatCAMApp.py:6018 msgid "Please Select a Geometry object to export" msgstr "Please Select a Geometry object to export" -#: FlatCAMApp.py:5837 +#: FlatCAMApp.py:5832 msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." msgstr "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." -#: FlatCAMApp.py:5850 FlatCAMApp.py:5854 +#: FlatCAMApp.py:5845 FlatCAMApp.py:5849 msgid "Export SVG" msgstr "Export SVG" -#: FlatCAMApp.py:5859 +#: FlatCAMApp.py:5854 msgid "[WARNING_NOTCL] Export SVG cancelled." msgstr "[WARNING_NOTCL] Export SVG cancelled." -#: FlatCAMApp.py:5873 +#: FlatCAMApp.py:5868 msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" msgstr "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" -#: FlatCAMApp.py:5879 FlatCAMApp.py:5883 +#: FlatCAMApp.py:5874 FlatCAMApp.py:5878 msgid "Export PNG Image" msgstr "Export PNG Image" -#: FlatCAMApp.py:5888 +#: FlatCAMApp.py:5883 msgid "Export PNG cancelled." msgstr "Export PNG cancelled." +#: FlatCAMApp.py:5900 +msgid "" +"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." +msgstr "" +"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." + #: FlatCAMApp.py:5905 msgid "" -"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." -msgstr "" -"[WARNING_NOTCL] No object selected. Please select an Gerber object to export." - -#: FlatCAMApp.py:5910 -msgid "" "[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." msgstr "" "[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." -#: FlatCAMApp.py:5922 +#: FlatCAMApp.py:5917 msgid "Save Gerber source file" msgstr "Save Gerber source file" -#: FlatCAMApp.py:5927 +#: FlatCAMApp.py:5922 msgid "[WARNING_NOTCL] Save Gerber source file cancelled." msgstr "[WARNING_NOTCL] Save Gerber source file cancelled." -#: FlatCAMApp.py:5944 +#: FlatCAMApp.py:5939 msgid "" "[WARNING_NOTCL] No object selected. Please select an Excellon object to " "export." @@ -589,21 +596,21 @@ msgstr "" "[WARNING_NOTCL] No object selected. Please select an Excellon object to " "export." -#: FlatCAMApp.py:5949 FlatCAMApp.py:5988 +#: FlatCAMApp.py:5944 FlatCAMApp.py:5983 msgid "" "[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." msgstr "" "[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." -#: FlatCAMApp.py:5957 FlatCAMApp.py:5961 +#: FlatCAMApp.py:5952 FlatCAMApp.py:5956 msgid "Save Excellon source file" msgstr "Save Excellon source file" -#: FlatCAMApp.py:5966 +#: FlatCAMApp.py:5961 msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." msgstr "[WARNING_NOTCL] Saving Excellon source file cancelled." -#: FlatCAMApp.py:5983 +#: FlatCAMApp.py:5978 msgid "" "[WARNING_NOTCL] No object selected. Please Select an Excellon object to " "export." @@ -611,54 +618,54 @@ msgstr "" "[WARNING_NOTCL] No object selected. Please Select an Excellon object to " "export." -#: FlatCAMApp.py:5996 FlatCAMApp.py:6000 +#: FlatCAMApp.py:5991 FlatCAMApp.py:5995 msgid "Export Excellon" msgstr "Export Excellon" -#: FlatCAMApp.py:6005 +#: FlatCAMApp.py:6000 msgid "[WARNING_NOTCL] Export Excellon cancelled." msgstr "[WARNING_NOTCL] Export Excellon cancelled." -#: FlatCAMApp.py:6033 +#: FlatCAMApp.py:6028 msgid "[ERROR_NOTCL] Only Geometry objects can be used." msgstr "[ERROR_NOTCL] Only Geometry objects can be used." -#: FlatCAMApp.py:6047 FlatCAMApp.py:6051 +#: FlatCAMApp.py:6042 FlatCAMApp.py:6046 msgid "Export DXF" msgstr "Export DXF" -#: FlatCAMApp.py:6056 +#: FlatCAMApp.py:6051 msgid "[WARNING_NOTCL] Export DXF cancelled." msgstr "[WARNING_NOTCL] Export DXF cancelled." -#: FlatCAMApp.py:6074 FlatCAMApp.py:6077 +#: FlatCAMApp.py:6069 FlatCAMApp.py:6072 msgid "Import SVG" msgstr "Import SVG" -#: FlatCAMApp.py:6085 +#: FlatCAMApp.py:6080 msgid "[WARNING_NOTCL] Open SVG cancelled." msgstr "[WARNING_NOTCL] Open SVG cancelled." -#: FlatCAMApp.py:6104 FlatCAMApp.py:6107 +#: FlatCAMApp.py:6099 FlatCAMApp.py:6102 msgid "Import DXF" msgstr "Import DXF" -#: FlatCAMApp.py:6115 +#: FlatCAMApp.py:6110 msgid "[WARNING_NOTCL] Open DXF cancelled." msgstr "[WARNING_NOTCL] Open DXF cancelled." -#: FlatCAMApp.py:6133 +#: FlatCAMApp.py:6128 #, python-format msgid "%s" msgstr "%s" -#: FlatCAMApp.py:6153 +#: FlatCAMApp.py:6148 msgid "" "[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." msgstr "" "[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." -#: FlatCAMApp.py:6160 +#: FlatCAMApp.py:6155 msgid "" "[WARNING_NOTCL] There is no selected object for which to see it's source " "file code." @@ -666,24 +673,24 @@ msgstr "" "[WARNING_NOTCL] There is no selected object for which to see it's source " "file code." -#: FlatCAMApp.py:6168 +#: FlatCAMApp.py:6163 msgid "Source Editor" msgstr "Source Editor" -#: FlatCAMApp.py:6178 +#: FlatCAMApp.py:6173 #, python-format msgid "[ERROR]App.on_view_source() -->%s" msgstr "[ERROR]App.on_view_source() -->%s" -#: FlatCAMApp.py:6190 FlatCAMApp.py:7211 FlatCAMObj.py:5257 +#: FlatCAMApp.py:6185 FlatCAMApp.py:7206 FlatCAMObj.py:5259 msgid "Code Editor" msgstr "Code Editor" -#: FlatCAMApp.py:6202 +#: FlatCAMApp.py:6197 msgid "Script Editor" msgstr "Script Editor" -#: FlatCAMApp.py:6205 +#: FlatCAMApp.py:6200 msgid "" "#\n" "# CREATE A NEW FLATCAM TCL SCRIPT\n" @@ -727,85 +734,85 @@ msgstr "" "#\n" "\n" -#: FlatCAMApp.py:6228 FlatCAMApp.py:6231 +#: FlatCAMApp.py:6223 FlatCAMApp.py:6226 msgid "Open TCL script" msgstr "Open TCL script" -#: FlatCAMApp.py:6239 +#: FlatCAMApp.py:6234 msgid "[WARNING_NOTCL] Open TCL script cancelled." msgstr "[WARNING_NOTCL] Open TCL script cancelled." -#: FlatCAMApp.py:6251 +#: FlatCAMApp.py:6246 #, python-format msgid "[ERROR]App.on_fileopenscript() -->%s" msgstr "[ERROR]App.on_fileopenscript() -->%s" -#: FlatCAMApp.py:6277 FlatCAMApp.py:6280 +#: FlatCAMApp.py:6272 FlatCAMApp.py:6275 msgid "Run TCL script" msgstr "Run TCL script" -#: FlatCAMApp.py:6288 +#: FlatCAMApp.py:6283 msgid "[WARNING_NOTCL] Run TCL script cancelled." msgstr "[WARNING_NOTCL] Run TCL script cancelled." -#: FlatCAMApp.py:6334 FlatCAMApp.py:6338 +#: FlatCAMApp.py:6329 FlatCAMApp.py:6333 msgid "Save Project As ..." msgstr "Save Project As ..." -#: FlatCAMApp.py:6335 +#: FlatCAMApp.py:6330 #, python-brace-format msgid "{l_save}/Project_{date}" msgstr "{l_save}/Project_{date}" -#: FlatCAMApp.py:6343 +#: FlatCAMApp.py:6338 msgid "[WARNING_NOTCL] Save Project cancelled." msgstr "[WARNING_NOTCL] Save Project cancelled." -#: FlatCAMApp.py:6388 +#: FlatCAMApp.py:6383 msgid "Exporting SVG" msgstr "Exporting SVG" -#: FlatCAMApp.py:6421 FlatCAMApp.py:6526 FlatCAMApp.py:6640 +#: FlatCAMApp.py:6416 FlatCAMApp.py:6521 FlatCAMApp.py:6635 #, python-format msgid "[success] SVG file exported to %s" msgstr "[success] SVG file exported to %s" -#: FlatCAMApp.py:6452 FlatCAMApp.py:6572 +#: FlatCAMApp.py:6447 FlatCAMApp.py:6567 #, python-format msgid "[WARNING_NOTCL] No object Box. Using instead %s" msgstr "[WARNING_NOTCL] No object Box. Using instead %s" -#: FlatCAMApp.py:6529 FlatCAMApp.py:6643 +#: FlatCAMApp.py:6524 FlatCAMApp.py:6638 msgid "Generating Film ... Please wait." msgstr "Generating Film ... Please wait." -#: FlatCAMApp.py:6790 +#: FlatCAMApp.py:6785 #, python-format msgid "[success] Excellon file exported to %s" msgstr "[success] Excellon file exported to %s" -#: FlatCAMApp.py:6797 +#: FlatCAMApp.py:6792 msgid "Exporting Excellon" msgstr "Exporting Excellon" -#: FlatCAMApp.py:6802 FlatCAMApp.py:6809 +#: FlatCAMApp.py:6797 FlatCAMApp.py:6804 msgid "[ERROR_NOTCL] Could not export Excellon file." msgstr "[ERROR_NOTCL] Could not export Excellon file." -#: FlatCAMApp.py:6848 +#: FlatCAMApp.py:6843 #, python-format msgid "[success] DXF file exported to %s" msgstr "[success] DXF file exported to %s" -#: FlatCAMApp.py:6854 +#: FlatCAMApp.py:6849 msgid "Exporting DXF" msgstr "Exporting DXF" -#: FlatCAMApp.py:6859 FlatCAMApp.py:6866 +#: FlatCAMApp.py:6854 FlatCAMApp.py:6861 msgid "[[WARNING_NOTCL]] Could not export DXF file." msgstr "[[WARNING_NOTCL]] Could not export DXF file." -#: FlatCAMApp.py:6886 FlatCAMApp.py:6928 FlatCAMApp.py:6969 +#: FlatCAMApp.py:6881 FlatCAMApp.py:6923 FlatCAMApp.py:6964 msgid "" "[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " "Gerber are supported" @@ -813,95 +820,96 @@ msgstr "" "[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " "Gerber are supported" -#: FlatCAMApp.py:6896 +#: FlatCAMApp.py:6891 msgid "Importing SVG" msgstr "Importing SVG" -#: FlatCAMApp.py:6907 FlatCAMApp.py:6949 FlatCAMApp.py:6989 FlatCAMApp.py:7065 -#: FlatCAMApp.py:7132 FlatCAMApp.py:7197 +#: FlatCAMApp.py:6902 FlatCAMApp.py:6944 FlatCAMApp.py:6984 FlatCAMApp.py:7060 +#: FlatCAMApp.py:7127 FlatCAMApp.py:7192 flatcamTools/ToolPDF.py:275 #, python-format msgid "[success] Opened: %s" msgstr "[success] Opened: %s" -#: FlatCAMApp.py:6938 +#: FlatCAMApp.py:6933 msgid "Importing DXF" msgstr "Importing DXF" -#: FlatCAMApp.py:6977 +#: FlatCAMApp.py:6972 msgid "Importing Image" msgstr "Importing Image" -#: FlatCAMApp.py:7018 FlatCAMApp.py:7020 +#: FlatCAMApp.py:7013 FlatCAMApp.py:7015 #, python-format msgid "[ERROR_NOTCL] Failed to open file: %s" msgstr "[ERROR_NOTCL] Failed to open file: %s" -#: FlatCAMApp.py:7023 +#: FlatCAMApp.py:7018 #, python-brace-format msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" msgstr "[ERROR_NOTCL] Failed to parse file: {name}. {error}" -#: FlatCAMApp.py:7029 FlatCAMObj.py:3961 -#: flatcamEditors/FlatCAMExcEditor.py:1927 -#: flatcamEditors/FlatCAMGrbEditor.py:2061 +#: FlatCAMApp.py:7024 FlatCAMObj.py:3963 +#: flatcamEditors/FlatCAMExcEditor.py:1977 +#: flatcamEditors/FlatCAMGrbEditor.py:3018 msgid "[ERROR] An internal error has ocurred. See shell.\n" msgstr "[ERROR] An internal error has ocurred. See shell.\n" -#: FlatCAMApp.py:7038 +#: FlatCAMApp.py:7033 msgid "" "[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." msgstr "" "[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." -#: FlatCAMApp.py:7046 +#: FlatCAMApp.py:7041 msgid "Opening Gerber" msgstr "Opening Gerber" -#: FlatCAMApp.py:7056 +#: FlatCAMApp.py:7051 msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." msgstr "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." -#: FlatCAMApp.py:7091 +#: FlatCAMApp.py:7086 flatcamTools/ToolPcbWizard.py:421 msgid "[ERROR_NOTCL] This is not Excellon file." msgstr "[ERROR_NOTCL] This is not Excellon file." -#: FlatCAMApp.py:7094 +#: FlatCAMApp.py:7089 #, python-format msgid "[ERROR_NOTCL] Cannot open file: %s" msgstr "[ERROR_NOTCL] Cannot open file: %s" -#: FlatCAMApp.py:7099 +#: FlatCAMApp.py:7094 flatcamTools/ToolPcbWizard.py:429 msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" msgstr "[ERROR_NOTCL] An internal error has occurred. See shell.\n" -#: FlatCAMApp.py:7115 +#: FlatCAMApp.py:7110 flatcamTools/ToolPDF.py:238 +#: flatcamTools/ToolPcbWizard.py:442 #, python-format msgid "[ERROR_NOTCL] No geometry found in file: %s" msgstr "[ERROR_NOTCL] No geometry found in file: %s" -#: FlatCAMApp.py:7118 +#: FlatCAMApp.py:7113 msgid "Opening Excellon." msgstr "Opening Excellon." -#: FlatCAMApp.py:7125 +#: FlatCAMApp.py:7120 msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." msgstr "" "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." -#: FlatCAMApp.py:7164 +#: FlatCAMApp.py:7159 #, python-format msgid "[ERROR_NOTCL] Failed to open %s" msgstr "[ERROR_NOTCL] Failed to open %s" -#: FlatCAMApp.py:7174 +#: FlatCAMApp.py:7169 msgid "[ERROR_NOTCL] This is not GCODE" msgstr "[ERROR_NOTCL] This is not GCODE" -#: FlatCAMApp.py:7180 +#: FlatCAMApp.py:7175 msgid "Opening G-Code." msgstr "Opening G-Code." -#: FlatCAMApp.py:7188 +#: FlatCAMApp.py:7183 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 " @@ -911,26 +919,26 @@ msgstr "" " Attempting to create a FlatCAM CNCJob Object from G-Code file failed during " "processing" -#: FlatCAMApp.py:7228 +#: FlatCAMApp.py:7223 #, python-format msgid "[ERROR_NOTCL] Failed to open config file: %s" msgstr "[ERROR_NOTCL] Failed to open config file: %s" -#: FlatCAMApp.py:7253 FlatCAMApp.py:7269 +#: FlatCAMApp.py:7248 FlatCAMApp.py:7264 #, python-format msgid "[ERROR_NOTCL] Failed to open project file: %s" msgstr "[ERROR_NOTCL] Failed to open project file: %s" -#: FlatCAMApp.py:7295 +#: FlatCAMApp.py:7290 #, python-format msgid "[success] Project loaded from: %s" msgstr "[success] Project loaded from: %s" -#: FlatCAMApp.py:7425 +#: FlatCAMApp.py:7420 msgid "Available commands:\n" msgstr "Available commands:\n" -#: FlatCAMApp.py:7427 +#: FlatCAMApp.py:7422 msgid "" "\n" "\n" @@ -942,23 +950,23 @@ msgstr "" "Type help for usage.\n" " Example: help open_gerber" -#: FlatCAMApp.py:7575 +#: FlatCAMApp.py:7570 msgid "Shows list of commands." msgstr "Shows list of commands." -#: FlatCAMApp.py:7628 +#: FlatCAMApp.py:7626 msgid "[ERROR_NOTCL] Failed to load recent item list." msgstr "[ERROR_NOTCL] Failed to load recent item list." -#: FlatCAMApp.py:7635 +#: FlatCAMApp.py:7633 msgid "[ERROR_NOTCL] Failed to parse recent item list." msgstr "[ERROR_NOTCL] Failed to parse recent item list." -#: FlatCAMApp.py:7696 flatcamGUI/FlatCAMGUI.py:929 +#: FlatCAMApp.py:7694 flatcamGUI/FlatCAMGUI.py:941 msgid "Shortcut Key List" msgstr "Shortcut Key List" -#: FlatCAMApp.py:7703 +#: FlatCAMApp.py:7701 msgid "" "\n" "

Selected Tab - Choose an Item from " @@ -1054,23 +1062,23 @@ msgstr "" "\n" " " -#: FlatCAMApp.py:7807 +#: FlatCAMApp.py:7805 msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." msgstr "[WARNING_NOTCL] Failed checking for latest version. Could not connect." -#: FlatCAMApp.py:7814 +#: FlatCAMApp.py:7812 msgid "[ERROR_NOTCL] Could not parse information about latest version." msgstr "[ERROR_NOTCL] Could not parse information about latest version." -#: FlatCAMApp.py:7824 +#: FlatCAMApp.py:7822 msgid "[success] FlatCAM is up to date!" msgstr "[success] FlatCAM is up to date!" -#: FlatCAMApp.py:7829 +#: FlatCAMApp.py:7827 msgid "Newer Version Available" msgstr "Newer Version Available" -#: FlatCAMApp.py:7830 +#: FlatCAMApp.py:7828 msgid "" "There is a newer version of FlatCAM available for download:\n" "\n" @@ -1078,43 +1086,43 @@ msgstr "" "There is a newer version of FlatCAM available for download:\n" "\n" -#: FlatCAMApp.py:7832 +#: FlatCAMApp.py:7830 msgid "info" msgstr "info" -#: FlatCAMApp.py:7851 +#: FlatCAMApp.py:7849 msgid "[success] All plots disabled." msgstr "[success] All plots disabled." -#: FlatCAMApp.py:7857 +#: FlatCAMApp.py:7855 msgid "[success] All non selected plots disabled." msgstr "[success] All non selected plots disabled." -#: FlatCAMApp.py:7863 +#: FlatCAMApp.py:7861 msgid "[success] All plots enabled." msgstr "[success] All plots enabled." -#: FlatCAMApp.py:7974 +#: FlatCAMApp.py:7972 msgid "Saving FlatCAM Project" msgstr "Saving FlatCAM Project" -#: FlatCAMApp.py:7995 FlatCAMApp.py:8026 +#: FlatCAMApp.py:7993 FlatCAMApp.py:8024 #, python-format msgid "[success] Project saved to: %s" msgstr "[success] Project saved to: %s" -#: FlatCAMApp.py:8013 +#: FlatCAMApp.py:8011 #, python-format msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." msgstr "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." -#: FlatCAMApp.py:8020 +#: FlatCAMApp.py:8018 #, python-format msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." msgstr "" "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." -#: FlatCAMApp.py:8028 +#: FlatCAMApp.py:8026 #, python-format msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." msgstr "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." @@ -1124,11 +1132,11 @@ msgstr "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." msgid "[success] Name changed from {old} to {new}" msgstr "[success] Name changed from {old} to {new}" -#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5156 +#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5158 msgid "Basic" msgstr "Basic" -#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5162 +#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5164 msgid "Advanced" msgstr "Advanced" @@ -1141,32 +1149,32 @@ msgstr "[success] Isolation geometry created: %s" msgid "Plotting Apertures" msgstr "Plotting Apertures" -#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1293 +#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1327 msgid "Total Drills" msgstr "Total Drills" -#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1325 +#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1359 msgid "Total Slots" msgstr "Total Slots" -#: FlatCAMObj.py:1813 FlatCAMObj.py:3078 FlatCAMObj.py:3384 FlatCAMObj.py:3571 -#: FlatCAMObj.py:3584 FlatCAMObj.py:3701 FlatCAMObj.py:4109 FlatCAMObj.py:4342 -#: FlatCAMObj.py:4748 flatcamEditors/FlatCAMExcEditor.py:1400 +#: FlatCAMObj.py:1813 FlatCAMObj.py:3079 FlatCAMObj.py:3386 FlatCAMObj.py:3573 +#: FlatCAMObj.py:3586 FlatCAMObj.py:3703 FlatCAMObj.py:4111 FlatCAMObj.py:4344 +#: FlatCAMObj.py:4750 flatcamEditors/FlatCAMExcEditor.py:1434 #: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 #: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 #: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 #: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 #: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 -#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:479 -#: flatcamTools/ToolNonCopperClear.py:550 -#: flatcamTools/ToolNonCopperClear.py:626 -#: flatcamTools/ToolNonCopperClear.py:643 flatcamTools/ToolPaint.py:537 -#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:742 -#: flatcamTools/ToolPaint.py:839 flatcamTools/ToolPaint.py:994 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:480 +#: flatcamTools/ToolNonCopperClear.py:551 +#: flatcamTools/ToolNonCopperClear.py:627 +#: flatcamTools/ToolNonCopperClear.py:644 flatcamTools/ToolPaint.py:538 +#: flatcamTools/ToolPaint.py:608 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:840 flatcamTools/ToolPaint.py:995 #: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 #: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 #: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 -#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +#: flatcamTools/ToolSolderPaste.py:756 flatcamTools/ToolSolderPaste.py:827 msgid "[ERROR_NOTCL] Wrong value format entered, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered, use a number." @@ -1187,10 +1195,10 @@ msgid "Tool_nr" msgstr "Tool_nr" #: FlatCAMObj.py:2058 FlatCAMObj.py:2152 FlatCAMObj.py:2263 -#: flatcamEditors/FlatCAMExcEditor.py:753 -#: flatcamEditors/FlatCAMExcEditor.py:1870 flatcamGUI/ObjectUI.py:556 +#: flatcamEditors/FlatCAMExcEditor.py:781 +#: flatcamEditors/FlatCAMExcEditor.py:1920 flatcamGUI/ObjectUI.py:556 #: flatcamTools/ToolNonCopperClear.py:83 flatcamTools/ToolPaint.py:80 -#: flatcamTools/ToolSolderPaste.py:81 +#: flatcamTools/ToolPcbWizard.py:78 flatcamTools/ToolSolderPaste.py:81 msgid "Diameter" msgstr "Diameter" @@ -1208,7 +1216,7 @@ msgid "" msgstr "" "[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." -#: FlatCAMObj.py:2303 FlatCAMObj.py:3997 FlatCAMObj.py:4208 FlatCAMObj.py:4523 +#: FlatCAMObj.py:2303 FlatCAMObj.py:3999 FlatCAMObj.py:4210 FlatCAMObj.py:4525 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"z_pdepth\"] or self." "options[\"z_pdepth\"]" @@ -1216,7 +1224,7 @@ msgstr "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"z_pdepth\"] or self." "options[\"z_pdepth\"]" -#: FlatCAMObj.py:2315 FlatCAMObj.py:4009 FlatCAMObj.py:4220 FlatCAMObj.py:4535 +#: FlatCAMObj.py:2315 FlatCAMObj.py:4011 FlatCAMObj.py:4222 FlatCAMObj.py:4537 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"feedrate_probe\"] or " "self.options[\"feedrate_probe\"]" @@ -1224,12 +1232,12 @@ msgstr "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"feedrate_probe\"] or " "self.options[\"feedrate_probe\"]" -#: FlatCAMObj.py:2347 FlatCAMObj.py:4410 FlatCAMObj.py:4415 FlatCAMObj.py:4561 +#: FlatCAMObj.py:2347 FlatCAMObj.py:4412 FlatCAMObj.py:4417 FlatCAMObj.py:4563 msgid "Generating CNC Code" msgstr "Generating CNC Code" -#: FlatCAMObj.py:2373 FlatCAMObj.py:4707 camlib.py:5141 camlib.py:5577 -#: camlib.py:5848 +#: FlatCAMObj.py:2373 FlatCAMObj.py:4709 camlib.py:5204 camlib.py:5653 +#: camlib.py:5924 msgid "" "[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " "format (x, y) \n" @@ -1239,7 +1247,7 @@ msgstr "" "format (x, y) \n" "but now there is only one value, not two. " -#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3247 +#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3249 msgid "Path" msgstr "Path" @@ -1251,15 +1259,15 @@ msgstr "In" msgid "Out" msgstr "Out" -#: FlatCAMObj.py:2720 FlatCAMObj.py:3043 FlatCAMObj.py:3616 +#: FlatCAMObj.py:2720 FlatCAMObj.py:3044 FlatCAMObj.py:3618 msgid "Custom" msgstr "Custom" -#: FlatCAMObj.py:2721 FlatCAMObj.py:3627 FlatCAMObj.py:3628 FlatCAMObj.py:3637 +#: FlatCAMObj.py:2721 FlatCAMObj.py:3629 FlatCAMObj.py:3630 FlatCAMObj.py:3639 msgid "Iso" msgstr "Iso" -#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3249 +#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3251 msgid "Rough" msgstr "Rough" @@ -1267,73 +1275,74 @@ msgstr "Rough" msgid "Finish" msgstr "Finish" -#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:512 flatcamGUI/FlatCAMGUI.py:698 -#: flatcamGUI/FlatCAMGUI.py:1536 flatcamGUI/FlatCAMGUI.py:1546 -#: flatcamGUI/FlatCAMGUI.py:1870 flatcamGUI/ObjectUI.py:996 +#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:518 flatcamGUI/FlatCAMGUI.py:710 +#: flatcamGUI/FlatCAMGUI.py:1580 flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1914 flatcamGUI/ObjectUI.py:996 msgid "Copy" msgstr "Copy" -#: FlatCAMObj.py:3001 flatcamGUI/FlatCAMGUI.py:513 flatcamGUI/FlatCAMGUI.py:700 -#: flatcamGUI/FlatCAMGUI.py:1537 flatcamGUI/FlatCAMGUI.py:1547 -#: flatcamGUI/FlatCAMGUI.py:1872 flatcamGUI/ObjectUI.py:1004 +#: FlatCAMObj.py:3001 flatcamEditors/FlatCAMGrbEditor.py:1825 +#: flatcamGUI/FlatCAMGUI.py:519 flatcamGUI/FlatCAMGUI.py:712 +#: flatcamGUI/FlatCAMGUI.py:1581 flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1916 flatcamGUI/ObjectUI.py:1004 #: flatcamTools/ToolNonCopperClear.py:146 flatcamTools/ToolPaint.py:143 -#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:481 msgid "Delete" msgstr "Delete" -#: FlatCAMObj.py:3219 +#: FlatCAMObj.py:3221 msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." msgstr "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." -#: FlatCAMObj.py:3294 +#: FlatCAMObj.py:3296 msgid "[success] Tool added in Tool Table." msgstr "[success] Tool added in Tool Table." -#: FlatCAMObj.py:3299 +#: FlatCAMObj.py:3301 msgid "[ERROR_NOTCL] Default Tool added. Wrong value format entered." msgstr "[ERROR_NOTCL] Default Tool added. Wrong value format entered." -#: FlatCAMObj.py:3329 FlatCAMObj.py:3339 +#: FlatCAMObj.py:3331 FlatCAMObj.py:3341 msgid "[WARNING_NOTCL] Failed. Select a tool to copy." msgstr "[WARNING_NOTCL] Failed. Select a tool to copy." -#: FlatCAMObj.py:3368 +#: FlatCAMObj.py:3370 msgid "[success] Tool was copied in Tool Table." msgstr "[success] Tool was copied in Tool Table." -#: FlatCAMObj.py:3401 +#: FlatCAMObj.py:3403 msgid "[success] Tool was edited in Tool Table." msgstr "[success] Tool was edited in Tool Table." -#: FlatCAMObj.py:3432 FlatCAMObj.py:3442 +#: FlatCAMObj.py:3434 FlatCAMObj.py:3444 msgid "[WARNING_NOTCL] Failed. Select a tool to delete." msgstr "[WARNING_NOTCL] Failed. Select a tool to delete." -#: FlatCAMObj.py:3466 +#: FlatCAMObj.py:3468 msgid "[success] Tool was deleted in Tool Table." msgstr "[success] Tool was deleted in Tool Table." -#: FlatCAMObj.py:3880 +#: FlatCAMObj.py:3882 #, python-format msgid "" "[WARNING_NOTCL] This Geometry can't be processed because it is %s geometry." msgstr "" "[WARNING_NOTCL] This Geometry can't be processed because it is %s geometry." -#: FlatCAMObj.py:3897 +#: FlatCAMObj.py:3899 msgid "[ERROR_NOTCL] Wrong Tool Dia value format entered, use a number." msgstr "[ERROR_NOTCL] Wrong Tool Dia value format entered, use a number." -#: FlatCAMObj.py:3924 +#: FlatCAMObj.py:3926 msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." msgstr "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." -#: FlatCAMObj.py:3962 +#: FlatCAMObj.py:3964 #, python-format msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" msgstr "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" -#: FlatCAMObj.py:4118 FlatCAMObj.py:4351 +#: FlatCAMObj.py:4120 FlatCAMObj.py:4353 msgid "" "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" "Add a Tool Offset or change the Offset Type." @@ -1341,20 +1350,20 @@ msgstr "" "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" "Add a Tool Offset or change the Offset Type." -#: FlatCAMObj.py:4232 flatcamTools/ToolSolderPaste.py:1106 -#: flatcamTools/ToolSolderPaste.py:1161 +#: FlatCAMObj.py:4234 flatcamTools/ToolSolderPaste.py:1107 +#: flatcamTools/ToolSolderPaste.py:1162 msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." msgstr "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." -#: FlatCAMObj.py:4594 FlatCAMObj.py:4604 camlib.py:3410 camlib.py:3419 +#: FlatCAMObj.py:4596 FlatCAMObj.py:4606 camlib.py:3426 camlib.py:3435 msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." msgstr "[ERROR_NOTCL] Scale factor has to be a number: integer or float." -#: FlatCAMObj.py:4642 +#: FlatCAMObj.py:4644 msgid "[success] Geometry Scale done." msgstr "[success] Geometry Scale done." -#: FlatCAMObj.py:4659 camlib.py:3481 +#: FlatCAMObj.py:4661 camlib.py:3497 msgid "" "[ERROR_NOTCL] An (x,y) pair of values are needed. Probable you entered only " "one value in the Offset field." @@ -1362,29 +1371,29 @@ msgstr "" "[ERROR_NOTCL] An (x,y) pair of values are needed. Probable you entered only " "one value in the Offset field." -#: FlatCAMObj.py:4679 +#: FlatCAMObj.py:4681 msgid "[success] Geometry Offset done." msgstr "[success] Geometry Offset done." -#: FlatCAMObj.py:5224 FlatCAMObj.py:5229 flatcamTools/ToolSolderPaste.py:1360 +#: FlatCAMObj.py:5226 FlatCAMObj.py:5231 flatcamTools/ToolSolderPaste.py:1361 msgid "Export Machine Code ..." msgstr "Export Machine Code ..." -#: FlatCAMObj.py:5235 flatcamTools/ToolSolderPaste.py:1363 +#: FlatCAMObj.py:5237 flatcamTools/ToolSolderPaste.py:1364 msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." msgstr "[WARNING_NOTCL] Export Machine Code cancelled ..." -#: FlatCAMObj.py:5246 +#: FlatCAMObj.py:5248 #, python-format msgid "[success] Machine Code file saved to: %s" msgstr "[success] Machine Code file saved to: %s" -#: FlatCAMObj.py:5268 +#: FlatCAMObj.py:5270 #, python-format msgid "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" msgstr "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" -#: FlatCAMObj.py:5385 +#: FlatCAMObj.py:5387 #, python-format msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed because it is a %s " @@ -1393,11 +1402,11 @@ msgstr "" "[WARNING_NOTCL] This CNCJob object can't be processed because it is a %s " "CNCJob object." -#: FlatCAMObj.py:5438 +#: FlatCAMObj.py:5440 msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" msgstr "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" -#: FlatCAMObj.py:5451 +#: FlatCAMObj.py:5453 msgid "" "[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " "empty." @@ -1405,15 +1414,15 @@ msgstr "" "[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " "empty." -#: FlatCAMObj.py:5458 +#: FlatCAMObj.py:5460 msgid "[success] Toolchange G-code was replaced by a custom code." msgstr "[success] Toolchange G-code was replaced by a custom code." -#: FlatCAMObj.py:5473 flatcamTools/ToolSolderPaste.py:1389 +#: FlatCAMObj.py:5475 flatcamTools/ToolSolderPaste.py:1390 msgid "[WARNING_NOTCL] No such file or directory" msgstr "[WARNING_NOTCL] No such file or directory" -#: FlatCAMObj.py:5492 FlatCAMObj.py:5504 +#: FlatCAMObj.py:5494 FlatCAMObj.py:5506 msgid "" "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " "'toolchange_custom'" @@ -1421,7 +1430,7 @@ msgstr "" "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " "'toolchange_custom'" -#: FlatCAMObj.py:5510 +#: FlatCAMObj.py:5512 msgid "[ERROR] There is no postprocessor file." msgstr "[ERROR] There is no postprocessor file." @@ -1435,44 +1444,44 @@ msgstr "Object renamed from {old} to {new}" msgid "[ERROR] Cause of error: %s" msgstr "[ERROR] Cause of error: %s" -#: camlib.py:200 +#: camlib.py:202 msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." msgstr "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." -#: camlib.py:1387 +#: camlib.py:1389 msgid "[success] Object was mirrored ..." msgstr "[success] Object was mirrored ..." -#: camlib.py:1389 +#: camlib.py:1391 msgid "[ERROR_NOTCL] Failed to mirror. No object selected" msgstr "[ERROR_NOTCL] Failed to mirror. No object selected" -#: camlib.py:1425 +#: camlib.py:1427 msgid "[success] Object was rotated ..." msgstr "[success] Object was rotated ..." -#: camlib.py:1427 +#: camlib.py:1429 msgid "[ERROR_NOTCL] Failed to rotate. No object selected" msgstr "[ERROR_NOTCL] Failed to rotate. No object selected" -#: camlib.py:1461 +#: camlib.py:1463 msgid "[success] Object was skewed ..." msgstr "[success] Object was skewed ..." -#: camlib.py:1463 +#: camlib.py:1465 msgid "[ERROR_NOTCL] Failed to skew. No object selected" msgstr "[ERROR_NOTCL] Failed to skew. No object selected" -#: camlib.py:2728 camlib.py:2832 +#: camlib.py:2733 camlib.py:2837 #, python-format msgid "[WARNING] Coordinates missing, line ignored: %s" msgstr "[WARNING] Coordinates missing, line ignored: %s" -#: camlib.py:2729 camlib.py:2833 +#: camlib.py:2734 camlib.py:2838 msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" msgstr "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" -#: camlib.py:2787 +#: camlib.py:2792 #, python-format msgid "" "[ERROR] Region does not have enough points. File will be processed but there " @@ -1481,7 +1490,7 @@ msgstr "" "[ERROR] Region does not have enough points. File will be processed but there " "are parser errors. Line number: %s" -#: camlib.py:3231 +#: camlib.py:3247 #, python-format msgid "" "[ERROR]Gerber Parser ERROR.\n" @@ -1490,20 +1499,37 @@ msgstr "" "[ERROR]Gerber Parser ERROR.\n" "%s:" -#: camlib.py:3448 +#: camlib.py:3464 msgid "[success] Gerber Scale done." msgstr "[success] Gerber Scale done." -#: camlib.py:3505 +#: camlib.py:3521 msgid "[success] Gerber Offset done." msgstr "[success] Gerber Offset done." -#: camlib.py:3887 +#: camlib.py:3915 #, python-format msgid "[ERROR_NOTCL] This is GCODE mark: %s" msgstr "[ERROR_NOTCL] This is GCODE mark: %s" -#: camlib.py:4431 +#: camlib.py:4029 +#, 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 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." + +#: camlib.py:4494 #, python-brace-format msgid "" "[ERROR] Excellon Parser error.\n" @@ -1512,7 +1538,7 @@ msgstr "" "[ERROR] Excellon Parser error.\n" "Parsing Failed. Line {l_nr}: {line}\n" -#: camlib.py:4508 +#: camlib.py:4571 msgid "" "[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " "not having a tool associated.\n" @@ -1522,12 +1548,12 @@ msgstr "" "not having a tool associated.\n" "Check the resulting GCode." -#: camlib.py:5050 +#: camlib.py:5113 #, python-format msgid "[ERROR] There is no such parameter: %s" msgstr "[ERROR] There is no such parameter: %s" -#: camlib.py:5120 +#: camlib.py:5183 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "drill into material.\n" @@ -1541,22 +1567,22 @@ msgstr "" "therefore the app will convert the value to negative. Check the resulting " "CNC code (Gcode etc)." -#: camlib.py:5127 camlib.py:5600 camlib.py:5871 +#: camlib.py:5190 camlib.py:5676 camlib.py:5947 #, python-format msgid "" "[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" msgstr "" "[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" -#: camlib.py:5343 camlib.py:5438 camlib.py:5489 +#: camlib.py:5412 camlib.py:5507 camlib.py:5565 msgid "[ERROR_NOTCL] The loaded Excellon file has no drills ..." msgstr "[ERROR_NOTCL] The loaded Excellon file has no drills ..." -#: camlib.py:5443 +#: camlib.py:5512 msgid "[ERROR_NOTCL] Wrong optimization type selected." msgstr "[ERROR_NOTCL] Wrong optimization type selected." -#: camlib.py:5588 camlib.py:5859 +#: camlib.py:5664 camlib.py:5935 msgid "" "[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " "combinations of other parameters." @@ -1564,7 +1590,7 @@ msgstr "" "[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " "combinations of other parameters." -#: camlib.py:5593 camlib.py:5864 +#: camlib.py:5669 camlib.py:5940 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "cut into material.\n" @@ -1578,11 +1604,11 @@ msgstr "" "therefore the app will convert the value to negative.Check the resulting CNC " "code (Gcode etc)." -#: camlib.py:5605 camlib.py:5876 +#: camlib.py:5681 camlib.py:5952 msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." msgstr "[ERROR_NOTCL] Travel Z parameter is None or zero." -#: camlib.py:5609 camlib.py:5880 +#: camlib.py:5685 camlib.py:5956 msgid "" "[WARNING] The Travel Z parameter has negative value. It is the height value " "to travel between cuts.\n" @@ -1596,19 +1622,19 @@ msgstr "" "therefore the app will convert the value to positive.Check the resulting CNC " "code (Gcode etc)." -#: camlib.py:5616 camlib.py:5887 +#: camlib.py:5692 camlib.py:5963 #, python-format msgid "" "[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" msgstr "" "[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" -#: camlib.py:5746 +#: camlib.py:5822 #, python-format msgid "[ERROR]Expected a Geometry, got %s" msgstr "[ERROR]Expected a Geometry, got %s" -#: camlib.py:5752 +#: camlib.py:5828 msgid "" "[ERROR_NOTCL] Trying to generate a CNC Job from a Geometry object without " "solid_geometry." @@ -1616,7 +1642,7 @@ msgstr "" "[ERROR_NOTCL] Trying to generate a CNC Job from a Geometry object without " "solid_geometry." -#: camlib.py:5791 +#: camlib.py:5867 msgid "" "[ERROR_NOTCL] The Tool Offset value is too negative to use for the " "current_geometry.\n" @@ -1626,38 +1652,38 @@ msgstr "" "current_geometry.\n" "Raise the value (in module) and try again." -#: camlib.py:6013 +#: camlib.py:6089 msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." msgstr "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." -#: flatcamEditors/FlatCAMExcEditor.py:44 +#: flatcamEditors/FlatCAMExcEditor.py:46 msgid "[WARNING_NOTCL] To add a drill first select a tool" msgstr "[WARNING_NOTCL] To add a drill first select a tool" -#: flatcamEditors/FlatCAMExcEditor.py:53 flatcamEditors/FlatCAMExcEditor.py:143 -#: flatcamEditors/FlatCAMExcEditor.py:420 -#: flatcamEditors/FlatCAMExcEditor.py:445 -#: flatcamEditors/FlatCAMGrbEditor.py:223 -#: flatcamEditors/FlatCAMGrbEditor.py:604 -#: flatcamEditors/FlatCAMGrbEditor.py:628 +#: flatcamEditors/FlatCAMExcEditor.py:62 flatcamEditors/FlatCAMExcEditor.py:164 +#: flatcamEditors/FlatCAMExcEditor.py:446 +#: flatcamEditors/FlatCAMExcEditor.py:471 +#: flatcamEditors/FlatCAMGrbEditor.py:287 +#: flatcamEditors/FlatCAMGrbEditor.py:1447 +#: flatcamEditors/FlatCAMGrbEditor.py:1471 msgid "Click on target location ..." msgstr "Click on target location ..." -#: flatcamEditors/FlatCAMExcEditor.py:93 +#: flatcamEditors/FlatCAMExcEditor.py:107 msgid "[success] Done. Drill added." msgstr "[success] Done. Drill added." -#: flatcamEditors/FlatCAMExcEditor.py:135 +#: flatcamEditors/FlatCAMExcEditor.py:149 msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" msgstr "" "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" -#: flatcamEditors/FlatCAMExcEditor.py:160 +#: flatcamEditors/FlatCAMExcEditor.py:181 msgid "Click on the Drill Circular Array Start position" msgstr "Click on the Drill Circular Array Start position" -#: flatcamEditors/FlatCAMExcEditor.py:182 -#: flatcamEditors/FlatCAMGrbEditor.py:262 +#: flatcamEditors/FlatCAMExcEditor.py:203 +#: flatcamEditors/FlatCAMGrbEditor.py:330 msgid "" "[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " "separator." @@ -1665,65 +1691,65 @@ msgstr "" "[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " "separator." -#: flatcamEditors/FlatCAMExcEditor.py:185 -#: flatcamEditors/FlatCAMGrbEditor.py:265 +#: flatcamEditors/FlatCAMExcEditor.py:206 +#: flatcamEditors/FlatCAMGrbEditor.py:333 msgid "[ERROR_NOTCL] The value is mistyped. Check the value." msgstr "[ERROR_NOTCL] The value is mistyped. Check the value." -#: flatcamEditors/FlatCAMExcEditor.py:278 +#: flatcamEditors/FlatCAMExcEditor.py:304 msgid "[WARNING_NOTCL] Too many drills for the selected spacing angle." msgstr "[WARNING_NOTCL] Too many drills for the selected spacing angle." -#: flatcamEditors/FlatCAMExcEditor.py:295 +#: flatcamEditors/FlatCAMExcEditor.py:321 msgid "[success] Done. Drill Array added." msgstr "[success] Done. Drill Array added." -#: flatcamEditors/FlatCAMExcEditor.py:306 +#: flatcamEditors/FlatCAMExcEditor.py:332 msgid "Click on the Drill(s) to resize ..." msgstr "Click on the Drill(s) to resize ..." -#: flatcamEditors/FlatCAMExcEditor.py:326 +#: flatcamEditors/FlatCAMExcEditor.py:352 msgid "" "[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize." msgstr "" "[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize." -#: flatcamEditors/FlatCAMExcEditor.py:396 +#: flatcamEditors/FlatCAMExcEditor.py:422 msgid "[success] Done. Drill Resize completed." msgstr "[success] Done. Drill Resize completed." -#: flatcamEditors/FlatCAMExcEditor.py:399 +#: flatcamEditors/FlatCAMExcEditor.py:425 msgid "[WARNING_NOTCL] Cancelled. No drills selected for resize ..." msgstr "[WARNING_NOTCL] Cancelled. No drills selected for resize ..." -#: flatcamEditors/FlatCAMExcEditor.py:422 -#: flatcamEditors/FlatCAMGrbEditor.py:606 +#: flatcamEditors/FlatCAMExcEditor.py:448 +#: flatcamEditors/FlatCAMGrbEditor.py:1449 msgid "Click on reference location ..." msgstr "Click on reference location ..." -#: flatcamEditors/FlatCAMExcEditor.py:477 +#: flatcamEditors/FlatCAMExcEditor.py:503 msgid "[success] Done. Drill(s) Move completed." msgstr "[success] Done. Drill(s) Move completed." -#: flatcamEditors/FlatCAMExcEditor.py:530 +#: flatcamEditors/FlatCAMExcEditor.py:556 msgid "[success] Done. Drill(s) copied." msgstr "[success] Done. Drill(s) copied." -#: flatcamEditors/FlatCAMExcEditor.py:712 +#: flatcamEditors/FlatCAMExcEditor.py:754 msgid "Excellon Editor" msgstr "Excellon Editor" -#: flatcamEditors/FlatCAMExcEditor.py:719 -#: flatcamEditors/FlatCAMGrbEditor.py:840 +#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMGrbEditor.py:1705 msgid "Name:" msgstr "Name:" -#: flatcamEditors/FlatCAMExcEditor.py:739 flatcamTools/ToolNonCopperClear.py:72 +#: flatcamEditors/FlatCAMExcEditor.py:767 flatcamTools/ToolNonCopperClear.py:72 #: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 msgid "Tools Table" msgstr "Tools Table" -#: flatcamEditors/FlatCAMExcEditor.py:741 flatcamGUI/ObjectUI.py:538 +#: flatcamEditors/FlatCAMExcEditor.py:769 flatcamGUI/ObjectUI.py:538 msgid "" "Tools in this Excellon object\n" "when are used for drilling." @@ -1731,11 +1757,11 @@ msgstr "" "Tools in this Excellon object\n" "when are used for drilling." -#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMExcEditor.py:789 msgid "Add/Delete Tool" msgstr "Add/Delete Tool" -#: flatcamEditors/FlatCAMExcEditor.py:763 +#: flatcamEditors/FlatCAMExcEditor.py:791 msgid "" "Add/Delete a tool to the tool list\n" "for this Excellon object." @@ -1743,19 +1769,19 @@ msgstr "" "Add/Delete a tool to the tool list\n" "for this Excellon object." -#: flatcamEditors/FlatCAMExcEditor.py:771 flatcamTools/ToolCutOut.py:77 +#: flatcamEditors/FlatCAMExcEditor.py:799 flatcamTools/ToolCutOut.py:77 msgid "Tool Dia:" msgstr "Tool Dia:" -#: flatcamEditors/FlatCAMExcEditor.py:773 flatcamGUI/ObjectUI.py:975 +#: flatcamEditors/FlatCAMExcEditor.py:801 flatcamGUI/ObjectUI.py:975 msgid "Diameter for the new tool" msgstr "Diameter for the new tool" -#: flatcamEditors/FlatCAMExcEditor.py:782 +#: flatcamEditors/FlatCAMExcEditor.py:810 msgid "Add Tool" msgstr "Add Tool" -#: flatcamEditors/FlatCAMExcEditor.py:784 +#: flatcamEditors/FlatCAMExcEditor.py:812 msgid "" "Add a new tool to the tool list\n" "with the diameter specified above." @@ -1763,11 +1789,11 @@ msgstr "" "Add a new tool to the tool list\n" "with the diameter specified above." -#: flatcamEditors/FlatCAMExcEditor.py:794 +#: flatcamEditors/FlatCAMExcEditor.py:822 msgid "Delete Tool" msgstr "Delete Tool" -#: flatcamEditors/FlatCAMExcEditor.py:796 +#: flatcamEditors/FlatCAMExcEditor.py:824 msgid "" "Delete a tool in the tool list\n" "by selecting a row in the tool table." @@ -1775,39 +1801,39 @@ msgstr "" "Delete a tool in the tool list\n" "by selecting a row in the tool table." -#: flatcamEditors/FlatCAMExcEditor.py:814 +#: flatcamEditors/FlatCAMExcEditor.py:842 msgid "Resize Drill(s)" msgstr "Resize Drill(s)" -#: flatcamEditors/FlatCAMExcEditor.py:816 +#: flatcamEditors/FlatCAMExcEditor.py:844 msgid "Resize a drill or a selection of drills." msgstr "Resize a drill or a selection of drills." -#: flatcamEditors/FlatCAMExcEditor.py:823 +#: flatcamEditors/FlatCAMExcEditor.py:851 msgid "Resize Dia:" msgstr "Resize Dia:" -#: flatcamEditors/FlatCAMExcEditor.py:825 +#: flatcamEditors/FlatCAMExcEditor.py:853 msgid "Diameter to resize to." msgstr "Diameter to resize to." -#: flatcamEditors/FlatCAMExcEditor.py:833 +#: flatcamEditors/FlatCAMExcEditor.py:861 msgid "Resize" msgstr "Resize" -#: flatcamEditors/FlatCAMExcEditor.py:835 +#: flatcamEditors/FlatCAMExcEditor.py:863 msgid "Resize drill(s)" msgstr "Resize drill(s)" -#: flatcamEditors/FlatCAMExcEditor.py:857 flatcamGUI/FlatCAMGUI.py:1542 +#: flatcamEditors/FlatCAMExcEditor.py:885 flatcamGUI/FlatCAMGUI.py:1586 msgid "Add Drill Array" msgstr "Add Drill Array" -#: flatcamEditors/FlatCAMExcEditor.py:859 +#: flatcamEditors/FlatCAMExcEditor.py:887 msgid "Add an array of drills (linear or circular array)" msgstr "Add an array of drills (linear or circular array)" -#: flatcamEditors/FlatCAMExcEditor.py:865 +#: flatcamEditors/FlatCAMExcEditor.py:893 msgid "" "Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular" @@ -1815,33 +1841,33 @@ msgstr "" "Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular" -#: flatcamEditors/FlatCAMExcEditor.py:868 -#: flatcamEditors/FlatCAMGrbEditor.py:1077 +#: flatcamEditors/FlatCAMExcEditor.py:896 +#: flatcamEditors/FlatCAMGrbEditor.py:1938 msgid "Linear" msgstr "Linear" -#: flatcamEditors/FlatCAMExcEditor.py:869 -#: flatcamEditors/FlatCAMGrbEditor.py:1078 +#: flatcamEditors/FlatCAMExcEditor.py:897 +#: flatcamEditors/FlatCAMGrbEditor.py:1939 msgid "Circular" msgstr "Circular" -#: flatcamEditors/FlatCAMExcEditor.py:876 +#: flatcamEditors/FlatCAMExcEditor.py:904 msgid "Nr of drills:" msgstr "Nr of drills:" -#: flatcamEditors/FlatCAMExcEditor.py:878 +#: flatcamEditors/FlatCAMExcEditor.py:906 msgid "Specify how many drills to be in the array." msgstr "Specify how many drills to be in the array." -#: flatcamEditors/FlatCAMExcEditor.py:895 -#: flatcamEditors/FlatCAMExcEditor.py:940 -#: flatcamEditors/FlatCAMGrbEditor.py:1104 -#: flatcamEditors/FlatCAMGrbEditor.py:1149 +#: flatcamEditors/FlatCAMExcEditor.py:923 +#: flatcamEditors/FlatCAMExcEditor.py:968 +#: flatcamEditors/FlatCAMGrbEditor.py:1965 +#: flatcamEditors/FlatCAMGrbEditor.py:2010 msgid "Direction:" msgstr "Direction:" -#: flatcamEditors/FlatCAMExcEditor.py:897 -#: flatcamEditors/FlatCAMGrbEditor.py:1106 +#: flatcamEditors/FlatCAMExcEditor.py:925 +#: flatcamEditors/FlatCAMGrbEditor.py:1967 msgid "" "Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" @@ -1853,32 +1879,32 @@ msgstr "" "- 'Y' - vertical axis or \n" "- 'Angle' - a custom angle for the array inclination" -#: flatcamEditors/FlatCAMExcEditor.py:906 -#: flatcamEditors/FlatCAMGrbEditor.py:1115 +#: flatcamEditors/FlatCAMExcEditor.py:934 +#: flatcamEditors/FlatCAMGrbEditor.py:1976 msgid "Angle" msgstr "Angle" -#: flatcamEditors/FlatCAMExcEditor.py:910 -#: flatcamEditors/FlatCAMGrbEditor.py:1119 +#: flatcamEditors/FlatCAMExcEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:1980 msgid "Pitch:" msgstr "Pitch:" -#: flatcamEditors/FlatCAMExcEditor.py:912 -#: flatcamEditors/FlatCAMGrbEditor.py:1121 +#: flatcamEditors/FlatCAMExcEditor.py:940 +#: flatcamEditors/FlatCAMGrbEditor.py:1982 msgid "Pitch = Distance between elements of the array." msgstr "Pitch = Distance between elements of the array." -#: flatcamEditors/FlatCAMExcEditor.py:919 -#: flatcamEditors/FlatCAMExcEditor.py:955 -#: flatcamEditors/FlatCAMGeoEditor.py:663 -#: flatcamEditors/FlatCAMGrbEditor.py:1128 -#: flatcamEditors/FlatCAMGrbEditor.py:1164 -#: flatcamEditors/FlatCAMGrbEditor.py:2822 flatcamTools/ToolTransform.py:68 +#: flatcamEditors/FlatCAMExcEditor.py:947 +#: flatcamEditors/FlatCAMExcEditor.py:983 +#: flatcamEditors/FlatCAMGeoEditor.py:664 +#: flatcamEditors/FlatCAMGrbEditor.py:1989 +#: flatcamEditors/FlatCAMGrbEditor.py:2025 +#: flatcamEditors/FlatCAMGrbEditor.py:3833 flatcamTools/ToolTransform.py:68 msgid "Angle:" msgstr "Angle:" -#: flatcamEditors/FlatCAMExcEditor.py:921 -#: flatcamEditors/FlatCAMGrbEditor.py:1130 +#: flatcamEditors/FlatCAMExcEditor.py:949 +#: flatcamEditors/FlatCAMGrbEditor.py:1991 msgid "" "Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" @@ -1890,8 +1916,8 @@ msgstr "" "Min value is: -359.99 degrees.\n" "Max value is: 360.00 degrees." -#: flatcamEditors/FlatCAMExcEditor.py:942 -#: flatcamEditors/FlatCAMGrbEditor.py:1151 +#: flatcamEditors/FlatCAMExcEditor.py:970 +#: flatcamEditors/FlatCAMGrbEditor.py:2012 msgid "" "Direction for circular array.Can be CW = clockwise or CCW = counter " "clockwise." @@ -1899,12 +1925,12 @@ msgstr "" "Direction for circular array.Can be CW = clockwise or CCW = counter " "clockwise." -#: flatcamEditors/FlatCAMExcEditor.py:957 -#: flatcamEditors/FlatCAMGrbEditor.py:1166 +#: flatcamEditors/FlatCAMExcEditor.py:985 +#: flatcamEditors/FlatCAMGrbEditor.py:2027 msgid "Angle at which each element in circular array is placed." msgstr "Angle at which each element in circular array is placed." -#: flatcamEditors/FlatCAMExcEditor.py:1413 +#: flatcamEditors/FlatCAMExcEditor.py:1447 msgid "" "[WARNING_NOTCL] Tool already in the original or actual tool list.\n" "Save and reedit Excellon if you need to add this tool. " @@ -1912,22 +1938,21 @@ msgstr "" "[WARNING_NOTCL] Tool already in the original or actual tool list.\n" "Save and reedit Excellon if you need to add this tool. " -#: flatcamEditors/FlatCAMExcEditor.py:1422 flatcamGUI/FlatCAMGUI.py:2888 +#: flatcamEditors/FlatCAMExcEditor.py:1456 flatcamGUI/FlatCAMGUI.py:2956 #, python-brace-format msgid "[success] Added new tool with dia: {dia} {units}" msgstr "[success] Added new tool with dia: {dia} {units}" -#: flatcamEditors/FlatCAMExcEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:1638 +#: flatcamEditors/FlatCAMExcEditor.py:1488 msgid "[WARNING_NOTCL] Select a tool in Tool Table" msgstr "[WARNING_NOTCL] Select a tool in Tool Table" -#: flatcamEditors/FlatCAMExcEditor.py:1486 +#: flatcamEditors/FlatCAMExcEditor.py:1521 #, python-brace-format msgid "[success] Deleted tool with dia: {del_dia} {units}" msgstr "[success] Deleted tool with dia: {del_dia} {units}" -#: flatcamEditors/FlatCAMExcEditor.py:1924 +#: flatcamEditors/FlatCAMExcEditor.py:1974 msgid "" "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " "creation." @@ -1935,36 +1960,38 @@ msgstr "" "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " "creation." -#: flatcamEditors/FlatCAMExcEditor.py:1933 +#: flatcamEditors/FlatCAMExcEditor.py:1983 msgid "Creating Excellon." msgstr "Creating Excellon." -#: flatcamEditors/FlatCAMExcEditor.py:1942 +#: flatcamEditors/FlatCAMExcEditor.py:1992 msgid "[success] Excellon editing finished." msgstr "[success] Excellon editing finished." -#: flatcamEditors/FlatCAMExcEditor.py:1959 +#: flatcamEditors/FlatCAMExcEditor.py:2009 msgid "[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected" msgstr "[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected" -#: flatcamEditors/FlatCAMExcEditor.py:2458 +#: flatcamEditors/FlatCAMExcEditor.py:2508 msgid "[success] Done. Drill(s) deleted." msgstr "[success] Done. Drill(s) deleted." -#: flatcamEditors/FlatCAMExcEditor.py:2528 -#: flatcamEditors/FlatCAMGrbEditor.py:2619 +#: flatcamEditors/FlatCAMExcEditor.py:2578 +#: flatcamEditors/FlatCAMGrbEditor.py:3621 msgid "Click on the circular array Center position" msgstr "Click on the circular array Center position" -#: flatcamEditors/FlatCAMGeoEditor.py:77 flatcamEditors/FlatCAMGrbEditor.py:994 +#: flatcamEditors/FlatCAMGeoEditor.py:78 +#: flatcamEditors/FlatCAMGrbEditor.py:1855 msgid "Buffer distance:" msgstr "Buffer distance:" -#: flatcamEditors/FlatCAMGeoEditor.py:78 flatcamEditors/FlatCAMGrbEditor.py:995 +#: flatcamEditors/FlatCAMGeoEditor.py:79 +#: flatcamEditors/FlatCAMGrbEditor.py:1856 msgid "Buffer corner:" msgstr "Buffer corner:" -#: flatcamEditors/FlatCAMGeoEditor.py:80 +#: flatcamEditors/FlatCAMGeoEditor.py:81 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded for exterior buffer.\n" @@ -1978,45 +2005,45 @@ msgstr "" " - 'Beveled:' the corner is a line that directly connects the features " "meeting in the corner" -#: flatcamEditors/FlatCAMGeoEditor.py:86 -#: flatcamEditors/FlatCAMGrbEditor.py:1003 +#: flatcamEditors/FlatCAMGeoEditor.py:87 +#: flatcamEditors/FlatCAMGrbEditor.py:1864 msgid "Round" msgstr "Round" -#: flatcamEditors/FlatCAMGeoEditor.py:87 -#: flatcamEditors/FlatCAMGrbEditor.py:1004 +#: flatcamEditors/FlatCAMGeoEditor.py:88 +#: flatcamEditors/FlatCAMGrbEditor.py:1865 msgid "Square" msgstr "Square" -#: flatcamEditors/FlatCAMGeoEditor.py:88 -#: flatcamEditors/FlatCAMGrbEditor.py:1005 +#: flatcamEditors/FlatCAMGeoEditor.py:89 +#: flatcamEditors/FlatCAMGrbEditor.py:1866 msgid "Beveled" msgstr "Beveled" -#: flatcamEditors/FlatCAMGeoEditor.py:95 +#: flatcamEditors/FlatCAMGeoEditor.py:96 msgid "Buffer Interior" msgstr "Buffer Interior" -#: flatcamEditors/FlatCAMGeoEditor.py:97 +#: flatcamEditors/FlatCAMGeoEditor.py:98 msgid "Buffer Exterior" msgstr "Buffer Exterior" -#: flatcamEditors/FlatCAMGeoEditor.py:103 +#: flatcamEditors/FlatCAMGeoEditor.py:104 msgid "Full Buffer" msgstr "Full Buffer" -#: flatcamEditors/FlatCAMGeoEditor.py:124 -#: flatcamEditors/FlatCAMGeoEditor.py:2505 +#: flatcamEditors/FlatCAMGeoEditor.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:2594 msgid "Buffer Tool" msgstr "Buffer Tool" -#: flatcamEditors/FlatCAMGeoEditor.py:135 -#: flatcamEditors/FlatCAMGeoEditor.py:152 -#: flatcamEditors/FlatCAMGeoEditor.py:169 -#: flatcamEditors/FlatCAMGeoEditor.py:2523 -#: flatcamEditors/FlatCAMGeoEditor.py:2549 -#: flatcamEditors/FlatCAMGeoEditor.py:2575 -#: flatcamEditors/FlatCAMGrbEditor.py:2662 +#: flatcamEditors/FlatCAMGeoEditor.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:153 +#: flatcamEditors/FlatCAMGeoEditor.py:170 +#: flatcamEditors/FlatCAMGeoEditor.py:2612 +#: flatcamEditors/FlatCAMGeoEditor.py:2638 +#: flatcamEditors/FlatCAMGeoEditor.py:2664 +#: flatcamEditors/FlatCAMGrbEditor.py:3673 msgid "" "[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " "retry." @@ -2024,21 +2051,21 @@ msgstr "" "[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " "retry." -#: flatcamEditors/FlatCAMGeoEditor.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:341 msgid "Text Tool" msgstr "Text Tool" -#: flatcamEditors/FlatCAMGeoEditor.py:398 flatcamGUI/FlatCAMGUI.py:764 +#: flatcamEditors/FlatCAMGeoEditor.py:399 flatcamGUI/FlatCAMGUI.py:776 msgid "Tool" msgstr "Tool" -#: flatcamEditors/FlatCAMGeoEditor.py:429 flatcamGUI/FlatCAMGUI.py:3833 -#: flatcamGUI/FlatCAMGUI.py:5039 flatcamGUI/FlatCAMGUI.py:5315 -#: flatcamGUI/FlatCAMGUI.py:5455 flatcamGUI/ObjectUI.py:260 +#: flatcamEditors/FlatCAMGeoEditor.py:430 flatcamGUI/FlatCAMGUI.py:3922 +#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5544 flatcamGUI/ObjectUI.py:260 msgid "Tool dia:" msgstr "Tool dia:" -#: flatcamEditors/FlatCAMGeoEditor.py:431 flatcamGUI/FlatCAMGUI.py:5457 +#: flatcamEditors/FlatCAMGeoEditor.py:432 flatcamGUI/FlatCAMGUI.py:5546 msgid "" "Diameter of the tool to\n" "be used in the operation." @@ -2046,13 +2073,13 @@ msgstr "" "Diameter of the tool to\n" "be used in the operation." -#: flatcamEditors/FlatCAMGeoEditor.py:440 flatcamGUI/FlatCAMGUI.py:5221 -#: flatcamGUI/FlatCAMGUI.py:5466 flatcamTools/ToolNonCopperClear.py:165 +#: flatcamEditors/FlatCAMGeoEditor.py:441 flatcamGUI/FlatCAMGUI.py:5310 +#: flatcamGUI/FlatCAMGUI.py:5555 flatcamTools/ToolNonCopperClear.py:165 #: flatcamTools/ToolPaint.py:160 msgid "Overlap Rate:" msgstr "Overlap Rate:" -#: flatcamEditors/FlatCAMGeoEditor.py:442 flatcamTools/ToolPaint.py:162 +#: flatcamEditors/FlatCAMGeoEditor.py:443 flatcamTools/ToolPaint.py:162 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -2077,14 +2104,14 @@ msgstr "" "Higher values = slow processing and slow execution on CNC\n" "due of too many paths." -#: flatcamEditors/FlatCAMGeoEditor.py:458 flatcamGUI/FlatCAMGUI.py:5237 -#: flatcamGUI/FlatCAMGUI.py:5323 flatcamGUI/FlatCAMGUI.py:5476 +#: flatcamEditors/FlatCAMGeoEditor.py:459 flatcamGUI/FlatCAMGUI.py:5326 +#: flatcamGUI/FlatCAMGUI.py:5412 flatcamGUI/FlatCAMGUI.py:5565 #: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:181 #: flatcamTools/ToolPaint.py:177 msgid "Margin:" msgstr "Margin:" -#: flatcamEditors/FlatCAMGeoEditor.py:460 flatcamGUI/FlatCAMGUI.py:5478 +#: flatcamEditors/FlatCAMGeoEditor.py:461 flatcamGUI/FlatCAMGUI.py:5567 #: flatcamTools/ToolPaint.py:179 msgid "" "Distance by which to avoid\n" @@ -2095,13 +2122,13 @@ msgstr "" "the edges of the polygon to\n" "be painted." -#: flatcamEditors/FlatCAMGeoEditor.py:469 flatcamGUI/FlatCAMGUI.py:5246 -#: flatcamGUI/FlatCAMGUI.py:5487 flatcamTools/ToolNonCopperClear.py:190 +#: flatcamEditors/FlatCAMGeoEditor.py:470 flatcamGUI/FlatCAMGUI.py:5335 +#: flatcamGUI/FlatCAMGUI.py:5576 flatcamTools/ToolNonCopperClear.py:190 #: flatcamTools/ToolPaint.py:188 msgid "Method:" msgstr "Method:" -#: flatcamEditors/FlatCAMGeoEditor.py:471 flatcamGUI/FlatCAMGUI.py:5489 +#: flatcamEditors/FlatCAMGeoEditor.py:472 flatcamGUI/FlatCAMGUI.py:5578 msgid "" "Algorithm to paint the polygon:
Standard: Fixed step inwards." "
Seed-based: Outwards from seed." @@ -2109,29 +2136,29 @@ msgstr "" "Algorithm to paint the polygon:
Standard: Fixed step inwards." "
Seed-based: Outwards from seed." -#: flatcamEditors/FlatCAMGeoEditor.py:477 flatcamGUI/FlatCAMGUI.py:5255 -#: flatcamGUI/FlatCAMGUI.py:5495 +#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5584 msgid "Standard" msgstr "Standard" -#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5256 -#: flatcamGUI/FlatCAMGUI.py:5496 +#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5345 +#: flatcamGUI/FlatCAMGUI.py:5585 msgid "Seed-based" msgstr "Seed-based" -#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5257 -#: flatcamGUI/FlatCAMGUI.py:5497 +#: flatcamEditors/FlatCAMGeoEditor.py:480 flatcamGUI/FlatCAMGUI.py:5346 +#: flatcamGUI/FlatCAMGUI.py:5586 msgid "Straight lines" msgstr "Straight lines" -#: flatcamEditors/FlatCAMGeoEditor.py:484 flatcamGUI/FlatCAMGUI.py:5262 -#: flatcamGUI/FlatCAMGUI.py:5502 flatcamTools/ToolNonCopperClear.py:206 +#: flatcamEditors/FlatCAMGeoEditor.py:485 flatcamGUI/FlatCAMGUI.py:5351 +#: flatcamGUI/FlatCAMGUI.py:5591 flatcamTools/ToolNonCopperClear.py:206 #: flatcamTools/ToolPaint.py:204 msgid "Connect:" msgstr "Connect:" -#: flatcamEditors/FlatCAMGeoEditor.py:486 flatcamGUI/FlatCAMGUI.py:5264 -#: flatcamGUI/FlatCAMGUI.py:5504 flatcamTools/ToolNonCopperClear.py:208 +#: flatcamEditors/FlatCAMGeoEditor.py:487 flatcamGUI/FlatCAMGUI.py:5353 +#: flatcamGUI/FlatCAMGUI.py:5593 flatcamTools/ToolNonCopperClear.py:208 #: flatcamTools/ToolPaint.py:206 msgid "" "Draw lines between resulting\n" @@ -2140,14 +2167,14 @@ msgstr "" "Draw lines between resulting\n" "segments to minimize tool lifts." -#: flatcamEditors/FlatCAMGeoEditor.py:493 flatcamGUI/FlatCAMGUI.py:5271 -#: flatcamGUI/FlatCAMGUI.py:5512 flatcamTools/ToolNonCopperClear.py:215 +#: flatcamEditors/FlatCAMGeoEditor.py:494 flatcamGUI/FlatCAMGUI.py:5360 +#: flatcamGUI/FlatCAMGUI.py:5601 flatcamTools/ToolNonCopperClear.py:215 #: flatcamTools/ToolPaint.py:213 msgid "Contour:" msgstr "Contour:" -#: flatcamEditors/FlatCAMGeoEditor.py:495 flatcamGUI/FlatCAMGUI.py:5273 -#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolNonCopperClear.py:217 +#: flatcamEditors/FlatCAMGeoEditor.py:496 flatcamGUI/FlatCAMGUI.py:5362 +#: flatcamGUI/FlatCAMGUI.py:5603 flatcamTools/ToolNonCopperClear.py:217 #: flatcamTools/ToolPaint.py:215 msgid "" "Cut around the perimeter of the polygon\n" @@ -2156,21 +2183,21 @@ msgstr "" "Cut around the perimeter of the polygon\n" "to trim rough edges." -#: flatcamEditors/FlatCAMGeoEditor.py:507 +#: flatcamEditors/FlatCAMGeoEditor.py:508 msgid "Paint" msgstr "Paint" -#: flatcamEditors/FlatCAMGeoEditor.py:525 flatcamGUI/FlatCAMGUI.py:629 -#: flatcamGUI/FlatCAMGUI.py:1796 flatcamGUI/ObjectUI.py:1308 -#: flatcamTools/ToolPaint.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:526 flatcamGUI/FlatCAMGUI.py:635 +#: flatcamGUI/FlatCAMGUI.py:1840 flatcamGUI/ObjectUI.py:1308 +#: flatcamTools/ToolPaint.py:341 msgid "Paint Tool" msgstr "Paint Tool" -#: flatcamEditors/FlatCAMGeoEditor.py:561 +#: flatcamEditors/FlatCAMGeoEditor.py:562 msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." msgstr "[WARNING_NOTCL] Paint cancelled. No shape selected." -#: flatcamEditors/FlatCAMGeoEditor.py:572 flatcamTools/ToolCutOut.py:352 +#: flatcamEditors/FlatCAMGeoEditor.py:573 flatcamTools/ToolCutOut.py:352 #: flatcamTools/ToolCutOut.py:496 flatcamTools/ToolCutOut.py:616 #: flatcamTools/ToolCutOut.py:721 flatcamTools/ToolDblSided.py:363 msgid "" @@ -2180,13 +2207,13 @@ msgstr "" "[WARNING_NOTCL] Tool diameter value is missing or wrong format. Add it and " "retry." -#: flatcamEditors/FlatCAMGeoEditor.py:583 +#: flatcamEditors/FlatCAMGeoEditor.py:584 msgid "" "[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." msgstr "" "[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." -#: flatcamEditors/FlatCAMGeoEditor.py:595 +#: flatcamEditors/FlatCAMGeoEditor.py:596 msgid "" "[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " "retry." @@ -2194,63 +2221,63 @@ msgstr "" "[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " "retry." -#: flatcamEditors/FlatCAMGeoEditor.py:604 -#: flatcamEditors/FlatCAMGeoEditor.py:2530 -#: flatcamEditors/FlatCAMGeoEditor.py:2556 -#: flatcamEditors/FlatCAMGeoEditor.py:2582 flatcamTools/ToolMeasurement.py:202 -#: flatcamTools/ToolNonCopperClear.py:812 flatcamTools/ToolProperties.py:104 +#: flatcamEditors/FlatCAMGeoEditor.py:605 +#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2645 +#: flatcamEditors/FlatCAMGeoEditor.py:2671 +#: flatcamTools/ToolNonCopperClear.py:813 flatcamTools/ToolProperties.py:104 msgid "Tools" msgstr "Tools" -#: flatcamEditors/FlatCAMGeoEditor.py:615 -#: flatcamEditors/FlatCAMGeoEditor.py:988 -#: flatcamEditors/FlatCAMGrbEditor.py:2774 -#: flatcamEditors/FlatCAMGrbEditor.py:3158 flatcamGUI/FlatCAMGUI.py:638 -#: flatcamGUI/FlatCAMGUI.py:1807 flatcamTools/ToolTransform.py:398 +#: flatcamEditors/FlatCAMGeoEditor.py:616 +#: flatcamEditors/FlatCAMGeoEditor.py:989 +#: flatcamEditors/FlatCAMGrbEditor.py:3785 +#: flatcamEditors/FlatCAMGrbEditor.py:4169 flatcamGUI/FlatCAMGUI.py:644 +#: flatcamGUI/FlatCAMGUI.py:1851 flatcamTools/ToolTransform.py:398 msgid "Transform Tool" msgstr "Transform Tool" -#: flatcamEditors/FlatCAMGeoEditor.py:616 -#: flatcamEditors/FlatCAMGeoEditor.py:677 -#: flatcamEditors/FlatCAMGrbEditor.py:2775 -#: flatcamEditors/FlatCAMGrbEditor.py:2836 flatcamTools/ToolTransform.py:24 +#: flatcamEditors/FlatCAMGeoEditor.py:617 +#: flatcamEditors/FlatCAMGeoEditor.py:678 +#: flatcamEditors/FlatCAMGrbEditor.py:3786 +#: flatcamEditors/FlatCAMGrbEditor.py:3847 flatcamTools/ToolTransform.py:24 #: flatcamTools/ToolTransform.py:82 msgid "Rotate" msgstr "Rotate" -#: flatcamEditors/FlatCAMGeoEditor.py:617 -#: flatcamEditors/FlatCAMGrbEditor.py:2776 flatcamTools/ToolTransform.py:25 +#: flatcamEditors/FlatCAMGeoEditor.py:618 +#: flatcamEditors/FlatCAMGrbEditor.py:3787 flatcamTools/ToolTransform.py:25 msgid "Skew/Shear" msgstr "Skew/Shear" -#: flatcamEditors/FlatCAMGeoEditor.py:618 -#: flatcamEditors/FlatCAMGrbEditor.py:1049 -#: flatcamEditors/FlatCAMGrbEditor.py:2777 flatcamGUI/FlatCAMGUI.py:696 -#: flatcamGUI/FlatCAMGUI.py:1868 flatcamGUI/ObjectUI.py:100 +#: flatcamEditors/FlatCAMGeoEditor.py:619 +#: flatcamEditors/FlatCAMGrbEditor.py:1910 +#: flatcamEditors/FlatCAMGrbEditor.py:3788 flatcamGUI/FlatCAMGUI.py:708 +#: flatcamGUI/FlatCAMGUI.py:1912 flatcamGUI/ObjectUI.py:100 #: flatcamTools/ToolTransform.py:26 msgid "Scale" msgstr "Scale" -#: flatcamEditors/FlatCAMGeoEditor.py:619 -#: flatcamEditors/FlatCAMGrbEditor.py:2778 flatcamTools/ToolTransform.py:27 +#: flatcamEditors/FlatCAMGeoEditor.py:620 +#: flatcamEditors/FlatCAMGrbEditor.py:3789 flatcamTools/ToolTransform.py:27 msgid "Mirror (Flip)" msgstr "Mirror (Flip)" -#: flatcamEditors/FlatCAMGeoEditor.py:620 -#: flatcamEditors/FlatCAMGrbEditor.py:2779 flatcamGUI/ObjectUI.py:127 +#: flatcamEditors/FlatCAMGeoEditor.py:621 +#: flatcamEditors/FlatCAMGrbEditor.py:3790 flatcamGUI/ObjectUI.py:127 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 #: flatcamTools/ToolTransform.py:28 msgid "Offset" msgstr "Offset" -#: flatcamEditors/FlatCAMGeoEditor.py:631 -#: flatcamEditors/FlatCAMGrbEditor.py:2790 +#: flatcamEditors/FlatCAMGeoEditor.py:632 +#: flatcamEditors/FlatCAMGrbEditor.py:3801 #, python-format msgid "Editor %s" msgstr "Editor %s" -#: flatcamEditors/FlatCAMGeoEditor.py:665 -#: flatcamEditors/FlatCAMGrbEditor.py:2824 flatcamTools/ToolTransform.py:70 +#: flatcamEditors/FlatCAMGeoEditor.py:666 +#: flatcamEditors/FlatCAMGrbEditor.py:3835 flatcamTools/ToolTransform.py:70 msgid "" "Angle for Rotation action, in degrees.\n" "Float number between -360 and 359.\n" @@ -2262,8 +2289,8 @@ msgstr "" "Positive numbers for CW motion.\n" "Negative numbers for CCW motion." -#: flatcamEditors/FlatCAMGeoEditor.py:679 -#: flatcamEditors/FlatCAMGrbEditor.py:2838 +#: flatcamEditors/FlatCAMGeoEditor.py:680 +#: flatcamEditors/FlatCAMGrbEditor.py:3849 msgid "" "Rotate the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2273,15 +2300,15 @@ msgstr "" "The point of reference is the middle of\n" "the bounding box for all selected shapes." -#: flatcamEditors/FlatCAMGeoEditor.py:702 -#: flatcamEditors/FlatCAMGrbEditor.py:2861 flatcamTools/ToolTransform.py:107 +#: flatcamEditors/FlatCAMGeoEditor.py:703 +#: flatcamEditors/FlatCAMGrbEditor.py:3872 flatcamTools/ToolTransform.py:107 msgid "Angle X:" msgstr "Angle X:" -#: flatcamEditors/FlatCAMGeoEditor.py:704 -#: flatcamEditors/FlatCAMGeoEditor.py:722 -#: flatcamEditors/FlatCAMGrbEditor.py:2863 -#: flatcamEditors/FlatCAMGrbEditor.py:2881 flatcamTools/ToolTransform.py:109 +#: flatcamEditors/FlatCAMGeoEditor.py:705 +#: flatcamEditors/FlatCAMGeoEditor.py:723 +#: flatcamEditors/FlatCAMGrbEditor.py:3874 +#: flatcamEditors/FlatCAMGrbEditor.py:3892 flatcamTools/ToolTransform.py:109 #: flatcamTools/ToolTransform.py:127 msgid "" "Angle for Skew action, in degrees.\n" @@ -2290,15 +2317,15 @@ msgstr "" "Angle for Skew action, in degrees.\n" "Float number between -360 and 359." -#: flatcamEditors/FlatCAMGeoEditor.py:713 -#: flatcamEditors/FlatCAMGrbEditor.py:2872 flatcamTools/ToolTransform.py:118 +#: flatcamEditors/FlatCAMGeoEditor.py:714 +#: flatcamEditors/FlatCAMGrbEditor.py:3883 flatcamTools/ToolTransform.py:118 msgid "Skew X" msgstr "Skew X" -#: flatcamEditors/FlatCAMGeoEditor.py:715 -#: flatcamEditors/FlatCAMGeoEditor.py:733 -#: flatcamEditors/FlatCAMGrbEditor.py:2874 -#: flatcamEditors/FlatCAMGrbEditor.py:2892 +#: flatcamEditors/FlatCAMGeoEditor.py:716 +#: flatcamEditors/FlatCAMGeoEditor.py:734 +#: flatcamEditors/FlatCAMGrbEditor.py:3885 +#: flatcamEditors/FlatCAMGrbEditor.py:3903 msgid "" "Skew/shear the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2308,35 +2335,35 @@ msgstr "" "The point of reference is the middle of\n" "the bounding box for all selected shapes." -#: flatcamEditors/FlatCAMGeoEditor.py:720 -#: flatcamEditors/FlatCAMGrbEditor.py:2879 flatcamTools/ToolTransform.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:721 +#: flatcamEditors/FlatCAMGrbEditor.py:3890 flatcamTools/ToolTransform.py:125 msgid "Angle Y:" msgstr "Angle Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:731 -#: flatcamEditors/FlatCAMGrbEditor.py:2890 flatcamTools/ToolTransform.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:732 +#: flatcamEditors/FlatCAMGrbEditor.py:3901 flatcamTools/ToolTransform.py:136 msgid "Skew Y" msgstr "Skew Y" -#: flatcamEditors/FlatCAMGeoEditor.py:759 -#: flatcamEditors/FlatCAMGrbEditor.py:2918 flatcamTools/ToolTransform.py:164 +#: flatcamEditors/FlatCAMGeoEditor.py:760 +#: flatcamEditors/FlatCAMGrbEditor.py:3929 flatcamTools/ToolTransform.py:164 msgid "Factor X:" msgstr "Factor X:" -#: flatcamEditors/FlatCAMGeoEditor.py:761 -#: flatcamEditors/FlatCAMGrbEditor.py:2920 flatcamTools/ToolTransform.py:166 +#: flatcamEditors/FlatCAMGeoEditor.py:762 +#: flatcamEditors/FlatCAMGrbEditor.py:3931 flatcamTools/ToolTransform.py:166 msgid "Factor for Scale action over X axis." msgstr "Factor for Scale action over X axis." -#: flatcamEditors/FlatCAMGeoEditor.py:769 -#: flatcamEditors/FlatCAMGrbEditor.py:2928 flatcamTools/ToolTransform.py:174 +#: flatcamEditors/FlatCAMGeoEditor.py:770 +#: flatcamEditors/FlatCAMGrbEditor.py:3939 flatcamTools/ToolTransform.py:174 msgid "Scale X" msgstr "Scale X" -#: flatcamEditors/FlatCAMGeoEditor.py:771 -#: flatcamEditors/FlatCAMGeoEditor.py:788 -#: flatcamEditors/FlatCAMGrbEditor.py:2930 -#: flatcamEditors/FlatCAMGrbEditor.py:2947 +#: flatcamEditors/FlatCAMGeoEditor.py:772 +#: flatcamEditors/FlatCAMGeoEditor.py:789 +#: flatcamEditors/FlatCAMGrbEditor.py:3941 +#: flatcamEditors/FlatCAMGrbEditor.py:3958 msgid "" "Scale the selected shape(s).\n" "The point of reference depends on \n" @@ -2346,29 +2373,29 @@ msgstr "" "The point of reference depends on \n" "the Scale reference checkbox state." -#: flatcamEditors/FlatCAMGeoEditor.py:776 -#: flatcamEditors/FlatCAMGrbEditor.py:2935 flatcamTools/ToolTransform.py:181 +#: flatcamEditors/FlatCAMGeoEditor.py:777 +#: flatcamEditors/FlatCAMGrbEditor.py:3946 flatcamTools/ToolTransform.py:181 msgid "Factor Y:" msgstr "Factor Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:778 -#: flatcamEditors/FlatCAMGrbEditor.py:2937 flatcamTools/ToolTransform.py:183 +#: flatcamEditors/FlatCAMGeoEditor.py:779 +#: flatcamEditors/FlatCAMGrbEditor.py:3948 flatcamTools/ToolTransform.py:183 msgid "Factor for Scale action over Y axis." msgstr "Factor for Scale action over Y axis." -#: flatcamEditors/FlatCAMGeoEditor.py:786 -#: flatcamEditors/FlatCAMGrbEditor.py:2945 flatcamTools/ToolTransform.py:191 +#: flatcamEditors/FlatCAMGeoEditor.py:787 +#: flatcamEditors/FlatCAMGrbEditor.py:3956 flatcamTools/ToolTransform.py:191 msgid "Scale Y" msgstr "Scale Y" -#: flatcamEditors/FlatCAMGeoEditor.py:795 -#: flatcamEditors/FlatCAMGrbEditor.py:2954 flatcamGUI/FlatCAMGUI.py:5861 +#: flatcamEditors/FlatCAMGeoEditor.py:796 +#: flatcamEditors/FlatCAMGrbEditor.py:3965 flatcamGUI/FlatCAMGUI.py:5950 #: flatcamTools/ToolTransform.py:200 msgid "Link" msgstr "Link" -#: flatcamEditors/FlatCAMGeoEditor.py:797 -#: flatcamEditors/FlatCAMGrbEditor.py:2956 +#: flatcamEditors/FlatCAMGeoEditor.py:798 +#: flatcamEditors/FlatCAMGrbEditor.py:3967 msgid "" "Scale the selected shape(s)\n" "using the Scale Factor X for both axis." @@ -2376,14 +2403,14 @@ msgstr "" "Scale the selected shape(s)\n" "using the Scale Factor X for both axis." -#: flatcamEditors/FlatCAMGeoEditor.py:803 -#: flatcamEditors/FlatCAMGrbEditor.py:2962 flatcamGUI/FlatCAMGUI.py:5869 +#: flatcamEditors/FlatCAMGeoEditor.py:804 +#: flatcamEditors/FlatCAMGrbEditor.py:3973 flatcamGUI/FlatCAMGUI.py:5958 #: flatcamTools/ToolTransform.py:208 msgid "Scale Reference" msgstr "Scale Reference" -#: flatcamEditors/FlatCAMGeoEditor.py:805 -#: flatcamEditors/FlatCAMGrbEditor.py:2964 +#: flatcamEditors/FlatCAMGeoEditor.py:806 +#: flatcamEditors/FlatCAMGrbEditor.py:3975 msgid "" "Scale the selected shape(s)\n" "using the origin reference when checked,\n" @@ -2395,25 +2422,25 @@ msgstr "" "and the center of the biggest bounding box\n" "of the selected shapes when unchecked." -#: flatcamEditors/FlatCAMGeoEditor.py:833 -#: flatcamEditors/FlatCAMGrbEditor.py:2993 flatcamTools/ToolTransform.py:238 +#: flatcamEditors/FlatCAMGeoEditor.py:834 +#: flatcamEditors/FlatCAMGrbEditor.py:4004 flatcamTools/ToolTransform.py:238 msgid "Value X:" msgstr "Value X:" -#: flatcamEditors/FlatCAMGeoEditor.py:835 -#: flatcamEditors/FlatCAMGrbEditor.py:2995 flatcamTools/ToolTransform.py:240 +#: flatcamEditors/FlatCAMGeoEditor.py:836 +#: flatcamEditors/FlatCAMGrbEditor.py:4006 flatcamTools/ToolTransform.py:240 msgid "Value for Offset action on X axis." msgstr "Value for Offset action on X axis." -#: flatcamEditors/FlatCAMGeoEditor.py:843 -#: flatcamEditors/FlatCAMGrbEditor.py:3003 flatcamTools/ToolTransform.py:248 +#: flatcamEditors/FlatCAMGeoEditor.py:844 +#: flatcamEditors/FlatCAMGrbEditor.py:4014 flatcamTools/ToolTransform.py:248 msgid "Offset X" msgstr "Offset X" -#: flatcamEditors/FlatCAMGeoEditor.py:845 -#: flatcamEditors/FlatCAMGeoEditor.py:863 -#: flatcamEditors/FlatCAMGrbEditor.py:3005 -#: flatcamEditors/FlatCAMGrbEditor.py:3023 +#: flatcamEditors/FlatCAMGeoEditor.py:846 +#: flatcamEditors/FlatCAMGeoEditor.py:864 +#: flatcamEditors/FlatCAMGrbEditor.py:4016 +#: flatcamEditors/FlatCAMGrbEditor.py:4034 msgid "" "Offset the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2423,30 +2450,30 @@ msgstr "" "The point of reference is the middle of\n" "the bounding box for all selected shapes.\n" -#: flatcamEditors/FlatCAMGeoEditor.py:851 -#: flatcamEditors/FlatCAMGrbEditor.py:3011 flatcamTools/ToolTransform.py:255 +#: flatcamEditors/FlatCAMGeoEditor.py:852 +#: flatcamEditors/FlatCAMGrbEditor.py:4022 flatcamTools/ToolTransform.py:255 msgid "Value Y:" msgstr "Value Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:853 -#: flatcamEditors/FlatCAMGrbEditor.py:3013 flatcamTools/ToolTransform.py:257 +#: flatcamEditors/FlatCAMGeoEditor.py:854 +#: flatcamEditors/FlatCAMGrbEditor.py:4024 flatcamTools/ToolTransform.py:257 msgid "Value for Offset action on Y axis." msgstr "Value for Offset action on Y axis." -#: flatcamEditors/FlatCAMGeoEditor.py:861 -#: flatcamEditors/FlatCAMGrbEditor.py:3021 flatcamTools/ToolTransform.py:265 +#: flatcamEditors/FlatCAMGeoEditor.py:862 +#: flatcamEditors/FlatCAMGrbEditor.py:4032 flatcamTools/ToolTransform.py:265 msgid "Offset Y" msgstr "Offset Y" -#: flatcamEditors/FlatCAMGeoEditor.py:892 -#: flatcamEditors/FlatCAMGrbEditor.py:3052 flatcamTools/ToolTransform.py:295 +#: flatcamEditors/FlatCAMGeoEditor.py:893 +#: flatcamEditors/FlatCAMGrbEditor.py:4063 flatcamTools/ToolTransform.py:295 msgid "Flip on X" msgstr "Flip on X" -#: flatcamEditors/FlatCAMGeoEditor.py:894 -#: flatcamEditors/FlatCAMGeoEditor.py:902 -#: flatcamEditors/FlatCAMGrbEditor.py:3054 -#: flatcamEditors/FlatCAMGrbEditor.py:3062 +#: flatcamEditors/FlatCAMGeoEditor.py:895 +#: flatcamEditors/FlatCAMGeoEditor.py:903 +#: flatcamEditors/FlatCAMGrbEditor.py:4065 +#: flatcamEditors/FlatCAMGrbEditor.py:4073 msgid "" "Flip the selected shape(s) over the X axis.\n" "Does not create a new shape." @@ -2454,18 +2481,18 @@ msgstr "" "Flip the selected shape(s) over the X axis.\n" "Does not create a new shape." -#: flatcamEditors/FlatCAMGeoEditor.py:900 -#: flatcamEditors/FlatCAMGrbEditor.py:3060 flatcamTools/ToolTransform.py:303 +#: flatcamEditors/FlatCAMGeoEditor.py:901 +#: flatcamEditors/FlatCAMGrbEditor.py:4071 flatcamTools/ToolTransform.py:303 msgid "Flip on Y" msgstr "Flip on Y" -#: flatcamEditors/FlatCAMGeoEditor.py:909 -#: flatcamEditors/FlatCAMGrbEditor.py:3069 flatcamTools/ToolTransform.py:312 +#: flatcamEditors/FlatCAMGeoEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:4080 flatcamTools/ToolTransform.py:312 msgid "Ref Pt" msgstr "Ref Pt" -#: flatcamEditors/FlatCAMGeoEditor.py:911 -#: flatcamEditors/FlatCAMGrbEditor.py:3071 +#: flatcamEditors/FlatCAMGeoEditor.py:912 +#: flatcamEditors/FlatCAMGrbEditor.py:4082 msgid "" "Flip the selected shape(s)\n" "around the point in Point Entry Field.\n" @@ -2487,13 +2514,13 @@ msgstr "" "Or enter the coords in format (x, y) in the\n" "Point Entry field and click Flip on X(Y)" -#: flatcamEditors/FlatCAMGeoEditor.py:923 -#: flatcamEditors/FlatCAMGrbEditor.py:3083 flatcamTools/ToolTransform.py:325 +#: flatcamEditors/FlatCAMGeoEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:4094 flatcamTools/ToolTransform.py:325 msgid "Point:" msgstr "Point:" -#: flatcamEditors/FlatCAMGeoEditor.py:925 -#: flatcamEditors/FlatCAMGrbEditor.py:3085 +#: flatcamEditors/FlatCAMGeoEditor.py:926 +#: flatcamEditors/FlatCAMGrbEditor.py:4096 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" @@ -2503,17 +2530,18 @@ msgstr "" "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." -#: flatcamEditors/FlatCAMGeoEditor.py:935 -#: flatcamEditors/FlatCAMGrbEditor.py:3095 flatcamGUI/ObjectUI.py:988 +#: flatcamEditors/FlatCAMGeoEditor.py:936 +#: flatcamEditors/FlatCAMGrbEditor.py:1820 +#: flatcamEditors/FlatCAMGrbEditor.py:4106 flatcamGUI/ObjectUI.py:988 #: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 #: flatcamTools/ToolNonCopperClear.py:134 flatcamTools/ToolPaint.py:131 -#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:479 #: flatcamTools/ToolTransform.py:337 msgid "Add" msgstr "Add" -#: flatcamEditors/FlatCAMGeoEditor.py:937 -#: flatcamEditors/FlatCAMGrbEditor.py:3097 flatcamTools/ToolTransform.py:339 +#: flatcamEditors/FlatCAMGeoEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:4108 flatcamTools/ToolTransform.py:339 msgid "" "The point coordinates can be captured by\n" "left click on canvas together with pressing\n" @@ -2523,318 +2551,375 @@ msgstr "" "left click on canvas together with pressing\n" "SHIFT key. Then click Add button to insert." -#: flatcamEditors/FlatCAMGeoEditor.py:1052 -#: flatcamEditors/FlatCAMGrbEditor.py:3222 +#: flatcamEditors/FlatCAMGeoEditor.py:1053 +#: flatcamEditors/FlatCAMGrbEditor.py:4233 msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." msgstr "[WARNING_NOTCL] Transformation cancelled. No shape selected." -#: flatcamEditors/FlatCAMGeoEditor.py:1073 -#: flatcamEditors/FlatCAMGrbEditor.py:3242 flatcamTools/ToolTransform.py:468 +#: flatcamEditors/FlatCAMGeoEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:4253 flatcamTools/ToolTransform.py:468 msgid "[ERROR_NOTCL] Wrong value format entered for Rotate, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Rotate, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1110 -#: flatcamEditors/FlatCAMGrbEditor.py:3279 flatcamTools/ToolTransform.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:1111 +#: flatcamEditors/FlatCAMGrbEditor.py:4290 flatcamTools/ToolTransform.py:502 msgid "[ERROR_NOTCL] Wrong value format entered for Skew X, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Skew X, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1131 -#: flatcamEditors/FlatCAMGrbEditor.py:3300 flatcamTools/ToolTransform.py:520 +#: flatcamEditors/FlatCAMGeoEditor.py:1132 +#: flatcamEditors/FlatCAMGrbEditor.py:4311 flatcamTools/ToolTransform.py:520 msgid "[ERROR_NOTCL] Wrong value format entered for Skew Y, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Skew Y, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1152 -#: flatcamEditors/FlatCAMGrbEditor.py:3321 flatcamTools/ToolTransform.py:538 +#: flatcamEditors/FlatCAMGeoEditor.py:1153 +#: flatcamEditors/FlatCAMGrbEditor.py:4332 flatcamTools/ToolTransform.py:538 msgid "[ERROR_NOTCL] Wrong value format entered for Scale X, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Scale X, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1189 -#: flatcamEditors/FlatCAMGrbEditor.py:3358 flatcamTools/ToolTransform.py:572 +#: flatcamEditors/FlatCAMGeoEditor.py:1190 +#: flatcamEditors/FlatCAMGrbEditor.py:4369 flatcamTools/ToolTransform.py:572 msgid "[ERROR_NOTCL] Wrong value format entered for Scale Y, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Scale Y, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1221 -#: flatcamEditors/FlatCAMGrbEditor.py:3390 flatcamTools/ToolTransform.py:601 +#: flatcamEditors/FlatCAMGeoEditor.py:1222 +#: flatcamEditors/FlatCAMGrbEditor.py:4401 flatcamTools/ToolTransform.py:601 msgid "[ERROR_NOTCL] Wrong value format entered for Offset X, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Offset X, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1242 -#: flatcamEditors/FlatCAMGrbEditor.py:3411 flatcamTools/ToolTransform.py:619 +#: flatcamEditors/FlatCAMGeoEditor.py:1243 +#: flatcamEditors/FlatCAMGrbEditor.py:4422 flatcamTools/ToolTransform.py:619 msgid "[ERROR_NOTCL] Wrong value format entered for Offset Y, use a number." msgstr "[ERROR_NOTCL] Wrong value format entered for Offset Y, use a number." -#: flatcamEditors/FlatCAMGeoEditor.py:1260 -#: flatcamEditors/FlatCAMGrbEditor.py:3429 +#: flatcamEditors/FlatCAMGeoEditor.py:1261 +#: flatcamEditors/FlatCAMGrbEditor.py:4440 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" -#: flatcamEditors/FlatCAMGeoEditor.py:1263 -#: flatcamEditors/FlatCAMGrbEditor.py:3432 flatcamTools/ToolTransform.py:640 +#: flatcamEditors/FlatCAMGeoEditor.py:1264 +#: flatcamEditors/FlatCAMGrbEditor.py:4443 flatcamTools/ToolTransform.py:640 msgid "Appying Rotate" msgstr "Appying Rotate" -#: flatcamEditors/FlatCAMGeoEditor.py:1291 -#: flatcamEditors/FlatCAMGrbEditor.py:3460 +#: flatcamEditors/FlatCAMGeoEditor.py:1292 +#: flatcamEditors/FlatCAMGrbEditor.py:4471 msgid "[success] Done. Rotate completed." msgstr "[success] Done. Rotate completed." -#: flatcamEditors/FlatCAMGeoEditor.py:1307 -#: flatcamEditors/FlatCAMGrbEditor.py:3476 +#: flatcamEditors/FlatCAMGeoEditor.py:1308 +#: flatcamEditors/FlatCAMGrbEditor.py:4487 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" -#: flatcamEditors/FlatCAMGeoEditor.py:1310 -#: flatcamEditors/FlatCAMGrbEditor.py:3479 flatcamTools/ToolTransform.py:692 +#: flatcamEditors/FlatCAMGeoEditor.py:1311 +#: flatcamEditors/FlatCAMGrbEditor.py:4490 flatcamTools/ToolTransform.py:692 msgid "Applying Flip" msgstr "Applying Flip" -#: flatcamEditors/FlatCAMGeoEditor.py:1340 -#: flatcamEditors/FlatCAMGrbEditor.py:3509 flatcamTools/ToolTransform.py:735 +#: flatcamEditors/FlatCAMGeoEditor.py:1341 +#: flatcamEditors/FlatCAMGrbEditor.py:4520 flatcamTools/ToolTransform.py:735 msgid "[success] Flip on the Y axis done ..." msgstr "[success] Flip on the Y axis done ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1343 -#: flatcamEditors/FlatCAMGrbEditor.py:3512 flatcamTools/ToolTransform.py:745 +#: flatcamEditors/FlatCAMGeoEditor.py:1344 +#: flatcamEditors/FlatCAMGrbEditor.py:4523 flatcamTools/ToolTransform.py:745 msgid "[success] Flip on the X axis done ..." msgstr "[success] Flip on the X axis done ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1362 -#: flatcamEditors/FlatCAMGrbEditor.py:3531 +#: flatcamEditors/FlatCAMGeoEditor.py:1363 +#: flatcamEditors/FlatCAMGrbEditor.py:4542 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" msgstr "" "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" -#: flatcamEditors/FlatCAMGeoEditor.py:1365 -#: flatcamEditors/FlatCAMGrbEditor.py:3534 flatcamTools/ToolTransform.py:762 +#: flatcamEditors/FlatCAMGeoEditor.py:1366 +#: flatcamEditors/FlatCAMGrbEditor.py:4545 flatcamTools/ToolTransform.py:762 msgid "Applying Skew" msgstr "Applying Skew" -#: flatcamEditors/FlatCAMGeoEditor.py:1390 -#: flatcamEditors/FlatCAMGrbEditor.py:3559 flatcamTools/ToolTransform.py:793 +#: flatcamEditors/FlatCAMGeoEditor.py:1391 +#: flatcamEditors/FlatCAMGrbEditor.py:4570 flatcamTools/ToolTransform.py:793 #, python-format msgid "[success] Skew on the %s axis done ..." msgstr "[success] Skew on the %s axis done ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1394 -#: flatcamEditors/FlatCAMGrbEditor.py:3563 flatcamTools/ToolTransform.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:1395 +#: flatcamEditors/FlatCAMGrbEditor.py:4574 flatcamTools/ToolTransform.py:797 #, python-format msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." msgstr "[ERROR_NOTCL] Due of %s, Skew action was not executed." -#: flatcamEditors/FlatCAMGeoEditor.py:1405 -#: flatcamEditors/FlatCAMGrbEditor.py:3574 +#: flatcamEditors/FlatCAMGeoEditor.py:1406 +#: flatcamEditors/FlatCAMGrbEditor.py:4585 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" -#: flatcamEditors/FlatCAMGeoEditor.py:1408 -#: flatcamEditors/FlatCAMGrbEditor.py:3577 flatcamTools/ToolTransform.py:811 +#: flatcamEditors/FlatCAMGeoEditor.py:1409 +#: flatcamEditors/FlatCAMGrbEditor.py:4588 flatcamTools/ToolTransform.py:811 msgid "Applying Scale" msgstr "Applying Scale" -#: flatcamEditors/FlatCAMGeoEditor.py:1441 -#: flatcamEditors/FlatCAMGrbEditor.py:3610 flatcamTools/ToolTransform.py:849 +#: flatcamEditors/FlatCAMGeoEditor.py:1442 +#: flatcamEditors/FlatCAMGrbEditor.py:4621 flatcamTools/ToolTransform.py:849 #, python-format msgid "[success] Scale on the %s axis done ..." msgstr "[success] Scale on the %s axis done ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1444 -#: flatcamEditors/FlatCAMGrbEditor.py:3613 flatcamTools/ToolTransform.py:852 +#: flatcamEditors/FlatCAMGeoEditor.py:1445 +#: flatcamEditors/FlatCAMGrbEditor.py:4624 flatcamTools/ToolTransform.py:852 #, python-format msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." msgstr "[ERROR_NOTCL] Due of %s, Scale action was not executed." -#: flatcamEditors/FlatCAMGeoEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:3622 +#: flatcamEditors/FlatCAMGeoEditor.py:1454 +#: flatcamEditors/FlatCAMGrbEditor.py:4633 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" msgstr "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" -#: flatcamEditors/FlatCAMGeoEditor.py:1456 -#: flatcamEditors/FlatCAMGrbEditor.py:3625 flatcamTools/ToolTransform.py:864 +#: flatcamEditors/FlatCAMGeoEditor.py:1457 +#: flatcamEditors/FlatCAMGrbEditor.py:4636 flatcamTools/ToolTransform.py:864 msgid "Applying Offset" msgstr "Applying Offset" -#: flatcamEditors/FlatCAMGeoEditor.py:1480 -#: flatcamEditors/FlatCAMGrbEditor.py:3649 flatcamTools/ToolTransform.py:894 +#: flatcamEditors/FlatCAMGeoEditor.py:1481 +#: flatcamEditors/FlatCAMGrbEditor.py:4660 flatcamTools/ToolTransform.py:894 #, python-format msgid "[success] Offset on the %s axis done ..." msgstr "[success] Offset on the %s axis done ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1484 -#: flatcamEditors/FlatCAMGrbEditor.py:3653 flatcamTools/ToolTransform.py:898 +#: flatcamEditors/FlatCAMGeoEditor.py:1485 +#: flatcamEditors/FlatCAMGrbEditor.py:4664 flatcamTools/ToolTransform.py:898 #, python-format msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." msgstr "[ERROR_NOTCL] Due of %s, Offset action was not executed." -#: flatcamEditors/FlatCAMGeoEditor.py:1488 -#: flatcamEditors/FlatCAMGrbEditor.py:3657 +#: flatcamEditors/FlatCAMGeoEditor.py:1489 +#: flatcamEditors/FlatCAMGrbEditor.py:4668 msgid "Rotate ..." msgstr "Rotate ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1489 -#: flatcamEditors/FlatCAMGeoEditor.py:1546 -#: flatcamEditors/FlatCAMGeoEditor.py:1563 -#: flatcamEditors/FlatCAMGrbEditor.py:3658 -#: flatcamEditors/FlatCAMGrbEditor.py:3715 -#: flatcamEditors/FlatCAMGrbEditor.py:3732 +#: flatcamEditors/FlatCAMGeoEditor.py:1490 +#: flatcamEditors/FlatCAMGeoEditor.py:1547 +#: flatcamEditors/FlatCAMGeoEditor.py:1564 +#: flatcamEditors/FlatCAMGrbEditor.py:4669 +#: flatcamEditors/FlatCAMGrbEditor.py:4726 +#: flatcamEditors/FlatCAMGrbEditor.py:4743 msgid "Enter an Angle Value (degrees):" msgstr "Enter an Angle Value (degrees):" -#: flatcamEditors/FlatCAMGeoEditor.py:1498 -#: flatcamEditors/FlatCAMGrbEditor.py:3667 +#: flatcamEditors/FlatCAMGeoEditor.py:1499 +#: flatcamEditors/FlatCAMGrbEditor.py:4678 msgid "[success] Geometry shape rotate done..." msgstr "[success] Geometry shape rotate done..." -#: flatcamEditors/FlatCAMGeoEditor.py:1503 -#: flatcamEditors/FlatCAMGrbEditor.py:3672 +#: flatcamEditors/FlatCAMGeoEditor.py:1504 +#: flatcamEditors/FlatCAMGrbEditor.py:4683 msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." msgstr "[WARNING_NOTCL] Geometry shape rotate cancelled..." -#: flatcamEditors/FlatCAMGeoEditor.py:1509 -#: flatcamEditors/FlatCAMGrbEditor.py:3678 +#: flatcamEditors/FlatCAMGeoEditor.py:1510 +#: flatcamEditors/FlatCAMGrbEditor.py:4689 msgid "Offset on X axis ..." msgstr "Offset on X axis ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1510 -#: flatcamEditors/FlatCAMGeoEditor.py:1529 -#: flatcamEditors/FlatCAMGrbEditor.py:3679 -#: flatcamEditors/FlatCAMGrbEditor.py:3698 +#: flatcamEditors/FlatCAMGeoEditor.py:1511 +#: flatcamEditors/FlatCAMGeoEditor.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:4690 +#: flatcamEditors/FlatCAMGrbEditor.py:4709 #, python-format msgid "Enter a distance Value (%s):" msgstr "Enter a distance Value (%s):" -#: flatcamEditors/FlatCAMGeoEditor.py:1519 -#: flatcamEditors/FlatCAMGrbEditor.py:3688 +#: flatcamEditors/FlatCAMGeoEditor.py:1520 +#: flatcamEditors/FlatCAMGrbEditor.py:4699 msgid "[success] Geometry shape offset on X axis done..." msgstr "[success] Geometry shape offset on X axis done..." -#: flatcamEditors/FlatCAMGeoEditor.py:1523 -#: flatcamEditors/FlatCAMGrbEditor.py:3692 +#: flatcamEditors/FlatCAMGeoEditor.py:1524 +#: flatcamEditors/FlatCAMGrbEditor.py:4703 msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." msgstr "[WARNING_NOTCL] Geometry shape offset X cancelled..." -#: flatcamEditors/FlatCAMGeoEditor.py:1528 -#: flatcamEditors/FlatCAMGrbEditor.py:3697 +#: flatcamEditors/FlatCAMGeoEditor.py:1529 +#: flatcamEditors/FlatCAMGrbEditor.py:4708 msgid "Offset on Y axis ..." msgstr "Offset on Y axis ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1538 -#: flatcamEditors/FlatCAMGrbEditor.py:3707 +#: flatcamEditors/FlatCAMGeoEditor.py:1539 +#: flatcamEditors/FlatCAMGrbEditor.py:4718 msgid "[success] Geometry shape offset on Y axis done..." msgstr "[success] Geometry shape offset on Y axis done..." -#: flatcamEditors/FlatCAMGeoEditor.py:1542 -#: flatcamEditors/FlatCAMGrbEditor.py:3711 +#: flatcamEditors/FlatCAMGeoEditor.py:1543 +#: flatcamEditors/FlatCAMGrbEditor.py:4722 msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." msgstr "[WARNING_NOTCL] Geometry shape offset Y cancelled..." -#: flatcamEditors/FlatCAMGeoEditor.py:1545 -#: flatcamEditors/FlatCAMGrbEditor.py:3714 +#: flatcamEditors/FlatCAMGeoEditor.py:1546 +#: flatcamEditors/FlatCAMGrbEditor.py:4725 msgid "Skew on X axis ..." msgstr "Skew on X axis ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1555 -#: flatcamEditors/FlatCAMGrbEditor.py:3724 +#: flatcamEditors/FlatCAMGeoEditor.py:1556 +#: flatcamEditors/FlatCAMGrbEditor.py:4735 msgid "[success] Geometry shape skew on X axis done..." msgstr "[success] Geometry shape skew on X axis done..." -#: flatcamEditors/FlatCAMGeoEditor.py:1559 -#: flatcamEditors/FlatCAMGrbEditor.py:3728 +#: flatcamEditors/FlatCAMGeoEditor.py:1560 +#: flatcamEditors/FlatCAMGrbEditor.py:4739 msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." msgstr "[WARNING_NOTCL] Geometry shape skew X cancelled..." -#: flatcamEditors/FlatCAMGeoEditor.py:1562 -#: flatcamEditors/FlatCAMGrbEditor.py:3731 +#: flatcamEditors/FlatCAMGeoEditor.py:1563 +#: flatcamEditors/FlatCAMGrbEditor.py:4742 msgid "Skew on Y axis ..." msgstr "Skew on Y axis ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1572 -#: flatcamEditors/FlatCAMGrbEditor.py:3741 +#: flatcamEditors/FlatCAMGeoEditor.py:1573 +#: flatcamEditors/FlatCAMGrbEditor.py:4752 msgid "[success] Geometry shape skew on Y axis done..." msgstr "[success] Geometry shape skew on Y axis done..." -#: flatcamEditors/FlatCAMGeoEditor.py:1576 -#: flatcamEditors/FlatCAMGrbEditor.py:3745 +#: flatcamEditors/FlatCAMGeoEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:4756 msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." msgstr "[WARNING_NOTCL] Geometry shape skew Y cancelled..." -#: flatcamEditors/FlatCAMGeoEditor.py:1934 -#: flatcamEditors/FlatCAMGeoEditor.py:1973 -msgid "Click on CENTER ..." -msgstr "Click on CENTER ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1942 +#: flatcamEditors/FlatCAMGeoEditor.py:1943 +#: flatcamEditors/FlatCAMGeoEditor.py:1987 +#: flatcamEditors/FlatCAMGeoEditor.py:1988 +#: flatcamEditors/FlatCAMGrbEditor.py:1081 +#: flatcamEditors/FlatCAMGrbEditor.py:1082 +#: flatcamEditors/FlatCAMGrbEditor.py:1135 +#: flatcamEditors/FlatCAMGrbEditor.py:1136 +msgid "Click on Center point ..." +msgstr "Click on Center point ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1941 -msgid "Click on Circle perimeter point to complete ..." -msgstr "Click on Circle perimeter point to complete ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1950 +#: flatcamEditors/FlatCAMGrbEditor.py:1090 +msgid "Click on Perimeter point to complete ..." +msgstr "Click on Perimeter point to complete ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1965 +#: flatcamEditors/FlatCAMGeoEditor.py:1979 msgid "[success] Done. Adding Circle completed." msgstr "[success] Done. Adding Circle completed." -#: flatcamEditors/FlatCAMGeoEditor.py:1992 -msgid "Click on Start arc point ..." -msgstr "Click on Start arc point ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2008 +#: flatcamEditors/FlatCAMGrbEditor.py:1161 +msgid "Click on Start point ..." +msgstr "Click on Start point ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1996 -msgid "Click on End arc point to complete ..." -msgstr "Click on End arc point to complete ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2010 +#: flatcamEditors/FlatCAMGrbEditor.py:1163 +msgid "Click on Point3 ..." +msgstr "Click on Point3 ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2151 +#: flatcamEditors/FlatCAMGeoEditor.py:2012 +#: flatcamEditors/FlatCAMGrbEditor.py:1165 +msgid "Click on Stop point ..." +msgstr "Click on Stop point ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2017 +#: flatcamEditors/FlatCAMGrbEditor.py:1170 +msgid "Click on Stop point to complete ..." +msgstr "Click on Stop point to complete ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2019 +#: flatcamEditors/FlatCAMGrbEditor.py:1172 +msgid "Click on Point2 to complete ..." +msgstr "Click on Point2 to complete ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2021 +#: flatcamEditors/FlatCAMGrbEditor.py:1174 +msgid "Click on Center point to complete ..." +msgstr "Click on Center point to complete ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2033 +#: flatcamEditors/FlatCAMGrbEditor.py:1186 +#, python-format +msgid "Direction: %s" +msgstr "Direction: %s" + +#: flatcamEditors/FlatCAMGeoEditor.py:2043 +#: flatcamEditors/FlatCAMGrbEditor.py:1196 +msgid "Mode: Start -> Stop -> Center. Click on Start point ..." +msgstr "Mode: Start -> Stop -> Center. Click on Start point ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2046 +#: flatcamEditors/FlatCAMGrbEditor.py:1199 +msgid "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..." +msgstr "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2049 +#: flatcamEditors/FlatCAMGrbEditor.py:1202 +msgid "Mode: Center -> Start -> Stop. Click on Center point ..." +msgstr "Mode: Center -> Start -> Stop. Click on Center point ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2187 msgid "[success] Done. Arc completed." msgstr "[success] Done. Arc completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2163 +#: flatcamEditors/FlatCAMGeoEditor.py:2206 msgid "Click on 1st corner ..." msgstr "Click on 1st corner ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2191 +#: flatcamEditors/FlatCAMGeoEditor.py:2239 msgid "[success] Done. Rectangle completed." msgstr "[success] Done. Rectangle completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2203 -#: flatcamEditors/FlatCAMGrbEditor.py:452 +#: flatcamEditors/FlatCAMGeoEditor.py:2258 +#: flatcamEditors/FlatCAMGrbEditor.py:627 msgid "Click on 1st point ..." msgstr "Click on 1st point ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2210 -#: flatcamEditors/FlatCAMGrbEditor.py:459 +#: flatcamEditors/FlatCAMGeoEditor.py:2265 +#: flatcamEditors/FlatCAMGrbEditor.py:637 +#: flatcamEditors/FlatCAMGrbEditor.py:904 msgid "Click on next Point or click Right mouse button to complete ..." msgstr "Click on next Point or click Right mouse button to complete ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2233 +#: flatcamEditors/FlatCAMGeoEditor.py:2293 msgid "[success] Done. Polygon completed." msgstr "[success] Done. Polygon completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2252 -#: flatcamEditors/FlatCAMGrbEditor.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:2303 +#: flatcamEditors/FlatCAMGeoEditor.py:2349 +#: flatcamEditors/FlatCAMGrbEditor.py:808 +#: flatcamEditors/FlatCAMGrbEditor.py:981 +msgid "Backtracked one point ..." +msgstr "Backtracked one point ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2331 msgid "[success] Done. Path completed." msgstr "[success] Done. Path completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2354 -#: flatcamEditors/FlatCAMGeoEditor.py:3442 +#: flatcamEditors/FlatCAMGeoEditor.py:2443 +#: flatcamEditors/FlatCAMGeoEditor.py:3539 msgid "[WARNING_NOTCL] Move cancelled. No shape selected." msgstr "[WARNING_NOTCL] Move cancelled. No shape selected." -#: flatcamEditors/FlatCAMGeoEditor.py:2358 +#: flatcamEditors/FlatCAMGeoEditor.py:2447 msgid "Click on reference point." msgstr "Click on reference point." -#: flatcamEditors/FlatCAMGeoEditor.py:2361 +#: flatcamEditors/FlatCAMGeoEditor.py:2450 msgid "Click on destination point." msgstr "Click on destination point." -#: flatcamEditors/FlatCAMGeoEditor.py:2392 +#: flatcamEditors/FlatCAMGeoEditor.py:2481 msgid "[success] Done. Geometry(s) Move completed." msgstr "[success] Done. Geometry(s) Move completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2437 +#: flatcamEditors/FlatCAMGeoEditor.py:2526 msgid "[success] Done. Geometry(s) Copy completed." msgstr "[success] Done. Geometry(s) Copy completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2449 +#: flatcamEditors/FlatCAMGeoEditor.py:2538 msgid "Click on the Destination point..." msgstr "Click on the Destination point..." -#: flatcamEditors/FlatCAMGeoEditor.py:2463 +#: flatcamEditors/FlatCAMGeoEditor.py:2552 #, python-format msgid "" "[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " @@ -2843,65 +2928,59 @@ msgstr "" "[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " "supported. Error: %s" -#: flatcamEditors/FlatCAMGeoEditor.py:2473 +#: flatcamEditors/FlatCAMGeoEditor.py:2562 msgid "[success] Done. Adding Text completed." msgstr "[success] Done. Adding Text completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2501 +#: flatcamEditors/FlatCAMGeoEditor.py:2590 msgid "Create buffer geometry ..." msgstr "Create buffer geometry ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2512 -#: flatcamEditors/FlatCAMGeoEditor.py:2538 -#: flatcamEditors/FlatCAMGeoEditor.py:2564 +#: flatcamEditors/FlatCAMGeoEditor.py:2601 +#: flatcamEditors/FlatCAMGeoEditor.py:2627 +#: flatcamEditors/FlatCAMGeoEditor.py:2653 msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." msgstr "[WARNING_NOTCL] Buffer cancelled. No shape selected." -#: flatcamEditors/FlatCAMGeoEditor.py:2534 -#: flatcamEditors/FlatCAMGrbEditor.py:2698 +#: flatcamEditors/FlatCAMGeoEditor.py:2623 +#: flatcamEditors/FlatCAMGrbEditor.py:3709 msgid "[success] Done. Buffer Tool completed." msgstr "[success] Done. Buffer Tool completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2560 +#: flatcamEditors/FlatCAMGeoEditor.py:2649 msgid "[success] Done. Buffer Int Tool completed." msgstr "[success] Done. Buffer Int Tool completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2586 +#: flatcamEditors/FlatCAMGeoEditor.py:2675 msgid "[success] Done. Buffer Ext Tool completed." msgstr "[success] Done. Buffer Ext Tool completed." -#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2708 msgid "Create Paint geometry ..." msgstr "Create Paint geometry ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2633 -#: flatcamEditors/FlatCAMGrbEditor.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:2722 +#: flatcamEditors/FlatCAMGrbEditor.py:1657 msgid "Shape transformations ..." msgstr "Shape transformations ..." -#: flatcamEditors/FlatCAMGeoEditor.py:3077 +#: flatcamEditors/FlatCAMGeoEditor.py:3174 #, python-brace-format msgid "[WARNING] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}" msgstr "[WARNING] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}" -#: flatcamEditors/FlatCAMGeoEditor.py:3316 -#: flatcamEditors/FlatCAMGrbEditor.py:2267 flatcamGUI/FlatCAMGUI.py:2320 -#: flatcamGUI/FlatCAMGUI.py:2332 -msgid "[success] Done." -msgstr "[success] Done." - -#: flatcamEditors/FlatCAMGeoEditor.py:3449 +#: flatcamEditors/FlatCAMGeoEditor.py:3546 msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." msgstr "[WARNING_NOTCL] Copy cancelled. No shape selected." -#: flatcamEditors/FlatCAMGeoEditor.py:3456 flatcamGUI/FlatCAMGUI.py:2623 -#: flatcamGUI/FlatCAMGUI.py:2657 flatcamGUI/FlatCAMGUI.py:2675 -#: flatcamGUI/FlatCAMGUI.py:2813 flatcamGUI/FlatCAMGUI.py:2825 -#: flatcamGUI/FlatCAMGUI.py:2859 +#: flatcamEditors/FlatCAMGeoEditor.py:3553 flatcamGUI/FlatCAMGUI.py:2686 +#: flatcamGUI/FlatCAMGUI.py:2732 flatcamGUI/FlatCAMGUI.py:2750 +#: flatcamGUI/FlatCAMGUI.py:2881 flatcamGUI/FlatCAMGUI.py:2893 +#: flatcamGUI/FlatCAMGUI.py:2927 msgid "Click on target point." msgstr "Click on target point." -#: flatcamEditors/FlatCAMGeoEditor.py:3699 +#: flatcamEditors/FlatCAMGeoEditor.py:3796 msgid "" "[WARNING_NOTCL] A selection of at least 2 geo items is required to do " "Intersection." @@ -2909,9 +2988,9 @@ msgstr "" "[WARNING_NOTCL] A selection of at least 2 geo items is required to do " "Intersection." -#: flatcamEditors/FlatCAMGeoEditor.py:3737 -#: flatcamEditors/FlatCAMGeoEditor.py:3774 -#: flatcamEditors/FlatCAMGeoEditor.py:3850 +#: flatcamEditors/FlatCAMGeoEditor.py:3834 +#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3947 msgid "" "[ERROR_NOTCL] Negative buffer value is not accepted. Use Buffer interior to " "generate an 'inside' shape" @@ -2919,52 +2998,52 @@ msgstr "" "[ERROR_NOTCL] Negative buffer value is not accepted. Use Buffer interior to " "generate an 'inside' shape" -#: flatcamEditors/FlatCAMGeoEditor.py:3745 -#: flatcamEditors/FlatCAMGeoEditor.py:3783 -#: flatcamEditors/FlatCAMGeoEditor.py:3858 +#: flatcamEditors/FlatCAMGeoEditor.py:3842 +#: flatcamEditors/FlatCAMGeoEditor.py:3880 +#: flatcamEditors/FlatCAMGeoEditor.py:3955 msgid "[WARNING_NOTCL] Nothing selected for buffering." msgstr "[WARNING_NOTCL] Nothing selected for buffering." -#: flatcamEditors/FlatCAMGeoEditor.py:3749 -#: flatcamEditors/FlatCAMGeoEditor.py:3787 -#: flatcamEditors/FlatCAMGeoEditor.py:3862 +#: flatcamEditors/FlatCAMGeoEditor.py:3846 +#: flatcamEditors/FlatCAMGeoEditor.py:3884 +#: flatcamEditors/FlatCAMGeoEditor.py:3959 msgid "[WARNING_NOTCL] Invalid distance for buffering." msgstr "[WARNING_NOTCL] Invalid distance for buffering." -#: flatcamEditors/FlatCAMGeoEditor.py:3759 -#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3856 +#: flatcamEditors/FlatCAMGeoEditor.py:3968 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value." msgstr "" "[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value." -#: flatcamEditors/FlatCAMGeoEditor.py:3767 +#: flatcamEditors/FlatCAMGeoEditor.py:3864 msgid "[success] Full buffer geometry created." msgstr "[success] Full buffer geometry created." -#: flatcamEditors/FlatCAMGeoEditor.py:3797 +#: flatcamEditors/FlatCAMGeoEditor.py:3894 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value." msgstr "" "[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value." -#: flatcamEditors/FlatCAMGeoEditor.py:3812 +#: flatcamEditors/FlatCAMGeoEditor.py:3909 msgid "[success] Interior buffer geometry created." msgstr "[success] Interior buffer geometry created." -#: flatcamEditors/FlatCAMGeoEditor.py:3883 +#: flatcamEditors/FlatCAMGeoEditor.py:3980 msgid "[success] Exterior buffer geometry created." msgstr "[success] Exterior buffer geometry created." -#: flatcamEditors/FlatCAMGeoEditor.py:3947 +#: flatcamEditors/FlatCAMGeoEditor.py:4044 msgid "[WARNING_NOTCL] Nothing selected for painting." msgstr "[WARNING_NOTCL] Nothing selected for painting." -#: flatcamEditors/FlatCAMGeoEditor.py:3953 +#: flatcamEditors/FlatCAMGeoEditor.py:4050 msgid "[WARNING] Invalid value for {}" msgstr "[WARNING] Invalid value for {}" -#: flatcamEditors/FlatCAMGeoEditor.py:3959 +#: flatcamEditors/FlatCAMGeoEditor.py:4056 msgid "" "[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " "(100%)." @@ -2972,7 +3051,7 @@ msgstr "" "[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " "(100%)." -#: flatcamEditors/FlatCAMGeoEditor.py:4018 +#: flatcamEditors/FlatCAMGeoEditor.py:4115 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -2983,112 +3062,185 @@ msgstr "" "different method of Paint\n" "%s" -#: flatcamEditors/FlatCAMGeoEditor.py:4029 +#: flatcamEditors/FlatCAMGeoEditor.py:4126 msgid "[success] Paint done." msgstr "[success] Paint done." -#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:63 +#: flatcamEditors/FlatCAMGrbEditor.py:52 +msgid "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table" +msgstr "" +"[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table" + +#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:232 +msgid "" +"[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero." +msgstr "" +"[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero." + +#: flatcamEditors/FlatCAMGrbEditor.py:81 flatcamEditors/FlatCAMGrbEditor.py:86 msgid "Click to place ..." msgstr "Click to place ..." -#: flatcamEditors/FlatCAMGrbEditor.py:149 -#: flatcamEditors/FlatCAMGrbEditor.py:386 +#: flatcamEditors/FlatCAMGrbEditor.py:191 +#: flatcamEditors/FlatCAMGrbEditor.py:469 msgid "" "Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'." msgstr "" "Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'." -#: flatcamEditors/FlatCAMGrbEditor.py:161 +#: flatcamEditors/FlatCAMGrbEditor.py:203 msgid "[success] Done. Adding Pad completed." msgstr "[success] Done. Adding Pad completed." -#: flatcamEditors/FlatCAMGrbEditor.py:215 -msgid "[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table" -msgstr "[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table" +#: flatcamEditors/FlatCAMGrbEditor.py:225 +msgid "" +"[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table" +msgstr "" +"[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table" -#: flatcamEditors/FlatCAMGrbEditor.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:304 msgid "Click on the Pad Circular Array Start position" msgstr "Click on the Pad Circular Array Start position" -#: flatcamEditors/FlatCAMGrbEditor.py:411 +#: flatcamEditors/FlatCAMGrbEditor.py:494 msgid "[WARNING_NOTCL] Too many Pads for the selected spacing angle." msgstr "[WARNING_NOTCL] Too many Pads for the selected spacing angle." -#: flatcamEditors/FlatCAMGrbEditor.py:433 +#: flatcamEditors/FlatCAMGrbEditor.py:516 msgid "[success] Done. Pad Array added." msgstr "[success] Done. Pad Array added." -#: flatcamEditors/FlatCAMGrbEditor.py:482 -msgid "[success] Done. Region completed." -msgstr "[success] Done. Region completed." +#: flatcamEditors/FlatCAMGrbEditor.py:537 +msgid "Select shape(s) and then click ..." +msgstr "Select shape(s) and then click ..." -#: flatcamEditors/FlatCAMGrbEditor.py:527 +#: flatcamEditors/FlatCAMGrbEditor.py:548 +msgid "[ERROR_NOTCL] Failed. Nothing selected." +msgstr "[ERROR_NOTCL] Failed. Nothing selected." + +#: flatcamEditors/FlatCAMGrbEditor.py:575 +msgid "[success] Done. Poligonize completed." +msgstr "[success] Done. Poligonize completed." + +#: flatcamEditors/FlatCAMGrbEditor.py:625 +#: flatcamEditors/FlatCAMGrbEditor.py:825 +#: flatcamEditors/FlatCAMGrbEditor.py:849 +msgid "Corner Mode 1: 45 degrees ..." +msgstr "Corner Mode 1: 45 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:813 +#: flatcamEditors/FlatCAMGrbEditor.py:846 +msgid "Corner Mode 2: Reverse 45 degrees ..." +msgstr "Corner Mode 2: Reverse 45 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:816 +#: flatcamEditors/FlatCAMGrbEditor.py:843 +msgid "Corner Mode 3: 90 degrees ..." +msgstr "Corner Mode 3: 90 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:819 +#: flatcamEditors/FlatCAMGrbEditor.py:840 +msgid "Corner Mode 4: Reverse 90 degrees ..." +msgstr "Corner Mode 4: Reverse 90 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:822 +#: flatcamEditors/FlatCAMGrbEditor.py:837 +msgid "Corner Mode 5: Free angle ..." +msgstr "Corner Mode 5: Free angle ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:875 +#: flatcamEditors/FlatCAMGrbEditor.py:1012 +#: flatcamEditors/FlatCAMGrbEditor.py:1050 +msgid "Track Mode 1: 45 degrees ..." +msgstr "Track Mode 1: 45 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:992 +#: flatcamEditors/FlatCAMGrbEditor.py:1045 +msgid "Track Mode 2: Reverse 45 degrees ..." +msgstr "Track Mode 2: Reverse 45 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1040 +msgid "Track Mode 3: 90 degrees ..." +msgstr "Track Mode 3: 90 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1002 +#: flatcamEditors/FlatCAMGrbEditor.py:1035 +msgid "Track Mode 4: Reverse 90 degrees ..." +msgstr "Track Mode 4: Reverse 90 degrees ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1007 +#: flatcamEditors/FlatCAMGrbEditor.py:1030 +msgid "Track Mode 5: Free angle ..." +msgstr "Track Mode 5: Free angle ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1360 msgid "Scale the selected Gerber apertures ..." msgstr "Scale the selected Gerber apertures ..." -#: flatcamEditors/FlatCAMGrbEditor.py:564 +#: flatcamEditors/FlatCAMGrbEditor.py:1402 msgid "Buffer the selected apertures ..." msgstr "Buffer the selected apertures ..." -#: flatcamEditors/FlatCAMGrbEditor.py:660 +#: flatcamEditors/FlatCAMGrbEditor.py:1503 msgid "[success] Done. Apertures Move completed." msgstr "[success] Done. Apertures Move completed." -#: flatcamEditors/FlatCAMGrbEditor.py:710 +#: flatcamEditors/FlatCAMGrbEditor.py:1558 msgid "[success] Done. Apertures copied." msgstr "[success] Done. Apertures copied." -#: flatcamEditors/FlatCAMGrbEditor.py:833 flatcamGUI/FlatCAMGUI.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:1698 flatcamGUI/FlatCAMGUI.py:1574 msgid "Gerber Editor" msgstr "Gerber Editor" -#: flatcamEditors/FlatCAMGrbEditor.py:852 flatcamGUI/ObjectUI.py:192 +#: flatcamEditors/FlatCAMGrbEditor.py:1717 flatcamGUI/ObjectUI.py:192 msgid "Apertures:" msgstr "Apertures:" -#: flatcamEditors/FlatCAMGrbEditor.py:854 flatcamGUI/ObjectUI.py:194 +#: flatcamEditors/FlatCAMGrbEditor.py:1719 flatcamGUI/ObjectUI.py:194 msgid "Apertures Table for the Gerber Object." msgstr "Apertures Table for the Gerber Object." -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Code" msgstr "Code" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 msgid "Type" msgstr "Type" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Size" msgstr "Size" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Dim" msgstr "Dim" -#: flatcamEditors/FlatCAMGrbEditor.py:869 flatcamGUI/ObjectUI.py:232 +#: flatcamEditors/FlatCAMGrbEditor.py:1734 flatcamGUI/ObjectUI.py:232 msgid "Index" msgstr "Index" -#: flatcamEditors/FlatCAMGrbEditor.py:871 flatcamGUI/ObjectUI.py:234 +#: flatcamEditors/FlatCAMGrbEditor.py:1736 flatcamGUI/ObjectUI.py:234 msgid "Aperture Code" msgstr "Aperture Code" -#: flatcamEditors/FlatCAMGrbEditor.py:873 flatcamGUI/ObjectUI.py:236 +#: flatcamEditors/FlatCAMGrbEditor.py:1738 flatcamGUI/ObjectUI.py:236 msgid "Type of aperture: circular, rectangle, macros etc" msgstr "Type of aperture: circular, rectangle, macros etc" -#: flatcamEditors/FlatCAMGrbEditor.py:875 -#: flatcamEditors/FlatCAMGrbEditor.py:908 flatcamGUI/ObjectUI.py:238 +#: flatcamEditors/FlatCAMGrbEditor.py:1740 +#: flatcamEditors/FlatCAMGrbEditor.py:1773 flatcamGUI/ObjectUI.py:238 msgid "Aperture Size:" msgstr "Aperture Size:" -#: flatcamEditors/FlatCAMGrbEditor.py:877 flatcamGUI/ObjectUI.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:1742 flatcamGUI/ObjectUI.py:240 msgid "" "Aperture Dimensions:\n" " - (width, height) for R, O type.\n" @@ -3098,15 +3250,15 @@ msgstr "" " - (width, height) for R, O type.\n" " - (dia, nVertices) for P type" -#: flatcamEditors/FlatCAMGrbEditor.py:898 +#: flatcamEditors/FlatCAMGrbEditor.py:1763 msgid "Aperture Code:" msgstr "Aperture Code:" -#: flatcamEditors/FlatCAMGrbEditor.py:900 +#: flatcamEditors/FlatCAMGrbEditor.py:1765 msgid "Code for the new aperture" msgstr "Code for the new aperture" -#: flatcamEditors/FlatCAMGrbEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:1775 msgid "" "Size for the new aperture.\n" "If aperture type is 'R' or 'O' then\n" @@ -3120,11 +3272,11 @@ msgstr "" "calculated as:\n" "sqrt(width**2 + height**2)" -#: flatcamEditors/FlatCAMGrbEditor.py:922 +#: flatcamEditors/FlatCAMGrbEditor.py:1787 msgid "Aperture Type:" msgstr "Aperture Type:" -#: flatcamEditors/FlatCAMGrbEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:1789 msgid "" "Select the type of new aperture. Can be:\n" "C = circular\n" @@ -3136,11 +3288,11 @@ msgstr "" "R = rectangular\n" "O = oblong" -#: flatcamEditors/FlatCAMGrbEditor.py:935 +#: flatcamEditors/FlatCAMGrbEditor.py:1800 msgid "Aperture Dim:" msgstr "Aperture Dim:" -#: flatcamEditors/FlatCAMGrbEditor.py:937 +#: flatcamEditors/FlatCAMGrbEditor.py:1802 msgid "" "Dimensions for the new aperture.\n" "Active only for rectangular apertures (type R).\n" @@ -3150,48 +3302,31 @@ msgstr "" "Active only for rectangular apertures (type R).\n" "The format is (width, height)" -#: flatcamEditors/FlatCAMGrbEditor.py:946 -msgid "Add Aperture:" -msgstr "Add Aperture:" +#: flatcamEditors/FlatCAMGrbEditor.py:1811 +msgid "Add/Delete Aperture:" +msgstr "Add/Delete Aperture:" -#: flatcamEditors/FlatCAMGrbEditor.py:948 -msgid "Add an aperture to the aperture list" -msgstr "Add an aperture to the aperture list" +#: flatcamEditors/FlatCAMGrbEditor.py:1813 +msgid "Add/Delete an aperture in the aperture table" +msgstr "Add/Delete an aperture in the aperture table" -#: flatcamEditors/FlatCAMGrbEditor.py:952 -#: flatcamEditors/FlatCAMGrbEditor.py:965 -msgid "Go" -msgstr "Go" - -#: flatcamEditors/FlatCAMGrbEditor.py:954 +#: flatcamEditors/FlatCAMGrbEditor.py:1822 msgid "Add a new aperture to the aperture list." msgstr "Add a new aperture to the aperture list." -#: flatcamEditors/FlatCAMGrbEditor.py:958 -msgid "Del Aperture:" -msgstr "Del Aperture:" - -#: flatcamEditors/FlatCAMGrbEditor.py:960 -msgid "" -"Delete a aperture in the aperture list.\n" -"It will delete also the associated geometry." -msgstr "" -"Delete a aperture in the aperture list.\n" -"It will delete also the associated geometry." - -#: flatcamEditors/FlatCAMGrbEditor.py:967 +#: flatcamEditors/FlatCAMGrbEditor.py:1827 msgid "Delete a aperture in the aperture list" msgstr "Delete a aperture in the aperture list" -#: flatcamEditors/FlatCAMGrbEditor.py:982 +#: flatcamEditors/FlatCAMGrbEditor.py:1843 msgid "Buffer Aperture:" msgstr "Buffer Aperture:" -#: flatcamEditors/FlatCAMGrbEditor.py:984 +#: flatcamEditors/FlatCAMGrbEditor.py:1845 msgid "Buffer a aperture in the aperture list" msgstr "Buffer a aperture in the aperture list" -#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1858 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded.\n" @@ -3205,24 +3340,24 @@ msgstr "" " - 'Beveled:' the corner is a line that directly connects the features " "meeting in the corner" -#: flatcamEditors/FlatCAMGrbEditor.py:1012 flatcamGUI/FlatCAMGUI.py:695 -#: flatcamGUI/FlatCAMGUI.py:1867 +#: flatcamEditors/FlatCAMGrbEditor.py:1873 flatcamGUI/FlatCAMGUI.py:707 +#: flatcamGUI/FlatCAMGUI.py:1911 msgid "Buffer" msgstr "Buffer" -#: flatcamEditors/FlatCAMGrbEditor.py:1026 +#: flatcamEditors/FlatCAMGrbEditor.py:1887 msgid "Scale Aperture:" msgstr "Scale Aperture:" -#: flatcamEditors/FlatCAMGrbEditor.py:1028 +#: flatcamEditors/FlatCAMGrbEditor.py:1889 msgid "Scale a aperture in the aperture list" msgstr "Scale a aperture in the aperture list" -#: flatcamEditors/FlatCAMGrbEditor.py:1036 +#: flatcamEditors/FlatCAMGrbEditor.py:1897 msgid "Scale factor:" msgstr "Scale factor:" -#: flatcamEditors/FlatCAMGrbEditor.py:1038 +#: flatcamEditors/FlatCAMGrbEditor.py:1899 msgid "" "The factor by which to scale the selected aperture.\n" "Values can be between 0.0000 and 999.9999" @@ -3230,16 +3365,16 @@ msgstr "" "The factor by which to scale the selected aperture.\n" "Values can be between 0.0000 and 999.9999" -#: flatcamEditors/FlatCAMGrbEditor.py:1066 flatcamGUI/FlatCAMGUI.py:690 -#: flatcamGUI/FlatCAMGUI.py:1862 +#: flatcamEditors/FlatCAMGrbEditor.py:1927 flatcamGUI/FlatCAMGUI.py:696 +#: flatcamGUI/FlatCAMGUI.py:1906 msgid "Add Pad Array" msgstr "Add Pad Array" -#: flatcamEditors/FlatCAMGrbEditor.py:1068 +#: flatcamEditors/FlatCAMGrbEditor.py:1929 msgid "Add an array of pads (linear or circular array)" msgstr "Add an array of pads (linear or circular array)" -#: flatcamEditors/FlatCAMGrbEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:1935 msgid "" "Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular" @@ -3247,16 +3382,16 @@ msgstr "" "Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular" -#: flatcamEditors/FlatCAMGrbEditor.py:1085 +#: flatcamEditors/FlatCAMGrbEditor.py:1946 msgid "Nr of pads:" msgstr "Nr of pads:" -#: flatcamEditors/FlatCAMGrbEditor.py:1087 +#: flatcamEditors/FlatCAMGrbEditor.py:1948 msgid "Specify how many pads to be in the array." msgstr "Specify how many pads to be in the array." -#: flatcamEditors/FlatCAMGrbEditor.py:1536 -#: flatcamEditors/FlatCAMGrbEditor.py:1540 +#: flatcamEditors/FlatCAMGrbEditor.py:2420 +#: flatcamEditors/FlatCAMGrbEditor.py:2424 msgid "" "[WARNING_NOTCL] Aperture code value is missing or wrong format. Add it and " "retry." @@ -3264,7 +3399,7 @@ msgstr "" "[WARNING_NOTCL] Aperture code value is missing or wrong format. Add it and " "retry." -#: flatcamEditors/FlatCAMGrbEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:2461 msgid "" "[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. Add it " "in format (width, height) and retry." @@ -3272,7 +3407,7 @@ msgstr "" "[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. Add it " "in format (width, height) and retry." -#: flatcamEditors/FlatCAMGrbEditor.py:1589 +#: flatcamEditors/FlatCAMGrbEditor.py:2473 msgid "" "[WARNING_NOTCL] Aperture size value is missing or wrong format. Add it and " "retry." @@ -3280,26 +3415,31 @@ msgstr "" "[WARNING_NOTCL] Aperture size value is missing or wrong format. Add it and " "retry." -#: flatcamEditors/FlatCAMGrbEditor.py:1601 +#: flatcamEditors/FlatCAMGrbEditor.py:2485 msgid "[WARNING_NOTCL] Aperture already in the aperture table." msgstr "[WARNING_NOTCL] Aperture already in the aperture table." -#: flatcamEditors/FlatCAMGrbEditor.py:1608 +#: flatcamEditors/FlatCAMGrbEditor.py:2492 #, python-brace-format msgid "[success] Added new aperture with code: {apid}" msgstr "[success] Added new aperture with code: {apid}" -#: flatcamEditors/FlatCAMGrbEditor.py:1660 +#: flatcamEditors/FlatCAMGrbEditor.py:2521 +#: flatcamEditors/FlatCAMGrbEditor.py:2527 +msgid "[WARNING_NOTCL] Select an aperture in Aperture Table" +msgstr "[WARNING_NOTCL] Select an aperture in Aperture Table" + +#: flatcamEditors/FlatCAMGrbEditor.py:2550 #, python-brace-format msgid "[success] Deleted aperture with code: {del_dia}" msgstr "[success] Deleted aperture with code: {del_dia}" -#: flatcamEditors/FlatCAMGrbEditor.py:1902 +#: flatcamEditors/FlatCAMGrbEditor.py:2851 #, python-format msgid "Adding aperture: %s geo ..." msgstr "Adding aperture: %s geo ..." -#: flatcamEditors/FlatCAMGrbEditor.py:2058 +#: flatcamEditors/FlatCAMGrbEditor.py:3015 msgid "" "[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber " "creation." @@ -3307,23 +3447,27 @@ msgstr "" "[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber " "creation." -#: flatcamEditors/FlatCAMGrbEditor.py:2067 +#: flatcamEditors/FlatCAMGrbEditor.py:3024 msgid "Creating Gerber." msgstr "Creating Gerber." -#: flatcamEditors/FlatCAMGrbEditor.py:2075 +#: flatcamEditors/FlatCAMGrbEditor.py:3032 msgid "[success] Gerber editing finished." msgstr "[success] Gerber editing finished." -#: flatcamEditors/FlatCAMGrbEditor.py:2092 +#: flatcamEditors/FlatCAMGrbEditor.py:3049 msgid "[WARNING_NOTCL] Cancelled. No aperture is selected" msgstr "[WARNING_NOTCL] Cancelled. No aperture is selected" -#: flatcamEditors/FlatCAMGrbEditor.py:2555 -msgid "[success] Done. Apertures deleted." -msgstr "[success] Done. Apertures deleted." +#: flatcamEditors/FlatCAMGrbEditor.py:3549 +msgid "[ERROR_NOTCL] Failed. No aperture geometry is selected." +msgstr "[ERROR_NOTCL] Failed. No aperture geometry is selected." -#: flatcamEditors/FlatCAMGrbEditor.py:2683 +#: flatcamEditors/FlatCAMGrbEditor.py:3557 +msgid "[success] Done. Apertures geometry deleted." +msgstr "[success] Done. Apertures geometry deleted." + +#: flatcamEditors/FlatCAMGrbEditor.py:3694 msgid "" "[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try " "again." @@ -3331,7 +3475,7 @@ msgstr "" "[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try " "again." -#: flatcamEditors/FlatCAMGrbEditor.py:2712 +#: flatcamEditors/FlatCAMGrbEditor.py:3723 msgid "" "[WARNING_NOTCL] Scale factor value is missing or wrong format. Add it and " "retry." @@ -3339,7 +3483,7 @@ msgstr "" "[WARNING_NOTCL] Scale factor value is missing or wrong format. Add it and " "retry." -#: flatcamEditors/FlatCAMGrbEditor.py:2730 +#: flatcamEditors/FlatCAMGrbEditor.py:3741 msgid "" "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " "again." @@ -3347,7 +3491,7 @@ msgstr "" "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " "again." -#: flatcamEditors/FlatCAMGrbEditor.py:2746 +#: flatcamEditors/FlatCAMGrbEditor.py:3757 msgid "[success] Done. Scale Tool completed." msgstr "[success] Done. Scale Tool completed." @@ -3391,7 +3535,8 @@ msgstr "Excellon\tL" msgid "Will create a new, empty Excellon Object." msgstr "Will create a new, empty Excellon Object." -#: flatcamGUI/FlatCAMGUI.py:78 +#: flatcamGUI/FlatCAMGUI.py:78 flatcamTools/ToolPcbWizard.py:63 +#: flatcamTools/ToolPcbWizard.py:71 msgid "Open" msgstr "Open" @@ -3509,7 +3654,7 @@ msgstr "" msgid "Save &Defaults" msgstr "Save &Defaults" -#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:514 +#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:520 msgid "Save" msgstr "Save" @@ -3538,10 +3683,8 @@ msgid "Edit Object\tE" msgstr "Edit Object\tE" #: flatcamGUI/FlatCAMGUI.py:226 -#, fuzzy -#| msgid "Save && Close Editor\tCTRL+S" msgid "Close Editor\tCTRL+S" -msgstr "Save && Close Editor\tCTRL+S" +msgstr "Close Editor\tCTRL+S" #: flatcamGUI/FlatCAMGUI.py:234 msgid "Conversion" @@ -3802,7 +3945,7 @@ msgstr "Copy Geom\tC" msgid "Delete Shape\tDEL" msgstr "Delete Shape\tDEL" -#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:489 +#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:495 msgid "Move\tM" msgstr "Move\tM" @@ -3838,11 +3981,11 @@ msgstr "Add Drill\tD" msgid "Resize Drill(S)\tR" msgstr "Resize Drill(S)\tR" -#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:482 +#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:488 msgid "Copy\tC" msgstr "Copy\tC" -#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:484 +#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:490 msgid "Delete\tDEL" msgstr "Delete\tDEL" @@ -3871,291 +4014,315 @@ msgid "Add Region\tN" msgstr "Add Region\tN" #: flatcamGUI/FlatCAMGUI.py:474 +msgid "Poligonize\tALT+N" +msgstr "Poligonize\tALT+N" + +#: flatcamGUI/FlatCAMGUI.py:476 +msgid "Add SemiDisc\tE" +msgstr "Add SemiDisc\tE" + +#: flatcamGUI/FlatCAMGUI.py:478 +msgid "Add Disc\tD" +msgstr "Add Disc\tD" + +#: flatcamGUI/FlatCAMGUI.py:480 msgid "Buffer\tB" msgstr "Buffer\tB" -#: flatcamGUI/FlatCAMGUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:482 msgid "Scale\tS" msgstr "Scale\tS" -#: flatcamGUI/FlatCAMGUI.py:478 +#: flatcamGUI/FlatCAMGUI.py:484 msgid "Transform\tALT+R" msgstr "Transform\tALT+R" -#: flatcamGUI/FlatCAMGUI.py:505 +#: flatcamGUI/FlatCAMGUI.py:511 msgid "Enable Plot" msgstr "Enable Plot" -#: flatcamGUI/FlatCAMGUI.py:506 +#: flatcamGUI/FlatCAMGUI.py:512 msgid "Disable Plot" msgstr "Disable Plot" -#: flatcamGUI/FlatCAMGUI.py:508 +#: flatcamGUI/FlatCAMGUI.py:514 msgid "Generate CNC" msgstr "Generate CNC" -#: flatcamGUI/FlatCAMGUI.py:509 +#: flatcamGUI/FlatCAMGUI.py:515 msgid "View Source" msgstr "View Source" -#: flatcamGUI/FlatCAMGUI.py:511 flatcamGUI/FlatCAMGUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1592 msgid "Edit" msgstr "Edit" -#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:523 flatcamGUI/FlatCAMGUI.py:1598 #: flatcamTools/ToolProperties.py:25 msgid "Properties" msgstr "Properties" -#: flatcamGUI/FlatCAMGUI.py:546 +#: flatcamGUI/FlatCAMGUI.py:552 msgid "File Toolbar" msgstr "File Toolbar" -#: flatcamGUI/FlatCAMGUI.py:550 +#: flatcamGUI/FlatCAMGUI.py:556 msgid "Edit Toolbar" msgstr "Edit Toolbar" -#: flatcamGUI/FlatCAMGUI.py:554 +#: flatcamGUI/FlatCAMGUI.py:560 msgid "View Toolbar" msgstr "View Toolbar" -#: flatcamGUI/FlatCAMGUI.py:558 +#: flatcamGUI/FlatCAMGUI.py:564 msgid "Shell Toolbar" msgstr "Shell Toolbar" -#: flatcamGUI/FlatCAMGUI.py:562 +#: flatcamGUI/FlatCAMGUI.py:568 msgid "Tools Toolbar" msgstr "Tools Toolbar" -#: flatcamGUI/FlatCAMGUI.py:566 +#: flatcamGUI/FlatCAMGUI.py:572 msgid "Excellon Editor Toolbar" msgstr "Excellon Editor Toolbar" -#: flatcamGUI/FlatCAMGUI.py:570 +#: flatcamGUI/FlatCAMGUI.py:576 msgid "Geometry Editor Toolbar" msgstr "Geometry Editor Toolbar" -#: flatcamGUI/FlatCAMGUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:580 msgid "Gerber Editor Toolbar" msgstr "Gerber Editor Toolbar" -#: flatcamGUI/FlatCAMGUI.py:578 +#: flatcamGUI/FlatCAMGUI.py:584 msgid "Grid Toolbar" msgstr "Grid Toolbar" -#: flatcamGUI/FlatCAMGUI.py:597 flatcamGUI/FlatCAMGUI.py:1765 +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1809 msgid "Open project" msgstr "Open project" -#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1766 +#: flatcamGUI/FlatCAMGUI.py:604 flatcamGUI/FlatCAMGUI.py:1810 msgid "Save project" msgstr "Save project" -#: flatcamGUI/FlatCAMGUI.py:601 flatcamGUI/FlatCAMGUI.py:1769 +#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1813 msgid "New Blank Geometry" msgstr "New Blank Geometry" -#: flatcamGUI/FlatCAMGUI.py:602 +#: flatcamGUI/FlatCAMGUI.py:608 msgid "New Blank Gerber" msgstr "New Blank Gerber" -#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1770 +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1814 msgid "New Blank Excellon" msgstr "New Blank Excellon" -#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1772 +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1816 msgid "Editor" msgstr "Editor" -#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1774 +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1818 msgid "Save Object and close the Editor" msgstr "Save Object and close the Editor" -#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1778 +#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1822 msgid "&Delete" msgstr "&Delete" -#: flatcamGUI/FlatCAMGUI.py:614 flatcamGUI/FlatCAMGUI.py:1781 +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1825 msgid "&Replot" msgstr "&Replot" -#: flatcamGUI/FlatCAMGUI.py:615 flatcamGUI/FlatCAMGUI.py:1782 +#: flatcamGUI/FlatCAMGUI.py:621 flatcamGUI/FlatCAMGUI.py:1826 msgid "&Clear plot" msgstr "&Clear plot" -#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1783 +#: flatcamGUI/FlatCAMGUI.py:622 flatcamGUI/FlatCAMGUI.py:1827 msgid "Zoom In" msgstr "Zoom In" -#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1784 +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1828 msgid "Zoom Out" msgstr "Zoom Out" -#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1518 -#: flatcamGUI/FlatCAMGUI.py:1785 +#: flatcamGUI/FlatCAMGUI.py:624 flatcamGUI/FlatCAMGUI.py:1562 +#: flatcamGUI/FlatCAMGUI.py:1829 msgid "Zoom Fit" msgstr "Zoom Fit" -#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1790 +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1834 msgid "&Command Line" msgstr "&Command Line" -#: flatcamGUI/FlatCAMGUI.py:626 flatcamGUI/FlatCAMGUI.py:1793 +#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1837 msgid "2Sided Tool" msgstr "2Sided Tool" -#: flatcamGUI/FlatCAMGUI.py:627 flatcamGUI/FlatCAMGUI.py:1794 +#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1838 msgid "&Cutout Tool" msgstr "&Cutout Tool" -#: flatcamGUI/FlatCAMGUI.py:628 flatcamGUI/FlatCAMGUI.py:1795 -#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:284 +#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:285 msgid "NCC Tool" msgstr "NCC Tool" -#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1799 +#: flatcamGUI/FlatCAMGUI.py:638 flatcamGUI/FlatCAMGUI.py:1843 msgid "Panel Tool" msgstr "Panel Tool" -#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1800 +#: flatcamGUI/FlatCAMGUI.py:639 flatcamGUI/FlatCAMGUI.py:1844 #: flatcamTools/ToolFilm.py:204 msgid "Film Tool" msgstr "Film Tool" -#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1802 +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1846 msgid "SolderPaste Tool" msgstr "SolderPaste Tool" -#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1806 +#: flatcamGUI/FlatCAMGUI.py:643 flatcamGUI/FlatCAMGUI.py:1850 msgid "Calculators Tool" msgstr "Calculators Tool" -#: flatcamGUI/FlatCAMGUI.py:641 flatcamGUI/FlatCAMGUI.py:655 -#: flatcamGUI/FlatCAMGUI.py:688 flatcamGUI/FlatCAMGUI.py:1810 -#: flatcamGUI/FlatCAMGUI.py:1860 +#: flatcamGUI/FlatCAMGUI.py:647 flatcamGUI/FlatCAMGUI.py:661 +#: flatcamGUI/FlatCAMGUI.py:694 flatcamGUI/FlatCAMGUI.py:1854 +#: flatcamGUI/FlatCAMGUI.py:1904 msgid "Select" msgstr "Select" -#: flatcamGUI/FlatCAMGUI.py:642 flatcamGUI/FlatCAMGUI.py:1811 +#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1855 msgid "Add Drill Hole" msgstr "Add Drill Hole" -#: flatcamGUI/FlatCAMGUI.py:644 flatcamGUI/FlatCAMGUI.py:1813 +#: flatcamGUI/FlatCAMGUI.py:650 flatcamGUI/FlatCAMGUI.py:1857 msgid "Add Drill Hole Array" msgstr "Add Drill Hole Array" -#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1814 +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1858 msgid "Resize Drill" msgstr "Resize Drill" -#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1817 +#: flatcamGUI/FlatCAMGUI.py:654 flatcamGUI/FlatCAMGUI.py:1861 msgid "Copy Drill" msgstr "Copy Drill" -#: flatcamGUI/FlatCAMGUI.py:649 flatcamGUI/FlatCAMGUI.py:1819 +#: flatcamGUI/FlatCAMGUI.py:655 flatcamGUI/FlatCAMGUI.py:1863 msgid "Delete Drill" msgstr "Delete Drill" -#: flatcamGUI/FlatCAMGUI.py:652 flatcamGUI/FlatCAMGUI.py:1822 +#: flatcamGUI/FlatCAMGUI.py:658 flatcamGUI/FlatCAMGUI.py:1866 msgid "Move Drill" msgstr "Move Drill" -#: flatcamGUI/FlatCAMGUI.py:656 flatcamGUI/FlatCAMGUI.py:1826 +#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1870 msgid "Add Circle" msgstr "Add Circle" -#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1827 +#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1871 msgid "Add Arc" msgstr "Add Arc" -#: flatcamGUI/FlatCAMGUI.py:659 flatcamGUI/FlatCAMGUI.py:1829 +#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1873 msgid "Add Rectangle" msgstr "Add Rectangle" -#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1832 +#: flatcamGUI/FlatCAMGUI.py:668 flatcamGUI/FlatCAMGUI.py:1876 msgid "Add Path" msgstr "Add Path" -#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1834 +#: flatcamGUI/FlatCAMGUI.py:669 flatcamGUI/FlatCAMGUI.py:1878 msgid "Add Polygon" msgstr "Add Polygon" -#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1836 +#: flatcamGUI/FlatCAMGUI.py:671 flatcamGUI/FlatCAMGUI.py:1880 msgid "Add Text" msgstr "Add Text" -#: flatcamGUI/FlatCAMGUI.py:666 flatcamGUI/FlatCAMGUI.py:1838 +#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1882 msgid "Add Buffer" msgstr "Add Buffer" -#: flatcamGUI/FlatCAMGUI.py:667 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/FlatCAMGUI.py:673 flatcamGUI/FlatCAMGUI.py:1883 msgid "Paint Shape" msgstr "Paint Shape" -#: flatcamGUI/FlatCAMGUI.py:670 flatcamGUI/FlatCAMGUI.py:1842 +#: flatcamGUI/FlatCAMGUI.py:676 flatcamGUI/FlatCAMGUI.py:1886 msgid "Polygon Union" msgstr "Polygon Union" -#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1844 +#: flatcamGUI/FlatCAMGUI.py:678 flatcamGUI/FlatCAMGUI.py:1888 msgid "Polygon Intersection" msgstr "Polygon Intersection" -#: flatcamGUI/FlatCAMGUI.py:674 flatcamGUI/FlatCAMGUI.py:1846 +#: flatcamGUI/FlatCAMGUI.py:680 flatcamGUI/FlatCAMGUI.py:1890 msgid "Polygon Subtraction" msgstr "Polygon Subtraction" -#: flatcamGUI/FlatCAMGUI.py:677 flatcamGUI/FlatCAMGUI.py:1849 +#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:1893 msgid "Cut Path" msgstr "Cut Path" -#: flatcamGUI/FlatCAMGUI.py:678 +#: flatcamGUI/FlatCAMGUI.py:684 msgid "Copy Shape(s)" msgstr "Copy Shape(s)" -#: flatcamGUI/FlatCAMGUI.py:681 +#: flatcamGUI/FlatCAMGUI.py:687 msgid "Delete Shape '-'" msgstr "Delete Shape '-'" -#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:702 -#: flatcamGUI/FlatCAMGUI.py:1854 flatcamGUI/FlatCAMGUI.py:1874 +#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:714 +#: flatcamGUI/FlatCAMGUI.py:1898 flatcamGUI/FlatCAMGUI.py:1918 msgid "Transformations" msgstr "Transformations" -#: flatcamGUI/FlatCAMGUI.py:685 +#: flatcamGUI/FlatCAMGUI.py:691 msgid "Move Objects " msgstr "Move Objects " -#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:1861 +#: flatcamGUI/FlatCAMGUI.py:695 flatcamGUI/FlatCAMGUI.py:1905 msgid "Add Pad" msgstr "Add Pad" -#: flatcamGUI/FlatCAMGUI.py:691 flatcamGUI/FlatCAMGUI.py:1863 +#: flatcamGUI/FlatCAMGUI.py:697 flatcamGUI/FlatCAMGUI.py:1907 msgid "Add Track" msgstr "Add Track" -#: flatcamGUI/FlatCAMGUI.py:692 flatcamGUI/FlatCAMGUI.py:1864 +#: flatcamGUI/FlatCAMGUI.py:698 flatcamGUI/FlatCAMGUI.py:1908 msgid "Add Region" msgstr "Add Region" -#: flatcamGUI/FlatCAMGUI.py:704 flatcamGUI/FlatCAMGUI.py:1528 -#: flatcamGUI/FlatCAMGUI.py:1538 flatcamGUI/FlatCAMGUI.py:1553 -#: flatcamGUI/FlatCAMGUI.py:1876 flatcamTools/ToolMove.py:26 +#: flatcamGUI/FlatCAMGUI.py:700 +msgid "Poligonize" +msgstr "Poligonize" + +#: flatcamGUI/FlatCAMGUI.py:703 +msgid "SemiDisc" +msgstr "SemiDisc" + +#: flatcamGUI/FlatCAMGUI.py:704 +msgid "Disc" +msgstr "Disc" + +#: flatcamGUI/FlatCAMGUI.py:716 flatcamGUI/FlatCAMGUI.py:1572 +#: flatcamGUI/FlatCAMGUI.py:1582 flatcamGUI/FlatCAMGUI.py:1597 +#: flatcamGUI/FlatCAMGUI.py:1920 flatcamTools/ToolMove.py:26 msgid "Move" msgstr "Move" -#: flatcamGUI/FlatCAMGUI.py:710 flatcamGUI/FlatCAMGUI.py:1882 +#: flatcamGUI/FlatCAMGUI.py:722 flatcamGUI/FlatCAMGUI.py:1926 msgid "Snap to grid" msgstr "Snap to grid" -#: flatcamGUI/FlatCAMGUI.py:713 flatcamGUI/FlatCAMGUI.py:1885 +#: flatcamGUI/FlatCAMGUI.py:725 flatcamGUI/FlatCAMGUI.py:1929 msgid "Grid X snapping distance" msgstr "Grid X snapping distance" -#: flatcamGUI/FlatCAMGUI.py:718 flatcamGUI/FlatCAMGUI.py:1890 +#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1934 msgid "Grid Y snapping distance" msgstr "Grid Y snapping distance" -#: flatcamGUI/FlatCAMGUI.py:724 flatcamGUI/FlatCAMGUI.py:1896 +#: flatcamGUI/FlatCAMGUI.py:736 flatcamGUI/FlatCAMGUI.py:1940 msgid "" "When active, value on Grid_X\n" "is copied to the Grid_Y value." @@ -4163,64 +4330,64 @@ msgstr "" "When active, value on Grid_X\n" "is copied to the Grid_Y value." -#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1902 +#: flatcamGUI/FlatCAMGUI.py:742 flatcamGUI/FlatCAMGUI.py:1946 msgid "Snap to corner" msgstr "Snap to corner" -#: flatcamGUI/FlatCAMGUI.py:734 flatcamGUI/FlatCAMGUI.py:1906 -#: flatcamGUI/FlatCAMGUI.py:3197 +#: flatcamGUI/FlatCAMGUI.py:746 flatcamGUI/FlatCAMGUI.py:1950 +#: flatcamGUI/FlatCAMGUI.py:3286 msgid "Max. magnet distance" msgstr "Max. magnet distance" -#: flatcamGUI/FlatCAMGUI.py:748 flatcamGUI/FlatCAMGUI.py:1512 +#: flatcamGUI/FlatCAMGUI.py:760 flatcamGUI/FlatCAMGUI.py:1556 msgid "Project" msgstr "Project" -#: flatcamGUI/FlatCAMGUI.py:757 +#: flatcamGUI/FlatCAMGUI.py:769 msgid "Selected" msgstr "Selected" -#: flatcamGUI/FlatCAMGUI.py:776 flatcamGUI/FlatCAMGUI.py:784 +#: flatcamGUI/FlatCAMGUI.py:788 flatcamGUI/FlatCAMGUI.py:796 msgid "Plot Area" msgstr "Plot Area" -#: flatcamGUI/FlatCAMGUI.py:808 +#: flatcamGUI/FlatCAMGUI.py:820 msgid "General" msgstr "General" -#: flatcamGUI/FlatCAMGUI.py:817 +#: flatcamGUI/FlatCAMGUI.py:829 msgid "APP. DEFAULTS" msgstr "APP. DEFAULTS" -#: flatcamGUI/FlatCAMGUI.py:818 +#: flatcamGUI/FlatCAMGUI.py:830 msgid "PROJ. OPTIONS " msgstr "PROJ. OPTIONS " -#: flatcamGUI/FlatCAMGUI.py:829 +#: flatcamGUI/FlatCAMGUI.py:841 msgid "GERBER" msgstr "GERBER" -#: flatcamGUI/FlatCAMGUI.py:838 +#: flatcamGUI/FlatCAMGUI.py:850 msgid "EXCELLON" msgstr "EXCELLON" -#: flatcamGUI/FlatCAMGUI.py:847 +#: flatcamGUI/FlatCAMGUI.py:859 msgid "GEOMETRY" msgstr "GEOMETRY" -#: flatcamGUI/FlatCAMGUI.py:857 +#: flatcamGUI/FlatCAMGUI.py:869 msgid "CNC-JOB" msgstr "CNC-JOB" -#: flatcamGUI/FlatCAMGUI.py:866 +#: flatcamGUI/FlatCAMGUI.py:878 msgid "TOOLS" msgstr "TOOLS" -#: flatcamGUI/FlatCAMGUI.py:883 +#: flatcamGUI/FlatCAMGUI.py:895 msgid "Import Preferences" msgstr "Import Preferences" -#: flatcamGUI/FlatCAMGUI.py:886 +#: flatcamGUI/FlatCAMGUI.py:898 msgid "" "Import a full set of FlatCAM settings from a file\n" "previously saved on HDD.\n" @@ -4234,11 +4401,11 @@ msgstr "" "FlatCAM automatically save a 'factory_defaults' file\n" "on the first start. Do not delete that file." -#: flatcamGUI/FlatCAMGUI.py:893 +#: flatcamGUI/FlatCAMGUI.py:905 msgid "Export Preferences" msgstr "Export Preferences" -#: flatcamGUI/FlatCAMGUI.py:896 +#: flatcamGUI/FlatCAMGUI.py:908 msgid "" "Export a full set of FlatCAM settings in a file\n" "that is saved on HDD." @@ -4246,19 +4413,19 @@ msgstr "" "Export a full set of FlatCAM settings in a file\n" "that is saved on HDD." -#: flatcamGUI/FlatCAMGUI.py:901 +#: flatcamGUI/FlatCAMGUI.py:913 msgid "Open Pref Folder" msgstr "Open Pref Folder" -#: flatcamGUI/FlatCAMGUI.py:904 +#: flatcamGUI/FlatCAMGUI.py:916 msgid "Open the folder where FlatCAM save the preferences files." msgstr "Open the folder where FlatCAM save the preferences files." -#: flatcamGUI/FlatCAMGUI.py:912 +#: flatcamGUI/FlatCAMGUI.py:924 msgid "Save Preferences" msgstr "Save Preferences" -#: flatcamGUI/FlatCAMGUI.py:915 +#: flatcamGUI/FlatCAMGUI.py:927 msgid "" "Save the current settings in the 'current_defaults' file\n" "which is the file storing the working default preferences." @@ -4266,7 +4433,286 @@ msgstr "" "Save the current settings in the 'current_defaults' file\n" "which is the file storing the working default preferences." -#: flatcamGUI/FlatCAMGUI.py:941 +#: flatcamGUI/FlatCAMGUI.py:953 +#| msgid "" +#| "General Shortcut list
\n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| "
F3 SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected " +#| "Tab or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'='\n" +#| "  Zoom Out
'-'\n" +#| "  Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+Q PDF Import Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area " +#| "(Left Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
\n" +#| " \n" +#| " " msgid "" "General Shortcut list
\n" "  \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4476,6 +4926,10 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4572,6 +5026,10 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4749,6 +5207,10 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4814,7 +5276,320 @@ msgstr "" " \n" " " -#: flatcamGUI/FlatCAMGUI.py:1218 +#: flatcamGUI/FlatCAMGUI.py:1238 +#| msgid "" +#| "Editor Shortcut list
\n" +#| "
\n" +#| " GEOMETRY EDITOR
\n" +#| " \n" +#| "
B New Gerber
E Edit Object (if selected)
 Paint Area Tool
ALT+Q PDF Import Tool
ALT+R Transformations Tool
 
B New Gerber
E Edit Object (if selected)
 Paint Area Tool
ALT+Q PDF Import Tool
ALT+R Transformations Tool
\n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| "
A Draw an Arc
B Buffer Tool
C Copy Geo Item
D Within Add Arc will toogle the ARC " +#| "direction: CW or CCW
E Polygon Intersection Tool
I Paint Tool
J Jump to Location (x, y)
K Toggle Corner Snap
M Move Geo Item
M Within Add Arc will cycle through the " +#| "ARC modes
N Draw a Polygon
O Draw a Circle
P Draw a Path
R Draw Rectangle
S Polygon Substraction Tool
T Add Text Tool
U Polygon Union Tool
X Flip shape on X axis
Y Flip shape on Y axis
  
SHIFT+X Skew shape on X axis
SHIFT+Y Skew shape on Y axis
  
ALT+R Editor Transformation Tool
ALT+X Offset shape on X axis
ALT+Y Offset shape on Y axis
  
CTRL+M Measurement Tool
CTRL+S Save Object and Exit Editor
CTRL+X Polygon Cut Tool
  
Space Rotate Geometry
ENTER Finish drawing for certain tools
ESC Abort and return to Select
Del Delete Shape
\n" +#| "
\n" +#| "
\n" +#| " EXCELLON EDITOR
\n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| "
A Add Drill Array
C Copy Drill(s)
D Add Drill
J Jump to Location (x, y)
M Move Drill(s)
R Resize Drill(s)
T Add a new Tool
  
Del Delete Drill(s)
Del Alternate: Delete Tool(s)
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
\n" +#| "
\n" +#| "
\n" +#| " GERBER EDITOR
\n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| " \n" +#| "
A Add Pad Array
B Buffer
C Copy
D Add Disc
E Add SemiDisc
J Jump to Location (x, y)
M Move
N Add Region
P Add Pad
R Within Track & Region Tools will cycle " +#| "in REVERSE the bend modes
S Scale
T Add Track
R Within Track & Region Tools will cycle " +#| "FORWARD the bend modes
  
Del Delete
Del Alternate: Delete Apertures
  
ESC Abort and return to Select
CTRL+S Save Object and Exit Editor
  
ALT+R Transformation Tool
\n" +#| " " msgid "" "Editor Shortcut list
\n" "
\n" @@ -4838,6 +5613,11 @@ msgid "" "  Copy Geo Item\n" " \n" " \n" +" D\n" +"  Within Add Arc will toogle the ARC " +"direction: CW or CCW\n" +" \n" +" \n" " E\n" "  Polygon Intersection Tool\n" " \n" @@ -4858,6 +5638,11 @@ msgid "" "  Move Geo Item\n" " \n" " \n" +" M\n" +"  Within Add Arc will cycle through the ARC " +"modes\n" +" \n" +" \n" " N\n" "  Draw a Polygon\n" " \n" @@ -5042,6 +5827,14 @@ msgid "" "  Copy\n" " \n" " \n" +" D\n" +"  Add Disc\n" +" \n" +" \n" +" E\n" +"  Add SemiDisc\n" +" \n" +" \n" " J\n" "  Jump to Location (x, y)\n" " \n" @@ -5058,6 +5851,11 @@ msgid "" "  Add Pad\n" " \n" " \n" +" R\n" +"  Within Track & Region Tools will cycle in " +"REVERSE the bend modes\n" +" \n" +" \n" " S\n" "  Scale\n" " \n" @@ -5066,6 +5864,11 @@ msgid "" "  Add Track\n" " \n" " \n" +" T\n" +"  Within Track & Region Tools will cycle " +"FORWARD the bend modes\n" +" \n" +" \n" "  \n" "  \n" " \n" @@ -5123,6 +5926,11 @@ msgstr "" "  Copy Geo Item\n" " \n" " \n" +" D\n" +"  Within Add Arc will toogle the ARC " +"direction: CW or CCW\n" +" \n" +" \n" " E\n" "  Polygon Intersection Tool\n" " \n" @@ -5143,6 +5951,11 @@ msgstr "" "  Move Geo Item\n" " \n" " \n" +" M\n" +"  Within Add Arc will cycle through the ARC " +"modes\n" +" \n" +" \n" " N\n" "  Draw a Polygon\n" " \n" @@ -5327,6 +6140,14 @@ msgstr "" "  Copy\n" " \n" " \n" +" D\n" +"  Add Disc\n" +" \n" +" \n" +" E\n" +"  Add SemiDisc\n" +" \n" +" \n" " J\n" "  Jump to Location (x, y)\n" " \n" @@ -5343,6 +6164,11 @@ msgstr "" "  Add Pad\n" " \n" " \n" +" R\n" +"  Within Track & Region Tools will cycle in " +"REVERSE the bend modes\n" +" \n" +" \n" " S\n" "  Scale\n" " \n" @@ -5351,6 +6177,11 @@ msgstr "" "  Add Track\n" " \n" " \n" +" T\n" +"  Within Track & Region Tools will cycle " +"FORWARD the bend modes\n" +" \n" +" \n" "  \n" "  \n" " \n" @@ -5386,105 +6217,105 @@ msgstr "" " \n" " " -#: flatcamGUI/FlatCAMGUI.py:1506 +#: flatcamGUI/FlatCAMGUI.py:1550 msgid "Disable" msgstr "Disable" -#: flatcamGUI/FlatCAMGUI.py:1508 +#: flatcamGUI/FlatCAMGUI.py:1552 msgid "New" msgstr "New" -#: flatcamGUI/FlatCAMGUI.py:1509 +#: flatcamGUI/FlatCAMGUI.py:1553 msgid "Geometry" msgstr "Geometry" -#: flatcamGUI/FlatCAMGUI.py:1510 +#: flatcamGUI/FlatCAMGUI.py:1554 msgid "Excellon" msgstr "Excellon" -#: flatcamGUI/FlatCAMGUI.py:1515 +#: flatcamGUI/FlatCAMGUI.py:1559 msgid "Grids" msgstr "Grids" -#: flatcamGUI/FlatCAMGUI.py:1517 +#: flatcamGUI/FlatCAMGUI.py:1561 msgid "View" msgstr "View" -#: flatcamGUI/FlatCAMGUI.py:1519 +#: flatcamGUI/FlatCAMGUI.py:1563 msgid "Clear Plot" msgstr "Clear Plot" -#: flatcamGUI/FlatCAMGUI.py:1520 +#: flatcamGUI/FlatCAMGUI.py:1564 msgid "Replot" msgstr "Replot" -#: flatcamGUI/FlatCAMGUI.py:1523 +#: flatcamGUI/FlatCAMGUI.py:1567 msgid "Geo Editor" msgstr "Geo Editor" -#: flatcamGUI/FlatCAMGUI.py:1524 +#: flatcamGUI/FlatCAMGUI.py:1568 msgid "Line" msgstr "Line" -#: flatcamGUI/FlatCAMGUI.py:1525 +#: flatcamGUI/FlatCAMGUI.py:1569 msgid "Rectangle" msgstr "Rectangle" -#: flatcamGUI/FlatCAMGUI.py:1526 flatcamGUI/FlatCAMGUI.py:5021 +#: flatcamGUI/FlatCAMGUI.py:1570 flatcamGUI/FlatCAMGUI.py:5110 #: flatcamGUI/ObjectUI.py:1360 msgid "Cut" msgstr "Cut" -#: flatcamGUI/FlatCAMGUI.py:1531 +#: flatcamGUI/FlatCAMGUI.py:1575 msgid "Pad" msgstr "Pad" -#: flatcamGUI/FlatCAMGUI.py:1532 +#: flatcamGUI/FlatCAMGUI.py:1576 msgid "Pad Array" msgstr "Pad Array" -#: flatcamGUI/FlatCAMGUI.py:1533 +#: flatcamGUI/FlatCAMGUI.py:1577 msgid "Track" msgstr "Track" -#: flatcamGUI/FlatCAMGUI.py:1534 +#: flatcamGUI/FlatCAMGUI.py:1578 msgid "Region" msgstr "Region" -#: flatcamGUI/FlatCAMGUI.py:1540 +#: flatcamGUI/FlatCAMGUI.py:1584 msgid "Exc Editor" msgstr "Exc Editor" -#: flatcamGUI/FlatCAMGUI.py:1541 +#: flatcamGUI/FlatCAMGUI.py:1585 msgid "Add Drill" msgstr "Add Drill" -#: flatcamGUI/FlatCAMGUI.py:1543 +#: flatcamGUI/FlatCAMGUI.py:1587 msgid "Copy Drill(s)" msgstr "Copy Drill(s)" -#: flatcamGUI/FlatCAMGUI.py:1574 +#: flatcamGUI/FlatCAMGUI.py:1618 msgid "Print Preview" msgstr "Print Preview" -#: flatcamGUI/FlatCAMGUI.py:1575 +#: flatcamGUI/FlatCAMGUI.py:1619 msgid "Print Code" msgstr "Print Code" -#: flatcamGUI/FlatCAMGUI.py:1576 +#: flatcamGUI/FlatCAMGUI.py:1620 msgid "Find in Code" msgstr "Find in Code" -#: flatcamGUI/FlatCAMGUI.py:1581 +#: flatcamGUI/FlatCAMGUI.py:1625 msgid "Replace With" msgstr "Replace With" -#: flatcamGUI/FlatCAMGUI.py:1585 flatcamGUI/FlatCAMGUI.py:5019 -#: flatcamGUI/FlatCAMGUI.py:5529 flatcamGUI/ObjectUI.py:1358 +#: flatcamGUI/FlatCAMGUI.py:1629 flatcamGUI/FlatCAMGUI.py:5108 +#: flatcamGUI/FlatCAMGUI.py:5618 flatcamGUI/ObjectUI.py:1358 msgid "All" msgstr "All" -#: flatcamGUI/FlatCAMGUI.py:1587 +#: flatcamGUI/FlatCAMGUI.py:1631 msgid "" "When checked it will replace all instances in the 'Find' box\n" "with the text in the 'Replace' box.." @@ -5492,15 +6323,15 @@ msgstr "" "When checked it will replace all instances in the 'Find' box\n" "with the text in the 'Replace' box.." -#: flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1634 msgid "Open Code" msgstr "Open Code" -#: flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1635 msgid "Save Code" msgstr "Save Code" -#: flatcamGUI/FlatCAMGUI.py:1626 +#: flatcamGUI/FlatCAMGUI.py:1670 msgid "" "Relative neasurement.\n" "Reference is last click position" @@ -5508,7 +6339,7 @@ msgstr "" "Relative neasurement.\n" "Reference is last click position" -#: flatcamGUI/FlatCAMGUI.py:1632 +#: flatcamGUI/FlatCAMGUI.py:1676 msgid "" "Absolute neasurement.\n" "Reference is (X=0, Y= 0) position" @@ -5516,23 +6347,23 @@ msgstr "" "Absolute neasurement.\n" "Reference is (X=0, Y= 0) position" -#: flatcamGUI/FlatCAMGUI.py:1825 +#: flatcamGUI/FlatCAMGUI.py:1869 msgid "Select 'Esc'" msgstr "Select 'Esc'" -#: flatcamGUI/FlatCAMGUI.py:1850 +#: flatcamGUI/FlatCAMGUI.py:1894 msgid "Copy Objects" msgstr "Copy Objects" -#: flatcamGUI/FlatCAMGUI.py:1852 +#: flatcamGUI/FlatCAMGUI.py:1896 msgid "Delete Shape" msgstr "Delete Shape" -#: flatcamGUI/FlatCAMGUI.py:1857 +#: flatcamGUI/FlatCAMGUI.py:1901 msgid "Move Objects" msgstr "Move Objects" -#: flatcamGUI/FlatCAMGUI.py:2266 +#: flatcamGUI/FlatCAMGUI.py:2319 msgid "" "Please first select a geometry item to be cutted\n" "then select the geometry item that will be cutted\n" @@ -5544,17 +6375,17 @@ msgstr "" "out of the first item. In the end press ~X~ key or\n" "the toolbar button." -#: flatcamGUI/FlatCAMGUI.py:2273 flatcamGUI/FlatCAMGUI.py:2405 -#: flatcamGUI/FlatCAMGUI.py:2464 flatcamGUI/FlatCAMGUI.py:2484 +#: flatcamGUI/FlatCAMGUI.py:2326 flatcamGUI/FlatCAMGUI.py:2463 +#: flatcamGUI/FlatCAMGUI.py:2522 flatcamGUI/FlatCAMGUI.py:2542 msgid "Warning" msgstr "Warning" -#: flatcamGUI/FlatCAMGUI.py:2340 flatcamGUI/FlatCAMGUI.py:2537 -#: flatcamGUI/FlatCAMGUI.py:2735 +#: flatcamGUI/FlatCAMGUI.py:2393 flatcamGUI/FlatCAMGUI.py:2592 +#: flatcamGUI/FlatCAMGUI.py:2803 msgid "[WARNING_NOTCL] Cancelled." msgstr "[WARNING_NOTCL] Cancelled." -#: flatcamGUI/FlatCAMGUI.py:2400 +#: flatcamGUI/FlatCAMGUI.py:2458 msgid "" "Please select geometry items \n" "on which to perform Intersection Tool." @@ -5562,7 +6393,7 @@ msgstr "" "Please select geometry items \n" "on which to perform Intersection Tool." -#: flatcamGUI/FlatCAMGUI.py:2459 +#: flatcamGUI/FlatCAMGUI.py:2517 msgid "" "Please select geometry items \n" "on which to perform Substraction Tool." @@ -5570,7 +6401,7 @@ msgstr "" "Please select geometry items \n" "on which to perform Substraction Tool." -#: flatcamGUI/FlatCAMGUI.py:2479 +#: flatcamGUI/FlatCAMGUI.py:2537 msgid "" "Please select geometry items \n" "on which to perform union." @@ -5578,51 +6409,55 @@ msgstr "" "Please select geometry items \n" "on which to perform union." -#: flatcamGUI/FlatCAMGUI.py:2552 flatcamGUI/FlatCAMGUI.py:2752 +#: flatcamGUI/FlatCAMGUI.py:2608 flatcamGUI/FlatCAMGUI.py:2820 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to delete." msgstr "[WARNING_NOTCL] Cancelled. Nothing selected to delete." -#: flatcamGUI/FlatCAMGUI.py:2629 flatcamGUI/FlatCAMGUI.py:2819 +#: flatcamGUI/FlatCAMGUI.py:2692 flatcamGUI/FlatCAMGUI.py:2887 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to copy." msgstr "[WARNING_NOTCL] Cancelled. Nothing selected to copy." -#: flatcamGUI/FlatCAMGUI.py:2663 flatcamGUI/FlatCAMGUI.py:2865 +#: flatcamGUI/FlatCAMGUI.py:2738 flatcamGUI/FlatCAMGUI.py:2933 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to move." msgstr "[WARNING_NOTCL] Cancelled. Nothing selected to move." -#: flatcamGUI/FlatCAMGUI.py:2879 +#: flatcamGUI/FlatCAMGUI.py:2947 msgid "New Tool ..." msgstr "New Tool ..." -#: flatcamGUI/FlatCAMGUI.py:2880 +#: flatcamGUI/FlatCAMGUI.py:2948 msgid "Enter a Tool Diameter:" msgstr "Enter a Tool Diameter:" -#: flatcamGUI/FlatCAMGUI.py:3182 +#: flatcamGUI/FlatCAMGUI.py:2990 +msgid "Measurement Tool exit..." +msgstr "Measurement Tool exit..." + +#: flatcamGUI/FlatCAMGUI.py:3271 msgid "Grid X value:" msgstr "Grid X value:" -#: flatcamGUI/FlatCAMGUI.py:3184 +#: flatcamGUI/FlatCAMGUI.py:3273 msgid "This is the Grid snap value on X axis." msgstr "This is the Grid snap value on X axis." -#: flatcamGUI/FlatCAMGUI.py:3189 +#: flatcamGUI/FlatCAMGUI.py:3278 msgid "Grid Y value:" msgstr "Grid Y value:" -#: flatcamGUI/FlatCAMGUI.py:3191 +#: flatcamGUI/FlatCAMGUI.py:3280 msgid "This is the Grid snap value on Y axis." msgstr "This is the Grid snap value on Y axis." -#: flatcamGUI/FlatCAMGUI.py:3196 +#: flatcamGUI/FlatCAMGUI.py:3285 msgid "Snap Max:" msgstr "Snap Max:" -#: flatcamGUI/FlatCAMGUI.py:3201 +#: flatcamGUI/FlatCAMGUI.py:3290 msgid "Workspace:" msgstr "Workspace:" -#: flatcamGUI/FlatCAMGUI.py:3203 +#: flatcamGUI/FlatCAMGUI.py:3292 msgid "" "Draw a delimiting rectangle on canvas.\n" "The purpose is to illustrate the limits for our work." @@ -5630,11 +6465,11 @@ msgstr "" "Draw a delimiting rectangle on canvas.\n" "The purpose is to illustrate the limits for our work." -#: flatcamGUI/FlatCAMGUI.py:3206 +#: flatcamGUI/FlatCAMGUI.py:3295 msgid "Wk. format:" msgstr "Wk. format:" -#: flatcamGUI/FlatCAMGUI.py:3208 +#: flatcamGUI/FlatCAMGUI.py:3297 msgid "" "Select the type of rectangle to be used on canvas,\n" "as valid workspace." @@ -5642,11 +6477,11 @@ msgstr "" "Select the type of rectangle to be used on canvas,\n" "as valid workspace." -#: flatcamGUI/FlatCAMGUI.py:3221 +#: flatcamGUI/FlatCAMGUI.py:3310 msgid "Plot Fill:" msgstr "Plot Fill:" -#: flatcamGUI/FlatCAMGUI.py:3223 +#: flatcamGUI/FlatCAMGUI.py:3312 msgid "" "Set the fill color for plotted objects.\n" "First 6 digits are the color and the last 2\n" @@ -5656,28 +6491,28 @@ msgstr "" "First 6 digits are the color and the last 2\n" "digits are for alpha (transparency) level." -#: flatcamGUI/FlatCAMGUI.py:3237 flatcamGUI/FlatCAMGUI.py:3287 -#: flatcamGUI/FlatCAMGUI.py:3337 +#: flatcamGUI/FlatCAMGUI.py:3326 flatcamGUI/FlatCAMGUI.py:3376 +#: flatcamGUI/FlatCAMGUI.py:3426 msgid "Alpha Level:" msgstr "Alpha Level:" -#: flatcamGUI/FlatCAMGUI.py:3239 +#: flatcamGUI/FlatCAMGUI.py:3328 msgid "Set the fill transparency for plotted objects." msgstr "Set the fill transparency for plotted objects." -#: flatcamGUI/FlatCAMGUI.py:3256 +#: flatcamGUI/FlatCAMGUI.py:3345 msgid "Plot Line:" msgstr "Plot Line:" -#: flatcamGUI/FlatCAMGUI.py:3258 +#: flatcamGUI/FlatCAMGUI.py:3347 msgid "Set the line color for plotted objects." msgstr "Set the line color for plotted objects." -#: flatcamGUI/FlatCAMGUI.py:3270 +#: flatcamGUI/FlatCAMGUI.py:3359 msgid "Sel. Fill:" msgstr "Sel. Fill:" -#: flatcamGUI/FlatCAMGUI.py:3272 +#: flatcamGUI/FlatCAMGUI.py:3361 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from left to right.\n" @@ -5689,23 +6524,23 @@ msgstr "" "First 6 digits are the color and the last 2\n" "digits are for alpha (transparency) level." -#: flatcamGUI/FlatCAMGUI.py:3289 +#: flatcamGUI/FlatCAMGUI.py:3378 msgid "Set the fill transparency for the 'left to right' selection box." msgstr "Set the fill transparency for the 'left to right' selection box." -#: flatcamGUI/FlatCAMGUI.py:3306 +#: flatcamGUI/FlatCAMGUI.py:3395 msgid "Sel. Line:" msgstr "Sel. Line:" -#: flatcamGUI/FlatCAMGUI.py:3308 +#: flatcamGUI/FlatCAMGUI.py:3397 msgid "Set the line color for the 'left to right' selection box." msgstr "Set the line color for the 'left to right' selection box." -#: flatcamGUI/FlatCAMGUI.py:3320 +#: flatcamGUI/FlatCAMGUI.py:3409 msgid "Sel2. Fill:" msgstr "Sel2. Fill:" -#: flatcamGUI/FlatCAMGUI.py:3322 +#: flatcamGUI/FlatCAMGUI.py:3411 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from right to left.\n" @@ -5717,43 +6552,43 @@ msgstr "" "First 6 digits are the color and the last 2\n" "digits are for alpha (transparency) level." -#: flatcamGUI/FlatCAMGUI.py:3339 +#: flatcamGUI/FlatCAMGUI.py:3428 msgid "Set the fill transparency for selection 'right to left' box." msgstr "Set the fill transparency for selection 'right to left' box." -#: flatcamGUI/FlatCAMGUI.py:3356 +#: flatcamGUI/FlatCAMGUI.py:3445 msgid "Sel2. Line:" msgstr "Sel2. Line:" -#: flatcamGUI/FlatCAMGUI.py:3358 +#: flatcamGUI/FlatCAMGUI.py:3447 msgid "Set the line color for the 'right to left' selection box." msgstr "Set the line color for the 'right to left' selection box." -#: flatcamGUI/FlatCAMGUI.py:3370 +#: flatcamGUI/FlatCAMGUI.py:3459 msgid "Editor Draw:" msgstr "Editor Draw:" -#: flatcamGUI/FlatCAMGUI.py:3372 +#: flatcamGUI/FlatCAMGUI.py:3461 msgid "Set the color for the shape." msgstr "Set the color for the shape." -#: flatcamGUI/FlatCAMGUI.py:3384 +#: flatcamGUI/FlatCAMGUI.py:3473 msgid "Editor Draw Sel.:" msgstr "Editor Draw Sel.:" -#: flatcamGUI/FlatCAMGUI.py:3386 +#: flatcamGUI/FlatCAMGUI.py:3475 msgid "Set the color of the shape when selected." msgstr "Set the color of the shape when selected." -#: flatcamGUI/FlatCAMGUI.py:3433 +#: flatcamGUI/FlatCAMGUI.py:3522 msgid "GUI Settings" msgstr "GUI Settings" -#: flatcamGUI/FlatCAMGUI.py:3440 +#: flatcamGUI/FlatCAMGUI.py:3529 msgid "Layout:" msgstr "Layout:" -#: flatcamGUI/FlatCAMGUI.py:3442 +#: flatcamGUI/FlatCAMGUI.py:3531 msgid "" "Select an layout for FlatCAM.\n" "It is applied immediately." @@ -5761,11 +6596,11 @@ msgstr "" "Select an layout for FlatCAM.\n" "It is applied immediately." -#: flatcamGUI/FlatCAMGUI.py:3458 +#: flatcamGUI/FlatCAMGUI.py:3547 msgid "Style:" msgstr "Style:" -#: flatcamGUI/FlatCAMGUI.py:3460 +#: flatcamGUI/FlatCAMGUI.py:3549 msgid "" "Select an style for FlatCAM.\n" "It will be applied at the next app start." @@ -5773,11 +6608,11 @@ msgstr "" "Select an style for FlatCAM.\n" "It will be applied at the next app start." -#: flatcamGUI/FlatCAMGUI.py:3471 +#: flatcamGUI/FlatCAMGUI.py:3560 msgid "HDPI Support:" msgstr "HDPI Support:" -#: flatcamGUI/FlatCAMGUI.py:3473 +#: flatcamGUI/FlatCAMGUI.py:3562 msgid "" "Enable High DPI support for FlatCAM.\n" "It will be applied at the next app start." @@ -5785,11 +6620,11 @@ msgstr "" "Enable High DPI support for FlatCAM.\n" "It will be applied at the next app start." -#: flatcamGUI/FlatCAMGUI.py:3486 +#: flatcamGUI/FlatCAMGUI.py:3575 msgid "Clear GUI Settings:" msgstr "Clear GUI Settings:" -#: flatcamGUI/FlatCAMGUI.py:3488 +#: flatcamGUI/FlatCAMGUI.py:3577 msgid "" "Clear the GUI settings for FlatCAM,\n" "such as: layout, gui state, style, hdpi support etc." @@ -5797,15 +6632,15 @@ msgstr "" "Clear the GUI settings for FlatCAM,\n" "such as: layout, gui state, style, hdpi support etc." -#: flatcamGUI/FlatCAMGUI.py:3491 +#: flatcamGUI/FlatCAMGUI.py:3580 msgid "Clear" msgstr "Clear" -#: flatcamGUI/FlatCAMGUI.py:3495 +#: flatcamGUI/FlatCAMGUI.py:3584 msgid "Hover Shape:" msgstr "Hover Shape:" -#: flatcamGUI/FlatCAMGUI.py:3497 +#: flatcamGUI/FlatCAMGUI.py:3586 msgid "" "Enable display of a hover shape for FlatCAM objects.\n" "It is displayed whenever the mouse cursor is hovering\n" @@ -5815,23 +6650,23 @@ msgstr "" "It is displayed whenever the mouse cursor is hovering\n" "over any kind of not-selected object." -#: flatcamGUI/FlatCAMGUI.py:3537 +#: flatcamGUI/FlatCAMGUI.py:3626 msgid "Are you sure you want to delete the GUI Settings? \n" msgstr "Are you sure you want to delete the GUI Settings? \n" -#: flatcamGUI/FlatCAMGUI.py:3540 +#: flatcamGUI/FlatCAMGUI.py:3629 msgid "Clear GUI Settings" msgstr "Clear GUI Settings" -#: flatcamGUI/FlatCAMGUI.py:3561 +#: flatcamGUI/FlatCAMGUI.py:3650 msgid "App Preferences" msgstr "App Preferences" -#: flatcamGUI/FlatCAMGUI.py:3567 +#: flatcamGUI/FlatCAMGUI.py:3656 msgid "Units:" msgstr "Units:" -#: flatcamGUI/FlatCAMGUI.py:3568 +#: flatcamGUI/FlatCAMGUI.py:3657 msgid "" "The default value for FlatCAM units.\n" "Whatever is selected here is set every time\n" @@ -5841,11 +6676,11 @@ msgstr "" "Whatever is selected here is set every time\n" "FLatCAM is started." -#: flatcamGUI/FlatCAMGUI.py:3575 +#: flatcamGUI/FlatCAMGUI.py:3664 msgid "APP. LEVEL:" msgstr "APP. LEVEL:" -#: flatcamGUI/FlatCAMGUI.py:3576 +#: flatcamGUI/FlatCAMGUI.py:3665 msgid "" "Choose the default level of usage for FlatCAM.\n" "BASIC level -> reduced functionality, best for beginner's.\n" @@ -5861,31 +6696,31 @@ msgstr "" "The choice here will influence the parameters in\n" "the Selected Tab for all kinds of FlatCAM objects." -#: flatcamGUI/FlatCAMGUI.py:3581 flatcamGUI/FlatCAMGUI.py:4206 +#: flatcamGUI/FlatCAMGUI.py:3670 flatcamGUI/FlatCAMGUI.py:4295 msgid "Basic" msgstr "Basic" -#: flatcamGUI/FlatCAMGUI.py:3582 +#: flatcamGUI/FlatCAMGUI.py:3671 msgid "Advanced" msgstr "Advanced" -#: flatcamGUI/FlatCAMGUI.py:3585 +#: flatcamGUI/FlatCAMGUI.py:3674 msgid "Languages:" msgstr "Languages:" -#: flatcamGUI/FlatCAMGUI.py:3586 +#: flatcamGUI/FlatCAMGUI.py:3675 msgid "Set the language used throughout FlatCAM." msgstr "Set the language used throughout FlatCAM." -#: flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:3678 msgid "Apply Language" msgstr "Apply Language" -#: flatcamGUI/FlatCAMGUI.py:3592 +#: flatcamGUI/FlatCAMGUI.py:3681 msgid "Shell at StartUp:" msgstr "Shell at StartUp:" -#: flatcamGUI/FlatCAMGUI.py:3594 flatcamGUI/FlatCAMGUI.py:3599 +#: flatcamGUI/FlatCAMGUI.py:3683 flatcamGUI/FlatCAMGUI.py:3688 msgid "" "Check this box if you want the shell to\n" "start automatically at startup." @@ -5893,11 +6728,11 @@ msgstr "" "Check this box if you want the shell to\n" "start automatically at startup." -#: flatcamGUI/FlatCAMGUI.py:3604 +#: flatcamGUI/FlatCAMGUI.py:3693 msgid "Version Check:" msgstr "Version Check:" -#: flatcamGUI/FlatCAMGUI.py:3606 flatcamGUI/FlatCAMGUI.py:3611 +#: flatcamGUI/FlatCAMGUI.py:3695 flatcamGUI/FlatCAMGUI.py:3700 msgid "" "Check this box if you want to check\n" "for a new version automatically at startup." @@ -5905,11 +6740,11 @@ msgstr "" "Check this box if you want to check\n" "for a new version automatically at startup." -#: flatcamGUI/FlatCAMGUI.py:3616 +#: flatcamGUI/FlatCAMGUI.py:3705 msgid "Send Stats:" msgstr "Send Stats:" -#: flatcamGUI/FlatCAMGUI.py:3618 flatcamGUI/FlatCAMGUI.py:3623 +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:3712 msgid "" "Check this box if you agree to send anonymous\n" "stats automatically at startup, to help improve FlatCAM." @@ -5917,11 +6752,11 @@ msgstr "" "Check this box if you agree to send anonymous\n" "stats automatically at startup, to help improve FlatCAM." -#: flatcamGUI/FlatCAMGUI.py:3630 +#: flatcamGUI/FlatCAMGUI.py:3719 msgid "Pan Button:" msgstr "Pan Button:" -#: flatcamGUI/FlatCAMGUI.py:3631 +#: flatcamGUI/FlatCAMGUI.py:3720 msgid "" "Select the mouse button to use for panning:\n" "- MMB --> Middle Mouse Button\n" @@ -5931,35 +6766,35 @@ msgstr "" "- MMB --> Middle Mouse Button\n" "- RMB --> Right Mouse Button" -#: flatcamGUI/FlatCAMGUI.py:3634 +#: flatcamGUI/FlatCAMGUI.py:3723 msgid "MMB" msgstr "MMB" -#: flatcamGUI/FlatCAMGUI.py:3635 +#: flatcamGUI/FlatCAMGUI.py:3724 msgid "RMB" msgstr "RMB" -#: flatcamGUI/FlatCAMGUI.py:3638 +#: flatcamGUI/FlatCAMGUI.py:3727 msgid "Multiple Sel:" msgstr "Multiple Sel:" -#: flatcamGUI/FlatCAMGUI.py:3639 +#: flatcamGUI/FlatCAMGUI.py:3728 msgid "Select the key used for multiple selection." msgstr "Select the key used for multiple selection." -#: flatcamGUI/FlatCAMGUI.py:3640 +#: flatcamGUI/FlatCAMGUI.py:3729 msgid "CTRL" msgstr "CTRL" -#: flatcamGUI/FlatCAMGUI.py:3641 +#: flatcamGUI/FlatCAMGUI.py:3730 msgid "SHIFT" msgstr "SHIFT" -#: flatcamGUI/FlatCAMGUI.py:3644 +#: flatcamGUI/FlatCAMGUI.py:3733 msgid "Project at StartUp:" msgstr "Project at StartUp:" -#: flatcamGUI/FlatCAMGUI.py:3646 flatcamGUI/FlatCAMGUI.py:3651 +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:3740 msgid "" "Check this box if you want the project/selected/tool tab area to\n" "to be shown automatically at startup." @@ -5967,11 +6802,11 @@ msgstr "" "Check this box if you want the project/selected/tool tab area to\n" "to be shown automatically at startup." -#: flatcamGUI/FlatCAMGUI.py:3656 +#: flatcamGUI/FlatCAMGUI.py:3745 msgid "Project AutoHide:" msgstr "Project AutoHide:" -#: flatcamGUI/FlatCAMGUI.py:3658 flatcamGUI/FlatCAMGUI.py:3664 +#: flatcamGUI/FlatCAMGUI.py:3747 flatcamGUI/FlatCAMGUI.py:3753 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" @@ -5981,11 +6816,11 @@ msgstr "" "hide automatically when there are no objects loaded and\n" "to show whenever a new object is created." -#: flatcamGUI/FlatCAMGUI.py:3670 +#: flatcamGUI/FlatCAMGUI.py:3759 msgid "Enable ToolTips:" msgstr "Enable ToolTips:" -#: flatcamGUI/FlatCAMGUI.py:3672 flatcamGUI/FlatCAMGUI.py:3677 +#: flatcamGUI/FlatCAMGUI.py:3761 flatcamGUI/FlatCAMGUI.py:3766 msgid "" "Check this box if you want to have toolTips displayed\n" "when hovering with mouse over items throughout the App." @@ -5993,11 +6828,11 @@ msgstr "" "Check this box if you want to have toolTips displayed\n" "when hovering with mouse over items throughout the App." -#: flatcamGUI/FlatCAMGUI.py:3680 +#: flatcamGUI/FlatCAMGUI.py:3769 msgid "Workers number:" msgstr "Workers number:" -#: flatcamGUI/FlatCAMGUI.py:3682 flatcamGUI/FlatCAMGUI.py:3691 +#: flatcamGUI/FlatCAMGUI.py:3771 flatcamGUI/FlatCAMGUI.py:3780 msgid "" "The number of Qthreads made available to the App.\n" "A bigger number may finish the jobs more quickly but\n" @@ -6013,11 +6848,11 @@ msgstr "" "Default value is 2.\n" "After change, it will be applied at next App start." -#: flatcamGUI/FlatCAMGUI.py:3732 +#: flatcamGUI/FlatCAMGUI.py:3821 msgid "Save Compressed Project" msgstr "Save Compressed Project" -#: flatcamGUI/FlatCAMGUI.py:3734 +#: flatcamGUI/FlatCAMGUI.py:3823 msgid "" "Whether to save a compressed or uncompressed project.\n" "When checked it will save a compressed FlatCAM project." @@ -6025,11 +6860,11 @@ msgstr "" "Whether to save a compressed or uncompressed project.\n" "When checked it will save a compressed FlatCAM project." -#: flatcamGUI/FlatCAMGUI.py:3745 +#: flatcamGUI/FlatCAMGUI.py:3834 msgid "Compression Level:" msgstr "Compression Level:" -#: flatcamGUI/FlatCAMGUI.py:3747 +#: flatcamGUI/FlatCAMGUI.py:3836 msgid "" "The level of compression used when saving\n" "a FlatCAM project. Higher value means better compression\n" @@ -6039,47 +6874,47 @@ msgstr "" "a FlatCAM project. Higher value means better compression\n" "but require more RAM usage and more processing time." -#: flatcamGUI/FlatCAMGUI.py:3773 flatcamGUI/FlatCAMGUI.py:4014 -#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/FlatCAMGUI.py:4993 +#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/FlatCAMGUI.py:4103 +#: flatcamGUI/FlatCAMGUI.py:4758 flatcamGUI/FlatCAMGUI.py:5082 #: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:505 #: flatcamGUI/ObjectUI.py:830 flatcamGUI/ObjectUI.py:1344 msgid "Plot Options:" msgstr "Plot Options:" -#: flatcamGUI/FlatCAMGUI.py:3780 flatcamGUI/FlatCAMGUI.py:4026 +#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/FlatCAMGUI.py:4115 #: flatcamGUI/ObjectUI.py:506 msgid "Solid" msgstr "Solid" -#: flatcamGUI/FlatCAMGUI.py:3782 flatcamGUI/ObjectUI.py:158 +#: flatcamGUI/FlatCAMGUI.py:3871 flatcamGUI/ObjectUI.py:158 msgid "Solid color polygons." msgstr "Solid color polygons." -#: flatcamGUI/FlatCAMGUI.py:3787 +#: flatcamGUI/FlatCAMGUI.py:3876 msgid "M-Color" msgstr "M-Color" -#: flatcamGUI/FlatCAMGUI.py:3789 flatcamGUI/ObjectUI.py:166 +#: flatcamGUI/FlatCAMGUI.py:3878 flatcamGUI/ObjectUI.py:166 msgid "Draw polygons in different colors." msgstr "Draw polygons in different colors." -#: flatcamGUI/FlatCAMGUI.py:3794 flatcamGUI/FlatCAMGUI.py:4020 -#: flatcamGUI/FlatCAMGUI.py:4673 flatcamGUI/ObjectUI.py:172 +#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:4109 +#: flatcamGUI/FlatCAMGUI.py:4762 flatcamGUI/ObjectUI.py:172 msgid "Plot" msgstr "Plot" -#: flatcamGUI/FlatCAMGUI.py:3796 flatcamGUI/FlatCAMGUI.py:4675 +#: flatcamGUI/FlatCAMGUI.py:3885 flatcamGUI/FlatCAMGUI.py:4764 #: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:546 #: flatcamGUI/ObjectUI.py:876 flatcamGUI/ObjectUI.py:1431 msgid "Plot (show) this object." msgstr "Plot (show) this object." -#: flatcamGUI/FlatCAMGUI.py:3801 flatcamGUI/FlatCAMGUI.py:4682 -#: flatcamGUI/FlatCAMGUI.py:5029 +#: flatcamGUI/FlatCAMGUI.py:3890 flatcamGUI/FlatCAMGUI.py:4771 +#: flatcamGUI/FlatCAMGUI.py:5118 msgid "Circle Steps:" msgstr "Circle Steps:" -#: flatcamGUI/FlatCAMGUI.py:3803 +#: flatcamGUI/FlatCAMGUI.py:3892 msgid "" "The number of circle steps for Gerber \n" "circular aperture linear approximation." @@ -6087,15 +6922,15 @@ msgstr "" "The number of circle steps for Gerber \n" "circular aperture linear approximation." -#: flatcamGUI/FlatCAMGUI.py:3818 +#: flatcamGUI/FlatCAMGUI.py:3907 msgid "Gerber Options" msgstr "Gerber Options" -#: flatcamGUI/FlatCAMGUI.py:3822 flatcamGUI/ObjectUI.py:251 +#: flatcamGUI/FlatCAMGUI.py:3911 flatcamGUI/ObjectUI.py:251 msgid "Isolation Routing:" msgstr "Isolation Routing:" -#: flatcamGUI/FlatCAMGUI.py:3824 flatcamGUI/ObjectUI.py:253 +#: flatcamGUI/FlatCAMGUI.py:3913 flatcamGUI/ObjectUI.py:253 msgid "" "Create a Geometry object with\n" "toolpaths to cut outside polygons." @@ -6103,17 +6938,17 @@ msgstr "" "Create a Geometry object with\n" "toolpaths to cut outside polygons." -#: flatcamGUI/FlatCAMGUI.py:3835 flatcamGUI/FlatCAMGUI.py:4392 -#: flatcamGUI/FlatCAMGUI.py:5317 flatcamGUI/ObjectUI.py:785 +#: flatcamGUI/FlatCAMGUI.py:3924 flatcamGUI/FlatCAMGUI.py:4481 +#: flatcamGUI/FlatCAMGUI.py:5406 flatcamGUI/ObjectUI.py:785 #: flatcamGUI/ObjectUI.py:801 msgid "Diameter of the cutting tool." msgstr "Diameter of the cutting tool." -#: flatcamGUI/FlatCAMGUI.py:3842 +#: flatcamGUI/FlatCAMGUI.py:3931 msgid "Width (# passes):" msgstr "Width (# passes):" -#: flatcamGUI/FlatCAMGUI.py:3844 flatcamGUI/ObjectUI.py:275 +#: flatcamGUI/FlatCAMGUI.py:3933 flatcamGUI/ObjectUI.py:275 msgid "" "Width of the isolation gap in\n" "number (integer) of tool widths." @@ -6121,11 +6956,11 @@ msgstr "" "Width of the isolation gap in\n" "number (integer) of tool widths." -#: flatcamGUI/FlatCAMGUI.py:3852 flatcamGUI/ObjectUI.py:283 +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:283 msgid "Pass overlap:" msgstr "Pass overlap:" -#: flatcamGUI/FlatCAMGUI.py:3854 flatcamGUI/ObjectUI.py:285 +#: flatcamGUI/FlatCAMGUI.py:3943 flatcamGUI/ObjectUI.py:285 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -6138,11 +6973,11 @@ msgstr "" "A value here of 0.25 means an overlap of 25%% from the tool diameter found " "above." -#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/ObjectUI.py:295 +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:295 msgid "Milling Type:" msgstr "Milling Type:" -#: flatcamGUI/FlatCAMGUI.py:3864 flatcamGUI/ObjectUI.py:297 +#: flatcamGUI/FlatCAMGUI.py:3953 flatcamGUI/ObjectUI.py:297 msgid "" "Milling type:\n" "- climb / best for precision milling and to reduce tool usage\n" @@ -6152,27 +6987,27 @@ msgstr "" "- climb / best for precision milling and to reduce tool usage\n" "- conventional / useful when there is no backlash compensation" -#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/ObjectUI.py:302 +#: flatcamGUI/FlatCAMGUI.py:3958 flatcamGUI/ObjectUI.py:302 msgid "Climb" msgstr "Climb" -#: flatcamGUI/FlatCAMGUI.py:3870 flatcamGUI/ObjectUI.py:303 +#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:303 msgid "Conv." msgstr "Conv." -#: flatcamGUI/FlatCAMGUI.py:3874 +#: flatcamGUI/FlatCAMGUI.py:3963 msgid "Combine Passes" msgstr "Combine Passes" -#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/ObjectUI.py:309 +#: flatcamGUI/FlatCAMGUI.py:3965 flatcamGUI/ObjectUI.py:309 msgid "Combine all passes into one object" msgstr "Combine all passes into one object" -#: flatcamGUI/FlatCAMGUI.py:3881 +#: flatcamGUI/FlatCAMGUI.py:3970 msgid "Clear non-copper:" msgstr "Clear non-copper:" -#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:5205 +#: flatcamGUI/FlatCAMGUI.py:3972 flatcamGUI/FlatCAMGUI.py:5294 #: flatcamGUI/ObjectUI.py:386 msgid "" "Create a Geometry object with\n" @@ -6181,12 +7016,12 @@ msgstr "" "Create a Geometry object with\n" "toolpaths to cut all non-copper regions." -#: flatcamGUI/FlatCAMGUI.py:3892 flatcamGUI/FlatCAMGUI.py:3918 +#: flatcamGUI/FlatCAMGUI.py:3981 flatcamGUI/FlatCAMGUI.py:4007 #: flatcamGUI/ObjectUI.py:430 flatcamGUI/ObjectUI.py:464 msgid "Boundary Margin:" msgstr "Boundary Margin:" -#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/ObjectUI.py:432 +#: flatcamGUI/FlatCAMGUI.py:3983 flatcamGUI/ObjectUI.py:432 msgid "" "Specify the edge of the PCB\n" "by drawing a box around all\n" @@ -6198,11 +7033,11 @@ msgstr "" "objects with this minimum\n" "distance." -#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:3927 +#: flatcamGUI/FlatCAMGUI.py:3993 flatcamGUI/FlatCAMGUI.py:4016 msgid "Rounded corners" msgstr "Rounded corners" -#: flatcamGUI/FlatCAMGUI.py:3906 +#: flatcamGUI/FlatCAMGUI.py:3995 msgid "" "Creates a Geometry objects with polygons\n" "covering the copper-free areas of the PCB." @@ -6210,11 +7045,11 @@ msgstr "" "Creates a Geometry objects with polygons\n" "covering the copper-free areas of the PCB." -#: flatcamGUI/FlatCAMGUI.py:3912 flatcamGUI/ObjectUI.py:454 +#: flatcamGUI/FlatCAMGUI.py:4001 flatcamGUI/ObjectUI.py:454 msgid "Bounding Box:" msgstr "Bounding Box:" -#: flatcamGUI/FlatCAMGUI.py:3920 flatcamGUI/ObjectUI.py:466 +#: flatcamGUI/FlatCAMGUI.py:4009 flatcamGUI/ObjectUI.py:466 msgid "" "Distance of the edges of the box\n" "to the nearest polygon." @@ -6222,7 +7057,7 @@ msgstr "" "Distance of the edges of the box\n" "to the nearest polygon." -#: flatcamGUI/FlatCAMGUI.py:3929 flatcamGUI/ObjectUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/ObjectUI.py:476 msgid "" "If the bounding box is \n" "to have rounded corners\n" @@ -6234,15 +7069,15 @@ msgstr "" "their radius is equal to\n" "the margin." -#: flatcamGUI/FlatCAMGUI.py:3943 +#: flatcamGUI/FlatCAMGUI.py:4032 msgid "Gerber Adv. Options" msgstr "Gerber Adv. Options" -#: flatcamGUI/FlatCAMGUI.py:3947 +#: flatcamGUI/FlatCAMGUI.py:4036 msgid "Advanced Param.:" msgstr "Advanced Param.:" -#: flatcamGUI/FlatCAMGUI.py:3949 +#: flatcamGUI/FlatCAMGUI.py:4038 msgid "" "A list of Gerber advanced parameters.\n" "Those parameters are available only for\n" @@ -6252,11 +7087,11 @@ msgstr "" "Those parameters are available only for\n" "Advanced App. Level." -#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:314 +#: flatcamGUI/FlatCAMGUI.py:4048 flatcamGUI/ObjectUI.py:314 msgid "\"Follow\"" msgstr "\"Follow\"" -#: flatcamGUI/FlatCAMGUI.py:3961 flatcamGUI/ObjectUI.py:316 +#: flatcamGUI/FlatCAMGUI.py:4050 flatcamGUI/ObjectUI.py:316 msgid "" "Generate a 'Follow' geometry.\n" "This means that it will cut through\n" @@ -6266,11 +7101,11 @@ msgstr "" "This means that it will cut through\n" "the middle of the trace." -#: flatcamGUI/FlatCAMGUI.py:3969 +#: flatcamGUI/FlatCAMGUI.py:4058 msgid "Table Show/Hide" msgstr "Table Show/Hide" -#: flatcamGUI/FlatCAMGUI.py:3971 +#: flatcamGUI/FlatCAMGUI.py:4060 msgid "" "Toggle the display of the Gerber Apertures Table.\n" "Also, on hide, it will delete all mark shapes\n" @@ -6280,11 +7115,11 @@ msgstr "" "Also, on hide, it will delete all mark shapes\n" "that are drawn on canvas." -#: flatcamGUI/FlatCAMGUI.py:3979 +#: flatcamGUI/FlatCAMGUI.py:4068 msgid "Ap. Scale Factor:" msgstr "Ap. Scale Factor:" -#: flatcamGUI/FlatCAMGUI.py:3981 +#: flatcamGUI/FlatCAMGUI.py:4070 msgid "" "Change the size of the selected apertures.\n" "Factor by which to multiply\n" @@ -6294,11 +7129,11 @@ msgstr "" "Factor by which to multiply\n" "geometric features of this object." -#: flatcamGUI/FlatCAMGUI.py:3991 +#: flatcamGUI/FlatCAMGUI.py:4080 msgid "Ap. Buffer Factor:" msgstr "Ap. Buffer Factor:" -#: flatcamGUI/FlatCAMGUI.py:3993 +#: flatcamGUI/FlatCAMGUI.py:4082 msgid "" "Change the size of the selected apertures.\n" "Factor by which to expand/shrink\n" @@ -6308,15 +7143,15 @@ msgstr "" "Factor by which to expand/shrink\n" "geometric features of this object." -#: flatcamGUI/FlatCAMGUI.py:4011 +#: flatcamGUI/FlatCAMGUI.py:4100 msgid "Excellon General" msgstr "Excellon General" -#: flatcamGUI/FlatCAMGUI.py:4033 +#: flatcamGUI/FlatCAMGUI.py:4122 msgid "Excellon Format:" msgstr "Excellon Format:" -#: flatcamGUI/FlatCAMGUI.py:4035 +#: flatcamGUI/FlatCAMGUI.py:4124 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -6358,16 +7193,16 @@ msgstr "" "Sprint Layout 2:4 INCH LZ\n" "KiCAD 3:5 INCH TZ" -#: flatcamGUI/FlatCAMGUI.py:4060 +#: flatcamGUI/FlatCAMGUI.py:4149 msgid "INCH:" msgstr "INCH:" -#: flatcamGUI/FlatCAMGUI.py:4063 +#: flatcamGUI/FlatCAMGUI.py:4152 msgid "Default values for INCH are 2:4" msgstr "Default values for INCH are 2:4" -#: flatcamGUI/FlatCAMGUI.py:4071 flatcamGUI/FlatCAMGUI.py:4104 -#: flatcamGUI/FlatCAMGUI.py:4581 +#: flatcamGUI/FlatCAMGUI.py:4160 flatcamGUI/FlatCAMGUI.py:4193 +#: flatcamGUI/FlatCAMGUI.py:4670 msgid "" "This numbers signify the number of digits in\n" "the whole part of Excellon coordinates." @@ -6375,8 +7210,8 @@ msgstr "" "This numbers signify the number of digits in\n" "the whole part of Excellon coordinates." -#: flatcamGUI/FlatCAMGUI.py:4085 flatcamGUI/FlatCAMGUI.py:4118 -#: flatcamGUI/FlatCAMGUI.py:4595 +#: flatcamGUI/FlatCAMGUI.py:4174 flatcamGUI/FlatCAMGUI.py:4207 +#: flatcamGUI/FlatCAMGUI.py:4684 msgid "" "This numbers signify the number of digits in\n" "the decimal part of Excellon coordinates." @@ -6384,19 +7219,19 @@ msgstr "" "This numbers signify the number of digits in\n" "the decimal part of Excellon coordinates." -#: flatcamGUI/FlatCAMGUI.py:4093 +#: flatcamGUI/FlatCAMGUI.py:4182 msgid "METRIC:" msgstr "METRIC:" -#: flatcamGUI/FlatCAMGUI.py:4096 +#: flatcamGUI/FlatCAMGUI.py:4185 msgid "Default values for METRIC are 3:3" msgstr "Default values for METRIC are 3:3" -#: flatcamGUI/FlatCAMGUI.py:4127 +#: flatcamGUI/FlatCAMGUI.py:4216 msgid "Default Zeros:" msgstr "Default Zeros:" -#: flatcamGUI/FlatCAMGUI.py:4130 flatcamGUI/FlatCAMGUI.py:4630 +#: flatcamGUI/FlatCAMGUI.py:4219 flatcamGUI/FlatCAMGUI.py:4719 msgid "" "This sets the type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -6410,15 +7245,15 @@ msgstr "" "If TZ is checked then Trailing Zeros are kept\n" "and Leading Zeros are removed." -#: flatcamGUI/FlatCAMGUI.py:4138 flatcamGUI/FlatCAMGUI.py:4637 +#: flatcamGUI/FlatCAMGUI.py:4227 flatcamGUI/FlatCAMGUI.py:4726 msgid "LZ" msgstr "LZ" -#: flatcamGUI/FlatCAMGUI.py:4139 flatcamGUI/FlatCAMGUI.py:4638 +#: flatcamGUI/FlatCAMGUI.py:4228 flatcamGUI/FlatCAMGUI.py:4727 msgid "TZ" msgstr "TZ" -#: flatcamGUI/FlatCAMGUI.py:4141 +#: flatcamGUI/FlatCAMGUI.py:4230 msgid "" "This sets the default type of Excellon zeros.\n" "If it is not detected in the parsed file the value here\n" @@ -6434,11 +7269,11 @@ msgstr "" "If TZ is checked then Trailing Zeros are kept\n" "and Leading Zeros are removed." -#: flatcamGUI/FlatCAMGUI.py:4155 +#: flatcamGUI/FlatCAMGUI.py:4244 msgid "Default Units:" msgstr "Default Units:" -#: flatcamGUI/FlatCAMGUI.py:4158 +#: flatcamGUI/FlatCAMGUI.py:4247 msgid "" "This sets the default units of Excellon files.\n" "If it is not detected in the parsed file the value here\n" @@ -6450,15 +7285,15 @@ msgstr "" "will be used.Some Excellon files don't have an header\n" "therefore this parameter will be used." -#: flatcamGUI/FlatCAMGUI.py:4166 flatcamGUI/FlatCAMGUI.py:4557 +#: flatcamGUI/FlatCAMGUI.py:4255 flatcamGUI/FlatCAMGUI.py:4646 msgid "INCH" msgstr "INCH" -#: flatcamGUI/FlatCAMGUI.py:4167 flatcamGUI/FlatCAMGUI.py:4558 +#: flatcamGUI/FlatCAMGUI.py:4256 flatcamGUI/FlatCAMGUI.py:4647 msgid "MM" msgstr "MM" -#: flatcamGUI/FlatCAMGUI.py:4169 +#: flatcamGUI/FlatCAMGUI.py:4258 msgid "" "This sets the units of Excellon files.\n" "Some Excellon files don't have an header\n" @@ -6468,15 +7303,15 @@ msgstr "" "Some Excellon files don't have an header\n" "therefore this parameter will be used." -#: flatcamGUI/FlatCAMGUI.py:4185 +#: flatcamGUI/FlatCAMGUI.py:4274 msgid "Excellon Optimization:" msgstr "Excellon Optimization:" -#: flatcamGUI/FlatCAMGUI.py:4192 +#: flatcamGUI/FlatCAMGUI.py:4281 msgid "Algorithm: " msgstr "Algorithm: " -#: flatcamGUI/FlatCAMGUI.py:4195 flatcamGUI/FlatCAMGUI.py:4208 +#: flatcamGUI/FlatCAMGUI.py:4284 flatcamGUI/FlatCAMGUI.py:4297 msgid "" "This sets the optimization type for the Excellon drill path.\n" "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" @@ -6496,15 +7331,15 @@ msgstr "" "If DISABLED, then FlatCAM works in 32bit mode and it uses \n" "Travelling Salesman algorithm for path optimization." -#: flatcamGUI/FlatCAMGUI.py:4205 +#: flatcamGUI/FlatCAMGUI.py:4294 msgid "MH" msgstr "MH" -#: flatcamGUI/FlatCAMGUI.py:4220 +#: flatcamGUI/FlatCAMGUI.py:4309 msgid "Optimization Time: " msgstr "Optimization Time: " -#: flatcamGUI/FlatCAMGUI.py:4223 +#: flatcamGUI/FlatCAMGUI.py:4312 msgid "" "When OR-Tools Metaheuristic (MH) is enabled there is a\n" "maximum threshold for how much time is spent doing the\n" @@ -6516,15 +7351,15 @@ msgstr "" "path optimization. This max duration is set here.\n" "In seconds." -#: flatcamGUI/FlatCAMGUI.py:4264 +#: flatcamGUI/FlatCAMGUI.py:4353 msgid "Excellon Options" msgstr "Excellon Options" -#: flatcamGUI/FlatCAMGUI.py:4267 flatcamGUI/ObjectUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:4356 flatcamGUI/ObjectUI.py:584 msgid "Create CNC Job" msgstr "Create CNC Job" -#: flatcamGUI/FlatCAMGUI.py:4269 +#: flatcamGUI/FlatCAMGUI.py:4358 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object." @@ -6532,13 +7367,13 @@ msgstr "" "Parameters used to create a CNC Job object\n" "for this drill object." -#: flatcamGUI/FlatCAMGUI.py:4277 flatcamGUI/FlatCAMGUI.py:4733 -#: flatcamGUI/FlatCAMGUI.py:5741 flatcamGUI/ObjectUI.py:595 +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/FlatCAMGUI.py:4822 +#: flatcamGUI/FlatCAMGUI.py:5830 flatcamGUI/ObjectUI.py:595 #: flatcamGUI/ObjectUI.py:1059 flatcamTools/ToolCalculators.py:108 msgid "Cut Z:" msgstr "Cut Z:" -#: flatcamGUI/FlatCAMGUI.py:4279 flatcamGUI/ObjectUI.py:597 +#: flatcamGUI/FlatCAMGUI.py:4368 flatcamGUI/ObjectUI.py:597 msgid "" "Drill depth (negative)\n" "below the copper surface." @@ -6546,12 +7381,12 @@ msgstr "" "Drill depth (negative)\n" "below the copper surface." -#: flatcamGUI/FlatCAMGUI.py:4286 flatcamGUI/FlatCAMGUI.py:4766 +#: flatcamGUI/FlatCAMGUI.py:4375 flatcamGUI/FlatCAMGUI.py:4855 #: flatcamGUI/ObjectUI.py:605 flatcamGUI/ObjectUI.py:1095 msgid "Travel Z:" msgstr "Travel Z:" -#: flatcamGUI/FlatCAMGUI.py:4288 flatcamGUI/ObjectUI.py:607 +#: flatcamGUI/FlatCAMGUI.py:4377 flatcamGUI/ObjectUI.py:607 msgid "" "Tool height when travelling\n" "across the XY plane." @@ -6559,11 +7394,11 @@ msgstr "" "Tool height when travelling\n" "across the XY plane." -#: flatcamGUI/FlatCAMGUI.py:4296 flatcamGUI/FlatCAMGUI.py:4776 +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/FlatCAMGUI.py:4865 msgid "Tool change:" msgstr "Tool change:" -#: flatcamGUI/FlatCAMGUI.py:4298 flatcamGUI/FlatCAMGUI.py:4778 +#: flatcamGUI/FlatCAMGUI.py:4387 flatcamGUI/FlatCAMGUI.py:4867 #: flatcamGUI/ObjectUI.py:617 msgid "" "Include tool-change sequence\n" @@ -6572,19 +7407,19 @@ msgstr "" "Include tool-change sequence\n" "in G-Code (Pause for tool change)." -#: flatcamGUI/FlatCAMGUI.py:4305 flatcamGUI/FlatCAMGUI.py:4786 +#: flatcamGUI/FlatCAMGUI.py:4394 flatcamGUI/FlatCAMGUI.py:4875 msgid "Toolchange Z:" msgstr "Toolchange Z:" -#: flatcamGUI/FlatCAMGUI.py:4307 flatcamGUI/FlatCAMGUI.py:4788 +#: flatcamGUI/FlatCAMGUI.py:4396 flatcamGUI/FlatCAMGUI.py:4877 msgid "Toolchange Z position." msgstr "Toolchange Z position." -#: flatcamGUI/FlatCAMGUI.py:4313 +#: flatcamGUI/FlatCAMGUI.py:4402 msgid "Feedrate:" msgstr "Feedrate:" -#: flatcamGUI/FlatCAMGUI.py:4315 +#: flatcamGUI/FlatCAMGUI.py:4404 msgid "" "Tool speed while drilling\n" "(in units per minute)." @@ -6592,11 +7427,11 @@ msgstr "" "Tool speed while drilling\n" "(in units per minute)." -#: flatcamGUI/FlatCAMGUI.py:4323 +#: flatcamGUI/FlatCAMGUI.py:4412 msgid "Spindle Speed:" msgstr "Spindle Speed:" -#: flatcamGUI/FlatCAMGUI.py:4325 flatcamGUI/FlatCAMGUI.py:4818 +#: flatcamGUI/FlatCAMGUI.py:4414 flatcamGUI/FlatCAMGUI.py:4907 #: flatcamGUI/ObjectUI.py:681 msgid "" "Speed of the spindle\n" @@ -6605,12 +7440,12 @@ msgstr "" "Speed of the spindle\n" "in RPM (optional)" -#: flatcamGUI/FlatCAMGUI.py:4333 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:4422 flatcamGUI/FlatCAMGUI.py:4915 #: flatcamGUI/ObjectUI.py:689 flatcamGUI/ObjectUI.py:1218 msgid "Dwell:" msgstr "Dwell:" -#: flatcamGUI/FlatCAMGUI.py:4335 flatcamGUI/FlatCAMGUI.py:4828 +#: flatcamGUI/FlatCAMGUI.py:4424 flatcamGUI/FlatCAMGUI.py:4917 #: flatcamGUI/ObjectUI.py:691 flatcamGUI/ObjectUI.py:1221 msgid "" "Pause to allow the spindle to reach its\n" @@ -6619,21 +7454,21 @@ msgstr "" "Pause to allow the spindle to reach its\n" "speed before cutting." -#: flatcamGUI/FlatCAMGUI.py:4338 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:4427 flatcamGUI/FlatCAMGUI.py:4920 msgid "Duration:" msgstr "Duration:" -#: flatcamGUI/FlatCAMGUI.py:4340 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:4429 flatcamGUI/FlatCAMGUI.py:4922 #: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1228 msgid "Number of milliseconds for spindle to dwell." msgstr "Number of milliseconds for spindle to dwell." -#: flatcamGUI/FlatCAMGUI.py:4352 flatcamGUI/FlatCAMGUI.py:4843 +#: flatcamGUI/FlatCAMGUI.py:4441 flatcamGUI/FlatCAMGUI.py:4932 #: flatcamGUI/ObjectUI.py:704 msgid "Postprocessor:" msgstr "Postprocessor:" -#: flatcamGUI/FlatCAMGUI.py:4354 +#: flatcamGUI/FlatCAMGUI.py:4443 msgid "" "The postprocessor file that dictates\n" "gcode output." @@ -6641,11 +7476,11 @@ msgstr "" "The postprocessor file that dictates\n" "gcode output." -#: flatcamGUI/FlatCAMGUI.py:4364 +#: flatcamGUI/FlatCAMGUI.py:4453 msgid "Gcode: " msgstr "Gcode: " -#: flatcamGUI/FlatCAMGUI.py:4366 +#: flatcamGUI/FlatCAMGUI.py:4455 msgid "" "Choose what to use for GCode generation:\n" "'Drills', 'Slots' or 'Both'.\n" @@ -6657,37 +7492,37 @@ msgstr "" "When choosing 'Slots' or 'Both', slots will be\n" "converted to drills." -#: flatcamGUI/FlatCAMGUI.py:4371 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4460 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:752 msgid "Drills" msgstr "Drills" -#: flatcamGUI/FlatCAMGUI.py:4372 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4461 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:753 msgid "Slots" msgstr "Slots" -#: flatcamGUI/FlatCAMGUI.py:4373 flatcamGUI/ObjectUI.py:754 +#: flatcamGUI/FlatCAMGUI.py:4462 flatcamGUI/ObjectUI.py:754 msgid "Both" msgstr "Both" -#: flatcamGUI/FlatCAMGUI.py:4382 flatcamGUI/ObjectUI.py:769 +#: flatcamGUI/FlatCAMGUI.py:4471 flatcamGUI/ObjectUI.py:769 msgid "Mill Holes" msgstr "Mill Holes" -#: flatcamGUI/FlatCAMGUI.py:4384 flatcamGUI/ObjectUI.py:771 +#: flatcamGUI/FlatCAMGUI.py:4473 flatcamGUI/ObjectUI.py:771 msgid "Create Geometry for milling holes." msgstr "Create Geometry for milling holes." -#: flatcamGUI/FlatCAMGUI.py:4390 +#: flatcamGUI/FlatCAMGUI.py:4479 msgid "Drill Tool dia:" msgstr "Drill Tool dia:" -#: flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/FlatCAMGUI.py:4486 msgid "Slot Tool dia:" msgstr "Slot Tool dia:" -#: flatcamGUI/FlatCAMGUI.py:4399 +#: flatcamGUI/FlatCAMGUI.py:4488 msgid "" "Diameter of the cutting tool\n" "when milling slots." @@ -6695,19 +7530,19 @@ msgstr "" "Diameter of the cutting tool\n" "when milling slots." -#: flatcamGUI/FlatCAMGUI.py:4411 +#: flatcamGUI/FlatCAMGUI.py:4500 msgid "Defaults" msgstr "Defaults" -#: flatcamGUI/FlatCAMGUI.py:4424 +#: flatcamGUI/FlatCAMGUI.py:4513 msgid "Excellon Adv. Options" msgstr "Excellon Adv. Options" -#: flatcamGUI/FlatCAMGUI.py:4430 flatcamGUI/FlatCAMGUI.py:4866 +#: flatcamGUI/FlatCAMGUI.py:4519 flatcamGUI/FlatCAMGUI.py:4955 msgid "Advanced Options:" msgstr "Advanced Options:" -#: flatcamGUI/FlatCAMGUI.py:4432 +#: flatcamGUI/FlatCAMGUI.py:4521 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object that are shown when App Level is Advanced." @@ -6715,11 +7550,11 @@ msgstr "" "Parameters used to create a CNC Job object\n" "for this drill object that are shown when App Level is Advanced." -#: flatcamGUI/FlatCAMGUI.py:4440 +#: flatcamGUI/FlatCAMGUI.py:4529 msgid "Offset Z:" msgstr "Offset Z:" -#: flatcamGUI/FlatCAMGUI.py:4442 flatcamGUI/ObjectUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:4531 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" @@ -6729,20 +7564,20 @@ msgstr "" "to create the desired exit hole diameter due of the tip shape.\n" "The value here can compensate the Cut Z parameter." -#: flatcamGUI/FlatCAMGUI.py:4449 flatcamGUI/FlatCAMGUI.py:4877 +#: flatcamGUI/FlatCAMGUI.py:4538 flatcamGUI/FlatCAMGUI.py:4966 msgid "Toolchange X,Y:" msgstr "Toolchange X,Y:" -#: flatcamGUI/FlatCAMGUI.py:4451 flatcamGUI/FlatCAMGUI.py:4879 +#: flatcamGUI/FlatCAMGUI.py:4540 flatcamGUI/FlatCAMGUI.py:4968 msgid "Toolchange X,Y position." msgstr "Toolchange X,Y position." -#: flatcamGUI/FlatCAMGUI.py:4457 flatcamGUI/FlatCAMGUI.py:4886 +#: flatcamGUI/FlatCAMGUI.py:4546 flatcamGUI/FlatCAMGUI.py:4975 #: flatcamGUI/ObjectUI.py:634 msgid "Start move Z:" msgstr "Start move Z:" -#: flatcamGUI/FlatCAMGUI.py:4459 +#: flatcamGUI/FlatCAMGUI.py:4548 msgid "" "Height of the tool just after start.\n" "Delete the value if you don't need this feature." @@ -6750,12 +7585,12 @@ msgstr "" "Height of the tool just after start.\n" "Delete the value if you don't need this feature." -#: flatcamGUI/FlatCAMGUI.py:4466 flatcamGUI/FlatCAMGUI.py:4896 +#: flatcamGUI/FlatCAMGUI.py:4555 flatcamGUI/FlatCAMGUI.py:4985 #: flatcamGUI/ObjectUI.py:644 flatcamGUI/ObjectUI.py:1141 msgid "End move Z:" msgstr "End move Z:" -#: flatcamGUI/FlatCAMGUI.py:4468 flatcamGUI/FlatCAMGUI.py:4898 +#: flatcamGUI/FlatCAMGUI.py:4557 flatcamGUI/FlatCAMGUI.py:4987 msgid "" "Height of the tool after\n" "the last move at the end of the job." @@ -6763,12 +7598,12 @@ msgstr "" "Height of the tool after\n" "the last move at the end of the job." -#: flatcamGUI/FlatCAMGUI.py:4475 flatcamGUI/FlatCAMGUI.py:4906 +#: flatcamGUI/FlatCAMGUI.py:4564 flatcamGUI/FlatCAMGUI.py:4995 #: flatcamGUI/ObjectUI.py:665 msgid "Feedrate Rapids:" msgstr "Feedrate Rapids:" -#: flatcamGUI/FlatCAMGUI.py:4477 flatcamGUI/ObjectUI.py:667 +#: flatcamGUI/FlatCAMGUI.py:4566 flatcamGUI/ObjectUI.py:667 msgid "" "Tool speed while drilling\n" "(in units per minute).\n" @@ -6782,12 +7617,12 @@ msgstr "" "It is useful only for Marlin,\n" "ignore for any other cases." -#: flatcamGUI/FlatCAMGUI.py:4488 flatcamGUI/FlatCAMGUI.py:4930 +#: flatcamGUI/FlatCAMGUI.py:4577 flatcamGUI/FlatCAMGUI.py:5019 #: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1250 msgid "Probe Z depth:" msgstr "Probe Z depth:" -#: flatcamGUI/FlatCAMGUI.py:4490 flatcamGUI/FlatCAMGUI.py:4932 +#: flatcamGUI/FlatCAMGUI.py:4579 flatcamGUI/FlatCAMGUI.py:5021 #: flatcamGUI/ObjectUI.py:717 flatcamGUI/ObjectUI.py:1253 msgid "" "The maximum depth that the probe is allowed\n" @@ -6796,21 +7631,21 @@ msgstr "" "The maximum depth that the probe is allowed\n" "to probe. Negative value, in current units." -#: flatcamGUI/FlatCAMGUI.py:4498 flatcamGUI/FlatCAMGUI.py:4940 +#: flatcamGUI/FlatCAMGUI.py:4587 flatcamGUI/FlatCAMGUI.py:5029 #: flatcamGUI/ObjectUI.py:727 flatcamGUI/ObjectUI.py:1264 msgid "Feedrate Probe:" msgstr "Feedrate Probe:" -#: flatcamGUI/FlatCAMGUI.py:4500 flatcamGUI/FlatCAMGUI.py:4942 +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/FlatCAMGUI.py:5031 #: flatcamGUI/ObjectUI.py:729 flatcamGUI/ObjectUI.py:1267 msgid "The feedrate used while the probe is probing." msgstr "The feedrate used while the probe is probing." -#: flatcamGUI/FlatCAMGUI.py:4506 flatcamGUI/FlatCAMGUI.py:4949 +#: flatcamGUI/FlatCAMGUI.py:4595 flatcamGUI/FlatCAMGUI.py:5038 msgid "Fast Plunge:" msgstr "Fast Plunge:" -#: flatcamGUI/FlatCAMGUI.py:4508 flatcamGUI/FlatCAMGUI.py:4951 +#: flatcamGUI/FlatCAMGUI.py:4597 flatcamGUI/FlatCAMGUI.py:5040 msgid "" "By checking this, the vertical move from\n" "Z_Toolchange to Z_move is done with G0,\n" @@ -6822,11 +7657,11 @@ msgstr "" "meaning the fastest speed available.\n" "WARNING: the move is done at Toolchange X,Y coords." -#: flatcamGUI/FlatCAMGUI.py:4517 +#: flatcamGUI/FlatCAMGUI.py:4606 msgid "Fast Retract:" msgstr "Fast Retract:" -#: flatcamGUI/FlatCAMGUI.py:4519 +#: flatcamGUI/FlatCAMGUI.py:4608 msgid "" "Exit hole strategy.\n" " - When uncheked, while exiting the drilled hole the drill bit\n" @@ -6842,15 +7677,15 @@ msgstr "" " - 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." -#: flatcamGUI/FlatCAMGUI.py:4538 +#: flatcamGUI/FlatCAMGUI.py:4627 msgid "Excellon Export" msgstr "Excellon Export" -#: flatcamGUI/FlatCAMGUI.py:4541 +#: flatcamGUI/FlatCAMGUI.py:4630 msgid "Export Options:" msgstr "Export Options:" -#: flatcamGUI/FlatCAMGUI.py:4543 +#: flatcamGUI/FlatCAMGUI.py:4632 msgid "" "The parameters set here are used in the file exported\n" "when using the File -> Export -> Export Excellon menu entry." @@ -6858,19 +7693,19 @@ msgstr "" "The parameters set here are used in the file exported\n" "when using the File -> Export -> Export Excellon menu entry." -#: flatcamGUI/FlatCAMGUI.py:4552 +#: flatcamGUI/FlatCAMGUI.py:4641 msgid "Units:" msgstr "Units:" -#: flatcamGUI/FlatCAMGUI.py:4554 flatcamGUI/FlatCAMGUI.py:4560 +#: flatcamGUI/FlatCAMGUI.py:4643 flatcamGUI/FlatCAMGUI.py:4649 msgid "The units used in the Excellon file." msgstr "The units used in the Excellon file." -#: flatcamGUI/FlatCAMGUI.py:4566 +#: flatcamGUI/FlatCAMGUI.py:4655 msgid "Int/Decimals:" msgstr "Int/Decimals:" -#: flatcamGUI/FlatCAMGUI.py:4568 +#: flatcamGUI/FlatCAMGUI.py:4657 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -6882,11 +7717,11 @@ msgstr "" "Here we set the format used when the provided\n" "coordinates are not using period." -#: flatcamGUI/FlatCAMGUI.py:4604 +#: flatcamGUI/FlatCAMGUI.py:4693 msgid "Format:" msgstr "Format:" -#: flatcamGUI/FlatCAMGUI.py:4606 flatcamGUI/FlatCAMGUI.py:4616 +#: flatcamGUI/FlatCAMGUI.py:4695 flatcamGUI/FlatCAMGUI.py:4705 msgid "" "Select the kind of coordinates format used.\n" "Coordinates can be saved with decimal point or without.\n" @@ -6902,19 +7737,19 @@ msgstr "" "Also it will have to be specified if LZ = leading zeros are kept\n" "or TZ = trailing zeros are kept." -#: flatcamGUI/FlatCAMGUI.py:4613 +#: flatcamGUI/FlatCAMGUI.py:4702 msgid "Decimal" msgstr "Decimal" -#: flatcamGUI/FlatCAMGUI.py:4614 +#: flatcamGUI/FlatCAMGUI.py:4703 msgid "No-Decimal" msgstr "No-Decimal" -#: flatcamGUI/FlatCAMGUI.py:4627 +#: flatcamGUI/FlatCAMGUI.py:4716 msgid "Zeros:" msgstr "Zeros:" -#: flatcamGUI/FlatCAMGUI.py:4640 +#: flatcamGUI/FlatCAMGUI.py:4729 msgid "" "This sets the default type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -6928,11 +7763,11 @@ msgstr "" "If TZ is checked then Trailing Zeros are kept\n" "and Leading Zeros are removed." -#: flatcamGUI/FlatCAMGUI.py:4666 +#: flatcamGUI/FlatCAMGUI.py:4755 msgid "Geometry General" msgstr "Geometry General" -#: flatcamGUI/FlatCAMGUI.py:4684 +#: flatcamGUI/FlatCAMGUI.py:4773 msgid "" "The number of circle steps for Geometry \n" "circle and arc shapes linear approximation." @@ -6940,15 +7775,15 @@ msgstr "" "The number of circle steps for Geometry \n" "circle and arc shapes linear approximation." -#: flatcamGUI/FlatCAMGUI.py:4692 +#: flatcamGUI/FlatCAMGUI.py:4781 msgid "Tools" msgstr "Tools" -#: flatcamGUI/FlatCAMGUI.py:4699 +#: flatcamGUI/FlatCAMGUI.py:4788 msgid "Tool dia: " msgstr "Tool dia: " -#: flatcamGUI/FlatCAMGUI.py:4701 +#: flatcamGUI/FlatCAMGUI.py:4790 msgid "" "The diameter of the cutting\n" "tool.." @@ -6956,15 +7791,15 @@ msgstr "" "The diameter of the cutting\n" "tool.." -#: flatcamGUI/FlatCAMGUI.py:4716 +#: flatcamGUI/FlatCAMGUI.py:4805 msgid "Geometry Options" msgstr "Geometry Options" -#: flatcamGUI/FlatCAMGUI.py:4721 +#: flatcamGUI/FlatCAMGUI.py:4810 msgid "Create CNC Job:" msgstr "Create CNC Job:" -#: flatcamGUI/FlatCAMGUI.py:4723 +#: flatcamGUI/FlatCAMGUI.py:4812 msgid "" "Create a CNC Job object\n" "tracing the contours of this\n" @@ -6974,7 +7809,7 @@ msgstr "" "tracing the contours of this\n" "Geometry object." -#: flatcamGUI/FlatCAMGUI.py:4735 flatcamGUI/ObjectUI.py:1062 +#: flatcamGUI/FlatCAMGUI.py:4824 flatcamGUI/ObjectUI.py:1062 msgid "" "Cutting depth (negative)\n" "below the copper surface." @@ -6982,19 +7817,19 @@ msgstr "" "Cutting depth (negative)\n" "below the copper surface." -#: flatcamGUI/FlatCAMGUI.py:4743 +#: flatcamGUI/FlatCAMGUI.py:4832 msgid "Multidepth" msgstr "Multidepth" -#: flatcamGUI/FlatCAMGUI.py:4745 +#: flatcamGUI/FlatCAMGUI.py:4834 msgid "Multidepth usage: True or False." msgstr "Multidepth usage: True or False." -#: flatcamGUI/FlatCAMGUI.py:4750 +#: flatcamGUI/FlatCAMGUI.py:4839 msgid "Depth/Pass:" msgstr "Depth/Pass:" -#: flatcamGUI/FlatCAMGUI.py:4752 +#: flatcamGUI/FlatCAMGUI.py:4841 msgid "" "The depth to cut on each pass,\n" "when multidepth is enabled.\n" @@ -7008,7 +7843,7 @@ msgstr "" "it is a fraction from the depth\n" "which has negative value." -#: flatcamGUI/FlatCAMGUI.py:4768 flatcamGUI/ObjectUI.py:1098 +#: flatcamGUI/FlatCAMGUI.py:4857 flatcamGUI/ObjectUI.py:1098 msgid "" "Height of the tool when\n" "moving without cutting." @@ -7016,11 +7851,11 @@ msgstr "" "Height of the tool when\n" "moving without cutting." -#: flatcamGUI/FlatCAMGUI.py:4795 flatcamGUI/ObjectUI.py:1153 +#: flatcamGUI/FlatCAMGUI.py:4884 flatcamGUI/ObjectUI.py:1153 msgid "Feed Rate X-Y:" msgstr "Feed Rate X-Y:" -#: flatcamGUI/FlatCAMGUI.py:4797 flatcamGUI/ObjectUI.py:1156 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:1156 msgid "" "Cutting speed in the XY\n" "plane in units per minute" @@ -7028,11 +7863,11 @@ msgstr "" "Cutting speed in the XY\n" "plane in units per minute" -#: flatcamGUI/FlatCAMGUI.py:4805 +#: flatcamGUI/FlatCAMGUI.py:4894 msgid "Feed Rate Z:" msgstr "Feed Rate Z:" -#: flatcamGUI/FlatCAMGUI.py:4807 +#: flatcamGUI/FlatCAMGUI.py:4896 msgid "" "Cutting speed in the XY\n" "plane in units per minute.\n" @@ -7042,12 +7877,12 @@ msgstr "" "plane in units per minute.\n" "It is called also Plunge." -#: flatcamGUI/FlatCAMGUI.py:4816 flatcamGUI/ObjectUI.py:679 +#: flatcamGUI/FlatCAMGUI.py:4905 flatcamGUI/ObjectUI.py:679 #: flatcamGUI/ObjectUI.py:1205 msgid "Spindle speed:" msgstr "Spindle speed:" -#: flatcamGUI/FlatCAMGUI.py:4845 +#: flatcamGUI/FlatCAMGUI.py:4934 msgid "" "The postprocessor file that dictates\n" "Machine Code output." @@ -7055,11 +7890,11 @@ msgstr "" "The postprocessor file that dictates\n" "Machine Code output." -#: flatcamGUI/FlatCAMGUI.py:4861 +#: flatcamGUI/FlatCAMGUI.py:4950 msgid "Geometry Adv. Options" msgstr "Geometry Adv. Options" -#: flatcamGUI/FlatCAMGUI.py:4868 +#: flatcamGUI/FlatCAMGUI.py:4957 msgid "" "Parameters to create a CNC Job object\n" "tracing the contours of a Geometry object." @@ -7067,7 +7902,7 @@ msgstr "" "Parameters to create a CNC Job object\n" "tracing the contours of a Geometry object." -#: flatcamGUI/FlatCAMGUI.py:4888 +#: flatcamGUI/FlatCAMGUI.py:4977 msgid "" "Height of the tool just after starting the work.\n" "Delete the value if you don't need this feature." @@ -7075,7 +7910,7 @@ msgstr "" "Height of the tool just after starting the work.\n" "Delete the value if you don't need this feature." -#: flatcamGUI/FlatCAMGUI.py:4908 +#: flatcamGUI/FlatCAMGUI.py:4997 msgid "" "Cutting speed in the XY plane\n" "(in units per minute).\n" @@ -7089,11 +7924,11 @@ msgstr "" "It is useful only for Marlin,\n" "ignore for any other cases." -#: flatcamGUI/FlatCAMGUI.py:4920 +#: flatcamGUI/FlatCAMGUI.py:5009 msgid "Re-cut 1st pt." msgstr "Re-cut 1st pt." -#: flatcamGUI/FlatCAMGUI.py:4922 flatcamGUI/ObjectUI.py:1196 +#: flatcamGUI/FlatCAMGUI.py:5011 flatcamGUI/ObjectUI.py:1196 msgid "" "In order to remove possible\n" "copper leftovers where first cut\n" @@ -7105,11 +7940,11 @@ msgstr "" "meet with last cut, we generate an\n" "extended cut over the first cut section." -#: flatcamGUI/FlatCAMGUI.py:4961 +#: flatcamGUI/FlatCAMGUI.py:5050 msgid "Seg. X size:" msgstr "Seg. X size:" -#: flatcamGUI/FlatCAMGUI.py:4963 +#: flatcamGUI/FlatCAMGUI.py:5052 msgid "" "The size of the trace segment on the X axis.\n" "Useful for auto-leveling.\n" @@ -7119,11 +7954,11 @@ msgstr "" "Useful for auto-leveling.\n" "A value of 0 means no segmentation on the X axis." -#: flatcamGUI/FlatCAMGUI.py:4972 +#: flatcamGUI/FlatCAMGUI.py:5061 msgid "Seg. Y size:" msgstr "Seg. Y size:" -#: flatcamGUI/FlatCAMGUI.py:4974 +#: flatcamGUI/FlatCAMGUI.py:5063 msgid "" "The size of the trace segment on the Y axis.\n" "Useful for auto-leveling.\n" @@ -7133,20 +7968,20 @@ msgstr "" "Useful for auto-leveling.\n" "A value of 0 means no segmentation on the Y axis." -#: flatcamGUI/FlatCAMGUI.py:4990 +#: flatcamGUI/FlatCAMGUI.py:5079 msgid "CNC Job General" msgstr "CNC Job General" -#: flatcamGUI/FlatCAMGUI.py:5003 flatcamGUI/ObjectUI.py:544 +#: flatcamGUI/FlatCAMGUI.py:5092 flatcamGUI/ObjectUI.py:544 #: flatcamGUI/ObjectUI.py:874 flatcamGUI/ObjectUI.py:1428 msgid "Plot Object" msgstr "Plot Object" -#: flatcamGUI/FlatCAMGUI.py:5010 +#: flatcamGUI/FlatCAMGUI.py:5099 msgid "Plot kind:" msgstr "Plot kind:" -#: flatcamGUI/FlatCAMGUI.py:5012 flatcamGUI/ObjectUI.py:1350 +#: flatcamGUI/FlatCAMGUI.py:5101 flatcamGUI/ObjectUI.py:1350 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" @@ -7158,11 +7993,11 @@ msgstr "" "above the work piece or it can be of type 'Cut',\n" "which means the moves that cut into the material." -#: flatcamGUI/FlatCAMGUI.py:5020 flatcamGUI/ObjectUI.py:1359 +#: flatcamGUI/FlatCAMGUI.py:5109 flatcamGUI/ObjectUI.py:1359 msgid "Travel" msgstr "Travel" -#: flatcamGUI/FlatCAMGUI.py:5031 +#: flatcamGUI/FlatCAMGUI.py:5120 msgid "" "The number of circle steps for GCode \n" "circle and arc shapes linear approximation." @@ -7170,7 +8005,7 @@ msgstr "" "The number of circle steps for GCode \n" "circle and arc shapes linear approximation." -#: flatcamGUI/FlatCAMGUI.py:5041 +#: flatcamGUI/FlatCAMGUI.py:5130 msgid "" "Diameter of the tool to be\n" "rendered in the plot." @@ -7178,11 +8013,11 @@ msgstr "" "Diameter of the tool to be\n" "rendered in the plot." -#: flatcamGUI/FlatCAMGUI.py:5049 +#: flatcamGUI/FlatCAMGUI.py:5138 msgid "Coords dec.:" msgstr "Coords dec.:" -#: flatcamGUI/FlatCAMGUI.py:5051 +#: flatcamGUI/FlatCAMGUI.py:5140 msgid "" "The number of decimals to be used for \n" "the X, Y, Z coordinates in CNC code (GCODE, etc.)" @@ -7190,11 +8025,11 @@ msgstr "" "The number of decimals to be used for \n" "the X, Y, Z coordinates in CNC code (GCODE, etc.)" -#: flatcamGUI/FlatCAMGUI.py:5059 +#: flatcamGUI/FlatCAMGUI.py:5148 msgid "Feedrate dec.:" msgstr "Feedrate dec.:" -#: flatcamGUI/FlatCAMGUI.py:5061 +#: flatcamGUI/FlatCAMGUI.py:5150 msgid "" "The number of decimals to be used for \n" "the Feedrate parameter in CNC code (GCODE, etc.)" @@ -7202,15 +8037,15 @@ msgstr "" "The number of decimals to be used for \n" "the Feedrate parameter in CNC code (GCODE, etc.)" -#: flatcamGUI/FlatCAMGUI.py:5076 +#: flatcamGUI/FlatCAMGUI.py:5165 msgid "CNC Job Options" msgstr "CNC Job Options" -#: flatcamGUI/FlatCAMGUI.py:5079 flatcamGUI/FlatCAMGUI.py:5120 +#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/FlatCAMGUI.py:5209 msgid "Export G-Code:" msgstr "Export G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5081 flatcamGUI/FlatCAMGUI.py:5122 +#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/FlatCAMGUI.py:5211 #: flatcamGUI/ObjectUI.py:1464 msgid "" "Export and save G-Code to\n" @@ -7219,11 +8054,11 @@ msgstr "" "Export and save G-Code to\n" "make this object to a file." -#: flatcamGUI/FlatCAMGUI.py:5087 +#: flatcamGUI/FlatCAMGUI.py:5176 msgid "Prepend to G-Code:" msgstr "Prepend to G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5089 +#: flatcamGUI/FlatCAMGUI.py:5178 msgid "" "Type here any G-Code commands you would\n" "like to add at the beginning of the G-Code file." @@ -7231,11 +8066,11 @@ msgstr "" "Type here any G-Code commands you would\n" "like to add at the beginning of the G-Code file." -#: flatcamGUI/FlatCAMGUI.py:5098 +#: flatcamGUI/FlatCAMGUI.py:5187 msgid "Append to G-Code:" msgstr "Append to G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5100 flatcamGUI/ObjectUI.py:1486 +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamGUI/ObjectUI.py:1486 msgid "" "Type here any G-Code commands you would\n" "like to append to the generated file.\n" @@ -7245,15 +8080,15 @@ msgstr "" "like to append to the generated file.\n" "I.e.: M2 (End of program)" -#: flatcamGUI/FlatCAMGUI.py:5117 +#: flatcamGUI/FlatCAMGUI.py:5206 msgid "CNC Job Adv. Options" msgstr "CNC Job Adv. Options" -#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/ObjectUI.py:1504 +#: flatcamGUI/FlatCAMGUI.py:5217 flatcamGUI/ObjectUI.py:1504 msgid "Toolchange G-Code:" msgstr "Toolchange G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5130 +#: flatcamGUI/FlatCAMGUI.py:5219 msgid "" "Type here any G-Code commands you would\n" "like to be executed when Toolchange event is encountered.\n" @@ -7265,11 +8100,11 @@ msgstr "" "This will constitute a Custom Toolchange GCode,\n" "or a Toolchange Macro." -#: flatcamGUI/FlatCAMGUI.py:5144 flatcamGUI/ObjectUI.py:1526 +#: flatcamGUI/FlatCAMGUI.py:5233 flatcamGUI/ObjectUI.py:1526 msgid "Use Toolchange Macro" msgstr "Use Toolchange Macro" -#: flatcamGUI/FlatCAMGUI.py:5146 flatcamGUI/ObjectUI.py:1529 +#: flatcamGUI/FlatCAMGUI.py:5235 flatcamGUI/ObjectUI.py:1529 msgid "" "Check this box if you want to use\n" "a Custom Toolchange GCode (macro)." @@ -7277,7 +8112,7 @@ msgstr "" "Check this box if you want to use\n" "a Custom Toolchange GCode (macro)." -#: flatcamGUI/FlatCAMGUI.py:5158 flatcamGUI/ObjectUI.py:1538 +#: flatcamGUI/FlatCAMGUI.py:5247 flatcamGUI/ObjectUI.py:1538 msgid "" "A list of the FlatCAM variables that can be used\n" "in the Toolchange event.\n" @@ -7287,78 +8122,78 @@ msgstr "" "in the Toolchange event.\n" "They have to be surrounded by the '%' symbol" -#: flatcamGUI/FlatCAMGUI.py:5165 flatcamGUI/ObjectUI.py:1545 +#: flatcamGUI/FlatCAMGUI.py:5254 flatcamGUI/ObjectUI.py:1545 msgid "Parameters" msgstr "Parameters" -#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/ObjectUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:5257 flatcamGUI/ObjectUI.py:1548 msgid "FlatCAM CNC parameters" msgstr "FlatCAM CNC parameters" -#: flatcamGUI/FlatCAMGUI.py:5169 flatcamGUI/ObjectUI.py:1549 +#: flatcamGUI/FlatCAMGUI.py:5258 flatcamGUI/ObjectUI.py:1549 msgid "tool = tool number" msgstr "tool = tool number" -#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/ObjectUI.py:1550 +#: flatcamGUI/FlatCAMGUI.py:5259 flatcamGUI/ObjectUI.py:1550 msgid "tooldia = tool diameter" msgstr "tooldia = tool diameter" -#: flatcamGUI/FlatCAMGUI.py:5171 flatcamGUI/ObjectUI.py:1551 +#: flatcamGUI/FlatCAMGUI.py:5260 flatcamGUI/ObjectUI.py:1551 msgid "t_drills = for Excellon, total number of drills" msgstr "t_drills = for Excellon, total number of drills" -#: flatcamGUI/FlatCAMGUI.py:5172 flatcamGUI/ObjectUI.py:1552 +#: flatcamGUI/FlatCAMGUI.py:5261 flatcamGUI/ObjectUI.py:1552 msgid "x_toolchange = X coord for Toolchange" msgstr "x_toolchange = X coord for Toolchange" -#: flatcamGUI/FlatCAMGUI.py:5173 flatcamGUI/ObjectUI.py:1553 +#: flatcamGUI/FlatCAMGUI.py:5262 flatcamGUI/ObjectUI.py:1553 msgid "y_toolchange = Y coord for Toolchange" msgstr "y_toolchange = Y coord for Toolchange" -#: flatcamGUI/FlatCAMGUI.py:5174 flatcamGUI/ObjectUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:5263 flatcamGUI/ObjectUI.py:1554 msgid "z_toolchange = Z coord for Toolchange" msgstr "z_toolchange = Z coord for Toolchange" -#: flatcamGUI/FlatCAMGUI.py:5175 +#: flatcamGUI/FlatCAMGUI.py:5264 msgid "z_cut = Z depth for the cut" msgstr "z_cut = Z depth for the cut" -#: flatcamGUI/FlatCAMGUI.py:5176 +#: flatcamGUI/FlatCAMGUI.py:5265 msgid "z_move = Z height for travel" msgstr "z_move = Z height for travel" -#: flatcamGUI/FlatCAMGUI.py:5177 flatcamGUI/ObjectUI.py:1557 +#: flatcamGUI/FlatCAMGUI.py:5266 flatcamGUI/ObjectUI.py:1557 msgid "z_depthpercut = the step value for multidepth cut" msgstr "z_depthpercut = the step value for multidepth cut" -#: flatcamGUI/FlatCAMGUI.py:5178 flatcamGUI/ObjectUI.py:1558 +#: flatcamGUI/FlatCAMGUI.py:5267 flatcamGUI/ObjectUI.py:1558 msgid "spindlesspeed = the value for the spindle speed" msgstr "spindlesspeed = the value for the spindle speed" -#: flatcamGUI/FlatCAMGUI.py:5179 flatcamGUI/ObjectUI.py:1559 +#: flatcamGUI/FlatCAMGUI.py:5268 flatcamGUI/ObjectUI.py:1559 msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" msgstr "dwelltime = time to dwell to allow the spindle to reach it's set RPM" -#: flatcamGUI/FlatCAMGUI.py:5200 +#: flatcamGUI/FlatCAMGUI.py:5289 msgid "NCC Tool Options" msgstr "NCC Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5203 flatcamGUI/FlatCAMGUI.py:5304 -#: flatcamGUI/FlatCAMGUI.py:5383 flatcamGUI/FlatCAMGUI.py:5442 -#: flatcamGUI/FlatCAMGUI.py:5545 flatcamGUI/FlatCAMGUI.py:5606 -#: flatcamGUI/FlatCAMGUI.py:5805 flatcamGUI/FlatCAMGUI.py:5932 +#: flatcamGUI/FlatCAMGUI.py:5292 flatcamGUI/FlatCAMGUI.py:5393 +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamGUI/FlatCAMGUI.py:5531 +#: flatcamGUI/FlatCAMGUI.py:5634 flatcamGUI/FlatCAMGUI.py:5695 +#: flatcamGUI/FlatCAMGUI.py:5894 flatcamGUI/FlatCAMGUI.py:6021 msgid "Parameters:" msgstr "Parameters:" -#: flatcamGUI/FlatCAMGUI.py:5213 flatcamGUI/FlatCAMGUI.py:5943 +#: flatcamGUI/FlatCAMGUI.py:5302 flatcamGUI/FlatCAMGUI.py:6032 msgid "Tools dia:" msgstr "Tools dia:" -#: flatcamGUI/FlatCAMGUI.py:5215 +#: flatcamGUI/FlatCAMGUI.py:5304 msgid "Diameters of the cutting tools, separated by ','" msgstr "Diameters of the cutting tools, separated by ','" -#: flatcamGUI/FlatCAMGUI.py:5223 flatcamTools/ToolNonCopperClear.py:167 +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolNonCopperClear.py:167 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -7383,11 +8218,11 @@ msgstr "" "Higher values = slow processing and slow execution on CNC\n" "due of too many paths." -#: flatcamGUI/FlatCAMGUI.py:5239 flatcamTools/ToolNonCopperClear.py:183 +#: flatcamGUI/FlatCAMGUI.py:5328 flatcamTools/ToolNonCopperClear.py:183 msgid "Bounding box margin." msgstr "Bounding box margin." -#: flatcamGUI/FlatCAMGUI.py:5248 flatcamTools/ToolNonCopperClear.py:192 +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolNonCopperClear.py:192 #: flatcamTools/ToolPaint.py:190 msgid "" "Algorithm for non-copper clearing:
Standard: Fixed step inwards." @@ -7398,12 +8233,12 @@ msgstr "" "
Seed-based: Outwards from seed.
Line-based: Parallel " "lines." -#: flatcamGUI/FlatCAMGUI.py:5280 flatcamTools/ToolNonCopperClear.py:224 +#: flatcamGUI/FlatCAMGUI.py:5369 flatcamTools/ToolNonCopperClear.py:224 #: flatcamTools/ToolPaint.py:222 msgid "Rest M.:" msgstr "Rest M.:" -#: flatcamGUI/FlatCAMGUI.py:5282 +#: flatcamGUI/FlatCAMGUI.py:5371 msgid "" "If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" @@ -7419,11 +8254,11 @@ msgstr "" "could not be cleared by previous tool.\n" "If not checked, use the standard algorithm." -#: flatcamGUI/FlatCAMGUI.py:5301 +#: flatcamGUI/FlatCAMGUI.py:5390 msgid "Cutout Tool Options" msgstr "Cutout Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5306 flatcamGUI/ObjectUI.py:402 +#: flatcamGUI/FlatCAMGUI.py:5395 flatcamGUI/ObjectUI.py:402 msgid "" "Create toolpaths to cut around\n" "the PCB and separate it from\n" @@ -7433,7 +8268,7 @@ msgstr "" "the PCB and separate it from\n" "the original board." -#: flatcamGUI/FlatCAMGUI.py:5325 +#: flatcamGUI/FlatCAMGUI.py:5414 msgid "" "Distance from objects at which\n" "to draw the cutout." @@ -7441,11 +8276,11 @@ msgstr "" "Distance from objects at which\n" "to draw the cutout." -#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCutOut.py:96 +#: flatcamGUI/FlatCAMGUI.py:5421 flatcamTools/ToolCutOut.py:96 msgid "Gap size:" msgstr "Gap size:" -#: flatcamGUI/FlatCAMGUI.py:5334 +#: flatcamGUI/FlatCAMGUI.py:5423 msgid "" "Size of the gaps in the toolpath\n" "that will remain to hold the\n" @@ -7455,11 +8290,11 @@ msgstr "" "that will remain to hold the\n" "board in place." -#: flatcamGUI/FlatCAMGUI.py:5342 flatcamTools/ToolCutOut.py:133 +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolCutOut.py:133 msgid "Gaps:" msgstr "Gaps:" -#: flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5433 msgid "" "Number of bridge gaps used for the cutout.\n" "There can be maximum 8 bridges/gaps.\n" @@ -7481,19 +8316,19 @@ msgstr "" "- 2tb - 2*top + 2*bottom\n" "- 8 - 2*left + 2*right +2*top + 2*bottom" -#: flatcamGUI/FlatCAMGUI.py:5365 flatcamTools/ToolCutOut.py:115 +#: flatcamGUI/FlatCAMGUI.py:5454 flatcamTools/ToolCutOut.py:115 msgid "Convex Sh.:" msgstr "Convex Sh.:" -#: flatcamGUI/FlatCAMGUI.py:5367 flatcamTools/ToolCutOut.py:117 +#: flatcamGUI/FlatCAMGUI.py:5456 flatcamTools/ToolCutOut.py:117 msgid "Create a convex shape surrounding the entire PCB." msgstr "Create a convex shape surrounding the entire PCB." -#: flatcamGUI/FlatCAMGUI.py:5380 +#: flatcamGUI/FlatCAMGUI.py:5469 msgid "2Sided Tool Options" msgstr "2Sided Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5385 +#: flatcamGUI/FlatCAMGUI.py:5474 msgid "" "A tool to help in creating a double sided\n" "PCB using alignment holes." @@ -7501,44 +8336,44 @@ msgstr "" "A tool to help in creating a double sided\n" "PCB using alignment holes." -#: flatcamGUI/FlatCAMGUI.py:5395 flatcamTools/ToolDblSided.py:235 +#: flatcamGUI/FlatCAMGUI.py:5484 flatcamTools/ToolDblSided.py:235 msgid "Drill diam.:" msgstr "Drill diam.:" -#: flatcamGUI/FlatCAMGUI.py:5397 flatcamTools/ToolDblSided.py:226 +#: flatcamGUI/FlatCAMGUI.py:5486 flatcamTools/ToolDblSided.py:226 #: flatcamTools/ToolDblSided.py:237 msgid "Diameter of the drill for the alignment holes." msgstr "Diameter of the drill for the alignment holes." -#: flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5493 msgid "X" msgstr "X" -#: flatcamGUI/FlatCAMGUI.py:5405 +#: flatcamGUI/FlatCAMGUI.py:5494 msgid "Y" msgstr "Y" -#: flatcamGUI/FlatCAMGUI.py:5406 flatcamTools/ToolDblSided.py:120 +#: flatcamGUI/FlatCAMGUI.py:5495 flatcamTools/ToolDblSided.py:120 msgid "Mirror Axis:" msgstr "Mirror Axis:" -#: flatcamGUI/FlatCAMGUI.py:5408 flatcamTools/ToolDblSided.py:122 +#: flatcamGUI/FlatCAMGUI.py:5497 flatcamTools/ToolDblSided.py:122 msgid "Mirror vertically (X) or horizontally (Y)." msgstr "Mirror vertically (X) or horizontally (Y)." -#: flatcamGUI/FlatCAMGUI.py:5417 +#: flatcamGUI/FlatCAMGUI.py:5506 msgid "Point" msgstr "Point" -#: flatcamGUI/FlatCAMGUI.py:5418 +#: flatcamGUI/FlatCAMGUI.py:5507 msgid "Box" msgstr "Box" -#: flatcamGUI/FlatCAMGUI.py:5419 flatcamTools/ToolDblSided.py:133 +#: flatcamGUI/FlatCAMGUI.py:5508 flatcamTools/ToolDblSided.py:133 msgid "Axis Ref:" msgstr "Axis Ref:" -#: flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamGUI/FlatCAMGUI.py:5510 msgid "" "The axis should pass through a point or cut\n" " a specified box (in a Geometry object) in \n" @@ -7548,11 +8383,11 @@ msgstr "" " a specified box (in a Geometry object) in \n" "the middle." -#: flatcamGUI/FlatCAMGUI.py:5437 +#: flatcamGUI/FlatCAMGUI.py:5526 msgid "Paint Tool Options" msgstr "Paint Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5444 flatcamGUI/ObjectUI.py:1299 +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamGUI/ObjectUI.py:1299 msgid "" "Creates tool paths to cover the\n" "whole area of a polygon (remove\n" @@ -7564,7 +8399,7 @@ msgstr "" "all copper). You will be asked\n" "to click on the desired polygon." -#: flatcamGUI/FlatCAMGUI.py:5468 +#: flatcamGUI/FlatCAMGUI.py:5557 msgid "" "How much (fraction) of the tool\n" "width to overlap each tool pass." @@ -7572,23 +8407,23 @@ msgstr "" "How much (fraction) of the tool\n" "width to overlap each tool pass." -#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolPaint.py:237 +#: flatcamGUI/FlatCAMGUI.py:5611 flatcamTools/ToolPaint.py:237 msgid "Selection:" msgstr "Selection:" -#: flatcamGUI/FlatCAMGUI.py:5524 +#: flatcamGUI/FlatCAMGUI.py:5613 msgid "How to select the polygons to paint." msgstr "How to select the polygons to paint." -#: flatcamGUI/FlatCAMGUI.py:5528 +#: flatcamGUI/FlatCAMGUI.py:5617 msgid "Single" msgstr "Single" -#: flatcamGUI/FlatCAMGUI.py:5542 +#: flatcamGUI/FlatCAMGUI.py:5631 msgid "Film Tool Options" msgstr "Film Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5547 +#: flatcamGUI/FlatCAMGUI.py:5636 msgid "" "Create a PCB film from a Gerber or Geometry\n" "FlatCAM object.\n" @@ -7598,19 +8433,19 @@ msgstr "" "FlatCAM object.\n" "The file is saved in SVG format." -#: flatcamGUI/FlatCAMGUI.py:5556 +#: flatcamGUI/FlatCAMGUI.py:5645 msgid "Pos" msgstr "Pos" -#: flatcamGUI/FlatCAMGUI.py:5557 +#: flatcamGUI/FlatCAMGUI.py:5646 msgid "Neg" msgstr "Neg" -#: flatcamGUI/FlatCAMGUI.py:5558 flatcamTools/ToolFilm.py:116 +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolFilm.py:116 msgid "Film Type:" msgstr "Film Type:" -#: flatcamGUI/FlatCAMGUI.py:5560 flatcamTools/ToolFilm.py:118 +#: flatcamGUI/FlatCAMGUI.py:5649 flatcamTools/ToolFilm.py:118 msgid "" "Generate a Positive black film or a Negative film.\n" "Positive means that it will print the features\n" @@ -7626,11 +8461,11 @@ msgstr "" "with white on a black canvas.\n" "The Film format is SVG." -#: flatcamGUI/FlatCAMGUI.py:5571 flatcamTools/ToolFilm.py:130 +#: flatcamGUI/FlatCAMGUI.py:5660 flatcamTools/ToolFilm.py:130 msgid "Border:" msgstr "Border:" -#: flatcamGUI/FlatCAMGUI.py:5573 flatcamTools/ToolFilm.py:132 +#: flatcamGUI/FlatCAMGUI.py:5662 flatcamTools/ToolFilm.py:132 msgid "" "Specify a border around the object.\n" "Only for negative film.\n" @@ -7650,11 +8485,11 @@ msgstr "" "white color like the rest and which may confound with the\n" "surroundings if not for this border." -#: flatcamGUI/FlatCAMGUI.py:5586 flatcamTools/ToolFilm.py:144 +#: flatcamGUI/FlatCAMGUI.py:5675 flatcamTools/ToolFilm.py:144 msgid "Scale Stroke:" msgstr "Scale Stroke:" -#: flatcamGUI/FlatCAMGUI.py:5588 flatcamTools/ToolFilm.py:146 +#: flatcamGUI/FlatCAMGUI.py:5677 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 " @@ -7666,11 +8501,11 @@ msgstr "" "thinner,\n" "therefore the fine features may be more affected by this parameter." -#: flatcamGUI/FlatCAMGUI.py:5603 +#: flatcamGUI/FlatCAMGUI.py:5692 msgid "Panelize Tool Options" msgstr "Panelize Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5608 +#: flatcamGUI/FlatCAMGUI.py:5697 msgid "" "Create an object that contains an array of (x, y) elements,\n" "each element is a copy of the source object spaced\n" @@ -7680,11 +8515,11 @@ msgstr "" "each element is a copy of the source object spaced\n" "at a X distance, Y distance of each other." -#: flatcamGUI/FlatCAMGUI.py:5619 flatcamTools/ToolPanelize.py:113 +#: flatcamGUI/FlatCAMGUI.py:5708 flatcamTools/ToolPanelize.py:113 msgid "Spacing cols:" msgstr "Spacing cols:" -#: flatcamGUI/FlatCAMGUI.py:5621 flatcamTools/ToolPanelize.py:115 +#: flatcamGUI/FlatCAMGUI.py:5710 flatcamTools/ToolPanelize.py:115 msgid "" "Spacing between columns of the desired panel.\n" "In current units." @@ -7692,11 +8527,11 @@ msgstr "" "Spacing between columns of the desired panel.\n" "In current units." -#: flatcamGUI/FlatCAMGUI.py:5629 flatcamTools/ToolPanelize.py:122 +#: flatcamGUI/FlatCAMGUI.py:5718 flatcamTools/ToolPanelize.py:122 msgid "Spacing rows:" msgstr "Spacing rows:" -#: flatcamGUI/FlatCAMGUI.py:5631 flatcamTools/ToolPanelize.py:124 +#: flatcamGUI/FlatCAMGUI.py:5720 flatcamTools/ToolPanelize.py:124 msgid "" "Spacing between rows of the desired panel.\n" "In current units." @@ -7704,35 +8539,35 @@ msgstr "" "Spacing between rows of the desired panel.\n" "In current units." -#: flatcamGUI/FlatCAMGUI.py:5639 flatcamTools/ToolPanelize.py:131 +#: flatcamGUI/FlatCAMGUI.py:5728 flatcamTools/ToolPanelize.py:131 msgid "Columns:" msgstr "Columns:" -#: flatcamGUI/FlatCAMGUI.py:5641 flatcamTools/ToolPanelize.py:133 +#: flatcamGUI/FlatCAMGUI.py:5730 flatcamTools/ToolPanelize.py:133 msgid "Number of columns of the desired panel" msgstr "Number of columns of the desired panel" -#: flatcamGUI/FlatCAMGUI.py:5648 flatcamTools/ToolPanelize.py:139 +#: flatcamGUI/FlatCAMGUI.py:5737 flatcamTools/ToolPanelize.py:139 msgid "Rows:" msgstr "Rows:" -#: flatcamGUI/FlatCAMGUI.py:5650 flatcamTools/ToolPanelize.py:141 +#: flatcamGUI/FlatCAMGUI.py:5739 flatcamTools/ToolPanelize.py:141 msgid "Number of rows of the desired panel" msgstr "Number of rows of the desired panel" -#: flatcamGUI/FlatCAMGUI.py:5656 +#: flatcamGUI/FlatCAMGUI.py:5745 msgid "Gerber" msgstr "Gerber" -#: flatcamGUI/FlatCAMGUI.py:5657 +#: flatcamGUI/FlatCAMGUI.py:5746 msgid "Geo" msgstr "Geo" -#: flatcamGUI/FlatCAMGUI.py:5658 flatcamTools/ToolPanelize.py:148 +#: flatcamGUI/FlatCAMGUI.py:5747 flatcamTools/ToolPanelize.py:148 msgid "Panel Type:" msgstr "Panel Type:" -#: flatcamGUI/FlatCAMGUI.py:5660 +#: flatcamGUI/FlatCAMGUI.py:5749 msgid "" "Choose the type of object for the panel object:\n" "- Gerber\n" @@ -7742,11 +8577,11 @@ msgstr "" "- Gerber\n" "- Geometry" -#: flatcamGUI/FlatCAMGUI.py:5669 +#: flatcamGUI/FlatCAMGUI.py:5758 msgid "Constrain within:" msgstr "Constrain within:" -#: flatcamGUI/FlatCAMGUI.py:5671 flatcamTools/ToolPanelize.py:160 +#: flatcamGUI/FlatCAMGUI.py:5760 flatcamTools/ToolPanelize.py:160 msgid "" "Area define by DX and DY within to constrain the panel.\n" "DX and DY values are in current units.\n" @@ -7760,11 +8595,11 @@ msgstr "" "the final panel will have as many columns and rows as\n" "they fit completely within selected area." -#: flatcamGUI/FlatCAMGUI.py:5680 flatcamTools/ToolPanelize.py:169 +#: flatcamGUI/FlatCAMGUI.py:5769 flatcamTools/ToolPanelize.py:169 msgid "Width (DX):" msgstr "Width (DX):" -#: flatcamGUI/FlatCAMGUI.py:5682 flatcamTools/ToolPanelize.py:171 +#: flatcamGUI/FlatCAMGUI.py:5771 flatcamTools/ToolPanelize.py:171 msgid "" "The width (DX) within which the panel must fit.\n" "In current units." @@ -7772,11 +8607,11 @@ msgstr "" "The width (DX) within which the panel must fit.\n" "In current units." -#: flatcamGUI/FlatCAMGUI.py:5689 flatcamTools/ToolPanelize.py:177 +#: flatcamGUI/FlatCAMGUI.py:5778 flatcamTools/ToolPanelize.py:177 msgid "Height (DY):" msgstr "Height (DY):" -#: flatcamGUI/FlatCAMGUI.py:5691 flatcamTools/ToolPanelize.py:179 +#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolPanelize.py:179 msgid "" "The height (DY)within which the panel must fit.\n" "In current units." @@ -7784,15 +8619,15 @@ msgstr "" "The height (DY)within which the panel must fit.\n" "In current units." -#: flatcamGUI/FlatCAMGUI.py:5705 +#: flatcamGUI/FlatCAMGUI.py:5794 msgid "Calculators Tool Options" msgstr "Calculators Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5708 +#: flatcamGUI/FlatCAMGUI.py:5797 msgid "V-Shape Tool Calculator:" msgstr "V-Shape Tool Calculator:" -#: flatcamGUI/FlatCAMGUI.py:5710 +#: flatcamGUI/FlatCAMGUI.py:5799 msgid "" "Calculate the tool diameter for a given V-shape tool,\n" "having the tip diameter, tip angle and\n" @@ -7802,11 +8637,11 @@ msgstr "" "having the tip diameter, tip angle and\n" "depth-of-cut as parameters." -#: flatcamGUI/FlatCAMGUI.py:5721 flatcamTools/ToolCalculators.py:94 +#: flatcamGUI/FlatCAMGUI.py:5810 flatcamTools/ToolCalculators.py:94 msgid "Tip Diameter:" msgstr "Tip Diameter:" -#: flatcamGUI/FlatCAMGUI.py:5723 +#: flatcamGUI/FlatCAMGUI.py:5812 msgid "" "This is the tool tip diameter.\n" "It is specified by manufacturer." @@ -7814,11 +8649,11 @@ msgstr "" "This is the tool tip diameter.\n" "It is specified by manufacturer." -#: flatcamGUI/FlatCAMGUI.py:5731 +#: flatcamGUI/FlatCAMGUI.py:5820 msgid "Tip angle:" msgstr "Tip angle:" -#: flatcamGUI/FlatCAMGUI.py:5733 +#: flatcamGUI/FlatCAMGUI.py:5822 msgid "" "This is the angle on the tip of the tool.\n" "It is specified by manufacturer." @@ -7826,7 +8661,7 @@ msgstr "" "This is the angle on the tip of the tool.\n" "It is specified by manufacturer." -#: flatcamGUI/FlatCAMGUI.py:5743 +#: flatcamGUI/FlatCAMGUI.py:5832 msgid "" "This is depth to cut into material.\n" "In the CNCJob object it is the CutZ parameter." @@ -7834,11 +8669,11 @@ msgstr "" "This is depth to cut into material.\n" "In the CNCJob object it is the CutZ parameter." -#: flatcamGUI/FlatCAMGUI.py:5750 +#: flatcamGUI/FlatCAMGUI.py:5839 msgid "ElectroPlating Calculator:" msgstr "ElectroPlating Calculator:" -#: flatcamGUI/FlatCAMGUI.py:5752 flatcamTools/ToolCalculators.py:152 +#: flatcamGUI/FlatCAMGUI.py:5841 flatcamTools/ToolCalculators.py:152 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 " @@ -7848,27 +8683,27 @@ msgstr "" "using a method like grahite ink or calcium hypophosphite ink or palladium " "chloride." -#: flatcamGUI/FlatCAMGUI.py:5762 flatcamTools/ToolCalculators.py:161 +#: flatcamGUI/FlatCAMGUI.py:5851 flatcamTools/ToolCalculators.py:161 msgid "Board Length:" msgstr "Board Length:" -#: flatcamGUI/FlatCAMGUI.py:5764 flatcamTools/ToolCalculators.py:165 +#: flatcamGUI/FlatCAMGUI.py:5853 flatcamTools/ToolCalculators.py:165 msgid "This is the board length. In centimeters." msgstr "This is the board length. In centimeters." -#: flatcamGUI/FlatCAMGUI.py:5770 flatcamTools/ToolCalculators.py:167 +#: flatcamGUI/FlatCAMGUI.py:5859 flatcamTools/ToolCalculators.py:167 msgid "Board Width:" msgstr "Board Width:" -#: flatcamGUI/FlatCAMGUI.py:5772 flatcamTools/ToolCalculators.py:171 +#: flatcamGUI/FlatCAMGUI.py:5861 flatcamTools/ToolCalculators.py:171 msgid "This is the board width.In centimeters." msgstr "This is the board width.In centimeters." -#: flatcamGUI/FlatCAMGUI.py:5777 flatcamTools/ToolCalculators.py:173 +#: flatcamGUI/FlatCAMGUI.py:5866 flatcamTools/ToolCalculators.py:173 msgid "Current Density:" msgstr "Current Density:" -#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolCalculators.py:177 +#: flatcamGUI/FlatCAMGUI.py:5869 flatcamTools/ToolCalculators.py:177 msgid "" "Current density to pass through the board. \n" "In Amps per Square Feet ASF." @@ -7876,11 +8711,11 @@ msgstr "" "Current density to pass through the board. \n" "In Amps per Square Feet ASF." -#: flatcamGUI/FlatCAMGUI.py:5786 flatcamTools/ToolCalculators.py:181 +#: flatcamGUI/FlatCAMGUI.py:5875 flatcamTools/ToolCalculators.py:181 msgid "Copper Growth:" msgstr "Copper Growth:" -#: flatcamGUI/FlatCAMGUI.py:5789 flatcamTools/ToolCalculators.py:185 +#: flatcamGUI/FlatCAMGUI.py:5878 flatcamTools/ToolCalculators.py:185 msgid "" "How thick the copper growth is intended to be.\n" "In microns." @@ -7888,11 +8723,11 @@ msgstr "" "How thick the copper growth is intended to be.\n" "In microns." -#: flatcamGUI/FlatCAMGUI.py:5802 +#: flatcamGUI/FlatCAMGUI.py:5891 msgid "Transform Tool Options" msgstr "Transform Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5807 +#: flatcamGUI/FlatCAMGUI.py:5896 msgid "" "Various transformations that can be applied\n" "on a FlatCAM object." @@ -7900,47 +8735,47 @@ msgstr "" "Various transformations that can be applied\n" "on a FlatCAM object." -#: flatcamGUI/FlatCAMGUI.py:5817 +#: flatcamGUI/FlatCAMGUI.py:5906 msgid "Rotate Angle:" msgstr "Rotate Angle:" -#: flatcamGUI/FlatCAMGUI.py:5819 +#: flatcamGUI/FlatCAMGUI.py:5908 msgid "Angle for rotation. In degrees." msgstr "Angle for rotation. In degrees." -#: flatcamGUI/FlatCAMGUI.py:5826 +#: flatcamGUI/FlatCAMGUI.py:5915 msgid "Skew_X angle:" msgstr "Skew_X angle:" -#: flatcamGUI/FlatCAMGUI.py:5828 +#: flatcamGUI/FlatCAMGUI.py:5917 msgid "Angle for Skew/Shear on X axis. In degrees." msgstr "Angle for Skew/Shear on X axis. In degrees." -#: flatcamGUI/FlatCAMGUI.py:5835 +#: flatcamGUI/FlatCAMGUI.py:5924 msgid "Skew_Y angle:" msgstr "Skew_Y angle:" -#: flatcamGUI/FlatCAMGUI.py:5837 +#: flatcamGUI/FlatCAMGUI.py:5926 msgid "Angle for Skew/Shear on Y axis. In degrees." msgstr "Angle for Skew/Shear on Y axis. In degrees." -#: flatcamGUI/FlatCAMGUI.py:5844 +#: flatcamGUI/FlatCAMGUI.py:5933 msgid "Scale_X factor:" msgstr "Scale_X factor:" -#: flatcamGUI/FlatCAMGUI.py:5846 +#: flatcamGUI/FlatCAMGUI.py:5935 msgid "Factor for scaling on X axis." msgstr "Factor for scaling on X axis." -#: flatcamGUI/FlatCAMGUI.py:5853 +#: flatcamGUI/FlatCAMGUI.py:5942 msgid "Scale_Y factor:" msgstr "Scale_Y factor:" -#: flatcamGUI/FlatCAMGUI.py:5855 +#: flatcamGUI/FlatCAMGUI.py:5944 msgid "Factor for scaling on Y axis." msgstr "Factor for scaling on Y axis." -#: flatcamGUI/FlatCAMGUI.py:5863 +#: flatcamGUI/FlatCAMGUI.py:5952 msgid "" "Scale the selected object(s)\n" "using the Scale_X factor for both axis." @@ -7948,7 +8783,7 @@ msgstr "" "Scale the selected object(s)\n" "using the Scale_X factor for both axis." -#: flatcamGUI/FlatCAMGUI.py:5871 flatcamTools/ToolTransform.py:210 +#: flatcamGUI/FlatCAMGUI.py:5960 flatcamTools/ToolTransform.py:210 msgid "" "Scale the selected object(s)\n" "using the origin reference when checked,\n" @@ -7960,27 +8795,27 @@ msgstr "" "and the center of the biggest bounding box\n" "of the selected objects when unchecked." -#: flatcamGUI/FlatCAMGUI.py:5880 +#: flatcamGUI/FlatCAMGUI.py:5969 msgid "Offset_X val:" msgstr "Offset_X val:" -#: flatcamGUI/FlatCAMGUI.py:5882 +#: flatcamGUI/FlatCAMGUI.py:5971 msgid "Distance to offset on X axis. In current units." msgstr "Distance to offset on X axis. In current units." -#: flatcamGUI/FlatCAMGUI.py:5889 +#: flatcamGUI/FlatCAMGUI.py:5978 msgid "Offset_Y val:" msgstr "Offset_Y val:" -#: flatcamGUI/FlatCAMGUI.py:5891 +#: flatcamGUI/FlatCAMGUI.py:5980 msgid "Distance to offset on Y axis. In current units." msgstr "Distance to offset on Y axis. In current units." -#: flatcamGUI/FlatCAMGUI.py:5897 +#: flatcamGUI/FlatCAMGUI.py:5986 msgid "Mirror Reference" msgstr "Mirror Reference" -#: flatcamGUI/FlatCAMGUI.py:5899 flatcamTools/ToolTransform.py:314 +#: flatcamGUI/FlatCAMGUI.py:5988 flatcamTools/ToolTransform.py:314 msgid "" "Flip the selected object(s)\n" "around the point in Point Entry Field.\n" @@ -8002,11 +8837,11 @@ msgstr "" "Or enter the coords in format (x, y) in the\n" "Point Entry field and click Flip on X(Y)" -#: flatcamGUI/FlatCAMGUI.py:5910 +#: flatcamGUI/FlatCAMGUI.py:5999 msgid " Mirror Ref. Point:" msgstr " Mirror Ref. Point:" -#: flatcamGUI/FlatCAMGUI.py:5912 flatcamTools/ToolTransform.py:327 +#: flatcamGUI/FlatCAMGUI.py:6001 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" @@ -8016,11 +8851,11 @@ msgstr "" "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" -#: flatcamGUI/FlatCAMGUI.py:5929 +#: flatcamGUI/FlatCAMGUI.py:6018 msgid "SolderPaste Tool Options" msgstr "SolderPaste Tool Options" -#: flatcamGUI/FlatCAMGUI.py:5934 +#: flatcamGUI/FlatCAMGUI.py:6023 msgid "" "A tool to create GCode for dispensing\n" "solder paste onto a PCB." @@ -8028,47 +8863,47 @@ msgstr "" "A tool to create GCode for dispensing\n" "solder paste onto a PCB." -#: flatcamGUI/FlatCAMGUI.py:5945 +#: flatcamGUI/FlatCAMGUI.py:6034 msgid "Diameters of nozzle tools, separated by ','" msgstr "Diameters of nozzle tools, separated by ','" -#: flatcamGUI/FlatCAMGUI.py:5952 +#: flatcamGUI/FlatCAMGUI.py:6041 msgid "New Nozzle Dia:" msgstr "New Nozzle Dia:" -#: flatcamGUI/FlatCAMGUI.py:5954 flatcamTools/ToolSolderPaste.py:103 +#: flatcamGUI/FlatCAMGUI.py:6043 flatcamTools/ToolSolderPaste.py:103 msgid "Diameter for the new Nozzle tool to add in the Tool Table" msgstr "Diameter for the new Nozzle tool to add in the Tool Table" -#: flatcamGUI/FlatCAMGUI.py:5962 flatcamTools/ToolSolderPaste.py:166 +#: flatcamGUI/FlatCAMGUI.py:6051 flatcamTools/ToolSolderPaste.py:166 msgid "Z Dispense Start:" msgstr "Z Dispense Start:" -#: flatcamGUI/FlatCAMGUI.py:5964 flatcamTools/ToolSolderPaste.py:168 +#: flatcamGUI/FlatCAMGUI.py:6053 flatcamTools/ToolSolderPaste.py:168 msgid "The height (Z) when solder paste dispensing starts." msgstr "The height (Z) when solder paste dispensing starts." -#: flatcamGUI/FlatCAMGUI.py:5971 flatcamTools/ToolSolderPaste.py:174 +#: flatcamGUI/FlatCAMGUI.py:6060 flatcamTools/ToolSolderPaste.py:174 msgid "Z Dispense:" msgstr "Z Dispense:" -#: flatcamGUI/FlatCAMGUI.py:5973 flatcamTools/ToolSolderPaste.py:176 +#: flatcamGUI/FlatCAMGUI.py:6062 flatcamTools/ToolSolderPaste.py:176 msgid "The height (Z) when doing solder paste dispensing." msgstr "The height (Z) when doing solder paste dispensing." -#: flatcamGUI/FlatCAMGUI.py:5980 flatcamTools/ToolSolderPaste.py:183 +#: flatcamGUI/FlatCAMGUI.py:6069 flatcamTools/ToolSolderPaste.py:183 msgid "Z Dispense Stop:" msgstr "Z Dispense Stop:" -#: flatcamGUI/FlatCAMGUI.py:5982 flatcamTools/ToolSolderPaste.py:185 +#: flatcamGUI/FlatCAMGUI.py:6071 flatcamTools/ToolSolderPaste.py:185 msgid "The height (Z) when solder paste dispensing stops." msgstr "The height (Z) when solder paste dispensing stops." -#: flatcamGUI/FlatCAMGUI.py:5989 flatcamTools/ToolSolderPaste.py:191 +#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:191 msgid "Z Travel:" msgstr "Z Travel:" -#: flatcamGUI/FlatCAMGUI.py:5991 flatcamTools/ToolSolderPaste.py:193 +#: flatcamGUI/FlatCAMGUI.py:6080 flatcamTools/ToolSolderPaste.py:193 msgid "" "The height (Z) for travel between pads\n" "(without dispensing solder paste)." @@ -8076,19 +8911,19 @@ msgstr "" "The height (Z) for travel between pads\n" "(without dispensing solder paste)." -#: flatcamGUI/FlatCAMGUI.py:5999 flatcamTools/ToolSolderPaste.py:200 +#: flatcamGUI/FlatCAMGUI.py:6088 flatcamTools/ToolSolderPaste.py:200 msgid "Z Toolchange:" msgstr "Z Toolchange:" -#: flatcamGUI/FlatCAMGUI.py:6001 flatcamTools/ToolSolderPaste.py:202 +#: flatcamGUI/FlatCAMGUI.py:6090 flatcamTools/ToolSolderPaste.py:202 msgid "The height (Z) for tool (nozzle) change." msgstr "The height (Z) for tool (nozzle) change." -#: flatcamGUI/FlatCAMGUI.py:6008 flatcamTools/ToolSolderPaste.py:208 +#: flatcamGUI/FlatCAMGUI.py:6097 flatcamTools/ToolSolderPaste.py:208 msgid "XY Toolchange:" msgstr "XY Toolchange:" -#: flatcamGUI/FlatCAMGUI.py:6010 flatcamTools/ToolSolderPaste.py:210 +#: flatcamGUI/FlatCAMGUI.py:6099 flatcamTools/ToolSolderPaste.py:210 msgid "" "The X,Y location for tool (nozzle) change.\n" "The format is (x, y) where x and y are real numbers." @@ -8096,19 +8931,19 @@ msgstr "" "The X,Y location for tool (nozzle) change.\n" "The format is (x, y) where x and y are real numbers." -#: flatcamGUI/FlatCAMGUI.py:6018 flatcamTools/ToolSolderPaste.py:217 +#: flatcamGUI/FlatCAMGUI.py:6107 flatcamTools/ToolSolderPaste.py:217 msgid "Feedrate X-Y:" msgstr "Feedrate X-Y:" -#: flatcamGUI/FlatCAMGUI.py:6020 flatcamTools/ToolSolderPaste.py:219 +#: flatcamGUI/FlatCAMGUI.py:6109 flatcamTools/ToolSolderPaste.py:219 msgid "Feedrate (speed) while moving on the X-Y plane." msgstr "Feedrate (speed) while moving on the X-Y plane." -#: flatcamGUI/FlatCAMGUI.py:6027 flatcamTools/ToolSolderPaste.py:225 +#: flatcamGUI/FlatCAMGUI.py:6116 flatcamTools/ToolSolderPaste.py:225 msgid "Feedrate Z:" msgstr "Feedrate Z:" -#: flatcamGUI/FlatCAMGUI.py:6029 flatcamTools/ToolSolderPaste.py:227 +#: flatcamGUI/FlatCAMGUI.py:6118 flatcamTools/ToolSolderPaste.py:227 msgid "" "Feedrate (speed) while moving vertically\n" "(on Z plane)." @@ -8116,11 +8951,11 @@ msgstr "" "Feedrate (speed) while moving vertically\n" "(on Z plane)." -#: flatcamGUI/FlatCAMGUI.py:6037 flatcamTools/ToolSolderPaste.py:234 +#: flatcamGUI/FlatCAMGUI.py:6126 flatcamTools/ToolSolderPaste.py:234 msgid "Feedrate Z Dispense:" msgstr "Feedrate Z Dispense:" -#: flatcamGUI/FlatCAMGUI.py:6039 flatcamTools/ToolSolderPaste.py:236 +#: flatcamGUI/FlatCAMGUI.py:6128 flatcamTools/ToolSolderPaste.py:236 msgid "" "Feedrate (speed) while moving up vertically\n" " to Dispense position (on Z plane)." @@ -8128,11 +8963,11 @@ msgstr "" "Feedrate (speed) while moving up vertically\n" " to Dispense position (on Z plane)." -#: flatcamGUI/FlatCAMGUI.py:6047 flatcamTools/ToolSolderPaste.py:243 +#: flatcamGUI/FlatCAMGUI.py:6136 flatcamTools/ToolSolderPaste.py:243 msgid "Spindle Speed FWD:" msgstr "Spindle Speed FWD:" -#: flatcamGUI/FlatCAMGUI.py:6049 flatcamTools/ToolSolderPaste.py:245 +#: flatcamGUI/FlatCAMGUI.py:6138 flatcamTools/ToolSolderPaste.py:245 msgid "" "The dispenser speed while pushing solder paste\n" "through the dispenser nozzle." @@ -8140,19 +8975,19 @@ msgstr "" "The dispenser speed while pushing solder paste\n" "through the dispenser nozzle." -#: flatcamGUI/FlatCAMGUI.py:6057 flatcamTools/ToolSolderPaste.py:252 +#: flatcamGUI/FlatCAMGUI.py:6146 flatcamTools/ToolSolderPaste.py:252 msgid "Dwell FWD:" msgstr "Dwell FWD:" -#: flatcamGUI/FlatCAMGUI.py:6059 flatcamTools/ToolSolderPaste.py:254 +#: flatcamGUI/FlatCAMGUI.py:6148 flatcamTools/ToolSolderPaste.py:254 msgid "Pause after solder dispensing." msgstr "Pause after solder dispensing." -#: flatcamGUI/FlatCAMGUI.py:6066 flatcamTools/ToolSolderPaste.py:260 +#: flatcamGUI/FlatCAMGUI.py:6155 flatcamTools/ToolSolderPaste.py:260 msgid "Spindle Speed REV:" msgstr "Spindle Speed REV:" -#: flatcamGUI/FlatCAMGUI.py:6068 flatcamTools/ToolSolderPaste.py:262 +#: flatcamGUI/FlatCAMGUI.py:6157 flatcamTools/ToolSolderPaste.py:262 msgid "" "The dispenser speed while retracting solder paste\n" "through the dispenser nozzle." @@ -8160,11 +8995,11 @@ msgstr "" "The dispenser speed while retracting solder paste\n" "through the dispenser nozzle." -#: flatcamGUI/FlatCAMGUI.py:6076 flatcamTools/ToolSolderPaste.py:269 +#: flatcamGUI/FlatCAMGUI.py:6165 flatcamTools/ToolSolderPaste.py:269 msgid "Dwell REV:" msgstr "Dwell REV:" -#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:271 +#: flatcamGUI/FlatCAMGUI.py:6167 flatcamTools/ToolSolderPaste.py:271 msgid "" "Pause after solder paste dispenser retracted,\n" "to allow pressure equilibrium." @@ -8172,23 +9007,23 @@ msgstr "" "Pause after solder paste dispenser retracted,\n" "to allow pressure equilibrium." -#: flatcamGUI/FlatCAMGUI.py:6085 flatcamTools/ToolSolderPaste.py:277 +#: flatcamGUI/FlatCAMGUI.py:6174 flatcamTools/ToolSolderPaste.py:277 msgid "PostProcessors:" msgstr "PostProcessors:" -#: flatcamGUI/FlatCAMGUI.py:6087 flatcamTools/ToolSolderPaste.py:279 +#: flatcamGUI/FlatCAMGUI.py:6176 flatcamTools/ToolSolderPaste.py:279 msgid "Files that control the GCode generation." msgstr "Files that control the GCode generation." -#: flatcamGUI/FlatCAMGUI.py:6117 flatcamGUI/FlatCAMGUI.py:6123 +#: flatcamGUI/FlatCAMGUI.py:6206 flatcamGUI/FlatCAMGUI.py:6212 msgid "Idle." msgstr "Idle." -#: flatcamGUI/FlatCAMGUI.py:6147 +#: flatcamGUI/FlatCAMGUI.py:6236 msgid "Application started ..." msgstr "Application started ..." -#: flatcamGUI/FlatCAMGUI.py:6148 +#: flatcamGUI/FlatCAMGUI.py:6237 msgid "Hello!" msgstr "Hello!" @@ -9442,7 +10277,7 @@ msgstr "" "the Geometry object used as a cutout geometry." #: flatcamTools/ToolCutOut.py:338 flatcamTools/ToolCutOut.py:483 -#: flatcamTools/ToolNonCopperClear.py:665 flatcamTools/ToolPaint.py:763 +#: flatcamTools/ToolNonCopperClear.py:666 flatcamTools/ToolPaint.py:764 #: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 #, python-format msgid "[ERROR_NOTCL] Could not retrieve object: %s" @@ -9506,7 +10341,7 @@ msgstr "" msgid "[success] Any form CutOut operation finished." msgstr "[success] Any form CutOut operation finished." -#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:767 +#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:768 #: flatcamTools/ToolPanelize.py:299 #, python-format msgid "[ERROR_NOTCL] Object not found: %s" @@ -10087,23 +10922,19 @@ msgstr "This is the point to point Euclidian distance." msgid "Measure" msgstr "Measure" -#: flatcamTools/ToolMeasurement.py:126 +#: flatcamTools/ToolMeasurement.py:132 msgid "Meas. Tool" msgstr "Meas. Tool" -#: flatcamTools/ToolMeasurement.py:221 +#: flatcamTools/ToolMeasurement.py:177 msgid "MEASURING: Click on the Start point ..." msgstr "MEASURING: Click on the Start point ..." -#: flatcamTools/ToolMeasurement.py:231 -msgid "Measurement Tool exit..." -msgstr "Measurement Tool exit..." - -#: flatcamTools/ToolMeasurement.py:258 +#: flatcamTools/ToolMeasurement.py:270 msgid "MEASURING: Click on the Destination point ..." msgstr "MEASURING: Click on the Destination point ..." -#: flatcamTools/ToolMeasurement.py:276 +#: flatcamTools/ToolMeasurement.py:278 #, python-brace-format msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" msgstr "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" @@ -10246,25 +11077,25 @@ msgstr "" msgid "Generate Geometry" msgstr "Generate Geometry" -#: flatcamTools/ToolNonCopperClear.py:484 flatcamTools/ToolPaint.py:543 -#: flatcamTools/ToolSolderPaste.py:760 +#: flatcamTools/ToolNonCopperClear.py:485 flatcamTools/ToolPaint.py:544 +#: flatcamTools/ToolSolderPaste.py:761 msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." msgstr "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." -#: flatcamTools/ToolNonCopperClear.py:512 flatcamTools/ToolPaint.py:567 +#: flatcamTools/ToolNonCopperClear.py:513 flatcamTools/ToolPaint.py:568 msgid "[WARNING_NOTCL] Adding tool cancelled. Tool already in Tool Table." msgstr "[WARNING_NOTCL] Adding tool cancelled. Tool already in Tool Table." -#: flatcamTools/ToolNonCopperClear.py:517 flatcamTools/ToolPaint.py:572 +#: flatcamTools/ToolNonCopperClear.py:518 flatcamTools/ToolPaint.py:573 msgid "[success] New tool added to Tool Table." msgstr "[success] New tool added to Tool Table." -#: flatcamTools/ToolNonCopperClear.py:559 flatcamTools/ToolPaint.py:615 +#: flatcamTools/ToolNonCopperClear.py:560 flatcamTools/ToolPaint.py:616 msgid "[success] Tool from Tool Table was edited." msgstr "[success] Tool from Tool Table was edited." -#: flatcamTools/ToolNonCopperClear.py:570 flatcamTools/ToolPaint.py:626 -#: flatcamTools/ToolSolderPaste.py:846 +#: flatcamTools/ToolNonCopperClear.py:571 flatcamTools/ToolPaint.py:627 +#: flatcamTools/ToolSolderPaste.py:847 msgid "" "[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " "Table." @@ -10272,44 +11103,44 @@ msgstr "" "[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " "Table." -#: flatcamTools/ToolNonCopperClear.py:609 flatcamTools/ToolPaint.py:723 +#: flatcamTools/ToolNonCopperClear.py:610 flatcamTools/ToolPaint.py:724 msgid "[WARNING_NOTCL] Delete failed. Select a tool to delete." msgstr "[WARNING_NOTCL] Delete failed. Select a tool to delete." -#: flatcamTools/ToolNonCopperClear.py:614 flatcamTools/ToolPaint.py:728 +#: flatcamTools/ToolNonCopperClear.py:615 flatcamTools/ToolPaint.py:729 msgid "[success] Tool(s) deleted from Tool Table." msgstr "[success] Tool(s) deleted from Tool Table." -#: flatcamTools/ToolNonCopperClear.py:632 flatcamTools/ToolPaint.py:747 +#: flatcamTools/ToolNonCopperClear.py:633 flatcamTools/ToolPaint.py:748 msgid "" "[ERROR_NOTCL] Overlap value must be between 0 (inclusive) and 1 (exclusive), " msgstr "" "[ERROR_NOTCL] Overlap value must be between 0 (inclusive) and 1 (exclusive), " -#: flatcamTools/ToolNonCopperClear.py:672 +#: flatcamTools/ToolNonCopperClear.py:673 msgid "[ERROR_NOTCL] No Gerber file available." msgstr "[ERROR_NOTCL] No Gerber file available." -#: flatcamTools/ToolNonCopperClear.py:710 -#: flatcamTools/ToolNonCopperClear.py:832 +#: flatcamTools/ToolNonCopperClear.py:711 +#: flatcamTools/ToolNonCopperClear.py:833 msgid "Clearing Non-Copper areas." msgstr "Clearing Non-Copper areas." -#: flatcamTools/ToolNonCopperClear.py:728 +#: flatcamTools/ToolNonCopperClear.py:729 #, python-format msgid "[success] Non-Copper Clearing with ToolDia = %s started." msgstr "[success] Non-Copper Clearing with ToolDia = %s started." -#: flatcamTools/ToolNonCopperClear.py:797 +#: flatcamTools/ToolNonCopperClear.py:798 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" -#: flatcamTools/ToolNonCopperClear.py:802 +#: flatcamTools/ToolNonCopperClear.py:803 msgid "[success] NCC Tool finished." msgstr "[success] NCC Tool finished." -#: flatcamTools/ToolNonCopperClear.py:804 +#: flatcamTools/ToolNonCopperClear.py:805 msgid "" "[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " "cleared. Check the result." @@ -10317,17 +11148,17 @@ msgstr "" "[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " "cleared. Check the result." -#: flatcamTools/ToolNonCopperClear.py:850 +#: flatcamTools/ToolNonCopperClear.py:851 #, python-format msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." msgstr "[success] Non-Copper Rest Clearing with ToolDia = %s started." -#: flatcamTools/ToolNonCopperClear.py:948 +#: flatcamTools/ToolNonCopperClear.py:949 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" -#: flatcamTools/ToolNonCopperClear.py:956 +#: flatcamTools/ToolNonCopperClear.py:957 msgid "" "[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " "settings." @@ -10335,6 +11166,31 @@ msgstr "" "[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " "settings." +#: flatcamTools/ToolPDF.py:37 +msgid "PDF Import Tool" +msgstr "PDF Import Tool" + +#: flatcamTools/ToolPDF.py:142 flatcamTools/ToolPDF.py:146 +msgid "Open PDF" +msgstr "Open PDF" + +#: flatcamTools/ToolPDF.py:149 +msgid "[WARNING_NOTCL] Open PDF cancelled." +msgstr "[WARNING_NOTCL] Open PDF cancelled." + +#: flatcamTools/ToolPDF.py:170 +msgid "Parsing PDF file ..." +msgstr "Parsing PDF file ..." + +#: flatcamTools/ToolPDF.py:266 +#, python-format +msgid "Rendering PDF layer #%d ..." +msgstr "Rendering PDF layer #%d ..." + +#: flatcamTools/ToolPDF.py:270 +msgid "[ERROR_NOTCL] Open PDF file failed." +msgstr "[ERROR_NOTCL] Open PDF file failed." + #: flatcamTools/ToolPaint.py:24 msgid "Paint Area" msgstr "Paint Area" @@ -10421,35 +11277,35 @@ msgstr "" "start after click.
A new Geometry object with the tool
paths will be " "created." -#: flatcamTools/ToolPaint.py:732 +#: flatcamTools/ToolPaint.py:733 msgid "geometry_on_paint_button" msgstr "geometry_on_paint_button" -#: flatcamTools/ToolPaint.py:751 flatcamTools/ToolPaint.py:786 +#: flatcamTools/ToolPaint.py:752 flatcamTools/ToolPaint.py:787 msgid "[WARNING_NOTCL] Click inside the desired polygon." msgstr "[WARNING_NOTCL] Click inside the desired polygon." -#: flatcamTools/ToolPaint.py:773 +#: flatcamTools/ToolPaint.py:774 msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." msgstr "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." -#: flatcamTools/ToolPaint.py:795 flatcamTools/ToolPaint.py:998 +#: flatcamTools/ToolPaint.py:796 flatcamTools/ToolPaint.py:999 msgid "Painting polygon..." msgstr "Painting polygon..." -#: flatcamTools/ToolPaint.py:846 +#: flatcamTools/ToolPaint.py:847 msgid "[WARNING] No polygon found." msgstr "[WARNING] No polygon found." -#: flatcamTools/ToolPaint.py:849 +#: flatcamTools/ToolPaint.py:850 msgid "Painting polygon." msgstr "Painting polygon." -#: flatcamTools/ToolPaint.py:891 +#: flatcamTools/ToolPaint.py:892 msgid "[ERROR_NOTCL] Geometry could not be painted completely" msgstr "[ERROR_NOTCL] Geometry could not be painted completely" -#: flatcamTools/ToolPaint.py:917 +#: flatcamTools/ToolPaint.py:918 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -10460,16 +11316,16 @@ msgstr "" "different strategy of paint\n" "%s" -#: flatcamTools/ToolPaint.py:959 +#: flatcamTools/ToolPaint.py:960 #, python-format msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" msgstr "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" -#: flatcamTools/ToolPaint.py:965 flatcamTools/ToolPaint.py:1258 +#: flatcamTools/ToolPaint.py:966 flatcamTools/ToolPaint.py:1259 msgid "Polygon Paint started ..." msgstr "Polygon Paint started ..." -#: flatcamTools/ToolPaint.py:1114 flatcamTools/ToolPaint.py:1203 +#: flatcamTools/ToolPaint.py:1115 flatcamTools/ToolPaint.py:1204 #, python-format msgid "" "[ERROR] Could not do Paint All. Try a different combination of parameters. " @@ -10480,7 +11336,7 @@ msgstr "" "Or a different Method of paint\n" "%s" -#: flatcamTools/ToolPaint.py:1138 +#: flatcamTools/ToolPaint.py:1139 msgid "" "[ERROR] There is no Painting Geometry in the file.\n" "Usually it means that the tool diameter is too big for the painted " @@ -10492,11 +11348,11 @@ msgstr "" "geometry.\n" "Change the painting parameters and try again." -#: flatcamTools/ToolPaint.py:1147 +#: flatcamTools/ToolPaint.py:1148 msgid "[success] Paint All Done." msgstr "[success] Paint All Done." -#: flatcamTools/ToolPaint.py:1233 +#: flatcamTools/ToolPaint.py:1234 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 " @@ -10508,7 +11364,7 @@ msgstr "" "geometry.\n" "Change the painting parameters and try again." -#: flatcamTools/ToolPaint.py:1242 +#: flatcamTools/ToolPaint.py:1243 msgid "[success] Paint All with Rest-Machining done." msgstr "[success] Paint All with Rest-Machining done." @@ -10618,6 +11474,160 @@ msgstr "" msgid "[success] Panel created successfully." msgstr "[success] Panel created successfully." +#: flatcamTools/ToolPcbWizard.py:32 +msgid "PcbWizard Import Tool" +msgstr "PcbWizard Import Tool" + +#: flatcamTools/ToolPcbWizard.py:40 +msgid "Import 2-file Excellon" +msgstr "Import 2-file Excellon" + +#: flatcamTools/ToolPcbWizard.py:57 +msgid "Excellon file:" +msgstr "Excellon file:" + +#: flatcamTools/ToolPcbWizard.py:59 +msgid "" +"Load the Excellon file.\n" +"Usually it has a .DRL extension" +msgstr "" +"Load the Excellon file.\n" +"Usually it has a .DRL extension" + +#: flatcamTools/ToolPcbWizard.py:66 +msgid "INF file:" +msgstr "INF file:" + +#: flatcamTools/ToolPcbWizard.py:68 +msgid "Load the INF file." +msgstr "Load the INF file." + +#: flatcamTools/ToolPcbWizard.py:81 +msgid "Tool Number" +msgstr "Tool Number" + +#: flatcamTools/ToolPcbWizard.py:83 +msgid "Tool diameter in file units." +msgstr "Tool diameter in file units." + +#: flatcamTools/ToolPcbWizard.py:97 +msgid "Int. digits:" +msgstr "Int. digits:" + +#: flatcamTools/ToolPcbWizard.py:99 +msgid "The number of digits for the integral part of the coordinates." +msgstr "The number of digits for the integral part of the coordinates." + +#: flatcamTools/ToolPcbWizard.py:106 +msgid "Frac. digits:" +msgstr "Frac. digits:" + +#: flatcamTools/ToolPcbWizard.py:108 +msgid "The number of digits for the fractional part of the coordinates." +msgstr "The number of digits for the fractional part of the coordinates." + +#: flatcamTools/ToolPcbWizard.py:116 +msgid "Zeros supp.:" +msgstr "Zeros supp.:" + +#: flatcamTools/ToolPcbWizard.py:118 +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 "" +"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" + +#: flatcamTools/ToolPcbWizard.py:129 +msgid "Units" +msgstr "Units" + +#: flatcamTools/ToolPcbWizard.py:131 +msgid "" +"The type of units that the coordinates and tool\n" +"diameters are using. Can be INCH or MM." +msgstr "" +"The type of units that the coordinates and tool\n" +"diameters are using. Can be INCH or MM." + +#: flatcamTools/ToolPcbWizard.py:138 +msgid "Import Excellon" +msgstr "Import Excellon" + +#: flatcamTools/ToolPcbWizard.py:140 +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 "" +"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." + +#: flatcamTools/ToolPcbWizard.py:194 +msgid "PCBWizard Tool" +msgstr "PCBWizard Tool" + +#: flatcamTools/ToolPcbWizard.py:288 flatcamTools/ToolPcbWizard.py:292 +msgid "Load PcbWizard Excellon file" +msgstr "Load PcbWizard Excellon file" + +#: flatcamTools/ToolPcbWizard.py:312 flatcamTools/ToolPcbWizard.py:316 +msgid "Load PcbWizard INF file" +msgstr "Load PcbWizard INF file" + +#: flatcamTools/ToolPcbWizard.py:363 +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 "" +"[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." + +#: flatcamTools/ToolPcbWizard.py:383 +msgid "[success] PcbWizard .INF file loaded." +msgstr "[success] PcbWizard .INF file loaded." + +#: flatcamTools/ToolPcbWizard.py:387 +msgid "[success] Main PcbWizard Excellon file loaded." +msgstr "[success] Main PcbWizard Excellon file loaded." + +#: flatcamTools/ToolPcbWizard.py:424 +#, python-format +msgid "[ERROR_NOTCL] Cannot parse file: %s" +msgstr "[ERROR_NOTCL] Cannot parse file: %s" + +#: flatcamTools/ToolPcbWizard.py:447 +msgid "Importing Excellon." +msgstr "Importing Excellon." + +#: flatcamTools/ToolPcbWizard.py:454 +msgid "[ERROR_NOTCL] Import Excellon file failed." +msgstr "[ERROR_NOTCL] Import Excellon file failed." + +#: flatcamTools/ToolPcbWizard.py:461 +#, python-format +msgid "[success] Imported: %s" +msgstr "[success] Imported: %s" + +#: flatcamTools/ToolPcbWizard.py:464 +msgid "[WARNING_NOTCL] Excellon merging is in progress. Please wait..." +msgstr "[WARNING_NOTCL] Excellon merging is in progress. Please wait..." + +#: flatcamTools/ToolPcbWizard.py:466 +msgid "[ERROR_NOTCL] The imported Excellon file is None." +msgstr "[ERROR_NOTCL] The imported Excellon file is None." + #: flatcamTools/ToolProperties.py:103 msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." msgstr "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." @@ -10827,45 +11837,45 @@ msgstr "" msgid "Delete Object" msgstr "Delete Object" -#: flatcamTools/ToolSolderPaste.py:788 +#: flatcamTools/ToolSolderPaste.py:789 msgid "" "[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." msgstr "" "[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." -#: flatcamTools/ToolSolderPaste.py:793 +#: flatcamTools/ToolSolderPaste.py:794 msgid "[success] New Nozzle tool added to Tool Table." msgstr "[success] New Nozzle tool added to Tool Table." -#: flatcamTools/ToolSolderPaste.py:835 +#: flatcamTools/ToolSolderPaste.py:836 msgid "[success] Nozzle tool from Tool Table was edited." msgstr "[success] Nozzle tool from Tool Table was edited." -#: flatcamTools/ToolSolderPaste.py:891 +#: flatcamTools/ToolSolderPaste.py:892 msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." msgstr "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." -#: flatcamTools/ToolSolderPaste.py:896 +#: flatcamTools/ToolSolderPaste.py:897 msgid "[success] Nozzle tool(s) deleted from Tool Table." msgstr "[success] Nozzle tool(s) deleted from Tool Table." -#: flatcamTools/ToolSolderPaste.py:951 +#: flatcamTools/ToolSolderPaste.py:952 msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." msgstr "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." -#: flatcamTools/ToolSolderPaste.py:968 +#: flatcamTools/ToolSolderPaste.py:969 msgid "Creating Solder Paste dispensing geometry." msgstr "Creating Solder Paste dispensing geometry." -#: flatcamTools/ToolSolderPaste.py:980 +#: flatcamTools/ToolSolderPaste.py:981 msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." msgstr "[WARNING_NOTCL] No Nozzle tools in the tool table." -#: flatcamTools/ToolSolderPaste.py:1109 +#: flatcamTools/ToolSolderPaste.py:1110 msgid "[success] Solder Paste geometry generated successfully..." msgstr "[success] Solder Paste geometry generated successfully..." -#: flatcamTools/ToolSolderPaste.py:1115 +#: flatcamTools/ToolSolderPaste.py:1116 msgid "" "[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " "diameters..." @@ -10873,15 +11883,15 @@ msgstr "" "[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " "diameters..." -#: flatcamTools/ToolSolderPaste.py:1129 +#: flatcamTools/ToolSolderPaste.py:1130 msgid "Generating Solder Paste dispensing geometry..." msgstr "Generating Solder Paste dispensing geometry..." -#: flatcamTools/ToolSolderPaste.py:1149 +#: flatcamTools/ToolSolderPaste.py:1150 msgid "[WARNING_NOTCL] There is no Geometry object available." msgstr "[WARNING_NOTCL] There is no Geometry object available." -#: flatcamTools/ToolSolderPaste.py:1153 +#: flatcamTools/ToolSolderPaste.py:1154 msgid "" "[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " "geometry." @@ -10889,13 +11899,13 @@ msgstr "" "[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " "geometry." -#: flatcamTools/ToolSolderPaste.py:1258 +#: flatcamTools/ToolSolderPaste.py:1259 #, python-format msgid "[success] ToolSolderPaste CNCjob created: %s" msgstr "[success] ToolSolderPaste CNCjob created: %s" -#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 -#: flatcamTools/ToolSolderPaste.py:1345 +#: flatcamTools/ToolSolderPaste.py:1291 flatcamTools/ToolSolderPaste.py:1295 +#: flatcamTools/ToolSolderPaste.py:1346 msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " "solder_paste_tool CNCJob object." @@ -10903,20 +11913,20 @@ msgstr "" "[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " "solder_paste_tool CNCJob object." -#: flatcamTools/ToolSolderPaste.py:1317 +#: flatcamTools/ToolSolderPaste.py:1318 msgid "[ERROR_NOTCL] No Gcode in the object..." msgstr "[ERROR_NOTCL] No Gcode in the object..." -#: flatcamTools/ToolSolderPaste.py:1326 +#: flatcamTools/ToolSolderPaste.py:1327 #, python-format msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" msgstr "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" -#: flatcamTools/ToolSolderPaste.py:1355 +#: flatcamTools/ToolSolderPaste.py:1356 msgid "Export GCode ..." msgstr "Export GCode ..." -#: flatcamTools/ToolSolderPaste.py:1393 +#: flatcamTools/ToolSolderPaste.py:1394 #, python-format msgid "[success] Solder paste dispenser GCode file saved to: %s" msgstr "[success] Solder paste dispenser GCode file saved to: %s" @@ -11029,6 +12039,31 @@ msgstr "[WARNING_NOTCL] No object selected. Please Select an object to offset!" msgid "CNCJob objects can't be offseted." msgstr "CNCJob objects can't be offseted." +#~ msgid "Done." +#~ msgstr "Done." + +#~ msgid "Click on CENTER ..." +#~ msgstr "Click on CENTER ..." + +#~ msgid "[success] Done. Region completed." +#~ msgstr "[success] Done. Region completed." + +#~ msgid "Add an aperture to the aperture list" +#~ msgstr "Add an aperture to the aperture list" + +#~ msgid "Go" +#~ msgstr "Go" + +#~ msgid "Del Aperture:" +#~ msgstr "Del Aperture:" + +#~ msgid "" +#~ "Delete a aperture in the aperture list.\n" +#~ "It will delete also the associated geometry." +#~ msgstr "" +#~ "Delete a aperture in the aperture list.\n" +#~ "It will delete also the associated geometry." + #~ msgid "Save && Close Edit" #~ msgstr "Save && Close Edit" @@ -11464,12 +12499,6 @@ msgstr "CNCJob objects can't be offseted." #~ msgid "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." #~ msgstr "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." -#~ msgid "[ERROR_NOTCL] Cretion of Gerber failed." -#~ msgstr "[ERROR_NOTCL] Cretion of Gerber failed." - -#~ msgid "[success] Created: %s" -#~ msgstr "[success] Created: %s" - #~ msgid "[ERROR_NOTCL]Cancelled. Empty file, it has no geometry..." #~ msgstr "[ERROR_NOTCL]Cancelled. Empty file, it has no geometry..." diff --git a/locale/ro/LC_MESSAGES/strings.mo b/locale/ro/LC_MESSAGES/strings.mo index dfc2258acde2e052340c0064dc2269b22dc75962..494ec73ff648cfd3c4ae89d68f377cb195e49197 100644 GIT binary patch delta 44911 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 JuB5&s{9lNx4MYF{ delta 38090 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 T|L{<)_Wrv5(5X)T++qI@?s)bl diff --git a/locale/ro/LC_MESSAGES/strings.po b/locale/ro/LC_MESSAGES/strings.po index 9184243b..f1df4002 100644 --- a/locale/ro/LC_MESSAGES/strings.po +++ b/locale/ro/LC_MESSAGES/strings.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"POT-Creation-Date: 2019-04-12 21:46+0300\n" -"PO-Revision-Date: 2019-04-12 22:53+0300\n" +"POT-Creation-Date: 2019-04-23 16:57+0300\n" +"PO-Revision-Date: 2019-04-23 17:48+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: ro\n" @@ -26,132 +26,133 @@ msgstr "" #: FlatCAMApp.py:857 msgid "[ERROR] Could not find the Language files. The App strings are missing." msgstr "" -"[ERROR]Nu am gasit fişierele cu traduceri. Mesajele aplicaţiei lipsesc." +"[ERROR] Nu am gasit fişierele cu traduceri. Mesajele aplicaţiei lipsesc." -#: FlatCAMApp.py:1888 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +#: FlatCAMApp.py:1889 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +#: flatcamTools/ToolPcbWizard.py:299 flatcamTools/ToolPcbWizard.py:322 msgid "Open cancelled." msgstr "Deschidere anulata." -#: FlatCAMApp.py:1902 +#: FlatCAMApp.py:1903 msgid "Open Config file failed." msgstr "Deschiderea fişierului de configurare a eşuat." -#: FlatCAMApp.py:1916 +#: FlatCAMApp.py:1917 msgid "Open Script file failed." msgstr "Deschiderea fişierului Script eşuat." -#: FlatCAMApp.py:2098 -msgid "[WARNING_NOTCL] Select a Geometry or Excellon Object to edit." +#: FlatCAMApp.py:2102 +msgid "[WARNING_NOTCL] Select a Geometry, Gerber or Excellon Object to edit." msgstr "" -"[WARNING_NOTCL] Selectează un obiect tip Geometrie sau Excellon pentru " -"editare." +"[WARNING_NOTCL] Selectează un obiect tip Geometrie Gerber sau Excellon " +"pentru editare." -#: FlatCAMApp.py:2108 +#: FlatCAMApp.py:2112 msgid "" "[WARNING_NOTCL] Simultanoeus editing of tools geometry in a MultiGeo " "Geometry is not possible.\n" -" Edit only one geometry at a time." +"Edit only one geometry at a time." msgstr "" -"[WARNING_NOTCL] Editarea simultana de geometrii ale uneltelor dintr-un " -"obiect tip Geometrie MultiGeo nu este posibila.\n" -"Se poate edita numai o singură geometrie de fiecare data." +"[WARNING_NOTCL] Editarea simultană de geometrii ale uneltelor dintr-un " +"obiect tip Geometrie MultiGeo nu este posibilă.\n" +"Se poate edita numai o singură geometrie de fiecare dată." -#: FlatCAMApp.py:2144 +#: FlatCAMApp.py:2149 msgid "[WARNING_NOTCL] Editor is activated ..." msgstr "[WARNING_NOTCL] Editorul este activ. .." -#: FlatCAMApp.py:2171 +#: FlatCAMApp.py:2168 msgid "Do you want to save the edited object?" msgstr "Vrei sa salvezi obiectul editat?" -#: FlatCAMApp.py:2172 flatcamGUI/FlatCAMGUI.py:1549 +#: FlatCAMApp.py:2169 flatcamGUI/FlatCAMGUI.py:1593 msgid "Close Editor" msgstr "Inchide Editorul" -#: FlatCAMApp.py:2175 FlatCAMApp.py:3255 FlatCAMApp.py:5564 -#: FlatCAMTranslation.py:89 flatcamGUI/FlatCAMGUI.py:3542 +#: FlatCAMApp.py:2172 FlatCAMApp.py:3254 FlatCAMApp.py:5559 +#: FlatCAMTranslation.py:89 flatcamGUI/FlatCAMGUI.py:3631 msgid "Yes" msgstr "Da" -#: FlatCAMApp.py:2176 FlatCAMApp.py:3256 FlatCAMApp.py:5565 -#: FlatCAMTranslation.py:90 flatcamGUI/FlatCAMGUI.py:3543 +#: FlatCAMApp.py:2173 FlatCAMApp.py:3255 FlatCAMApp.py:5560 +#: FlatCAMTranslation.py:90 flatcamGUI/FlatCAMGUI.py:3632 msgid "No" msgstr "Nu" -#: FlatCAMApp.py:2177 FlatCAMApp.py:3257 FlatCAMApp.py:3589 FlatCAMApp.py:5566 +#: FlatCAMApp.py:2174 FlatCAMApp.py:3256 FlatCAMApp.py:3588 FlatCAMApp.py:5561 msgid "Cancel" msgstr "Anuleaza" -#: FlatCAMApp.py:2199 FlatCAMApp.py:2224 +#: FlatCAMApp.py:2196 FlatCAMApp.py:2221 msgid "[WARNING] Object empty after edit." msgstr "[WARNING] Obiectul nu are date dupa editare." -#: FlatCAMApp.py:2233 FlatCAMApp.py:2245 FlatCAMApp.py:2257 +#: FlatCAMApp.py:2230 FlatCAMApp.py:2244 FlatCAMApp.py:2256 msgid "[WARNING_NOTCL] Select a Gerber, Geometry or Excellon Object to update." msgstr "" "[WARNING_NOTCL] Selectează un obiect tip Gerber, Geometrie sau Excellon " "pentru salvare." -#: FlatCAMApp.py:2236 +#: FlatCAMApp.py:2233 #, python-format msgid "[selected] %s is updated, returning to App..." msgstr "[selected] %s este actualizat, intoarcere la aplicaţie." -#: FlatCAMApp.py:2593 +#: FlatCAMApp.py:2592 msgid "[ERROR] Could not load defaults file." msgstr "[ERROR] Nu am putut incărca fişierul cu valori default." -#: FlatCAMApp.py:2605 +#: FlatCAMApp.py:2604 msgid "[ERROR] Failed to parse defaults file." msgstr "[ERROR] Parsarea fişierului cu valori default a eșuat." -#: FlatCAMApp.py:2626 FlatCAMApp.py:2629 +#: FlatCAMApp.py:2625 FlatCAMApp.py:2628 msgid "Import FlatCAM Preferences" msgstr "Importa Preferințele FlatCAM" -#: FlatCAMApp.py:2634 +#: FlatCAMApp.py:2633 msgid "[WARNING_NOTCL] FlatCAM preferences import cancelled." msgstr "[WARNING_NOTCL] Importul preferințelor FlatCAM a eșuat." -#: FlatCAMApp.py:2642 FlatCAMApp.py:2689 FlatCAMApp.py:3134 +#: FlatCAMApp.py:2641 FlatCAMApp.py:2688 FlatCAMApp.py:3133 msgid "[ERROR_NOTCL] Could not load defaults file." msgstr "" -"[ERROR_NOTCL] Nu a fost posibila incărcarea fişierului cu valori default." +"[ERROR_NOTCL] Nu a fost posibilă incărcarea fişierului cu valori default." -#: FlatCAMApp.py:2650 FlatCAMApp.py:3143 +#: FlatCAMApp.py:2649 FlatCAMApp.py:3142 msgid "[ERROR_NOTCL] Failed to parse defaults file." msgstr "[ERROR_NOTCL] Parsarea fişierului cu valori default a eșuat." -#: FlatCAMApp.py:2653 +#: FlatCAMApp.py:2652 #, python-format msgid "[success] Imported Defaults from %s" msgstr "[success] Valorile default au fost importate din %s" -#: FlatCAMApp.py:2663 FlatCAMApp.py:2667 +#: FlatCAMApp.py:2662 FlatCAMApp.py:2666 msgid "Export FlatCAM Preferences" msgstr "Exporta Preferințele FlatCAM" -#: FlatCAMApp.py:2673 +#: FlatCAMApp.py:2672 msgid "[WARNING_NOTCL] FlatCAM preferences export cancelled." msgstr "[WARNING_NOTCL] Exportul preferințelor FlatCAM este anulat." -#: FlatCAMApp.py:2708 FlatCAMApp.py:3188 +#: FlatCAMApp.py:2707 FlatCAMApp.py:3187 msgid "[ERROR_NOTCL] Failed to write defaults to file." msgstr "[ERROR_NOTCL] Salvarea valorilor default intr-un fişier a eșuat." -#: FlatCAMApp.py:2760 +#: FlatCAMApp.py:2759 msgid "[ERROR_NOTCL] Failed to open recent files file for writing." msgstr "" "[ERROR_NOTCL] Deschiderea fişierului cu >fişiere recente< pentru a fi salvat " "a eșuat." -#: FlatCAMApp.py:2845 camlib.py:4430 +#: FlatCAMApp.py:2844 camlib.py:4493 msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" msgstr "" -"[ERROR_NOTCL] A aparut o eroare interna. Verifică in TCL Shell pt mai multe " +"[ERROR_NOTCL] A apărut o eroare internă. Verifică in TCL Shell pt mai multe " "detalii.\n" -#: FlatCAMApp.py:2846 +#: FlatCAMApp.py:2845 #, python-brace-format msgid "" "Object ({kind}) failed because: {error} \n" @@ -160,11 +161,11 @@ msgstr "" "Obiectul ({kind}) a eșuat din cauza: {error} \n" "\n" -#: FlatCAMApp.py:2866 +#: FlatCAMApp.py:2865 msgid "Converting units to " msgstr "Se convertesc unitatile la " -#: FlatCAMApp.py:2936 FlatCAMApp.py:2939 FlatCAMApp.py:2942 FlatCAMApp.py:2945 +#: FlatCAMApp.py:2935 FlatCAMApp.py:2938 FlatCAMApp.py:2941 FlatCAMApp.py:2944 #, python-brace-format msgid "" "[selected] {kind} created/selected: {name}{name}" -#: FlatCAMApp.py:3039 +#: FlatCAMApp.py:3038 #, python-brace-format msgid "" "FlatCAM
Version {version} {beta} ({date}) - " @@ -195,35 +196,35 @@ msgstr "" "flatcam/src/Beta/\">aici.
Sectiunea DOWNLOAD este aici.
" -#: FlatCAMApp.py:3192 +#: FlatCAMApp.py:3191 msgid "[success] Defaults saved." msgstr "[success] Valorile default au fost salvate." -#: FlatCAMApp.py:3213 +#: FlatCAMApp.py:3212 msgid "[ERROR_NOTCL] Could not load factory defaults file." msgstr "" "[ERROR_NOTCL] Fişierul cu valori default de fabrică nu a putut fi deschis." -#: FlatCAMApp.py:3222 +#: FlatCAMApp.py:3221 msgid "[ERROR_NOTCL] Failed to parse factory defaults file." msgstr "" "[ERROR_NOTCL] Parsarea fişierului cu valori default de fabrică a eșuat." -#: FlatCAMApp.py:3236 +#: FlatCAMApp.py:3235 msgid "[ERROR_NOTCL] Failed to write factory defaults to file." msgstr "" "[ERROR_NOTCL]] Salvarea fişierului cu valori default de fabrică intr-un " "fişier a eșuat." -#: FlatCAMApp.py:3240 +#: FlatCAMApp.py:3239 msgid "Factory defaults saved." msgstr "Valori default de fabrică au fost salvate." -#: FlatCAMApp.py:3245 flatcamGUI/FlatCAMGUI.py:2974 +#: FlatCAMApp.py:3244 flatcamGUI/FlatCAMGUI.py:3063 msgid "[WARNING_NOTCL] Application is saving the project. Please wait ..." msgstr "[WARNING_NOTCL] Aplicația salvează proiectul. Vă rugăm aşteptați ..." -#: FlatCAMApp.py:3250 +#: FlatCAMApp.py:3249 msgid "" "There are files/objects modified in FlatCAM. \n" "Do you want to Save the project?" @@ -231,11 +232,11 @@ msgstr "" "FlatCAM are fişiere/obiecte care au fost modificate. \n" "Dorești să Salvezi proiectul?" -#: FlatCAMApp.py:3253 FlatCAMApp.py:5562 +#: FlatCAMApp.py:3252 FlatCAMApp.py:5557 msgid "Save changes" msgstr "Salvează modificarile." -#: FlatCAMApp.py:3320 +#: FlatCAMApp.py:3319 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 " @@ -252,73 +253,73 @@ msgstr "" "informatii și rezultatul ar putea să nu fie cel dorit. \n" "Verifică codul G-Code generat." -#: FlatCAMApp.py:3361 +#: FlatCAMApp.py:3360 msgid "[ERROR_NOTCL] Failed. Excellon joining works only on Excellon objects." msgstr "" "[ERROR_NOTCL] Esuat. Fuzionarea Excellon functionează doar cu obiecte de tip " "Excellon." -#: FlatCAMApp.py:3383 +#: FlatCAMApp.py:3382 msgid "[ERROR_NOTCL] Failed. Gerber joining works only on Gerber objects." msgstr "" "[ERROR_NOTCL] Esuat. Fuzionarea Gerber functionează doar cu obiecte de tip " "Gerber ." -#: FlatCAMApp.py:3398 FlatCAMApp.py:3423 +#: FlatCAMApp.py:3397 FlatCAMApp.py:3422 msgid "[ERROR_NOTCL] Failed. Select a Geometry Object and try again." msgstr "" "[ERROR_NOTCL] Esuat. Selectează un obiect Geometrie și încearcă din nou." -#: FlatCAMApp.py:3402 FlatCAMApp.py:3427 +#: FlatCAMApp.py:3401 FlatCAMApp.py:3426 #, python-format msgid "[ERROR_NOTCL] Expected a FlatCAMGeometry, got %s" msgstr "[ERROR_NOTCL] Se astepta o Geometrie FlatCAM, s-a primit %s" -#: FlatCAMApp.py:3415 +#: FlatCAMApp.py:3414 msgid "[success] A Geometry object was converted to MultiGeo type." msgstr "[success] Un obiect Geometrie a fost convertit la tipul MultiGeo." -#: FlatCAMApp.py:3441 +#: FlatCAMApp.py:3440 msgid "[success] A Geometry object was converted to SingleGeo type." msgstr "[success] Un obiect Geometrie a fost convertit la tipul SingleGeo ." -#: FlatCAMApp.py:3588 FlatCAMApp.py:4353 FlatCAMApp.py:5829 FlatCAMApp.py:5840 -#: FlatCAMApp.py:6026 FlatCAMApp.py:6036 +#: FlatCAMApp.py:3587 FlatCAMApp.py:4352 FlatCAMApp.py:5824 FlatCAMApp.py:5835 +#: FlatCAMApp.py:6021 FlatCAMApp.py:6031 msgid "Ok" msgstr "Ok" -#: FlatCAMApp.py:3629 +#: FlatCAMApp.py:3628 #, python-format msgid "[success] Converted units to %s" msgstr "[success] Conversie unitati la %s" -#: FlatCAMApp.py:3640 +#: FlatCAMApp.py:3639 msgid "[WARNING_NOTCL] Units conversion cancelled." msgstr "[WARNING_NOTCL] Conversia unitatilor este anulata." -#: FlatCAMApp.py:4222 +#: FlatCAMApp.py:4221 msgid "Open file" msgstr "Deschide fişierul ..." -#: FlatCAMApp.py:4253 FlatCAMApp.py:4258 +#: FlatCAMApp.py:4252 FlatCAMApp.py:4257 msgid "Export G-Code ..." msgstr "Exporta G-Code ..." -#: FlatCAMApp.py:4261 +#: FlatCAMApp.py:4260 msgid "[WARNING_NOTCL] Export Code cancelled." msgstr "[WARNING_NOTCL Exportul GCode este anulat." -#: FlatCAMApp.py:4271 +#: FlatCAMApp.py:4270 msgid "[WARNING] No such file or directory" msgstr "[WARNING] Nu exista un aşa fişier sau director" -#: FlatCAMApp.py:4278 +#: FlatCAMApp.py:4277 #, python-format msgid "Saved to: %s" msgstr "Salvat in: %s" -#: FlatCAMApp.py:4341 FlatCAMApp.py:4374 FlatCAMApp.py:4385 FlatCAMApp.py:4396 -#: flatcamTools/ToolNonCopperClear.py:488 flatcamTools/ToolSolderPaste.py:764 +#: FlatCAMApp.py:4340 FlatCAMApp.py:4373 FlatCAMApp.py:4384 FlatCAMApp.py:4395 +#: flatcamTools/ToolNonCopperClear.py:489 flatcamTools/ToolSolderPaste.py:765 msgid "" "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " "format." @@ -326,12 +327,12 @@ msgstr "" "[WARNING_NOTCL] Introdu un diametru al uneltei valid: valoare ne-nula in " "format Real." -#: FlatCAMApp.py:4346 FlatCAMApp.py:4379 FlatCAMApp.py:4390 FlatCAMApp.py:4401 -#: flatcamGUI/FlatCAMGUI.py:2891 +#: FlatCAMApp.py:4345 FlatCAMApp.py:4378 FlatCAMApp.py:4389 FlatCAMApp.py:4400 +#: flatcamGUI/FlatCAMGUI.py:2959 msgid "[WARNING_NOTCL] Adding Tool cancelled ..." msgstr "[WARNING_NOTCL] Adaugarea unei unelte anulata ..." -#: FlatCAMApp.py:4349 +#: FlatCAMApp.py:4348 msgid "" "Adding Tool works only when Advanced is checked.\n" "Go to Preferences -> General - Show Advanced Options." @@ -339,159 +340,166 @@ msgstr "" "Adaugarea de unelte noi functionează doar in modul Avansat.\n" "Pentru aceasta mergi in Preferințe -> General - Activează Modul Avansat." -#: FlatCAMApp.py:4455 +#: FlatCAMApp.py:4454 msgid "Object(s) deleted ..." msgstr "Obiect(ele) șters(e)." -#: FlatCAMApp.py:4459 +#: FlatCAMApp.py:4458 msgid "Failed. No object(s) selected..." msgstr "Esuat. Nici-un obiect nu este selectat." -#: FlatCAMApp.py:4461 +#: FlatCAMApp.py:4460 msgid "Save the work in Editor and try again ..." msgstr "Salvează continutul din Editor și încearcă din nou." -#: FlatCAMApp.py:4474 +#: FlatCAMApp.py:4473 msgid "Click to set the origin ..." msgstr "Click pentru a seta originea..." -#: FlatCAMApp.py:4487 +#: FlatCAMApp.py:4485 msgid "Jump to ..." msgstr "Sari la ..." -#: FlatCAMApp.py:4488 +#: FlatCAMApp.py:4486 msgid "Enter the coordinates in format X,Y:" msgstr "Introduceți coordonatele in format X,Y:" -#: FlatCAMApp.py:4495 +#: FlatCAMApp.py:4493 msgid "Wrong coordinates. Enter coordinates in format: X,Y" msgstr "Coordonate gresite. Introduceți coordonatele in format X,Y." -#: FlatCAMApp.py:4513 -msgid "Done." -msgstr "Executat." +#: FlatCAMApp.py:4511 flatcamEditors/FlatCAMGeoEditor.py:3413 +#: flatcamEditors/FlatCAMGrbEditor.py:790 +#: flatcamEditors/FlatCAMGrbEditor.py:885 +#: flatcamEditors/FlatCAMGrbEditor.py:1122 +#: flatcamEditors/FlatCAMGrbEditor.py:1343 +#: flatcamEditors/FlatCAMGrbEditor.py:3235 +#: flatcamEditors/FlatCAMGrbEditor.py:3248 flatcamGUI/FlatCAMGUI.py:2373 +#: flatcamGUI/FlatCAMGUI.py:2385 +msgid "[success] Done." +msgstr "[success] Executat." -#: FlatCAMApp.py:4672 +#: FlatCAMApp.py:4670 msgid "[success] Origin set ..." msgstr "[success] Originea a fost setată ..." -#: FlatCAMApp.py:4690 +#: FlatCAMApp.py:4688 msgid "Preferences" msgstr "Preferințe" -#: FlatCAMApp.py:4710 +#: FlatCAMApp.py:4708 msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." msgstr "" "[WARNING_NOTCL] Nu sete nici-un obiect selectat pentru oglindire pe axa Y." -#: FlatCAMApp.py:4735 +#: FlatCAMApp.py:4733 msgid "[success] Flip on Y axis done." msgstr "[success] Oglindire pe axa Y executată." -#: FlatCAMApp.py:4737 FlatCAMApp.py:4777 -#: flatcamEditors/FlatCAMGeoEditor.py:1353 -#: flatcamEditors/FlatCAMGrbEditor.py:3522 flatcamTools/ToolTransform.py:750 +#: FlatCAMApp.py:4735 FlatCAMApp.py:4775 +#: flatcamEditors/FlatCAMGeoEditor.py:1354 +#: flatcamEditors/FlatCAMGrbEditor.py:4533 flatcamTools/ToolTransform.py:750 #, python-format msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." msgstr "[ERROR_NOTCL] Datorita %s, oglindirea a eșuat." -#: FlatCAMApp.py:4750 +#: FlatCAMApp.py:4748 msgid "[WARNING_NOTCL] No object selected to Flip on X axis." msgstr "" "[WARNING_NOTCL] Nu sete nici-un obiect selectat pentru oglindire pe axa X." -#: FlatCAMApp.py:4775 +#: FlatCAMApp.py:4773 msgid "[success] Flip on X axis done." msgstr "[success] Oglindirea pe axa X executată." -#: FlatCAMApp.py:4790 +#: FlatCAMApp.py:4788 msgid "[WARNING_NOTCL] No object selected to Rotate." msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru Rotaţie." -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Transform" msgstr "Transformare" -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Enter the Angle value:" msgstr "Introduceți valoaea Unghiului:" -#: FlatCAMApp.py:4823 +#: FlatCAMApp.py:4821 msgid "[success] Rotation done." msgstr "[success] Rotaţie executată." -#: FlatCAMApp.py:4825 flatcamEditors/FlatCAMGeoEditor.py:1296 -#: flatcamEditors/FlatCAMGrbEditor.py:3465 flatcamTools/ToolTransform.py:678 +#: FlatCAMApp.py:4823 flatcamEditors/FlatCAMGeoEditor.py:1297 +#: flatcamEditors/FlatCAMGrbEditor.py:4476 flatcamTools/ToolTransform.py:678 #, python-format msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." msgstr "[ERROR_NOTCL] Datorita %s, Rotatia a eșuat." -#: FlatCAMApp.py:4836 +#: FlatCAMApp.py:4834 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru Deformare pe axa X." -#: FlatCAMApp.py:4857 +#: FlatCAMApp.py:4855 msgid "[success] Skew on X axis done." msgstr "[success] Deformare pe axa X executată." -#: FlatCAMApp.py:4867 +#: FlatCAMApp.py:4865 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru Deformare pe axa Y." -#: FlatCAMApp.py:4888 +#: FlatCAMApp.py:4886 msgid "[success] Skew on Y axis done." msgstr "[success] Deformare pe axa Y executată." -#: FlatCAMApp.py:4984 FlatCAMApp.py:5011 +#: FlatCAMApp.py:4982 FlatCAMApp.py:5009 msgid "" "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " "format." msgstr "" "[WARNING_NOTCL] Introduceți o valoare pentru Grila ne-nula și in format Real." -#: FlatCAMApp.py:4990 +#: FlatCAMApp.py:4988 msgid "[success] New Grid added ..." msgstr "[success] O noua valoare pt Grila a fost adăugată..." -#: FlatCAMApp.py:4993 +#: FlatCAMApp.py:4991 msgid "[WARNING_NOTCL] Grid already exists ..." msgstr "[WARNING_NOTCL] Grila exista deja." -#: FlatCAMApp.py:4996 +#: FlatCAMApp.py:4994 msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." msgstr "[WARNING_NOTCL] Adaugarea unei valori de Grila a fost anulata ..." -#: FlatCAMApp.py:5018 +#: FlatCAMApp.py:5016 msgid "[ERROR_NOTCL] Grid Value does not exist ..." msgstr "[ERROR_NOTCL] Valoarea Grilei nu exista ..." -#: FlatCAMApp.py:5021 +#: FlatCAMApp.py:5019 msgid "[success] Grid Value deleted ..." msgstr "[success] Valoarea Grila a fost stearsa." -#: FlatCAMApp.py:5024 +#: FlatCAMApp.py:5022 msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." msgstr "[WARNING_NOTCL] Ștergerea unei valori de Grila a fost anulata ..." -#: FlatCAMApp.py:5063 +#: FlatCAMApp.py:5061 msgid "[WARNING_NOTCL] No object selected to copy it's name" msgstr "" "[WARNING_NOTCL] Nici-un obiect nu este selectat pentru i se copia valoarea" -#: FlatCAMApp.py:5067 +#: FlatCAMApp.py:5065 msgid "Name copied on clipboard ..." msgstr "Numele a fost copiat pe Clipboard ..." -#: FlatCAMApp.py:5362 FlatCAMApp.py:5365 FlatCAMApp.py:5368 FlatCAMApp.py:5371 -#: FlatCAMApp.py:5385 FlatCAMApp.py:5388 FlatCAMApp.py:5391 FlatCAMApp.py:5394 -#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 FlatCAMApp.py:5439 FlatCAMApp.py:5442 +#: FlatCAMApp.py:5357 FlatCAMApp.py:5360 FlatCAMApp.py:5363 FlatCAMApp.py:5366 +#: FlatCAMApp.py:5380 FlatCAMApp.py:5383 FlatCAMApp.py:5386 FlatCAMApp.py:5389 +#: FlatCAMApp.py:5428 FlatCAMApp.py:5431 FlatCAMApp.py:5434 FlatCAMApp.py:5437 #: ObjectCollection.py:711 ObjectCollection.py:714 ObjectCollection.py:717 #: ObjectCollection.py:720 #, python-brace-format msgid "[selected]{name} selected" msgstr "[selected]{name} selectat" -#: FlatCAMApp.py:5559 +#: FlatCAMApp.py:5554 msgid "" "There are files/objects opened in FlatCAM.\n" "Creating a New project will delete them.\n" @@ -501,111 +509,111 @@ msgstr "" "Crearea unui nou Proiect le va șterge..\n" "Doriti să Salvati proiectul curentt?" -#: FlatCAMApp.py:5580 +#: FlatCAMApp.py:5575 msgid "[success] New Project created..." msgstr "[success] Un nou Proiect a fost creat..." -#: FlatCAMApp.py:5688 FlatCAMApp.py:5691 flatcamGUI/FlatCAMGUI.py:594 -#: flatcamGUI/FlatCAMGUI.py:1762 +#: FlatCAMApp.py:5683 FlatCAMApp.py:5686 flatcamGUI/FlatCAMGUI.py:600 +#: flatcamGUI/FlatCAMGUI.py:1806 msgid "Open Gerber" msgstr "Încarcă Gerber" -#: FlatCAMApp.py:5696 +#: FlatCAMApp.py:5691 msgid "[WARNING_NOTCL] Open Gerber cancelled." msgstr "[WARNING_NOTCL] Incărcarea unui fişier Gerber este anulata." -#: FlatCAMApp.py:5717 FlatCAMApp.py:5720 flatcamGUI/FlatCAMGUI.py:595 -#: flatcamGUI/FlatCAMGUI.py:1763 +#: FlatCAMApp.py:5712 FlatCAMApp.py:5715 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1807 msgid "Open Excellon" msgstr "Încarcă Excellon" -#: FlatCAMApp.py:5725 +#: FlatCAMApp.py:5720 msgid "[WARNING_NOTCL] Open Excellon cancelled." msgstr "[WARNING_NOTCL] Incărcarea unui fişier Excellon este anulata." -#: FlatCAMApp.py:5747 FlatCAMApp.py:5750 +#: FlatCAMApp.py:5742 FlatCAMApp.py:5745 msgid "Open G-Code" msgstr "Încarcă G-Code" -#: FlatCAMApp.py:5755 +#: FlatCAMApp.py:5750 msgid "[WARNING_NOTCL] Open G-Code cancelled." msgstr "[WARNING_NOTCL] Incărcarea unui fişier G-Code este anulata." -#: FlatCAMApp.py:5773 FlatCAMApp.py:5776 +#: FlatCAMApp.py:5768 FlatCAMApp.py:5771 msgid "Open Project" msgstr "Încarcă Project" -#: FlatCAMApp.py:5784 +#: FlatCAMApp.py:5779 msgid "[WARNING_NOTCL] Open Project cancelled." msgstr "[WARNING_NOTCL] Incărcarea unui Proiect a fost anulata." -#: FlatCAMApp.py:5803 FlatCAMApp.py:5806 +#: FlatCAMApp.py:5798 FlatCAMApp.py:5801 msgid "Open Configuration File" msgstr "Încarcă un fişier de Configurare" -#: FlatCAMApp.py:5810 +#: FlatCAMApp.py:5805 msgid "[WARNING_NOTCL Open Config cancelled." msgstr "[WARNING_NOTCL] Incărcarea unui fişier de Configurare este anulata." -#: FlatCAMApp.py:5825 FlatCAMApp.py:6022 FlatCAMApp.py:8105 FlatCAMApp.py:8125 -#: FlatCAMApp.py:8146 FlatCAMApp.py:8168 +#: FlatCAMApp.py:5820 FlatCAMApp.py:6017 FlatCAMApp.py:8103 FlatCAMApp.py:8123 +#: FlatCAMApp.py:8144 FlatCAMApp.py:8166 msgid "[WARNING_NOTCL] No object selected." msgstr "[WARNING_NOTCL] Nici-un obiect selectat." -#: FlatCAMApp.py:5826 FlatCAMApp.py:6023 +#: FlatCAMApp.py:5821 FlatCAMApp.py:6018 msgid "Please Select a Geometry object to export" msgstr "Selectează un obiect Geometrie pentru export" -#: FlatCAMApp.py:5837 +#: FlatCAMApp.py:5832 msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." msgstr "" "[ERROR_NOTCL] Doar obiectele Geometrie, Gerber și CNCJob pot fi folosite." -#: FlatCAMApp.py:5850 FlatCAMApp.py:5854 +#: FlatCAMApp.py:5845 FlatCAMApp.py:5849 msgid "Export SVG" msgstr "Exporta SVG" -#: FlatCAMApp.py:5859 +#: FlatCAMApp.py:5854 msgid "[WARNING_NOTCL] Export SVG cancelled." msgstr "[WARNING_NOTCL] Exportul SVG este anulat." -#: FlatCAMApp.py:5873 +#: FlatCAMApp.py:5868 msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" msgstr "" "[[WARNING_NOTCL]] Datele trebuie să fie organizate intr-o arie 3D cu ultima " "dimensiune cu valoarea 3 sau 4." -#: FlatCAMApp.py:5879 FlatCAMApp.py:5883 +#: FlatCAMApp.py:5874 FlatCAMApp.py:5878 msgid "Export PNG Image" msgstr "Exporta imagine PNG" -#: FlatCAMApp.py:5888 +#: FlatCAMApp.py:5883 msgid "Export PNG cancelled." msgstr "Exportul imagine PNG este anulat." -#: FlatCAMApp.py:5905 +#: FlatCAMApp.py:5900 msgid "" "[WARNING_NOTCL] No object selected. Please select an Gerber object to export." msgstr "" "[WARNING_NOTCL] Nici-un obiect selectat. Selectează un obiect Gerber pentru " "export." -#: FlatCAMApp.py:5910 +#: FlatCAMApp.py:5905 msgid "" "[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." msgstr "" "[ERROR_NOTCL] Esuat. Doar obiectele tip Gerber pot fi salvate ca fişiere " "Gerber..." -#: FlatCAMApp.py:5922 +#: FlatCAMApp.py:5917 msgid "Save Gerber source file" msgstr "Salvează codul sursa Gerber ca fişier" -#: FlatCAMApp.py:5927 +#: FlatCAMApp.py:5922 msgid "[WARNING_NOTCL] Save Gerber source file cancelled." msgstr "[WARNING_NOTCL] Salvarea codului sursa Gerber este anulata." -#: FlatCAMApp.py:5944 +#: FlatCAMApp.py:5939 msgid "" "[WARNING_NOTCL] No object selected. Please select an Excellon object to " "export." @@ -613,22 +621,22 @@ msgstr "" "[WARNING_NOTCL] Nici-un obiect selectat. Selectează un obiect Excellon " "pentru export." -#: FlatCAMApp.py:5949 FlatCAMApp.py:5988 +#: FlatCAMApp.py:5944 FlatCAMApp.py:5983 msgid "" "[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." msgstr "" "[ERROR_NOTCL] Esuat. Doar obiectele tip Excellon pot fi salvate ca fişiere " "Excellon ..." -#: FlatCAMApp.py:5957 FlatCAMApp.py:5961 +#: FlatCAMApp.py:5952 FlatCAMApp.py:5956 msgid "Save Excellon source file" msgstr "Salvează codul sursa Excellon ca fişier" -#: FlatCAMApp.py:5966 +#: FlatCAMApp.py:5961 msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." msgstr "[WARNING_NOTCL] Salvarea codului sursa Excellon este anulata." -#: FlatCAMApp.py:5983 +#: FlatCAMApp.py:5978 msgid "" "[WARNING_NOTCL] No object selected. Please Select an Excellon object to " "export." @@ -636,78 +644,78 @@ msgstr "" "[WARNING_NOTCL] Nici-un obiect selectat. Selectează un obiect Excellon " "pentru export." -#: FlatCAMApp.py:5996 FlatCAMApp.py:6000 +#: FlatCAMApp.py:5991 FlatCAMApp.py:5995 msgid "Export Excellon" msgstr "Exporta Excellon" -#: FlatCAMApp.py:6005 +#: FlatCAMApp.py:6000 msgid "[WARNING_NOTCL] Export Excellon cancelled." msgstr "[WARNING_NOTCL] Exportul Excellon anulat." -#: FlatCAMApp.py:6033 +#: FlatCAMApp.py:6028 msgid "[ERROR_NOTCL] Only Geometry objects can be used." msgstr "[ERROR_NOTCL] Doar obiecte tip Geometrie pot fi folosite." -#: FlatCAMApp.py:6047 FlatCAMApp.py:6051 +#: FlatCAMApp.py:6042 FlatCAMApp.py:6046 msgid "Export DXF" msgstr "Exporta DXF" -#: FlatCAMApp.py:6056 +#: FlatCAMApp.py:6051 msgid "[WARNING_NOTCL] Export DXF cancelled." msgstr "[WARNING_NOTCL] Exportul DXF anulat." -#: FlatCAMApp.py:6074 FlatCAMApp.py:6077 +#: FlatCAMApp.py:6069 FlatCAMApp.py:6072 msgid "Import SVG" msgstr "Importa SVG" -#: FlatCAMApp.py:6085 +#: FlatCAMApp.py:6080 msgid "[WARNING_NOTCL] Open SVG cancelled." msgstr "[WARNING_NOTCL] Importul SVG anulat." -#: FlatCAMApp.py:6104 FlatCAMApp.py:6107 +#: FlatCAMApp.py:6099 FlatCAMApp.py:6102 msgid "Import DXF" msgstr "Importa DXF" -#: FlatCAMApp.py:6115 +#: FlatCAMApp.py:6110 msgid "[WARNING_NOTCL] Open DXF cancelled." msgstr "[WARNING_NOTCL] Incărcarea fişier DXF anulata." -#: FlatCAMApp.py:6133 +#: FlatCAMApp.py:6128 #, python-format msgid "%s" msgstr "%s" -#: FlatCAMApp.py:6153 +#: FlatCAMApp.py:6148 msgid "" "[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." msgstr "" "[WARNING_NOTCL] Selectati un obiect Gerber sau Excellon pentru a-i vedea " "codul sursa." -#: FlatCAMApp.py:6160 +#: FlatCAMApp.py:6155 msgid "" "[WARNING_NOTCL] There is no selected object for which to see it's source " "file code." msgstr "[WARNING_NOTCL] Nici-un obiect selectat pentru a-i vedea codul sursa." -#: FlatCAMApp.py:6168 +#: FlatCAMApp.py:6163 msgid "Source Editor" msgstr "Editor Cod" -#: FlatCAMApp.py:6178 +#: FlatCAMApp.py:6173 #, python-format msgid "[ERROR]App.on_view_source() -->%s" msgstr "[ERROR]App.on_view_source() -->%s" -#: FlatCAMApp.py:6190 FlatCAMApp.py:7211 FlatCAMObj.py:5257 +#: FlatCAMApp.py:6185 FlatCAMApp.py:7206 FlatCAMObj.py:5259 msgid "Code Editor" msgstr "Editor Cod" -#: FlatCAMApp.py:6202 +#: FlatCAMApp.py:6197 msgid "Script Editor" msgstr "Editor Script." -#: FlatCAMApp.py:6205 +#: FlatCAMApp.py:6200 msgid "" "#\n" "# CREATE A NEW FLATCAM TCL SCRIPT\n" @@ -751,86 +759,86 @@ msgstr "" "#\n" "\n" -#: FlatCAMApp.py:6228 FlatCAMApp.py:6231 +#: FlatCAMApp.py:6223 FlatCAMApp.py:6226 msgid "Open TCL script" msgstr "Încarcă TCL script" -#: FlatCAMApp.py:6239 +#: FlatCAMApp.py:6234 msgid "[WARNING_NOTCL] Open TCL script cancelled." msgstr "[WARNING_NOTCL] Incărcarea TCL script anulata." -#: FlatCAMApp.py:6251 +#: FlatCAMApp.py:6246 #, python-format msgid "[ERROR]App.on_fileopenscript() -->%s" msgstr "[ERROR]App.on_fileopenscript() -->%s" -#: FlatCAMApp.py:6277 FlatCAMApp.py:6280 +#: FlatCAMApp.py:6272 FlatCAMApp.py:6275 msgid "Run TCL script" msgstr "Ruleaza TCL script" -#: FlatCAMApp.py:6288 +#: FlatCAMApp.py:6283 msgid "[WARNING_NOTCL] Run TCL script cancelled." msgstr "[WARNING_NOTCL] Rularea fisierului Script a fost anulata." -#: FlatCAMApp.py:6334 FlatCAMApp.py:6338 +#: FlatCAMApp.py:6329 FlatCAMApp.py:6333 msgid "Save Project As ..." msgstr "Salvează Proiectul ca ..." -#: FlatCAMApp.py:6335 +#: FlatCAMApp.py:6330 #, python-brace-format msgid "{l_save}/Project_{date}" msgstr "{l_save}/Proiect_{date}" -#: FlatCAMApp.py:6343 +#: FlatCAMApp.py:6338 msgid "[WARNING_NOTCL] Save Project cancelled." msgstr "[WARNING_NOTCL] Salvarea Proiect anulata." -#: FlatCAMApp.py:6388 +#: FlatCAMApp.py:6383 msgid "Exporting SVG" msgstr "SVG in curs de export" -#: FlatCAMApp.py:6421 FlatCAMApp.py:6526 FlatCAMApp.py:6640 +#: FlatCAMApp.py:6416 FlatCAMApp.py:6521 FlatCAMApp.py:6635 #, python-format msgid "[success] SVG file exported to %s" msgstr "[success] Fişier SVG exportat in %s" -#: FlatCAMApp.py:6452 FlatCAMApp.py:6572 +#: FlatCAMApp.py:6447 FlatCAMApp.py:6567 #, python-format msgid "[WARNING_NOTCL] No object Box. Using instead %s" msgstr "" "[WARNING_NOTCL] Nu este nici-un container Box pentru obiect. Se foloseşte %s" -#: FlatCAMApp.py:6529 FlatCAMApp.py:6643 +#: FlatCAMApp.py:6524 FlatCAMApp.py:6638 msgid "Generating Film ... Please wait." msgstr "Filmul se generează ... Aşteaptă!" -#: FlatCAMApp.py:6790 +#: FlatCAMApp.py:6785 #, python-format msgid "[success] Excellon file exported to %s" msgstr "[success] Fişierul Excellon exportat in %s" -#: FlatCAMApp.py:6797 +#: FlatCAMApp.py:6792 msgid "Exporting Excellon" msgstr "Excellon in curs de export" -#: FlatCAMApp.py:6802 FlatCAMApp.py:6809 +#: FlatCAMApp.py:6797 FlatCAMApp.py:6804 msgid "[ERROR_NOTCL] Could not export Excellon file." msgstr "[ERROR_NOTCL] Fişierul Excellon nu a putut fi exportat." -#: FlatCAMApp.py:6848 +#: FlatCAMApp.py:6843 #, python-format msgid "[success] DXF file exported to %s" msgstr "[success] Fişierul DXF exportat in %s" -#: FlatCAMApp.py:6854 +#: FlatCAMApp.py:6849 msgid "Exporting DXF" msgstr "DXF in curs de export" -#: FlatCAMApp.py:6859 FlatCAMApp.py:6866 +#: FlatCAMApp.py:6854 FlatCAMApp.py:6861 msgid "[[WARNING_NOTCL]] Could not export DXF file." msgstr "[[WARNING_NOTCL]] Fişierul DXF nu a putut fi exportat." -#: FlatCAMApp.py:6886 FlatCAMApp.py:6928 FlatCAMApp.py:6969 +#: FlatCAMApp.py:6881 FlatCAMApp.py:6923 FlatCAMApp.py:6964 msgid "" "[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " "Gerber are supported" @@ -838,102 +846,103 @@ msgstr "" "[ERROR_NOTCL] Typul parametrului nu este compatibil. Doar Geometrie is " "Gerber sunt acceptate." -#: FlatCAMApp.py:6896 +#: FlatCAMApp.py:6891 msgid "Importing SVG" msgstr "SVG in curs de ia fi importat" -#: FlatCAMApp.py:6907 FlatCAMApp.py:6949 FlatCAMApp.py:6989 FlatCAMApp.py:7065 -#: FlatCAMApp.py:7132 FlatCAMApp.py:7197 +#: FlatCAMApp.py:6902 FlatCAMApp.py:6944 FlatCAMApp.py:6984 FlatCAMApp.py:7060 +#: FlatCAMApp.py:7127 FlatCAMApp.py:7192 flatcamTools/ToolPDF.py:275 #, python-format msgid "[success] Opened: %s" msgstr "[success] Incărcat: %s" -#: FlatCAMApp.py:6938 +#: FlatCAMApp.py:6933 msgid "Importing DXF" msgstr "DXF in curs de a fi importat" -#: FlatCAMApp.py:6977 +#: FlatCAMApp.py:6972 msgid "Importing Image" msgstr "Imaginea in curs de a fi importata" -#: FlatCAMApp.py:7018 FlatCAMApp.py:7020 +#: FlatCAMApp.py:7013 FlatCAMApp.py:7015 #, python-format msgid "[ERROR_NOTCL] Failed to open file: %s" msgstr "[ERROR_NOTCL] Esec in incărcarea fişierului %s" -#: FlatCAMApp.py:7023 +#: FlatCAMApp.py:7018 #, python-brace-format msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" msgstr "[ERROR_NOTCL] Esec in parsarea fişierului: {name}. {error}" -#: FlatCAMApp.py:7029 FlatCAMObj.py:3961 -#: flatcamEditors/FlatCAMExcEditor.py:1927 -#: flatcamEditors/FlatCAMGrbEditor.py:2061 +#: FlatCAMApp.py:7024 FlatCAMObj.py:3963 +#: flatcamEditors/FlatCAMExcEditor.py:1977 +#: flatcamEditors/FlatCAMGrbEditor.py:3018 msgid "[ERROR] An internal error has ocurred. See shell.\n" msgstr "" "[ERROR] A aparut o eroare interna. Verifică in TCL Shell pt mai multe " "detalii.\n" -#: FlatCAMApp.py:7038 +#: FlatCAMApp.py:7033 msgid "" "[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." msgstr "" "[ERROR_NOTCL] Obiectul nu estetip Gerber sau este gol. Se anulează crearea " "obiectului." -#: FlatCAMApp.py:7046 +#: FlatCAMApp.py:7041 msgid "Opening Gerber" msgstr "Gerber in curs de incărcare" -#: FlatCAMApp.py:7056 +#: FlatCAMApp.py:7051 msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." msgstr "" "[ERROR_NOTCL] Incărcarea Gerber a eșuat. Probabil nu este de tip Gerber." -#: FlatCAMApp.py:7091 +#: FlatCAMApp.py:7086 flatcamTools/ToolPcbWizard.py:421 msgid "[ERROR_NOTCL] This is not Excellon file." msgstr "[ERROR_NOTCL] Acesta nu este un fişier Excellon." -#: FlatCAMApp.py:7094 +#: FlatCAMApp.py:7089 #, python-format msgid "[ERROR_NOTCL] Cannot open file: %s" msgstr "[ERROR_NOTCL] Fişierul %s nu se poate incărca." -#: FlatCAMApp.py:7099 +#: FlatCAMApp.py:7094 flatcamTools/ToolPcbWizard.py:429 msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" msgstr "" "[ERROR_NOTCL] A aparut o eroare interna. Verifică in TCL Shell pt mai multe " "detalii.\n" -#: FlatCAMApp.py:7115 +#: FlatCAMApp.py:7110 flatcamTools/ToolPDF.py:238 +#: flatcamTools/ToolPcbWizard.py:442 #, python-format msgid "[ERROR_NOTCL] No geometry found in file: %s" msgstr "" "[ERROR_NOTCL] Nici-o informaţie de tip geometrie nu s-a gasit in fişierul: %s" -#: FlatCAMApp.py:7118 +#: FlatCAMApp.py:7113 msgid "Opening Excellon." msgstr "Excellon in curs de incărcare" -#: FlatCAMApp.py:7125 +#: FlatCAMApp.py:7120 msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." msgstr "" "[ERROR_NOTCL] Incărcarea Excellon a eșuat. Probabil nu este de tip Excellon." -#: FlatCAMApp.py:7164 +#: FlatCAMApp.py:7159 #, python-format msgid "[ERROR_NOTCL] Failed to open %s" msgstr "[ERROR_NOTCL] Incărcarea fişierului %s a eșuat." -#: FlatCAMApp.py:7174 +#: FlatCAMApp.py:7169 msgid "[ERROR_NOTCL] This is not GCODE" msgstr "[ERROR_NOTCL] Acest obiect nu este de tip GCode" -#: FlatCAMApp.py:7180 +#: FlatCAMApp.py:7175 msgid "Opening G-Code." msgstr "G-Code in curs de incărcare" -#: FlatCAMApp.py:7188 +#: FlatCAMApp.py:7183 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 " @@ -944,26 +953,26 @@ msgstr "" "Incercarea de a crea un obiect CNCJob din G-Code a eșuat in timpul " "procesarii." -#: FlatCAMApp.py:7228 +#: FlatCAMApp.py:7223 #, python-format msgid "[ERROR_NOTCL] Failed to open config file: %s" msgstr "[ERROR_NOTCL] Esec in incărcarea fişierului de configurare: %s" -#: FlatCAMApp.py:7253 FlatCAMApp.py:7269 +#: FlatCAMApp.py:7248 FlatCAMApp.py:7264 #, python-format msgid "[ERROR_NOTCL] Failed to open project file: %s" msgstr "[ERROR_NOTCL] Esec in incărcarea fişierului proiect: %s" -#: FlatCAMApp.py:7295 +#: FlatCAMApp.py:7290 #, python-format msgid "[success] Project loaded from: %s" msgstr "[success] Proeictul a fost incărcat din: %s" -#: FlatCAMApp.py:7425 +#: FlatCAMApp.py:7420 msgid "Available commands:\n" msgstr "Comenzi disponibile:\n" -#: FlatCAMApp.py:7427 +#: FlatCAMApp.py:7422 msgid "" "\n" "\n" @@ -975,23 +984,23 @@ msgstr "" "Introduceți help pentru utilizare.\n" "Exemplu: help open_gerber" -#: FlatCAMApp.py:7575 +#: FlatCAMApp.py:7570 msgid "Shows list of commands." msgstr "Arata o lista de comenzi." -#: FlatCAMApp.py:7628 +#: FlatCAMApp.py:7626 msgid "[ERROR_NOTCL] Failed to load recent item list." msgstr "[ERROR_NOTCL] Esec in incărcarea listei cu obiecte recente." -#: FlatCAMApp.py:7635 +#: FlatCAMApp.py:7633 msgid "[ERROR_NOTCL] Failed to parse recent item list." msgstr "[ERROR_NOTCL] Esec in parsarea listei cu obiecte recente." -#: FlatCAMApp.py:7696 flatcamGUI/FlatCAMGUI.py:929 +#: FlatCAMApp.py:7694 flatcamGUI/FlatCAMGUI.py:941 msgid "Shortcut Key List" msgstr "Lista cu taste Shortcut" -#: FlatCAMApp.py:7703 +#: FlatCAMApp.py:7701 msgid "" "\n" "

Selected Tab - Choose an Item from " @@ -1088,27 +1097,27 @@ msgstr "" "\n" " " -#: FlatCAMApp.py:7807 +#: FlatCAMApp.py:7805 msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." msgstr "" "[WARNING_NOTCL] Verificarea pentru ultima versiune a eșuat. Nu a fost " -"posibila conectarea la server." +"posibilă conectarea la server." -#: FlatCAMApp.py:7814 +#: FlatCAMApp.py:7812 msgid "[ERROR_NOTCL] Could not parse information about latest version." msgstr "" "[ERROR_NOTCL] Informatia cu privire la ultima versiune nu s-a putut " "interpreta." -#: FlatCAMApp.py:7824 +#: FlatCAMApp.py:7822 msgid "[success] FlatCAM is up to date!" msgstr "[success] FlatCAM este la ultima versiune!" -#: FlatCAMApp.py:7829 +#: FlatCAMApp.py:7827 msgid "Newer Version Available" msgstr "O nouă versiune este disponibila" -#: FlatCAMApp.py:7830 +#: FlatCAMApp.py:7828 msgid "" "There is a newer version of FlatCAM available for download:\n" "\n" @@ -1116,46 +1125,46 @@ msgstr "" "O nouă versiune de FlatCAM este disponibilă pentru download::\n" "\n" -#: FlatCAMApp.py:7832 +#: FlatCAMApp.py:7830 msgid "info" msgstr "Informaţie" -#: FlatCAMApp.py:7851 +#: FlatCAMApp.py:7849 msgid "[success] All plots disabled." msgstr "[success] Toate afisarile sunt dezactivate." -#: FlatCAMApp.py:7857 +#: FlatCAMApp.py:7855 msgid "[success] All non selected plots disabled." msgstr "[success] Toate afisarile care nu sunt selectate sunt dezactivate." -#: FlatCAMApp.py:7863 +#: FlatCAMApp.py:7861 msgid "[success] All plots enabled." msgstr "[success] Toate afisarile sunt activate." -#: FlatCAMApp.py:7974 +#: FlatCAMApp.py:7972 msgid "Saving FlatCAM Project" msgstr "Proiectul FlatCAM este in curs de salvare" -#: FlatCAMApp.py:7995 FlatCAMApp.py:8026 +#: FlatCAMApp.py:7993 FlatCAMApp.py:8024 #, python-format msgid "[success] Project saved to: %s" msgstr "[success] Proiectul s-a salvat in: %s" -#: FlatCAMApp.py:8013 +#: FlatCAMApp.py:8011 #, python-format msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." msgstr "" "[ERROR_NOTCL] Verificarea proiectului salvat a eșuat: %s. Incearcă să il " "salvezi din nou." -#: FlatCAMApp.py:8020 +#: FlatCAMApp.py:8018 #, python-format msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." msgstr "" "[ERROR_NOTCL] Parsarea proiectului salvat a eșuat: %s. Incearcă să il " "salvezi din nou." -#: FlatCAMApp.py:8028 +#: FlatCAMApp.py:8026 #, python-format msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." msgstr "" @@ -1167,11 +1176,11 @@ msgstr "" msgid "[success] Name changed from {old} to {new}" msgstr "[success] Numele schimbat din {old} in {new}" -#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5156 +#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5158 msgid "Basic" msgstr "Baza" -#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5162 +#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5164 msgid "Advanced" msgstr "Avansat" @@ -1184,32 +1193,32 @@ msgstr "[success] Geometria de izolare creată: %s" msgid "Plotting Apertures" msgstr "Aperturile sunt in curs de afișare" -#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1293 +#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1327 msgid "Total Drills" msgstr "Nr. Tot. Op. Găurire" -#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1325 +#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1359 msgid "Total Slots" msgstr "Nr. Tot. Sloturi" -#: FlatCAMObj.py:1813 FlatCAMObj.py:3078 FlatCAMObj.py:3384 FlatCAMObj.py:3571 -#: FlatCAMObj.py:3584 FlatCAMObj.py:3701 FlatCAMObj.py:4109 FlatCAMObj.py:4342 -#: FlatCAMObj.py:4748 flatcamEditors/FlatCAMExcEditor.py:1400 +#: FlatCAMObj.py:1813 FlatCAMObj.py:3079 FlatCAMObj.py:3386 FlatCAMObj.py:3573 +#: FlatCAMObj.py:3586 FlatCAMObj.py:3703 FlatCAMObj.py:4111 FlatCAMObj.py:4344 +#: FlatCAMObj.py:4750 flatcamEditors/FlatCAMExcEditor.py:1434 #: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 #: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 #: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 #: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 #: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 -#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:479 -#: flatcamTools/ToolNonCopperClear.py:550 -#: flatcamTools/ToolNonCopperClear.py:626 -#: flatcamTools/ToolNonCopperClear.py:643 flatcamTools/ToolPaint.py:537 -#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:742 -#: flatcamTools/ToolPaint.py:839 flatcamTools/ToolPaint.py:994 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:480 +#: flatcamTools/ToolNonCopperClear.py:551 +#: flatcamTools/ToolNonCopperClear.py:627 +#: flatcamTools/ToolNonCopperClear.py:644 flatcamTools/ToolPaint.py:538 +#: flatcamTools/ToolPaint.py:608 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:840 flatcamTools/ToolPaint.py:995 #: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 #: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 #: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 -#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +#: flatcamTools/ToolSolderPaste.py:756 flatcamTools/ToolSolderPaste.py:827 msgid "[ERROR_NOTCL] Wrong value format entered, use a number." msgstr "[ERROR_NOTCL] O valoare gresita a fost introdusa. Foloseşte un număr." @@ -1232,10 +1241,10 @@ msgid "Tool_nr" msgstr "Nr. Unealta" #: FlatCAMObj.py:2058 FlatCAMObj.py:2152 FlatCAMObj.py:2263 -#: flatcamEditors/FlatCAMExcEditor.py:753 -#: flatcamEditors/FlatCAMExcEditor.py:1870 flatcamGUI/ObjectUI.py:556 +#: flatcamEditors/FlatCAMExcEditor.py:781 +#: flatcamEditors/FlatCAMExcEditor.py:1920 flatcamGUI/ObjectUI.py:556 #: flatcamTools/ToolNonCopperClear.py:83 flatcamTools/ToolPaint.py:80 -#: flatcamTools/ToolSolderPaste.py:81 +#: flatcamTools/ToolPcbWizard.py:78 flatcamTools/ToolSolderPaste.py:81 msgid "Diameter" msgstr "Diametru" @@ -1253,7 +1262,7 @@ msgid "" msgstr "" "[ERROR_NOTCL] Anulat. Freza este mai mare decat diametrul slotului de frezat." -#: FlatCAMObj.py:2303 FlatCAMObj.py:3997 FlatCAMObj.py:4208 FlatCAMObj.py:4523 +#: FlatCAMObj.py:2303 FlatCAMObj.py:3999 FlatCAMObj.py:4210 FlatCAMObj.py:4525 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"z_pdepth\"] or self." "options[\"z_pdepth\"]" @@ -1261,7 +1270,7 @@ msgstr "" "[ERROR_NOTCL] Valoare gresita pt self.defaults[\"z_pdepth\"] sau self." "options[\"z_pdepth\"]" -#: FlatCAMObj.py:2315 FlatCAMObj.py:4009 FlatCAMObj.py:4220 FlatCAMObj.py:4535 +#: FlatCAMObj.py:2315 FlatCAMObj.py:4011 FlatCAMObj.py:4222 FlatCAMObj.py:4537 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"feedrate_probe\"] or " "self.options[\"feedrate_probe\"]" @@ -1269,12 +1278,12 @@ msgstr "" "[ERROR_NOTCL] Valoare gresita pt self.defaults[\"feedrate_probe\"] sau self." "options[\"feedrate_probe\"]" -#: FlatCAMObj.py:2347 FlatCAMObj.py:4410 FlatCAMObj.py:4415 FlatCAMObj.py:4561 +#: FlatCAMObj.py:2347 FlatCAMObj.py:4412 FlatCAMObj.py:4417 FlatCAMObj.py:4563 msgid "Generating CNC Code" msgstr "CNC Code in curs de generare" -#: FlatCAMObj.py:2373 FlatCAMObj.py:4707 camlib.py:5141 camlib.py:5577 -#: camlib.py:5848 +#: FlatCAMObj.py:2373 FlatCAMObj.py:4709 camlib.py:5204 camlib.py:5653 +#: camlib.py:5924 msgid "" "[ERROR]The Toolchange X,Y field in Edit -> Preferences has to be in the " "format (x, y) \n" @@ -1284,7 +1293,7 @@ msgstr "" "să fie in formatul (x, y) \n" "dar are o singură valoare in loc de doua. " -#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3247 +#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3249 msgid "Path" msgstr "Pe cale" @@ -1296,15 +1305,15 @@ msgstr "În" msgid "Out" msgstr "Afară" -#: FlatCAMObj.py:2720 FlatCAMObj.py:3043 FlatCAMObj.py:3616 +#: FlatCAMObj.py:2720 FlatCAMObj.py:3044 FlatCAMObj.py:3618 msgid "Custom" msgstr "Personalizat" -#: FlatCAMObj.py:2721 FlatCAMObj.py:3627 FlatCAMObj.py:3628 FlatCAMObj.py:3637 +#: FlatCAMObj.py:2721 FlatCAMObj.py:3629 FlatCAMObj.py:3630 FlatCAMObj.py:3639 msgid "Iso" msgstr "Izo." -#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3249 +#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3251 msgid "Rough" msgstr "Grosier" @@ -1312,54 +1321,55 @@ msgstr "Grosier" msgid "Finish" msgstr "Finisare" -#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:512 flatcamGUI/FlatCAMGUI.py:698 -#: flatcamGUI/FlatCAMGUI.py:1536 flatcamGUI/FlatCAMGUI.py:1546 -#: flatcamGUI/FlatCAMGUI.py:1870 flatcamGUI/ObjectUI.py:996 +#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:518 flatcamGUI/FlatCAMGUI.py:710 +#: flatcamGUI/FlatCAMGUI.py:1580 flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1914 flatcamGUI/ObjectUI.py:996 msgid "Copy" msgstr "Copiaza" -#: FlatCAMObj.py:3001 flatcamGUI/FlatCAMGUI.py:513 flatcamGUI/FlatCAMGUI.py:700 -#: flatcamGUI/FlatCAMGUI.py:1537 flatcamGUI/FlatCAMGUI.py:1547 -#: flatcamGUI/FlatCAMGUI.py:1872 flatcamGUI/ObjectUI.py:1004 +#: FlatCAMObj.py:3001 flatcamEditors/FlatCAMGrbEditor.py:1825 +#: flatcamGUI/FlatCAMGUI.py:519 flatcamGUI/FlatCAMGUI.py:712 +#: flatcamGUI/FlatCAMGUI.py:1581 flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1916 flatcamGUI/ObjectUI.py:1004 #: flatcamTools/ToolNonCopperClear.py:146 flatcamTools/ToolPaint.py:143 -#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:481 msgid "Delete" msgstr "Șterge" -#: FlatCAMObj.py:3219 +#: FlatCAMObj.py:3221 msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." msgstr "[ERROR_NOTCL] Introdu diametrul dorit pt unealtă in format Real." -#: FlatCAMObj.py:3294 +#: FlatCAMObj.py:3296 msgid "[success] Tool added in Tool Table." msgstr "[success] Unealta adăugată in Tabela de Unelte." -#: FlatCAMObj.py:3299 +#: FlatCAMObj.py:3301 msgid "[ERROR_NOTCL] Default Tool added. Wrong value format entered." msgstr "" "[ERROR_NOTCL] Unealta implicita adăugatădar valoarea are un format gresit." -#: FlatCAMObj.py:3329 FlatCAMObj.py:3339 +#: FlatCAMObj.py:3331 FlatCAMObj.py:3341 msgid "[WARNING_NOTCL] Failed. Select a tool to copy." msgstr "[WARNING_NOTCL] Esuat. Selectează o unealtă pt copiere." -#: FlatCAMObj.py:3368 +#: FlatCAMObj.py:3370 msgid "[success] Tool was copied in Tool Table." msgstr "[success] Unealta a fost copiata in Tabela de Unelte." -#: FlatCAMObj.py:3401 +#: FlatCAMObj.py:3403 msgid "[success] Tool was edited in Tool Table." msgstr "[success] Unealta a fost editata in Tabela de Unelte." -#: FlatCAMObj.py:3432 FlatCAMObj.py:3442 +#: FlatCAMObj.py:3434 FlatCAMObj.py:3444 msgid "[WARNING_NOTCL] Failed. Select a tool to delete." msgstr "[WARNING_NOTCL] Esuat. Selectează o unealtă pentru ștergere." -#: FlatCAMObj.py:3466 +#: FlatCAMObj.py:3468 msgid "[success] Tool was deleted in Tool Table." msgstr "[success] Unealta a fost stearsa din Tabela de Unelte." -#: FlatCAMObj.py:3880 +#: FlatCAMObj.py:3882 #, python-format msgid "" "[WARNING_NOTCL] This Geometry can't be processed because it is %s geometry." @@ -1367,23 +1377,23 @@ msgstr "" "[WARNING_NOTCL] Acest obiect Geometrie nu poate fi procesar decoarece este " "Geometrie %s." -#: FlatCAMObj.py:3897 +#: FlatCAMObj.py:3899 msgid "[ERROR_NOTCL] Wrong Tool Dia value format entered, use a number." msgstr "" "[ERROR_NOTCL] Diametrul uneltei este in format gresit, foloseşte un număr " "Real." -#: FlatCAMObj.py:3924 +#: FlatCAMObj.py:3926 msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." msgstr "" "[ERROR_NOTCL] Esuat. Nici-o unealtă nu este selectată in Tabela de Unelte ..." -#: FlatCAMObj.py:3962 +#: FlatCAMObj.py:3964 #, python-format msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" msgstr "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" -#: FlatCAMObj.py:4118 FlatCAMObj.py:4351 +#: FlatCAMObj.py:4120 FlatCAMObj.py:4353 msgid "" "[WARNING] Tool Offset is selected in Tool Table but no value is provided.\n" "Add a Tool Offset or change the Offset Type." @@ -1392,21 +1402,21 @@ msgstr "" "val. nu este oferita.\n" "Adaugă un ofset pt unealtă sau schimbă Tipul Ofset." -#: FlatCAMObj.py:4232 flatcamTools/ToolSolderPaste.py:1106 -#: flatcamTools/ToolSolderPaste.py:1161 +#: FlatCAMObj.py:4234 flatcamTools/ToolSolderPaste.py:1107 +#: flatcamTools/ToolSolderPaste.py:1162 msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." msgstr "[ERROR_NOTCL] Anulat. Fişier gol, nu are date geometrice." -#: FlatCAMObj.py:4594 FlatCAMObj.py:4604 camlib.py:3410 camlib.py:3419 +#: FlatCAMObj.py:4596 FlatCAMObj.py:4606 camlib.py:3426 camlib.py:3435 msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." msgstr "" "[ERROR_NOTCL] Factorul de scalare trebuie să fie un număr: natural sau real." -#: FlatCAMObj.py:4642 +#: FlatCAMObj.py:4644 msgid "[success] Geometry Scale done." msgstr "[success] Scalare Geometrie executată." -#: FlatCAMObj.py:4659 camlib.py:3481 +#: FlatCAMObj.py:4661 camlib.py:3497 msgid "" "[ERROR_NOTCL] An (x,y) pair of values are needed. Probable you entered only " "one value in the Offset field." @@ -1414,29 +1424,29 @@ msgstr "" "[ERROR_NOTCL] O pereche de valori (x,y) este necesară. Probabil că ai " "introdus numai o singură valoare in câmpul Offset." -#: FlatCAMObj.py:4679 +#: FlatCAMObj.py:4681 msgid "[success] Geometry Offset done." msgstr "[success] Ofset Geometrie executat." -#: FlatCAMObj.py:5224 FlatCAMObj.py:5229 flatcamTools/ToolSolderPaste.py:1360 +#: FlatCAMObj.py:5226 FlatCAMObj.py:5231 flatcamTools/ToolSolderPaste.py:1361 msgid "Export Machine Code ..." msgstr "Exporta CNC Cod Masina ..." -#: FlatCAMObj.py:5235 flatcamTools/ToolSolderPaste.py:1363 +#: FlatCAMObj.py:5237 flatcamTools/ToolSolderPaste.py:1364 msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." msgstr "[WARNING_NOTCL] Exportul codului masina CNC a fost anulat ..." -#: FlatCAMObj.py:5246 +#: FlatCAMObj.py:5248 #, python-format msgid "[success] Machine Code file saved to: %s" msgstr "[success] Fişierul cu cod CNC este salvat in: %s" -#: FlatCAMObj.py:5268 +#: FlatCAMObj.py:5270 #, python-format msgid "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" msgstr "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" -#: FlatCAMObj.py:5385 +#: FlatCAMObj.py:5387 #, python-format msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed because it is a %s " @@ -1445,11 +1455,11 @@ msgstr "" "[WARNING_NOTCL] Acest obiect CNCJob nu poate fi procesar deoarece este un " "obiect CNCJob tip %s." -#: FlatCAMObj.py:5438 +#: FlatCAMObj.py:5440 msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" msgstr "[ERROR_NOTCL] G-code nu contine codul pt unitati: G20 sau G21" -#: FlatCAMObj.py:5451 +#: FlatCAMObj.py:5453 msgid "" "[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " "empty." @@ -1457,17 +1467,17 @@ msgstr "" "[ERROR_NOTCL] Anulat. Codul G-Code din Macro-ul Schimbare unealtă este " "activat dar nuc contine nimic." -#: FlatCAMObj.py:5458 +#: FlatCAMObj.py:5460 msgid "[success] Toolchange G-code was replaced by a custom code." msgstr "" "[success] G-Code-ul pt schimbare unealtă a fost inlocuit cu un cod " "pesonalizat." -#: FlatCAMObj.py:5473 flatcamTools/ToolSolderPaste.py:1389 +#: FlatCAMObj.py:5475 flatcamTools/ToolSolderPaste.py:1390 msgid "[WARNING_NOTCL] No such file or directory" msgstr "[WARNING_NOTCL] Nu exista un asemenea fişier sau director" -#: FlatCAMObj.py:5492 FlatCAMObj.py:5504 +#: FlatCAMObj.py:5494 FlatCAMObj.py:5506 msgid "" "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " "'toolchange_custom'" @@ -1475,7 +1485,7 @@ msgstr "" "[WARNING_NOTCL] Postprocesorul folosit trebuie să aibă in numele sau: " "'toolchange_custom'" -#: FlatCAMObj.py:5510 +#: FlatCAMObj.py:5512 msgid "[ERROR] There is no postprocessor file." msgstr "[ERROR] Nu exista nici-un fişier postprocesor." @@ -1489,46 +1499,46 @@ msgstr "Obiectul este redenumit din {old} in {new}." msgid "[ERROR] Cause of error: %s" msgstr "[ERROR] Motivul erorii: %s" -#: camlib.py:200 +#: camlib.py:202 msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." msgstr "" "[ERROR_NOTCL] self.solid_geometry nu este tip BaseGeometry sau tip lista." -#: camlib.py:1387 +#: camlib.py:1389 msgid "[success] Object was mirrored ..." msgstr "[success] Obiectul a fost oglindit ..." -#: camlib.py:1389 +#: camlib.py:1391 msgid "[ERROR_NOTCL] Failed to mirror. No object selected" msgstr "[ERROR_NOTCL] Oglindire eșuata. Nici-un obiect nu este selectat ..." -#: camlib.py:1425 +#: camlib.py:1427 msgid "[success] Object was rotated ..." msgstr "[success] Obiectul a fost rotit ..." -#: camlib.py:1427 +#: camlib.py:1429 msgid "[ERROR_NOTCL] Failed to rotate. No object selected" msgstr "[ERROR_NOTCL] Rotaţie eșuata. Nici-un obiect nu este selectat ..." -#: camlib.py:1461 +#: camlib.py:1463 msgid "[success] Object was skewed ..." msgstr "[success] Obiectul a fost deformat ..." -#: camlib.py:1463 +#: camlib.py:1465 msgid "[ERROR_NOTCL] Failed to skew. No object selected" msgstr "[ERROR_NOTCL] Deformare eșuata. Nici-un obiect nu este selectat ..." -#: camlib.py:2728 camlib.py:2832 +#: camlib.py:2733 camlib.py:2837 #, python-format msgid "[WARNING] Coordinates missing, line ignored: %s" msgstr "[WARNING] Coordonatele lipsesc, linia este ignorata: %s" -#: camlib.py:2729 camlib.py:2833 +#: camlib.py:2734 camlib.py:2838 msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" msgstr "" "[WARNING_NOTCL] Fişierul Gerber poate fi corrupt. Verificati fişierul!!!" -#: camlib.py:2787 +#: camlib.py:2792 #, python-format msgid "" "[ERROR] Region does not have enough points. File will be processed but there " @@ -1537,7 +1547,7 @@ msgstr "" "[ERROR] Regiunea Gerber nu are suficiente puncte. Fişierul va fi procesat " "dar sunt erori de parsare. Numărul liniei: %s" -#: camlib.py:3231 +#: camlib.py:3247 #, python-format msgid "" "[ERROR]Gerber Parser ERROR.\n" @@ -1546,20 +1556,36 @@ msgstr "" "[ERROR] Eroare in parserul Gerber.\n" "%s:" -#: camlib.py:3448 +#: camlib.py:3464 msgid "[success] Gerber Scale done." msgstr "[success] Scalarea Gerber efectuata." -#: camlib.py:3505 +#: camlib.py:3521 msgid "[success] Gerber Offset done." msgstr "[success] Offsetare Gerber efectuata." -#: camlib.py:3887 +#: camlib.py:3915 #, python-format msgid "[ERROR_NOTCL] This is GCODE mark: %s" msgstr "[ERROR_NOTCL] Acesta este un marcaj Gerber: %s" -#: camlib.py:4431 +#: camlib.py:4029 +#, 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] Nu sunt date despre diametrul uneltei. Vezi in Shell.\n" +"Schimbare Unealtă: T%s a fost gasită dar fisierul Excellon nu are info's " +"despre diametrele uneltelor prin urmare aplicatia va folosi valori 'false'.\n" +"Userul trebuie să editeze obictul Excellon rezultat si sa ajusteze " +"diametrele a.i sa reflecte diametrele reale." + +#: camlib.py:4494 #, python-brace-format msgid "" "[ERROR] Excellon Parser error.\n" @@ -1569,7 +1595,7 @@ msgstr "" "Parsare eșuata. Linia {l_nr}: {line}\n" "\n" -#: camlib.py:4508 +#: camlib.py:4571 msgid "" "[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " "not having a tool associated.\n" @@ -1579,12 +1605,12 @@ msgstr "" "deoarece nu are o unealtă asociata.\n" "Verifică codul G-Code rezultat." -#: camlib.py:5050 +#: camlib.py:5113 #, python-format msgid "[ERROR] There is no such parameter: %s" msgstr "[ERROR] Nu exista un asemenea parametru: %s" -#: camlib.py:5120 +#: camlib.py:5183 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "drill into material.\n" @@ -1597,7 +1623,7 @@ msgstr "" "Se presupune că este o eroare de tastare astfel ca aplicaţia va converti " "intr-o valoare negativă. Verifică codul masina (G-Code etc) rezultat." -#: camlib.py:5127 camlib.py:5600 camlib.py:5871 +#: camlib.py:5190 camlib.py:5676 camlib.py:5947 #, python-format msgid "" "[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" @@ -1605,15 +1631,15 @@ msgstr "" "[WARNING] Parametrul >Z tăiere< este nul. Nu va fi nici-o tăiere prin urmare " "nu procesam fişierul %s" -#: camlib.py:5343 camlib.py:5438 camlib.py:5489 +#: camlib.py:5412 camlib.py:5507 camlib.py:5565 msgid "[ERROR_NOTCL] The loaded Excellon file has no drills ..." msgstr "[ERROR_NOTCL] Fişierul Excellon incărcat nu are găuri ..." -#: camlib.py:5443 +#: camlib.py:5512 msgid "[ERROR_NOTCL] Wrong optimization type selected." msgstr "[ERROR_NOTCL] Un tip de optimizare incorrect a fost selectat." -#: camlib.py:5588 camlib.py:5859 +#: camlib.py:5664 camlib.py:5935 msgid "" "[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " "combinations of other parameters." @@ -1621,7 +1647,7 @@ msgstr "" "[ERROR_NOTCL] Parametrul >Z tăiere< este None sau zero. Cel mai probabil o " "combinaţie nefericita de parametri." -#: camlib.py:5593 camlib.py:5864 +#: camlib.py:5669 camlib.py:5940 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "cut into material.\n" @@ -1634,11 +1660,11 @@ msgstr "" "Se presupune că este o eroare de tastare astfel ca aplicaţia va converti " "intr-o valoare negativă. Verifică codul masina (G-Code etc) rezultat." -#: camlib.py:5605 camlib.py:5876 +#: camlib.py:5681 camlib.py:5952 msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." msgstr "[ERROR_NOTCL] Parametrul >Z deplasare< este None sau zero." -#: camlib.py:5609 camlib.py:5880 +#: camlib.py:5685 camlib.py:5956 msgid "" "[WARNING] The Travel Z parameter has negative value. It is the height value " "to travel between cuts.\n" @@ -1652,7 +1678,7 @@ msgstr "" "Se presupune că este o eroare de tastare astfel ca aplicaţia va converti " "intr-o valoare pozitivă. Verifică codul masina (G-Code etc) rezultat." -#: camlib.py:5616 camlib.py:5887 +#: camlib.py:5692 camlib.py:5963 #, python-format msgid "" "[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" @@ -1660,12 +1686,12 @@ msgstr "" "[WARNING] Parametrul >Z deplasare< este zero. Aceasta este periculos, prin " "urmare fişierul %s nu se procesează." -#: camlib.py:5746 +#: camlib.py:5822 #, python-format msgid "[ERROR]Expected a Geometry, got %s" msgstr "[ERROR] Se astepta o Geometrie, am primit in schimb %s" -#: camlib.py:5752 +#: camlib.py:5828 msgid "" "[ERROR_NOTCL] Trying to generate a CNC Job from a Geometry object without " "solid_geometry." @@ -1673,7 +1699,7 @@ msgstr "" "[ERROR_NOTCL] Se încearcă generarea unui CNC Job dintr-un obiect Geometrie " "fără atributul solid_geometry." -#: camlib.py:5791 +#: camlib.py:5867 msgid "" "[ERROR_NOTCL] The Tool Offset value is too negative to use for the " "current_geometry.\n" @@ -1683,42 +1709,42 @@ msgstr "" "fi folosita. \n" "Mareste valoarea absoluta și încearcă din nou." -#: camlib.py:6013 +#: camlib.py:6089 msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." msgstr "" "[ERROR_NOTCL] Nu exista date cu privier la unealtă in geometria SolderPaste." -#: flatcamEditors/FlatCAMExcEditor.py:44 +#: flatcamEditors/FlatCAMExcEditor.py:46 msgid "[WARNING_NOTCL] To add a drill first select a tool" msgstr "" "[WARNING_NOTCL] Pentru a adăuga o operaţie de găurire mai intai selectează " "un burghiu (unealtă)" -#: flatcamEditors/FlatCAMExcEditor.py:53 flatcamEditors/FlatCAMExcEditor.py:143 -#: flatcamEditors/FlatCAMExcEditor.py:420 -#: flatcamEditors/FlatCAMExcEditor.py:445 -#: flatcamEditors/FlatCAMGrbEditor.py:223 -#: flatcamEditors/FlatCAMGrbEditor.py:604 -#: flatcamEditors/FlatCAMGrbEditor.py:628 +#: flatcamEditors/FlatCAMExcEditor.py:62 flatcamEditors/FlatCAMExcEditor.py:164 +#: flatcamEditors/FlatCAMExcEditor.py:446 +#: flatcamEditors/FlatCAMExcEditor.py:471 +#: flatcamEditors/FlatCAMGrbEditor.py:287 +#: flatcamEditors/FlatCAMGrbEditor.py:1447 +#: flatcamEditors/FlatCAMGrbEditor.py:1471 msgid "Click on target location ..." msgstr "Click pe locatia tinta ..." -#: flatcamEditors/FlatCAMExcEditor.py:93 +#: flatcamEditors/FlatCAMExcEditor.py:107 msgid "[success] Done. Drill added." msgstr "[success] Executat. Operaţie de găurire adăugată." -#: flatcamEditors/FlatCAMExcEditor.py:135 +#: flatcamEditors/FlatCAMExcEditor.py:149 msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" msgstr "" "[WARNING_NOTCL] Pentru a adăuga o arie de operațiuni de găurire mai intai " "selectează un burghiu (unealtă)" -#: flatcamEditors/FlatCAMExcEditor.py:160 +#: flatcamEditors/FlatCAMExcEditor.py:181 msgid "Click on the Drill Circular Array Start position" msgstr "Click pe punctul de Start al ariei de operațiuni de găurire" -#: flatcamEditors/FlatCAMExcEditor.py:182 -#: flatcamEditors/FlatCAMGrbEditor.py:262 +#: flatcamEditors/FlatCAMExcEditor.py:203 +#: flatcamEditors/FlatCAMGrbEditor.py:330 msgid "" "[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " "separator." @@ -1726,69 +1752,69 @@ msgstr "" "[ERROR_NOTCL] Valoarea nu este număr Real. Verifică să nu fi folosit virgula " "in loc de punct ca și separator decimal." -#: flatcamEditors/FlatCAMExcEditor.py:185 -#: flatcamEditors/FlatCAMGrbEditor.py:265 +#: flatcamEditors/FlatCAMExcEditor.py:206 +#: flatcamEditors/FlatCAMGrbEditor.py:333 msgid "[ERROR_NOTCL] The value is mistyped. Check the value." msgstr "[ERROR_NOTCL] Valoarea este gresita. Verifică ce ai introdus." -#: flatcamEditors/FlatCAMExcEditor.py:278 +#: flatcamEditors/FlatCAMExcEditor.py:304 msgid "[WARNING_NOTCL] Too many drills for the selected spacing angle." msgstr "" "[WARNING_NOTCL] Prea multe operațiuni de găurire pentru unghiul selectat." -#: flatcamEditors/FlatCAMExcEditor.py:295 +#: flatcamEditors/FlatCAMExcEditor.py:321 msgid "[success] Done. Drill Array added." msgstr "[success] Executat. Aria de operațiuni de găurire a fost adăugată." -#: flatcamEditors/FlatCAMExcEditor.py:306 +#: flatcamEditors/FlatCAMExcEditor.py:332 msgid "Click on the Drill(s) to resize ..." msgstr "" "Click pe operațiunile de găurire care se doreste să fie redimensionate ..." -#: flatcamEditors/FlatCAMExcEditor.py:326 +#: flatcamEditors/FlatCAMExcEditor.py:352 msgid "" "[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize." msgstr "" "[ERROR_NOTCL] Redimensionarea operațiunilor de găurire a eșuat. Adaugă o " "valoare pentru dimetrul la care se face redimensionarea." -#: flatcamEditors/FlatCAMExcEditor.py:396 +#: flatcamEditors/FlatCAMExcEditor.py:422 msgid "[success] Done. Drill Resize completed." msgstr "[success] Executat. Redimensionare găurire terminata." -#: flatcamEditors/FlatCAMExcEditor.py:399 +#: flatcamEditors/FlatCAMExcEditor.py:425 msgid "[WARNING_NOTCL] Cancelled. No drills selected for resize ..." msgstr "" "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentruredimensionare ..." -#: flatcamEditors/FlatCAMExcEditor.py:422 -#: flatcamEditors/FlatCAMGrbEditor.py:606 +#: flatcamEditors/FlatCAMExcEditor.py:448 +#: flatcamEditors/FlatCAMGrbEditor.py:1449 msgid "Click on reference location ..." msgstr "Click pe locatia de referinţă ..." -#: flatcamEditors/FlatCAMExcEditor.py:477 +#: flatcamEditors/FlatCAMExcEditor.py:503 msgid "[success] Done. Drill(s) Move completed." msgstr "[success] Executat. Operatiile de găurire au fost mutate." -#: flatcamEditors/FlatCAMExcEditor.py:530 +#: flatcamEditors/FlatCAMExcEditor.py:556 msgid "[success] Done. Drill(s) copied." msgstr "[success] Executat. Operatiile de găurire au fost copiate." -#: flatcamEditors/FlatCAMExcEditor.py:712 +#: flatcamEditors/FlatCAMExcEditor.py:754 msgid "Excellon Editor" msgstr "Editor Excellon" -#: flatcamEditors/FlatCAMExcEditor.py:719 -#: flatcamEditors/FlatCAMGrbEditor.py:840 +#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMGrbEditor.py:1705 msgid "Name:" msgstr "Nume:" -#: flatcamEditors/FlatCAMExcEditor.py:739 flatcamTools/ToolNonCopperClear.py:72 +#: flatcamEditors/FlatCAMExcEditor.py:767 flatcamTools/ToolNonCopperClear.py:72 #: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 msgid "Tools Table" msgstr "Tabela Unelte" -#: flatcamEditors/FlatCAMExcEditor.py:741 flatcamGUI/ObjectUI.py:538 +#: flatcamEditors/FlatCAMExcEditor.py:769 flatcamGUI/ObjectUI.py:538 msgid "" "Tools in this Excellon object\n" "when are used for drilling." @@ -1796,11 +1822,11 @@ msgstr "" "Burghie (unelte) in acest obiect Excellon\n" "când se face găurire." -#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMExcEditor.py:789 msgid "Add/Delete Tool" msgstr "Adaugă/Șterge Unealta" -#: flatcamEditors/FlatCAMExcEditor.py:763 +#: flatcamEditors/FlatCAMExcEditor.py:791 msgid "" "Add/Delete a tool to the tool list\n" "for this Excellon object." @@ -1808,19 +1834,19 @@ msgstr "" "Adaugă/Șterge o unealtă la lista de unelte\n" "pentru acest obiect Excellon." -#: flatcamEditors/FlatCAMExcEditor.py:771 flatcamTools/ToolCutOut.py:77 +#: flatcamEditors/FlatCAMExcEditor.py:799 flatcamTools/ToolCutOut.py:77 msgid "Tool Dia:" msgstr "Dia. Unealta:" -#: flatcamEditors/FlatCAMExcEditor.py:773 flatcamGUI/ObjectUI.py:975 +#: flatcamEditors/FlatCAMExcEditor.py:801 flatcamGUI/ObjectUI.py:975 msgid "Diameter for the new tool" msgstr "Diametru pentru noua unealtă (burghiu, freza)" -#: flatcamEditors/FlatCAMExcEditor.py:782 +#: flatcamEditors/FlatCAMExcEditor.py:810 msgid "Add Tool" msgstr "Adaugă Unealta" -#: flatcamEditors/FlatCAMExcEditor.py:784 +#: flatcamEditors/FlatCAMExcEditor.py:812 msgid "" "Add a new tool to the tool list\n" "with the diameter specified above." @@ -1828,11 +1854,11 @@ msgstr "" "Adaugă o unealtă noua la lista de unelte\n" "cu diametrul specificat deasupra." -#: flatcamEditors/FlatCAMExcEditor.py:794 +#: flatcamEditors/FlatCAMExcEditor.py:822 msgid "Delete Tool" msgstr "Șterge Unealta" -#: flatcamEditors/FlatCAMExcEditor.py:796 +#: flatcamEditors/FlatCAMExcEditor.py:824 msgid "" "Delete a tool in the tool list\n" "by selecting a row in the tool table." @@ -1840,41 +1866,41 @@ msgstr "" "Șterge o unealtă in lista de unelte\n" "prin selectarea unei linii in tabela de unelte." -#: flatcamEditors/FlatCAMExcEditor.py:814 +#: flatcamEditors/FlatCAMExcEditor.py:842 msgid "Resize Drill(s)" msgstr "Redimensionare operațiuni de găurire" -#: flatcamEditors/FlatCAMExcEditor.py:816 +#: flatcamEditors/FlatCAMExcEditor.py:844 msgid "Resize a drill or a selection of drills." msgstr "" "Redimensionează o operaţie de găurire sau o selecţie de operațiuni de " "găurire." -#: flatcamEditors/FlatCAMExcEditor.py:823 +#: flatcamEditors/FlatCAMExcEditor.py:851 msgid "Resize Dia:" msgstr "Redimensionare Dia:" -#: flatcamEditors/FlatCAMExcEditor.py:825 +#: flatcamEditors/FlatCAMExcEditor.py:853 msgid "Diameter to resize to." msgstr "Diametrul la care se face redimensionarea." -#: flatcamEditors/FlatCAMExcEditor.py:833 +#: flatcamEditors/FlatCAMExcEditor.py:861 msgid "Resize" msgstr "Redimensionează" -#: flatcamEditors/FlatCAMExcEditor.py:835 +#: flatcamEditors/FlatCAMExcEditor.py:863 msgid "Resize drill(s)" msgstr "Redimensionează op. de găurire." -#: flatcamEditors/FlatCAMExcEditor.py:857 flatcamGUI/FlatCAMGUI.py:1542 +#: flatcamEditors/FlatCAMExcEditor.py:885 flatcamGUI/FlatCAMGUI.py:1586 msgid "Add Drill Array" msgstr "Adaugă o arie de op. găurire" -#: flatcamEditors/FlatCAMExcEditor.py:859 +#: flatcamEditors/FlatCAMExcEditor.py:887 msgid "Add an array of drills (linear or circular array)" msgstr "Adaugă o arie de operațiuni de găurire (arie lineara sau circulara)." -#: flatcamEditors/FlatCAMExcEditor.py:865 +#: flatcamEditors/FlatCAMExcEditor.py:893 msgid "" "Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular" @@ -1882,33 +1908,33 @@ msgstr "" "Selectează tipul de arii de operațiuni de găurire.\n" "Poate fi Liniar X(Y) sau Circular." -#: flatcamEditors/FlatCAMExcEditor.py:868 -#: flatcamEditors/FlatCAMGrbEditor.py:1077 +#: flatcamEditors/FlatCAMExcEditor.py:896 +#: flatcamEditors/FlatCAMGrbEditor.py:1938 msgid "Linear" msgstr "Liniar" -#: flatcamEditors/FlatCAMExcEditor.py:869 -#: flatcamEditors/FlatCAMGrbEditor.py:1078 +#: flatcamEditors/FlatCAMExcEditor.py:897 +#: flatcamEditors/FlatCAMGrbEditor.py:1939 msgid "Circular" msgstr "Circular" -#: flatcamEditors/FlatCAMExcEditor.py:876 +#: flatcamEditors/FlatCAMExcEditor.py:904 msgid "Nr of drills:" msgstr "Nr. op. găurire" -#: flatcamEditors/FlatCAMExcEditor.py:878 +#: flatcamEditors/FlatCAMExcEditor.py:906 msgid "Specify how many drills to be in the array." msgstr "Specifica cate operațiuni de găurire să fie incluse in arie." -#: flatcamEditors/FlatCAMExcEditor.py:895 -#: flatcamEditors/FlatCAMExcEditor.py:940 -#: flatcamEditors/FlatCAMGrbEditor.py:1104 -#: flatcamEditors/FlatCAMGrbEditor.py:1149 +#: flatcamEditors/FlatCAMExcEditor.py:923 +#: flatcamEditors/FlatCAMExcEditor.py:968 +#: flatcamEditors/FlatCAMGrbEditor.py:1965 +#: flatcamEditors/FlatCAMGrbEditor.py:2010 msgid "Direction:" msgstr "Direcţie:" -#: flatcamEditors/FlatCAMExcEditor.py:897 -#: flatcamEditors/FlatCAMGrbEditor.py:1106 +#: flatcamEditors/FlatCAMExcEditor.py:925 +#: flatcamEditors/FlatCAMGrbEditor.py:1967 msgid "" "Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" @@ -1920,32 +1946,32 @@ msgstr "" "- 'Y' - pe axa verticala sau \n" "- 'Unghi' - un unghi particular pentru inclinatia ariei" -#: flatcamEditors/FlatCAMExcEditor.py:906 -#: flatcamEditors/FlatCAMGrbEditor.py:1115 +#: flatcamEditors/FlatCAMExcEditor.py:934 +#: flatcamEditors/FlatCAMGrbEditor.py:1976 msgid "Angle" msgstr "Unghi" -#: flatcamEditors/FlatCAMExcEditor.py:910 -#: flatcamEditors/FlatCAMGrbEditor.py:1119 +#: flatcamEditors/FlatCAMExcEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:1980 msgid "Pitch:" msgstr "Pas:" -#: flatcamEditors/FlatCAMExcEditor.py:912 -#: flatcamEditors/FlatCAMGrbEditor.py:1121 +#: flatcamEditors/FlatCAMExcEditor.py:940 +#: flatcamEditors/FlatCAMGrbEditor.py:1982 msgid "Pitch = Distance between elements of the array." msgstr "Pas = Distanta între elementele ariei." -#: flatcamEditors/FlatCAMExcEditor.py:919 -#: flatcamEditors/FlatCAMExcEditor.py:955 -#: flatcamEditors/FlatCAMGeoEditor.py:663 -#: flatcamEditors/FlatCAMGrbEditor.py:1128 -#: flatcamEditors/FlatCAMGrbEditor.py:1164 -#: flatcamEditors/FlatCAMGrbEditor.py:2822 flatcamTools/ToolTransform.py:68 +#: flatcamEditors/FlatCAMExcEditor.py:947 +#: flatcamEditors/FlatCAMExcEditor.py:983 +#: flatcamEditors/FlatCAMGeoEditor.py:664 +#: flatcamEditors/FlatCAMGrbEditor.py:1989 +#: flatcamEditors/FlatCAMGrbEditor.py:2025 +#: flatcamEditors/FlatCAMGrbEditor.py:3833 flatcamTools/ToolTransform.py:68 msgid "Angle:" msgstr "Unghi:" -#: flatcamEditors/FlatCAMExcEditor.py:921 -#: flatcamEditors/FlatCAMGrbEditor.py:1130 +#: flatcamEditors/FlatCAMExcEditor.py:949 +#: flatcamEditors/FlatCAMGrbEditor.py:1991 msgid "" "Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" @@ -1957,8 +1983,8 @@ msgstr "" "Val minima este: -359.99 grade.\n" "Val maxima este: 360.00 grade." -#: flatcamEditors/FlatCAMExcEditor.py:942 -#: flatcamEditors/FlatCAMGrbEditor.py:1151 +#: flatcamEditors/FlatCAMExcEditor.py:970 +#: flatcamEditors/FlatCAMGrbEditor.py:2012 msgid "" "Direction for circular array.Can be CW = clockwise or CCW = counter " "clockwise." @@ -1966,14 +1992,14 @@ msgstr "" "Directia pentru aria circulara. Poate fi CW = in sensul acelor de ceasornic " "sau CCW = invers acelor de ceasornic" -#: flatcamEditors/FlatCAMExcEditor.py:957 -#: flatcamEditors/FlatCAMGrbEditor.py:1166 +#: flatcamEditors/FlatCAMExcEditor.py:985 +#: flatcamEditors/FlatCAMGrbEditor.py:2027 msgid "Angle at which each element in circular array is placed." msgstr "" "Unghiul la care fiecare element al ariei circulare este plasat fata de " "originea ariei." -#: flatcamEditors/FlatCAMExcEditor.py:1413 +#: flatcamEditors/FlatCAMExcEditor.py:1447 msgid "" "[WARNING_NOTCL] Tool already in the original or actual tool list.\n" "Save and reedit Excellon if you need to add this tool. " @@ -1982,22 +2008,21 @@ msgstr "" "Salvează și reeditează obiectul Excellon daca ai nevoie să adaugi aceasta " "unealtă." -#: flatcamEditors/FlatCAMExcEditor.py:1422 flatcamGUI/FlatCAMGUI.py:2888 +#: flatcamEditors/FlatCAMExcEditor.py:1456 flatcamGUI/FlatCAMGUI.py:2956 #, python-brace-format msgid "[success] Added new tool with dia: {dia} {units}" msgstr "[success] O noua unealtă este adăugată cu diametrul: {dia} {units}" -#: flatcamEditors/FlatCAMExcEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:1638 +#: flatcamEditors/FlatCAMExcEditor.py:1488 msgid "[WARNING_NOTCL] Select a tool in Tool Table" msgstr "[WARNING_NOTCL] Selectează o unealtă in Tabela de Unelte" -#: flatcamEditors/FlatCAMExcEditor.py:1486 +#: flatcamEditors/FlatCAMExcEditor.py:1521 #, python-brace-format msgid "[success] Deleted tool with dia: {del_dia} {units}" msgstr "[success] Unealta stearsa cu diametrul: {del_dia} {units}" -#: flatcamEditors/FlatCAMExcEditor.py:1924 +#: flatcamEditors/FlatCAMExcEditor.py:1974 msgid "" "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " "creation." @@ -2005,37 +2030,39 @@ msgstr "" "[ERROR_NOTCL] Nu exista definitii de unelte in fişier. Se anulează crearea " "de obiect Excellon." -#: flatcamEditors/FlatCAMExcEditor.py:1933 +#: flatcamEditors/FlatCAMExcEditor.py:1983 msgid "Creating Excellon." msgstr "In curs de creere Excellon." -#: flatcamEditors/FlatCAMExcEditor.py:1942 +#: flatcamEditors/FlatCAMExcEditor.py:1992 msgid "[success] Excellon editing finished." msgstr "[success] Editarea Excellon a fost terminata." -#: flatcamEditors/FlatCAMExcEditor.py:1959 +#: flatcamEditors/FlatCAMExcEditor.py:2009 msgid "[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected" msgstr "" "[WARNING_NOTCL] Anulata. Nu este selectată nici-o unealtă sau op. de găurire." -#: flatcamEditors/FlatCAMExcEditor.py:2458 +#: flatcamEditors/FlatCAMExcEditor.py:2508 msgid "[success] Done. Drill(s) deleted." msgstr "[success] Executat. Operatiile de găurire șterse." -#: flatcamEditors/FlatCAMExcEditor.py:2528 -#: flatcamEditors/FlatCAMGrbEditor.py:2619 +#: flatcamEditors/FlatCAMExcEditor.py:2578 +#: flatcamEditors/FlatCAMGrbEditor.py:3621 msgid "Click on the circular array Center position" msgstr "Click pe punctul de Centru al ariei circulare." -#: flatcamEditors/FlatCAMGeoEditor.py:77 flatcamEditors/FlatCAMGrbEditor.py:994 +#: flatcamEditors/FlatCAMGeoEditor.py:78 +#: flatcamEditors/FlatCAMGrbEditor.py:1855 msgid "Buffer distance:" msgstr "Distanta pt bufer:" -#: flatcamEditors/FlatCAMGeoEditor.py:78 flatcamEditors/FlatCAMGrbEditor.py:995 +#: flatcamEditors/FlatCAMGeoEditor.py:79 +#: flatcamEditors/FlatCAMGrbEditor.py:1856 msgid "Buffer corner:" msgstr "Coltul pt bufer:" -#: flatcamEditors/FlatCAMGeoEditor.py:80 +#: flatcamEditors/FlatCAMGeoEditor.py:81 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded for exterior buffer.\n" @@ -2049,45 +2076,45 @@ msgstr "" " - 'Beveled:' coltul este inlocuit cu o linie care uneste capetele liniilor " "care formează coltul" -#: flatcamEditors/FlatCAMGeoEditor.py:86 -#: flatcamEditors/FlatCAMGrbEditor.py:1003 +#: flatcamEditors/FlatCAMGeoEditor.py:87 +#: flatcamEditors/FlatCAMGrbEditor.py:1864 msgid "Round" msgstr "Rotund" -#: flatcamEditors/FlatCAMGeoEditor.py:87 -#: flatcamEditors/FlatCAMGrbEditor.py:1004 +#: flatcamEditors/FlatCAMGeoEditor.py:88 +#: flatcamEditors/FlatCAMGrbEditor.py:1865 msgid "Square" msgstr "Patrat" -#: flatcamEditors/FlatCAMGeoEditor.py:88 -#: flatcamEditors/FlatCAMGrbEditor.py:1005 +#: flatcamEditors/FlatCAMGeoEditor.py:89 +#: flatcamEditors/FlatCAMGrbEditor.py:1866 msgid "Beveled" msgstr "Beveled" -#: flatcamEditors/FlatCAMGeoEditor.py:95 +#: flatcamEditors/FlatCAMGeoEditor.py:96 msgid "Buffer Interior" msgstr "Bufer interior" -#: flatcamEditors/FlatCAMGeoEditor.py:97 +#: flatcamEditors/FlatCAMGeoEditor.py:98 msgid "Buffer Exterior" msgstr "Bufer Exterior" -#: flatcamEditors/FlatCAMGeoEditor.py:103 +#: flatcamEditors/FlatCAMGeoEditor.py:104 msgid "Full Buffer" msgstr "Bufer complet" -#: flatcamEditors/FlatCAMGeoEditor.py:124 -#: flatcamEditors/FlatCAMGeoEditor.py:2505 +#: flatcamEditors/FlatCAMGeoEditor.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:2594 msgid "Buffer Tool" msgstr "Unealta Bufer" -#: flatcamEditors/FlatCAMGeoEditor.py:135 -#: flatcamEditors/FlatCAMGeoEditor.py:152 -#: flatcamEditors/FlatCAMGeoEditor.py:169 -#: flatcamEditors/FlatCAMGeoEditor.py:2523 -#: flatcamEditors/FlatCAMGeoEditor.py:2549 -#: flatcamEditors/FlatCAMGeoEditor.py:2575 -#: flatcamEditors/FlatCAMGrbEditor.py:2662 +#: flatcamEditors/FlatCAMGeoEditor.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:153 +#: flatcamEditors/FlatCAMGeoEditor.py:170 +#: flatcamEditors/FlatCAMGeoEditor.py:2612 +#: flatcamEditors/FlatCAMGeoEditor.py:2638 +#: flatcamEditors/FlatCAMGeoEditor.py:2664 +#: flatcamEditors/FlatCAMGrbEditor.py:3673 msgid "" "[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " "retry." @@ -2095,21 +2122,21 @@ msgstr "" "[WARNING_NOTCL] Valoarea distantei bufer lipseste sau este intr-un format " "gresit. Adaugă din nou și reîncearcă." -#: flatcamEditors/FlatCAMGeoEditor.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:341 msgid "Text Tool" msgstr "Unealta Text" -#: flatcamEditors/FlatCAMGeoEditor.py:398 flatcamGUI/FlatCAMGUI.py:764 +#: flatcamEditors/FlatCAMGeoEditor.py:399 flatcamGUI/FlatCAMGUI.py:776 msgid "Tool" msgstr "Unealta" -#: flatcamEditors/FlatCAMGeoEditor.py:429 flatcamGUI/FlatCAMGUI.py:3833 -#: flatcamGUI/FlatCAMGUI.py:5039 flatcamGUI/FlatCAMGUI.py:5315 -#: flatcamGUI/FlatCAMGUI.py:5455 flatcamGUI/ObjectUI.py:260 +#: flatcamEditors/FlatCAMGeoEditor.py:430 flatcamGUI/FlatCAMGUI.py:3922 +#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5544 flatcamGUI/ObjectUI.py:260 msgid "Tool dia:" msgstr "Dia unealtă:" -#: flatcamEditors/FlatCAMGeoEditor.py:431 flatcamGUI/FlatCAMGUI.py:5457 +#: flatcamEditors/FlatCAMGeoEditor.py:432 flatcamGUI/FlatCAMGUI.py:5546 msgid "" "Diameter of the tool to\n" "be used in the operation." @@ -2117,13 +2144,13 @@ msgstr "" "Diametrul uneltei care este utilizata in operaţie. \n" "Este și lăţimea de tăiere pentru uneltele cilindrice." -#: flatcamEditors/FlatCAMGeoEditor.py:440 flatcamGUI/FlatCAMGUI.py:5221 -#: flatcamGUI/FlatCAMGUI.py:5466 flatcamTools/ToolNonCopperClear.py:165 +#: flatcamEditors/FlatCAMGeoEditor.py:441 flatcamGUI/FlatCAMGUI.py:5310 +#: flatcamGUI/FlatCAMGUI.py:5555 flatcamTools/ToolNonCopperClear.py:165 #: flatcamTools/ToolPaint.py:160 msgid "Overlap Rate:" msgstr "Rata suprapunere:" -#: flatcamEditors/FlatCAMGeoEditor.py:442 flatcamTools/ToolPaint.py:162 +#: flatcamEditors/FlatCAMGeoEditor.py:443 flatcamTools/ToolPaint.py:162 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -2149,14 +2176,14 @@ msgstr "" "Valori mari= procesare lenta cat și o execuţie la fel de lenta a PCB-ului,\n" "datorita numărului mai mare de treceri-tăiere." -#: flatcamEditors/FlatCAMGeoEditor.py:458 flatcamGUI/FlatCAMGUI.py:5237 -#: flatcamGUI/FlatCAMGUI.py:5323 flatcamGUI/FlatCAMGUI.py:5476 +#: flatcamEditors/FlatCAMGeoEditor.py:459 flatcamGUI/FlatCAMGUI.py:5326 +#: flatcamGUI/FlatCAMGUI.py:5412 flatcamGUI/FlatCAMGUI.py:5565 #: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:181 #: flatcamTools/ToolPaint.py:177 msgid "Margin:" msgstr "Margine:" -#: flatcamEditors/FlatCAMGeoEditor.py:460 flatcamGUI/FlatCAMGUI.py:5478 +#: flatcamEditors/FlatCAMGeoEditor.py:461 flatcamGUI/FlatCAMGUI.py:5567 #: flatcamTools/ToolPaint.py:179 msgid "" "Distance by which to avoid\n" @@ -2167,13 +2194,13 @@ msgstr "" "poligonului care trebuie\n" "să fie >pictat<." -#: flatcamEditors/FlatCAMGeoEditor.py:469 flatcamGUI/FlatCAMGUI.py:5246 -#: flatcamGUI/FlatCAMGUI.py:5487 flatcamTools/ToolNonCopperClear.py:190 +#: flatcamEditors/FlatCAMGeoEditor.py:470 flatcamGUI/FlatCAMGUI.py:5335 +#: flatcamGUI/FlatCAMGUI.py:5576 flatcamTools/ToolNonCopperClear.py:190 #: flatcamTools/ToolPaint.py:188 msgid "Method:" msgstr "Metoda:" -#: flatcamEditors/FlatCAMGeoEditor.py:471 flatcamGUI/FlatCAMGUI.py:5489 +#: flatcamEditors/FlatCAMGeoEditor.py:472 flatcamGUI/FlatCAMGUI.py:5578 msgid "" "Algorithm to paint the polygon:
Standard: Fixed step inwards." "
Seed-based: Outwards from seed." @@ -2181,29 +2208,29 @@ msgstr "" "Algoritm pentru a picta poligonul
Standard: Pas fix spre interior." "
Samanta: Spre exterior pornind de la un punct-samanta." -#: flatcamEditors/FlatCAMGeoEditor.py:477 flatcamGUI/FlatCAMGUI.py:5255 -#: flatcamGUI/FlatCAMGUI.py:5495 +#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5584 msgid "Standard" msgstr "Standard" -#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5256 -#: flatcamGUI/FlatCAMGUI.py:5496 +#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5345 +#: flatcamGUI/FlatCAMGUI.py:5585 msgid "Seed-based" msgstr "Punct-samanta" -#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5257 -#: flatcamGUI/FlatCAMGUI.py:5497 +#: flatcamEditors/FlatCAMGeoEditor.py:480 flatcamGUI/FlatCAMGUI.py:5346 +#: flatcamGUI/FlatCAMGUI.py:5586 msgid "Straight lines" msgstr "Linii drepte" -#: flatcamEditors/FlatCAMGeoEditor.py:484 flatcamGUI/FlatCAMGUI.py:5262 -#: flatcamGUI/FlatCAMGUI.py:5502 flatcamTools/ToolNonCopperClear.py:206 +#: flatcamEditors/FlatCAMGeoEditor.py:485 flatcamGUI/FlatCAMGUI.py:5351 +#: flatcamGUI/FlatCAMGUI.py:5591 flatcamTools/ToolNonCopperClear.py:206 #: flatcamTools/ToolPaint.py:204 msgid "Connect:" msgstr "Conectează:" -#: flatcamEditors/FlatCAMGeoEditor.py:486 flatcamGUI/FlatCAMGUI.py:5264 -#: flatcamGUI/FlatCAMGUI.py:5504 flatcamTools/ToolNonCopperClear.py:208 +#: flatcamEditors/FlatCAMGeoEditor.py:487 flatcamGUI/FlatCAMGUI.py:5353 +#: flatcamGUI/FlatCAMGUI.py:5593 flatcamTools/ToolNonCopperClear.py:208 #: flatcamTools/ToolPaint.py:206 msgid "" "Draw lines between resulting\n" @@ -2213,14 +2240,14 @@ msgstr "" "rezultate pentru a minimiza miscarile\n" "de ridicare a uneltei." -#: flatcamEditors/FlatCAMGeoEditor.py:493 flatcamGUI/FlatCAMGUI.py:5271 -#: flatcamGUI/FlatCAMGUI.py:5512 flatcamTools/ToolNonCopperClear.py:215 +#: flatcamEditors/FlatCAMGeoEditor.py:494 flatcamGUI/FlatCAMGUI.py:5360 +#: flatcamGUI/FlatCAMGUI.py:5601 flatcamTools/ToolNonCopperClear.py:215 #: flatcamTools/ToolPaint.py:213 msgid "Contour:" msgstr "Contur:" -#: flatcamEditors/FlatCAMGeoEditor.py:495 flatcamGUI/FlatCAMGUI.py:5273 -#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolNonCopperClear.py:217 +#: flatcamEditors/FlatCAMGeoEditor.py:496 flatcamGUI/FlatCAMGUI.py:5362 +#: flatcamGUI/FlatCAMGUI.py:5603 flatcamTools/ToolNonCopperClear.py:217 #: flatcamTools/ToolPaint.py:215 msgid "" "Cut around the perimeter of the polygon\n" @@ -2229,21 +2256,21 @@ msgstr "" "Taie de-a lungul perimetrului poligonului\n" "pentru a elimina bavurile." -#: flatcamEditors/FlatCAMGeoEditor.py:507 +#: flatcamEditors/FlatCAMGeoEditor.py:508 msgid "Paint" msgstr "Pictează" -#: flatcamEditors/FlatCAMGeoEditor.py:525 flatcamGUI/FlatCAMGUI.py:629 -#: flatcamGUI/FlatCAMGUI.py:1796 flatcamGUI/ObjectUI.py:1308 -#: flatcamTools/ToolPaint.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:526 flatcamGUI/FlatCAMGUI.py:635 +#: flatcamGUI/FlatCAMGUI.py:1840 flatcamGUI/ObjectUI.py:1308 +#: flatcamTools/ToolPaint.py:341 msgid "Paint Tool" msgstr "Unealta Paint" -#: flatcamEditors/FlatCAMGeoEditor.py:561 +#: flatcamEditors/FlatCAMGeoEditor.py:562 msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." msgstr "[WARNING_NOTCL] Operaţie Paint anulata. Nici-o forma selectată." -#: flatcamEditors/FlatCAMGeoEditor.py:572 flatcamTools/ToolCutOut.py:352 +#: flatcamEditors/FlatCAMGeoEditor.py:573 flatcamTools/ToolCutOut.py:352 #: flatcamTools/ToolCutOut.py:496 flatcamTools/ToolCutOut.py:616 #: flatcamTools/ToolCutOut.py:721 flatcamTools/ToolDblSided.py:363 msgid "" @@ -2253,14 +2280,14 @@ msgstr "" "[WARNING_NOTCL] Diametrul uneltei lipseste sau este intr-un format " "incompatibil. Adaugă-l și reîncearcă." -#: flatcamEditors/FlatCAMGeoEditor.py:583 +#: flatcamEditors/FlatCAMGeoEditor.py:584 msgid "" "[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." msgstr "" "[WARNING_NOTCL] Valoarea de suprapunere a uneltei lipseste sau este intr-un " "format incompatibil. Adaugă-o și reîncearcă." -#: flatcamEditors/FlatCAMGeoEditor.py:595 +#: flatcamEditors/FlatCAMGeoEditor.py:596 msgid "" "[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " "retry." @@ -2268,63 +2295,63 @@ msgstr "" "[WARNING_NOTCL] Valoarea de margine lipseste sau este intr-un format " "incompatibil. Adaugă-o și reîncearcă." -#: flatcamEditors/FlatCAMGeoEditor.py:604 -#: flatcamEditors/FlatCAMGeoEditor.py:2530 -#: flatcamEditors/FlatCAMGeoEditor.py:2556 -#: flatcamEditors/FlatCAMGeoEditor.py:2582 flatcamTools/ToolMeasurement.py:202 -#: flatcamTools/ToolNonCopperClear.py:812 flatcamTools/ToolProperties.py:104 +#: flatcamEditors/FlatCAMGeoEditor.py:605 +#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2645 +#: flatcamEditors/FlatCAMGeoEditor.py:2671 +#: flatcamTools/ToolNonCopperClear.py:813 flatcamTools/ToolProperties.py:104 msgid "Tools" msgstr "Unelte" -#: flatcamEditors/FlatCAMGeoEditor.py:615 -#: flatcamEditors/FlatCAMGeoEditor.py:988 -#: flatcamEditors/FlatCAMGrbEditor.py:2774 -#: flatcamEditors/FlatCAMGrbEditor.py:3158 flatcamGUI/FlatCAMGUI.py:638 -#: flatcamGUI/FlatCAMGUI.py:1807 flatcamTools/ToolTransform.py:398 +#: flatcamEditors/FlatCAMGeoEditor.py:616 +#: flatcamEditors/FlatCAMGeoEditor.py:989 +#: flatcamEditors/FlatCAMGrbEditor.py:3785 +#: flatcamEditors/FlatCAMGrbEditor.py:4169 flatcamGUI/FlatCAMGUI.py:644 +#: flatcamGUI/FlatCAMGUI.py:1851 flatcamTools/ToolTransform.py:398 msgid "Transform Tool" msgstr "Unealta Transformare" -#: flatcamEditors/FlatCAMGeoEditor.py:616 -#: flatcamEditors/FlatCAMGeoEditor.py:677 -#: flatcamEditors/FlatCAMGrbEditor.py:2775 -#: flatcamEditors/FlatCAMGrbEditor.py:2836 flatcamTools/ToolTransform.py:24 +#: flatcamEditors/FlatCAMGeoEditor.py:617 +#: flatcamEditors/FlatCAMGeoEditor.py:678 +#: flatcamEditors/FlatCAMGrbEditor.py:3786 +#: flatcamEditors/FlatCAMGrbEditor.py:3847 flatcamTools/ToolTransform.py:24 #: flatcamTools/ToolTransform.py:82 msgid "Rotate" msgstr "Rotaţie" -#: flatcamEditors/FlatCAMGeoEditor.py:617 -#: flatcamEditors/FlatCAMGrbEditor.py:2776 flatcamTools/ToolTransform.py:25 +#: flatcamEditors/FlatCAMGeoEditor.py:618 +#: flatcamEditors/FlatCAMGrbEditor.py:3787 flatcamTools/ToolTransform.py:25 msgid "Skew/Shear" msgstr "Deformare" -#: flatcamEditors/FlatCAMGeoEditor.py:618 -#: flatcamEditors/FlatCAMGrbEditor.py:1049 -#: flatcamEditors/FlatCAMGrbEditor.py:2777 flatcamGUI/FlatCAMGUI.py:696 -#: flatcamGUI/FlatCAMGUI.py:1868 flatcamGUI/ObjectUI.py:100 +#: flatcamEditors/FlatCAMGeoEditor.py:619 +#: flatcamEditors/FlatCAMGrbEditor.py:1910 +#: flatcamEditors/FlatCAMGrbEditor.py:3788 flatcamGUI/FlatCAMGUI.py:708 +#: flatcamGUI/FlatCAMGUI.py:1912 flatcamGUI/ObjectUI.py:100 #: flatcamTools/ToolTransform.py:26 msgid "Scale" msgstr "Scalare" -#: flatcamEditors/FlatCAMGeoEditor.py:619 -#: flatcamEditors/FlatCAMGrbEditor.py:2778 flatcamTools/ToolTransform.py:27 +#: flatcamEditors/FlatCAMGeoEditor.py:620 +#: flatcamEditors/FlatCAMGrbEditor.py:3789 flatcamTools/ToolTransform.py:27 msgid "Mirror (Flip)" msgstr "Oglindire" -#: flatcamEditors/FlatCAMGeoEditor.py:620 -#: flatcamEditors/FlatCAMGrbEditor.py:2779 flatcamGUI/ObjectUI.py:127 +#: flatcamEditors/FlatCAMGeoEditor.py:621 +#: flatcamEditors/FlatCAMGrbEditor.py:3790 flatcamGUI/ObjectUI.py:127 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 #: flatcamTools/ToolTransform.py:28 msgid "Offset" msgstr "Ofset" -#: flatcamEditors/FlatCAMGeoEditor.py:631 -#: flatcamEditors/FlatCAMGrbEditor.py:2790 +#: flatcamEditors/FlatCAMGeoEditor.py:632 +#: flatcamEditors/FlatCAMGrbEditor.py:3801 #, python-format msgid "Editor %s" msgstr "Editor %s" -#: flatcamEditors/FlatCAMGeoEditor.py:665 -#: flatcamEditors/FlatCAMGrbEditor.py:2824 flatcamTools/ToolTransform.py:70 +#: flatcamEditors/FlatCAMGeoEditor.py:666 +#: flatcamEditors/FlatCAMGrbEditor.py:3835 flatcamTools/ToolTransform.py:70 msgid "" "Angle for Rotation action, in degrees.\n" "Float number between -360 and 359.\n" @@ -2335,8 +2362,8 @@ msgstr "" "Numerele pozitive inseamna o mișcare in sens ace ceasornic.\n" "Numerele negative inseamna o mișcare in sens invers ace ceasornic." -#: flatcamEditors/FlatCAMGeoEditor.py:679 -#: flatcamEditors/FlatCAMGrbEditor.py:2838 +#: flatcamEditors/FlatCAMGeoEditor.py:680 +#: flatcamEditors/FlatCAMGrbEditor.py:3849 msgid "" "Rotate the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2347,15 +2374,15 @@ msgstr "" "formei înconjurătoare care cuprinde\n" "toate formele selectate." -#: flatcamEditors/FlatCAMGeoEditor.py:702 -#: flatcamEditors/FlatCAMGrbEditor.py:2861 flatcamTools/ToolTransform.py:107 +#: flatcamEditors/FlatCAMGeoEditor.py:703 +#: flatcamEditors/FlatCAMGrbEditor.py:3872 flatcamTools/ToolTransform.py:107 msgid "Angle X:" msgstr "Unghi X:" -#: flatcamEditors/FlatCAMGeoEditor.py:704 -#: flatcamEditors/FlatCAMGeoEditor.py:722 -#: flatcamEditors/FlatCAMGrbEditor.py:2863 -#: flatcamEditors/FlatCAMGrbEditor.py:2881 flatcamTools/ToolTransform.py:109 +#: flatcamEditors/FlatCAMGeoEditor.py:705 +#: flatcamEditors/FlatCAMGeoEditor.py:723 +#: flatcamEditors/FlatCAMGrbEditor.py:3874 +#: flatcamEditors/FlatCAMGrbEditor.py:3892 flatcamTools/ToolTransform.py:109 #: flatcamTools/ToolTransform.py:127 msgid "" "Angle for Skew action, in degrees.\n" @@ -2364,15 +2391,15 @@ msgstr "" "Valoarea unghiului de Deformare, in grade.\n" "Ia valori Reale între -360 and 359 grade." -#: flatcamEditors/FlatCAMGeoEditor.py:713 -#: flatcamEditors/FlatCAMGrbEditor.py:2872 flatcamTools/ToolTransform.py:118 +#: flatcamEditors/FlatCAMGeoEditor.py:714 +#: flatcamEditors/FlatCAMGrbEditor.py:3883 flatcamTools/ToolTransform.py:118 msgid "Skew X" msgstr "Deformare X" -#: flatcamEditors/FlatCAMGeoEditor.py:715 -#: flatcamEditors/FlatCAMGeoEditor.py:733 -#: flatcamEditors/FlatCAMGrbEditor.py:2874 -#: flatcamEditors/FlatCAMGrbEditor.py:2892 +#: flatcamEditors/FlatCAMGeoEditor.py:716 +#: flatcamEditors/FlatCAMGeoEditor.py:734 +#: flatcamEditors/FlatCAMGrbEditor.py:3885 +#: flatcamEditors/FlatCAMGrbEditor.py:3903 msgid "" "Skew/shear the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2383,35 +2410,35 @@ msgstr "" "formei înconjurătoare care cuprinde\n" "toate formele selectate." -#: flatcamEditors/FlatCAMGeoEditor.py:720 -#: flatcamEditors/FlatCAMGrbEditor.py:2879 flatcamTools/ToolTransform.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:721 +#: flatcamEditors/FlatCAMGrbEditor.py:3890 flatcamTools/ToolTransform.py:125 msgid "Angle Y:" msgstr "Unghi Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:731 -#: flatcamEditors/FlatCAMGrbEditor.py:2890 flatcamTools/ToolTransform.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:732 +#: flatcamEditors/FlatCAMGrbEditor.py:3901 flatcamTools/ToolTransform.py:136 msgid "Skew Y" msgstr "Deformare Y" -#: flatcamEditors/FlatCAMGeoEditor.py:759 -#: flatcamEditors/FlatCAMGrbEditor.py:2918 flatcamTools/ToolTransform.py:164 +#: flatcamEditors/FlatCAMGeoEditor.py:760 +#: flatcamEditors/FlatCAMGrbEditor.py:3929 flatcamTools/ToolTransform.py:164 msgid "Factor X:" msgstr "Factor X:" -#: flatcamEditors/FlatCAMGeoEditor.py:761 -#: flatcamEditors/FlatCAMGrbEditor.py:2920 flatcamTools/ToolTransform.py:166 +#: flatcamEditors/FlatCAMGeoEditor.py:762 +#: flatcamEditors/FlatCAMGrbEditor.py:3931 flatcamTools/ToolTransform.py:166 msgid "Factor for Scale action over X axis." msgstr "Factor pentru scalarea pe axa X" -#: flatcamEditors/FlatCAMGeoEditor.py:769 -#: flatcamEditors/FlatCAMGrbEditor.py:2928 flatcamTools/ToolTransform.py:174 +#: flatcamEditors/FlatCAMGeoEditor.py:770 +#: flatcamEditors/FlatCAMGrbEditor.py:3939 flatcamTools/ToolTransform.py:174 msgid "Scale X" msgstr "Scalează X" -#: flatcamEditors/FlatCAMGeoEditor.py:771 -#: flatcamEditors/FlatCAMGeoEditor.py:788 -#: flatcamEditors/FlatCAMGrbEditor.py:2930 -#: flatcamEditors/FlatCAMGrbEditor.py:2947 +#: flatcamEditors/FlatCAMGeoEditor.py:772 +#: flatcamEditors/FlatCAMGeoEditor.py:789 +#: flatcamEditors/FlatCAMGrbEditor.py:3941 +#: flatcamEditors/FlatCAMGrbEditor.py:3958 msgid "" "Scale the selected shape(s).\n" "The point of reference depends on \n" @@ -2421,29 +2448,29 @@ msgstr "" "Punctul de referinţă depinde de \n" "starea checkbox-ului >Referința scalare<." -#: flatcamEditors/FlatCAMGeoEditor.py:776 -#: flatcamEditors/FlatCAMGrbEditor.py:2935 flatcamTools/ToolTransform.py:181 +#: flatcamEditors/FlatCAMGeoEditor.py:777 +#: flatcamEditors/FlatCAMGrbEditor.py:3946 flatcamTools/ToolTransform.py:181 msgid "Factor Y:" msgstr "Factor Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:778 -#: flatcamEditors/FlatCAMGrbEditor.py:2937 flatcamTools/ToolTransform.py:183 +#: flatcamEditors/FlatCAMGeoEditor.py:779 +#: flatcamEditors/FlatCAMGrbEditor.py:3948 flatcamTools/ToolTransform.py:183 msgid "Factor for Scale action over Y axis." msgstr "Factor pentru scalarea pe axa Y." -#: flatcamEditors/FlatCAMGeoEditor.py:786 -#: flatcamEditors/FlatCAMGrbEditor.py:2945 flatcamTools/ToolTransform.py:191 +#: flatcamEditors/FlatCAMGeoEditor.py:787 +#: flatcamEditors/FlatCAMGrbEditor.py:3956 flatcamTools/ToolTransform.py:191 msgid "Scale Y" msgstr "Scalează Y" -#: flatcamEditors/FlatCAMGeoEditor.py:795 -#: flatcamEditors/FlatCAMGrbEditor.py:2954 flatcamGUI/FlatCAMGUI.py:5861 +#: flatcamEditors/FlatCAMGeoEditor.py:796 +#: flatcamEditors/FlatCAMGrbEditor.py:3965 flatcamGUI/FlatCAMGUI.py:5950 #: flatcamTools/ToolTransform.py:200 msgid "Link" msgstr "Legatura" -#: flatcamEditors/FlatCAMGeoEditor.py:797 -#: flatcamEditors/FlatCAMGrbEditor.py:2956 +#: flatcamEditors/FlatCAMGeoEditor.py:798 +#: flatcamEditors/FlatCAMGrbEditor.py:3967 msgid "" "Scale the selected shape(s)\n" "using the Scale Factor X for both axis." @@ -2451,14 +2478,14 @@ msgstr "" "Scalează formele selectate\n" "folsoind factorul: Factor X pentru ambele axe." -#: flatcamEditors/FlatCAMGeoEditor.py:803 -#: flatcamEditors/FlatCAMGrbEditor.py:2962 flatcamGUI/FlatCAMGUI.py:5869 +#: flatcamEditors/FlatCAMGeoEditor.py:804 +#: flatcamEditors/FlatCAMGrbEditor.py:3973 flatcamGUI/FlatCAMGUI.py:5958 #: flatcamTools/ToolTransform.py:208 msgid "Scale Reference" msgstr "Referința scalare" -#: flatcamEditors/FlatCAMGeoEditor.py:805 -#: flatcamEditors/FlatCAMGrbEditor.py:2964 +#: flatcamEditors/FlatCAMGeoEditor.py:806 +#: flatcamEditors/FlatCAMGrbEditor.py:3975 msgid "" "Scale the selected shape(s)\n" "using the origin reference when checked,\n" @@ -2471,25 +2498,25 @@ msgstr "" "toate formele selectate când nu este\n" "bifat și este originea când este bifat." -#: flatcamEditors/FlatCAMGeoEditor.py:833 -#: flatcamEditors/FlatCAMGrbEditor.py:2993 flatcamTools/ToolTransform.py:238 +#: flatcamEditors/FlatCAMGeoEditor.py:834 +#: flatcamEditors/FlatCAMGrbEditor.py:4004 flatcamTools/ToolTransform.py:238 msgid "Value X:" msgstr "Valoare X:" -#: flatcamEditors/FlatCAMGeoEditor.py:835 -#: flatcamEditors/FlatCAMGrbEditor.py:2995 flatcamTools/ToolTransform.py:240 +#: flatcamEditors/FlatCAMGeoEditor.py:836 +#: flatcamEditors/FlatCAMGrbEditor.py:4006 flatcamTools/ToolTransform.py:240 msgid "Value for Offset action on X axis." msgstr "Valoare pentru deplasarea pe axa X." -#: flatcamEditors/FlatCAMGeoEditor.py:843 -#: flatcamEditors/FlatCAMGrbEditor.py:3003 flatcamTools/ToolTransform.py:248 +#: flatcamEditors/FlatCAMGeoEditor.py:844 +#: flatcamEditors/FlatCAMGrbEditor.py:4014 flatcamTools/ToolTransform.py:248 msgid "Offset X" msgstr "Ofset pe X" -#: flatcamEditors/FlatCAMGeoEditor.py:845 -#: flatcamEditors/FlatCAMGeoEditor.py:863 -#: flatcamEditors/FlatCAMGrbEditor.py:3005 -#: flatcamEditors/FlatCAMGrbEditor.py:3023 +#: flatcamEditors/FlatCAMGeoEditor.py:846 +#: flatcamEditors/FlatCAMGeoEditor.py:864 +#: flatcamEditors/FlatCAMGrbEditor.py:4016 +#: flatcamEditors/FlatCAMGrbEditor.py:4034 msgid "" "Offset the selected shape(s).\n" "The point of reference is the middle of\n" @@ -2500,30 +2527,30 @@ msgstr "" "formei înconjurătoare care cuprinde\n" "toate formele selectate.\n" -#: flatcamEditors/FlatCAMGeoEditor.py:851 -#: flatcamEditors/FlatCAMGrbEditor.py:3011 flatcamTools/ToolTransform.py:255 +#: flatcamEditors/FlatCAMGeoEditor.py:852 +#: flatcamEditors/FlatCAMGrbEditor.py:4022 flatcamTools/ToolTransform.py:255 msgid "Value Y:" msgstr "Valoare Y:" -#: flatcamEditors/FlatCAMGeoEditor.py:853 -#: flatcamEditors/FlatCAMGrbEditor.py:3013 flatcamTools/ToolTransform.py:257 +#: flatcamEditors/FlatCAMGeoEditor.py:854 +#: flatcamEditors/FlatCAMGrbEditor.py:4024 flatcamTools/ToolTransform.py:257 msgid "Value for Offset action on Y axis." msgstr "Valoare pentru deplasarea pe axa Y." -#: flatcamEditors/FlatCAMGeoEditor.py:861 -#: flatcamEditors/FlatCAMGrbEditor.py:3021 flatcamTools/ToolTransform.py:265 +#: flatcamEditors/FlatCAMGeoEditor.py:862 +#: flatcamEditors/FlatCAMGrbEditor.py:4032 flatcamTools/ToolTransform.py:265 msgid "Offset Y" msgstr "Ofset pe Y" -#: flatcamEditors/FlatCAMGeoEditor.py:892 -#: flatcamEditors/FlatCAMGrbEditor.py:3052 flatcamTools/ToolTransform.py:295 +#: flatcamEditors/FlatCAMGeoEditor.py:893 +#: flatcamEditors/FlatCAMGrbEditor.py:4063 flatcamTools/ToolTransform.py:295 msgid "Flip on X" msgstr "Oglindește pe X" -#: flatcamEditors/FlatCAMGeoEditor.py:894 -#: flatcamEditors/FlatCAMGeoEditor.py:902 -#: flatcamEditors/FlatCAMGrbEditor.py:3054 -#: flatcamEditors/FlatCAMGrbEditor.py:3062 +#: flatcamEditors/FlatCAMGeoEditor.py:895 +#: flatcamEditors/FlatCAMGeoEditor.py:903 +#: flatcamEditors/FlatCAMGrbEditor.py:4065 +#: flatcamEditors/FlatCAMGrbEditor.py:4073 msgid "" "Flip the selected shape(s) over the X axis.\n" "Does not create a new shape." @@ -2531,18 +2558,18 @@ msgstr "" "Oglindește formele selectate peste axa X\n" "Nu crează noi forme." -#: flatcamEditors/FlatCAMGeoEditor.py:900 -#: flatcamEditors/FlatCAMGrbEditor.py:3060 flatcamTools/ToolTransform.py:303 +#: flatcamEditors/FlatCAMGeoEditor.py:901 +#: flatcamEditors/FlatCAMGrbEditor.py:4071 flatcamTools/ToolTransform.py:303 msgid "Flip on Y" msgstr "Oglindește pe Y" -#: flatcamEditors/FlatCAMGeoEditor.py:909 -#: flatcamEditors/FlatCAMGrbEditor.py:3069 flatcamTools/ToolTransform.py:312 +#: flatcamEditors/FlatCAMGeoEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:4080 flatcamTools/ToolTransform.py:312 msgid "Ref Pt" msgstr "Pt ref" -#: flatcamEditors/FlatCAMGeoEditor.py:911 -#: flatcamEditors/FlatCAMGrbEditor.py:3071 +#: flatcamEditors/FlatCAMGeoEditor.py:912 +#: flatcamEditors/FlatCAMGrbEditor.py:4082 msgid "" "Flip the selected shape(s)\n" "around the point in Point Entry Field.\n" @@ -2565,13 +2592,13 @@ msgstr "" "Alternativ se pot introduce manual in formatul (x, y). \n" "La final click pe >Oglindește pe X(Y)<." -#: flatcamEditors/FlatCAMGeoEditor.py:923 -#: flatcamEditors/FlatCAMGrbEditor.py:3083 flatcamTools/ToolTransform.py:325 +#: flatcamEditors/FlatCAMGeoEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:4094 flatcamTools/ToolTransform.py:325 msgid "Point:" msgstr "Punct:" -#: flatcamEditors/FlatCAMGeoEditor.py:925 -#: flatcamEditors/FlatCAMGrbEditor.py:3085 +#: flatcamEditors/FlatCAMGeoEditor.py:926 +#: flatcamEditors/FlatCAMGrbEditor.py:4096 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" @@ -2581,17 +2608,18 @@ msgstr "" "Valoarea 'x' in (x, y) va fi folosita când se face oglindire pe X\n" "și valoarea 'y' in (x, y) va fi folosita când se face oglindire pe Y." -#: flatcamEditors/FlatCAMGeoEditor.py:935 -#: flatcamEditors/FlatCAMGrbEditor.py:3095 flatcamGUI/ObjectUI.py:988 +#: flatcamEditors/FlatCAMGeoEditor.py:936 +#: flatcamEditors/FlatCAMGrbEditor.py:1820 +#: flatcamEditors/FlatCAMGrbEditor.py:4106 flatcamGUI/ObjectUI.py:988 #: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 #: flatcamTools/ToolNonCopperClear.py:134 flatcamTools/ToolPaint.py:131 -#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:479 #: flatcamTools/ToolTransform.py:337 msgid "Add" msgstr "Adaugă" -#: flatcamEditors/FlatCAMGeoEditor.py:937 -#: flatcamEditors/FlatCAMGrbEditor.py:3097 flatcamTools/ToolTransform.py:339 +#: flatcamEditors/FlatCAMGeoEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:4108 flatcamTools/ToolTransform.py:339 msgid "" "The point coordinates can be captured by\n" "left click on canvas together with pressing\n" @@ -2602,343 +2630,400 @@ msgstr "" "tasta SHIFT.\n" "La final, apasa butonul >Adaugă< pt a le insera." -#: flatcamEditors/FlatCAMGeoEditor.py:1052 -#: flatcamEditors/FlatCAMGrbEditor.py:3222 +#: flatcamEditors/FlatCAMGeoEditor.py:1053 +#: flatcamEditors/FlatCAMGrbEditor.py:4233 msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." msgstr "[WARNING_NOTCL] Transformare anulata. Nici-o forma nu este selectată." -#: flatcamEditors/FlatCAMGeoEditor.py:1073 -#: flatcamEditors/FlatCAMGrbEditor.py:3242 flatcamTools/ToolTransform.py:468 +#: flatcamEditors/FlatCAMGeoEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:4253 flatcamTools/ToolTransform.py:468 msgid "[ERROR_NOTCL] Wrong value format entered for Rotate, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Rotaţie, foloseşte un număr " "Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1110 -#: flatcamEditors/FlatCAMGrbEditor.py:3279 flatcamTools/ToolTransform.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:1111 +#: flatcamEditors/FlatCAMGrbEditor.py:4290 flatcamTools/ToolTransform.py:502 msgid "[ERROR_NOTCL] Wrong value format entered for Skew X, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Deformare X, foloseşte un " "număr Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1131 -#: flatcamEditors/FlatCAMGrbEditor.py:3300 flatcamTools/ToolTransform.py:520 +#: flatcamEditors/FlatCAMGeoEditor.py:1132 +#: flatcamEditors/FlatCAMGrbEditor.py:4311 flatcamTools/ToolTransform.py:520 msgid "[ERROR_NOTCL] Wrong value format entered for Skew Y, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Deformare Y, foloseşte un " "număr Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1152 -#: flatcamEditors/FlatCAMGrbEditor.py:3321 flatcamTools/ToolTransform.py:538 +#: flatcamEditors/FlatCAMGeoEditor.py:1153 +#: flatcamEditors/FlatCAMGrbEditor.py:4332 flatcamTools/ToolTransform.py:538 msgid "[ERROR_NOTCL] Wrong value format entered for Scale X, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Scalare X, foloseşte un " "număr Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1189 -#: flatcamEditors/FlatCAMGrbEditor.py:3358 flatcamTools/ToolTransform.py:572 +#: flatcamEditors/FlatCAMGeoEditor.py:1190 +#: flatcamEditors/FlatCAMGrbEditor.py:4369 flatcamTools/ToolTransform.py:572 msgid "[ERROR_NOTCL] Wrong value format entered for Scale Y, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Scalare Y, foloseşte un " "număr Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1221 -#: flatcamEditors/FlatCAMGrbEditor.py:3390 flatcamTools/ToolTransform.py:601 +#: flatcamEditors/FlatCAMGeoEditor.py:1222 +#: flatcamEditors/FlatCAMGrbEditor.py:4401 flatcamTools/ToolTransform.py:601 msgid "[ERROR_NOTCL] Wrong value format entered for Offset X, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Ofset pe X, foloseşte un " "număr Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1242 -#: flatcamEditors/FlatCAMGrbEditor.py:3411 flatcamTools/ToolTransform.py:619 +#: flatcamEditors/FlatCAMGeoEditor.py:1243 +#: flatcamEditors/FlatCAMGrbEditor.py:4422 flatcamTools/ToolTransform.py:619 msgid "[ERROR_NOTCL] Wrong value format entered for Offset Y, use a number." msgstr "" "[ERROR_NOTCL] Valoare incorecta intodusa pentru Ofset pe Y, foloseşte un " "număr Real." -#: flatcamEditors/FlatCAMGeoEditor.py:1260 -#: flatcamEditors/FlatCAMGrbEditor.py:3429 +#: flatcamEditors/FlatCAMGeoEditor.py:1261 +#: flatcamEditors/FlatCAMGrbEditor.py:4440 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" msgstr "" "[WARNING_NOTCL] Nici-o forma nu este selectată. Selectează o forma pentru a " "putea face Rotaţie!" -#: flatcamEditors/FlatCAMGeoEditor.py:1263 -#: flatcamEditors/FlatCAMGrbEditor.py:3432 flatcamTools/ToolTransform.py:640 +#: flatcamEditors/FlatCAMGeoEditor.py:1264 +#: flatcamEditors/FlatCAMGrbEditor.py:4443 flatcamTools/ToolTransform.py:640 msgid "Appying Rotate" msgstr "Execuţie Rotaţie" -#: flatcamEditors/FlatCAMGeoEditor.py:1291 -#: flatcamEditors/FlatCAMGrbEditor.py:3460 +#: flatcamEditors/FlatCAMGeoEditor.py:1292 +#: flatcamEditors/FlatCAMGrbEditor.py:4471 msgid "[success] Done. Rotate completed." msgstr "[success] Executat. Rotaţie finalizata." -#: flatcamEditors/FlatCAMGeoEditor.py:1307 -#: flatcamEditors/FlatCAMGrbEditor.py:3476 +#: flatcamEditors/FlatCAMGeoEditor.py:1308 +#: flatcamEditors/FlatCAMGrbEditor.py:4487 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" msgstr "" "[WARNING_NOTCL] Nici-o forma nu este selectată. Selectează o forma pentru a " "putea face Oglindire!" -#: flatcamEditors/FlatCAMGeoEditor.py:1310 -#: flatcamEditors/FlatCAMGrbEditor.py:3479 flatcamTools/ToolTransform.py:692 +#: flatcamEditors/FlatCAMGeoEditor.py:1311 +#: flatcamEditors/FlatCAMGrbEditor.py:4490 flatcamTools/ToolTransform.py:692 msgid "Applying Flip" msgstr "Execuţie Oglindire" -#: flatcamEditors/FlatCAMGeoEditor.py:1340 -#: flatcamEditors/FlatCAMGrbEditor.py:3509 flatcamTools/ToolTransform.py:735 +#: flatcamEditors/FlatCAMGeoEditor.py:1341 +#: flatcamEditors/FlatCAMGrbEditor.py:4520 flatcamTools/ToolTransform.py:735 msgid "[success] Flip on the Y axis done ..." msgstr "Oglindirea pe axa X efectuata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1343 -#: flatcamEditors/FlatCAMGrbEditor.py:3512 flatcamTools/ToolTransform.py:745 +#: flatcamEditors/FlatCAMGeoEditor.py:1344 +#: flatcamEditors/FlatCAMGrbEditor.py:4523 flatcamTools/ToolTransform.py:745 msgid "[success] Flip on the X axis done ..." msgstr "Oglindirea pe axa Y efectuata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1362 -#: flatcamEditors/FlatCAMGrbEditor.py:3531 +#: flatcamEditors/FlatCAMGeoEditor.py:1363 +#: flatcamEditors/FlatCAMGrbEditor.py:4542 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" msgstr "" "[WARNING_NOTCL] Nici-o forma nu este selectată. Selectează o forma pentru a " "putea face Deformare!" -#: flatcamEditors/FlatCAMGeoEditor.py:1365 -#: flatcamEditors/FlatCAMGrbEditor.py:3534 flatcamTools/ToolTransform.py:762 +#: flatcamEditors/FlatCAMGeoEditor.py:1366 +#: flatcamEditors/FlatCAMGrbEditor.py:4545 flatcamTools/ToolTransform.py:762 msgid "Applying Skew" msgstr "Execuţie Deformare" -#: flatcamEditors/FlatCAMGeoEditor.py:1390 -#: flatcamEditors/FlatCAMGrbEditor.py:3559 flatcamTools/ToolTransform.py:793 +#: flatcamEditors/FlatCAMGeoEditor.py:1391 +#: flatcamEditors/FlatCAMGrbEditor.py:4570 flatcamTools/ToolTransform.py:793 #, python-format msgid "[success] Skew on the %s axis done ..." msgstr "[success] Deformarea pe axa %s executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1394 -#: flatcamEditors/FlatCAMGrbEditor.py:3563 flatcamTools/ToolTransform.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:1395 +#: flatcamEditors/FlatCAMGrbEditor.py:4574 flatcamTools/ToolTransform.py:797 #, python-format msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." msgstr "[ERROR_NOTCL] Datorita erorii: %s, Deformarea a fost anulata." -#: flatcamEditors/FlatCAMGeoEditor.py:1405 -#: flatcamEditors/FlatCAMGrbEditor.py:3574 +#: flatcamEditors/FlatCAMGeoEditor.py:1406 +#: flatcamEditors/FlatCAMGrbEditor.py:4585 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" msgstr "" "[WARNING_NOTCL] Nici-o forma nu este selectată. Selectează o forma pentru a " "putea face Scalare!" -#: flatcamEditors/FlatCAMGeoEditor.py:1408 -#: flatcamEditors/FlatCAMGrbEditor.py:3577 flatcamTools/ToolTransform.py:811 +#: flatcamEditors/FlatCAMGeoEditor.py:1409 +#: flatcamEditors/FlatCAMGrbEditor.py:4588 flatcamTools/ToolTransform.py:811 msgid "Applying Scale" msgstr "Execuţie Scalare" -#: flatcamEditors/FlatCAMGeoEditor.py:1441 -#: flatcamEditors/FlatCAMGrbEditor.py:3610 flatcamTools/ToolTransform.py:849 +#: flatcamEditors/FlatCAMGeoEditor.py:1442 +#: flatcamEditors/FlatCAMGrbEditor.py:4621 flatcamTools/ToolTransform.py:849 #, python-format msgid "[success] Scale on the %s axis done ..." msgstr "[success] Scalarea pe axa %s executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1444 -#: flatcamEditors/FlatCAMGrbEditor.py:3613 flatcamTools/ToolTransform.py:852 +#: flatcamEditors/FlatCAMGeoEditor.py:1445 +#: flatcamEditors/FlatCAMGrbEditor.py:4624 flatcamTools/ToolTransform.py:852 #, python-format msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." msgstr "[ERROR_NOTCL] Datorita erorii: %s, Scalarea a fost anulata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:3622 +#: flatcamEditors/FlatCAMGeoEditor.py:1454 +#: flatcamEditors/FlatCAMGrbEditor.py:4633 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" msgstr "" "[WARNING_NOTCL] Nici-o forma nu este selectată. Selectează o forma pentru a " "putea face Ofset!" -#: flatcamEditors/FlatCAMGeoEditor.py:1456 -#: flatcamEditors/FlatCAMGrbEditor.py:3625 flatcamTools/ToolTransform.py:864 +#: flatcamEditors/FlatCAMGeoEditor.py:1457 +#: flatcamEditors/FlatCAMGrbEditor.py:4636 flatcamTools/ToolTransform.py:864 msgid "Applying Offset" msgstr "Execuţie Ofset" -#: flatcamEditors/FlatCAMGeoEditor.py:1480 -#: flatcamEditors/FlatCAMGrbEditor.py:3649 flatcamTools/ToolTransform.py:894 +#: flatcamEditors/FlatCAMGeoEditor.py:1481 +#: flatcamEditors/FlatCAMGrbEditor.py:4660 flatcamTools/ToolTransform.py:894 #, python-format msgid "[success] Offset on the %s axis done ..." msgstr "[success] Deplasarea pe axa %s executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1484 -#: flatcamEditors/FlatCAMGrbEditor.py:3653 flatcamTools/ToolTransform.py:898 +#: flatcamEditors/FlatCAMGeoEditor.py:1485 +#: flatcamEditors/FlatCAMGrbEditor.py:4664 flatcamTools/ToolTransform.py:898 #, python-format msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." msgstr "[ERROR_NOTCL] Datorita erorii: %s, Deplasarea a fost anulata." -#: flatcamEditors/FlatCAMGeoEditor.py:1488 -#: flatcamEditors/FlatCAMGrbEditor.py:3657 +#: flatcamEditors/FlatCAMGeoEditor.py:1489 +#: flatcamEditors/FlatCAMGrbEditor.py:4668 msgid "Rotate ..." msgstr "Rotaţie ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1489 -#: flatcamEditors/FlatCAMGeoEditor.py:1546 -#: flatcamEditors/FlatCAMGeoEditor.py:1563 -#: flatcamEditors/FlatCAMGrbEditor.py:3658 -#: flatcamEditors/FlatCAMGrbEditor.py:3715 -#: flatcamEditors/FlatCAMGrbEditor.py:3732 +#: flatcamEditors/FlatCAMGeoEditor.py:1490 +#: flatcamEditors/FlatCAMGeoEditor.py:1547 +#: flatcamEditors/FlatCAMGeoEditor.py:1564 +#: flatcamEditors/FlatCAMGrbEditor.py:4669 +#: flatcamEditors/FlatCAMGrbEditor.py:4726 +#: flatcamEditors/FlatCAMGrbEditor.py:4743 msgid "Enter an Angle Value (degrees):" msgstr "Introdu o valoare in grade pt Unghi:" -#: flatcamEditors/FlatCAMGeoEditor.py:1498 -#: flatcamEditors/FlatCAMGrbEditor.py:3667 +#: flatcamEditors/FlatCAMGeoEditor.py:1499 +#: flatcamEditors/FlatCAMGrbEditor.py:4678 msgid "[success] Geometry shape rotate done..." msgstr "[success] Rotatia formei geometrice executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1503 -#: flatcamEditors/FlatCAMGrbEditor.py:3672 +#: flatcamEditors/FlatCAMGeoEditor.py:1504 +#: flatcamEditors/FlatCAMGrbEditor.py:4683 msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." msgstr "[WARNING_NOTCL] Rotatia formei geometrice anulata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1509 -#: flatcamEditors/FlatCAMGrbEditor.py:3678 +#: flatcamEditors/FlatCAMGeoEditor.py:1510 +#: flatcamEditors/FlatCAMGrbEditor.py:4689 msgid "Offset on X axis ..." msgstr "Ofset pe axa X ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1510 -#: flatcamEditors/FlatCAMGeoEditor.py:1529 -#: flatcamEditors/FlatCAMGrbEditor.py:3679 -#: flatcamEditors/FlatCAMGrbEditor.py:3698 +#: flatcamEditors/FlatCAMGeoEditor.py:1511 +#: flatcamEditors/FlatCAMGeoEditor.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:4690 +#: flatcamEditors/FlatCAMGrbEditor.py:4709 #, python-format msgid "Enter a distance Value (%s):" msgstr "Introdu of valoare pt Distanta (%s):" -#: flatcamEditors/FlatCAMGeoEditor.py:1519 -#: flatcamEditors/FlatCAMGrbEditor.py:3688 +#: flatcamEditors/FlatCAMGeoEditor.py:1520 +#: flatcamEditors/FlatCAMGrbEditor.py:4699 msgid "[success] Geometry shape offset on X axis done..." msgstr "[success] Deplasarea formei geometrice pe axa X executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1523 -#: flatcamEditors/FlatCAMGrbEditor.py:3692 +#: flatcamEditors/FlatCAMGeoEditor.py:1524 +#: flatcamEditors/FlatCAMGrbEditor.py:4703 msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." msgstr "[WARNING_NOTCL] Deplasarea formei geometrice pe axa X anulata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1528 -#: flatcamEditors/FlatCAMGrbEditor.py:3697 +#: flatcamEditors/FlatCAMGeoEditor.py:1529 +#: flatcamEditors/FlatCAMGrbEditor.py:4708 msgid "Offset on Y axis ..." msgstr "Ofset pe axa Y ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1538 -#: flatcamEditors/FlatCAMGrbEditor.py:3707 +#: flatcamEditors/FlatCAMGeoEditor.py:1539 +#: flatcamEditors/FlatCAMGrbEditor.py:4718 msgid "[success] Geometry shape offset on Y axis done..." msgstr "[success] Deplasarea formei geometrice pe axa Y executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1542 -#: flatcamEditors/FlatCAMGrbEditor.py:3711 +#: flatcamEditors/FlatCAMGeoEditor.py:1543 +#: flatcamEditors/FlatCAMGrbEditor.py:4722 msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." msgstr "[WARNING_NOTCL] Deplasarea formei geometrice pe axa Y anulata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1545 -#: flatcamEditors/FlatCAMGrbEditor.py:3714 +#: flatcamEditors/FlatCAMGeoEditor.py:1546 +#: flatcamEditors/FlatCAMGrbEditor.py:4725 msgid "Skew on X axis ..." msgstr "Deformare pe axa X ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1555 -#: flatcamEditors/FlatCAMGrbEditor.py:3724 +#: flatcamEditors/FlatCAMGeoEditor.py:1556 +#: flatcamEditors/FlatCAMGrbEditor.py:4735 msgid "[success] Geometry shape skew on X axis done..." msgstr "[success] Deformarea formei geometrice pe axa X executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1559 -#: flatcamEditors/FlatCAMGrbEditor.py:3728 +#: flatcamEditors/FlatCAMGeoEditor.py:1560 +#: flatcamEditors/FlatCAMGrbEditor.py:4739 msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." msgstr "[WARNING_NOTCL] Deformarea formei geometrice pe axa X anulata ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1562 -#: flatcamEditors/FlatCAMGrbEditor.py:3731 +#: flatcamEditors/FlatCAMGeoEditor.py:1563 +#: flatcamEditors/FlatCAMGrbEditor.py:4742 msgid "Skew on Y axis ..." msgstr "Deformare pe axa Y ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1572 -#: flatcamEditors/FlatCAMGrbEditor.py:3741 +#: flatcamEditors/FlatCAMGeoEditor.py:1573 +#: flatcamEditors/FlatCAMGrbEditor.py:4752 msgid "[success] Geometry shape skew on Y axis done..." msgstr "[success] Deformarea formei geometrice pe axa Y executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1576 -#: flatcamEditors/FlatCAMGrbEditor.py:3745 +#: flatcamEditors/FlatCAMGeoEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:4756 msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." msgstr "[success] Deformarea formei geometrice pe axa Y executată ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1934 -#: flatcamEditors/FlatCAMGeoEditor.py:1973 -msgid "Click on CENTER ..." -msgstr "Click in Centru ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1942 +#: flatcamEditors/FlatCAMGeoEditor.py:1943 +#: flatcamEditors/FlatCAMGeoEditor.py:1987 +#: flatcamEditors/FlatCAMGeoEditor.py:1988 +#: flatcamEditors/FlatCAMGrbEditor.py:1081 +#: flatcamEditors/FlatCAMGrbEditor.py:1082 +#: flatcamEditors/FlatCAMGrbEditor.py:1135 +#: flatcamEditors/FlatCAMGrbEditor.py:1136 +msgid "Click on Center point ..." +msgstr "Click pe punctul de Centru ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1941 -msgid "Click on Circle perimeter point to complete ..." -msgstr "Click pe un punct aflat pe circumferinta Cercului pentru terminare ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1950 +#: flatcamEditors/FlatCAMGrbEditor.py:1090 +msgid "Click on Perimeter point to complete ..." +msgstr "Click pe un punct aflat pe Circumferintă pentru terminare ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1965 +#: flatcamEditors/FlatCAMGeoEditor.py:1979 msgid "[success] Done. Adding Circle completed." msgstr "[success] Executat. Adaugarea unei forme Cerc terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:1992 -msgid "Click on Start arc point ..." -msgstr "Click pe punctul de Start al Arcului ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2008 +#: flatcamEditors/FlatCAMGrbEditor.py:1161 +msgid "Click on Start point ..." +msgstr "Click pe punctul de Start ..." -#: flatcamEditors/FlatCAMGeoEditor.py:1996 -msgid "Click on End arc point to complete ..." -msgstr "Click pe punctul de End al Arcului pentru terminare ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2010 +#: flatcamEditors/FlatCAMGrbEditor.py:1163 +msgid "Click on Point3 ..." +msgstr "Click pe Punctul3 ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2151 +#: flatcamEditors/FlatCAMGeoEditor.py:2012 +#: flatcamEditors/FlatCAMGrbEditor.py:1165 +msgid "Click on Stop point ..." +msgstr "Click pe punctulde Stop ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2017 +#: flatcamEditors/FlatCAMGrbEditor.py:1170 +msgid "Click on Stop point to complete ..." +msgstr "Click pe punctul de Stop pentru terminare ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2019 +#: flatcamEditors/FlatCAMGrbEditor.py:1172 +msgid "Click on Point2 to complete ..." +msgstr "Click pe Punctul2 pentru terminare ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2021 +#: flatcamEditors/FlatCAMGrbEditor.py:1174 +msgid "Click on Center point to complete ..." +msgstr "Click pe punctul de Centru pentru terminare ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2033 +#: flatcamEditors/FlatCAMGrbEditor.py:1186 +#, python-format +msgid "Direction: %s" +msgstr "Direcţie: %s" + +#: flatcamEditors/FlatCAMGeoEditor.py:2043 +#: flatcamEditors/FlatCAMGrbEditor.py:1196 +msgid "Mode: Start -> Stop -> Center. Click on Start point ..." +msgstr "Mod: Start -> Stop -> Centru. Click pe punctul de Start ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2046 +#: flatcamEditors/FlatCAMGrbEditor.py:1199 +msgid "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..." +msgstr "Mod: Point1 -> Point3 -> Point2. Click pe Punctul1 ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2049 +#: flatcamEditors/FlatCAMGrbEditor.py:1202 +msgid "Mode: Center -> Start -> Stop. Click on Center point ..." +msgstr "Mod: Center -> Start -> Stop. Click pe punctul de Centru ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2187 msgid "[success] Done. Arc completed." msgstr "[success] Executat. Adaugarea unei forme Arc terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:2163 +#: flatcamEditors/FlatCAMGeoEditor.py:2206 msgid "Click on 1st corner ..." msgstr "Click pe primul colt ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2191 +#: flatcamEditors/FlatCAMGeoEditor.py:2239 msgid "[success] Done. Rectangle completed." msgstr "[success] Executat. Rotaţie finalizata." -#: flatcamEditors/FlatCAMGeoEditor.py:2203 -#: flatcamEditors/FlatCAMGrbEditor.py:452 +#: flatcamEditors/FlatCAMGeoEditor.py:2258 +#: flatcamEditors/FlatCAMGrbEditor.py:627 msgid "Click on 1st point ..." msgstr "Click pe primul punct ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2210 -#: flatcamEditors/FlatCAMGrbEditor.py:459 +#: flatcamEditors/FlatCAMGeoEditor.py:2265 +#: flatcamEditors/FlatCAMGrbEditor.py:637 +#: flatcamEditors/FlatCAMGrbEditor.py:904 msgid "Click on next Point or click Right mouse button to complete ..." msgstr "" "Click pe punctul următor sau click buton dreapta al mousului pentru " "terminare ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2233 +#: flatcamEditors/FlatCAMGeoEditor.py:2293 msgid "[success] Done. Polygon completed." msgstr "[success] Executat. Adaugarea unei forme Poligon terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:2252 -#: flatcamEditors/FlatCAMGrbEditor.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:2303 +#: flatcamEditors/FlatCAMGeoEditor.py:2349 +#: flatcamEditors/FlatCAMGrbEditor.py:808 +#: flatcamEditors/FlatCAMGrbEditor.py:981 +msgid "Backtracked one point ..." +msgstr "Revenit la penultimul Punct ..." + +#: flatcamEditors/FlatCAMGeoEditor.py:2331 msgid "[success] Done. Path completed." msgstr "[success] Executata. Adaugarea unei forme tip Cale terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:2354 -#: flatcamEditors/FlatCAMGeoEditor.py:3442 +#: flatcamEditors/FlatCAMGeoEditor.py:2443 +#: flatcamEditors/FlatCAMGeoEditor.py:3539 msgid "[WARNING_NOTCL] Move cancelled. No shape selected." msgstr "[WARNING_NOTCL] Mutare anulata. Nici-o forma nu este selectată." -#: flatcamEditors/FlatCAMGeoEditor.py:2358 +#: flatcamEditors/FlatCAMGeoEditor.py:2447 msgid "Click on reference point." msgstr "Click pe punctul de referinţă." -#: flatcamEditors/FlatCAMGeoEditor.py:2361 +#: flatcamEditors/FlatCAMGeoEditor.py:2450 msgid "Click on destination point." msgstr "Click pe punctul de Destinaţie." -#: flatcamEditors/FlatCAMGeoEditor.py:2392 +#: flatcamEditors/FlatCAMGeoEditor.py:2481 msgid "[success] Done. Geometry(s) Move completed." msgstr "[success] Executat. Mutarea Geometriilor terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:2437 +#: flatcamEditors/FlatCAMGeoEditor.py:2526 msgid "[success] Done. Geometry(s) Copy completed." msgstr "[success] Executat. Copierea Geometriilor terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:2449 +#: flatcamEditors/FlatCAMGeoEditor.py:2538 msgid "Click on the Destination point..." msgstr "Click pe punctul de Destinaţie ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2463 +#: flatcamEditors/FlatCAMGeoEditor.py:2552 #, python-format msgid "" "[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " @@ -2947,70 +3032,64 @@ msgstr "" "[ERROR] Fontul nu este compatibil. Doar cele tip: Regular, Bold, Italic și " "BoldItalic sunt acceptate. Eroarea:: %s" -#: flatcamEditors/FlatCAMGeoEditor.py:2473 +#: flatcamEditors/FlatCAMGeoEditor.py:2562 msgid "[success] Done. Adding Text completed." msgstr "[success] Executat. Adaugarea de Text terminata." -#: flatcamEditors/FlatCAMGeoEditor.py:2501 +#: flatcamEditors/FlatCAMGeoEditor.py:2590 msgid "Create buffer geometry ..." msgstr "Crează o geometrie de tipe Bufer ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2512 -#: flatcamEditors/FlatCAMGeoEditor.py:2538 -#: flatcamEditors/FlatCAMGeoEditor.py:2564 +#: flatcamEditors/FlatCAMGeoEditor.py:2601 +#: flatcamEditors/FlatCAMGeoEditor.py:2627 +#: flatcamEditors/FlatCAMGeoEditor.py:2653 msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." msgstr "" "[WARNING_NOTCL] Crearea de geometrie Bufer anulata. Nici-o forma geometrică " "nu este selectată." -#: flatcamEditors/FlatCAMGeoEditor.py:2534 -#: flatcamEditors/FlatCAMGrbEditor.py:2698 +#: flatcamEditors/FlatCAMGeoEditor.py:2623 +#: flatcamEditors/FlatCAMGrbEditor.py:3709 msgid "[success] Done. Buffer Tool completed." msgstr "[success] Executat. Unealta Bufer terminat." -#: flatcamEditors/FlatCAMGeoEditor.py:2560 +#: flatcamEditors/FlatCAMGeoEditor.py:2649 msgid "[success] Done. Buffer Int Tool completed." msgstr "[success] Executat. Unealta Bufer Intern terminat." -#: flatcamEditors/FlatCAMGeoEditor.py:2586 +#: flatcamEditors/FlatCAMGeoEditor.py:2675 msgid "[success] Done. Buffer Ext Tool completed." msgstr "[success] Executat. Unealta Bufer Extern terminat." -#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2708 msgid "Create Paint geometry ..." msgstr "Crează o geometrie Paint ..." -#: flatcamEditors/FlatCAMGeoEditor.py:2633 -#: flatcamEditors/FlatCAMGrbEditor.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:2722 +#: flatcamEditors/FlatCAMGrbEditor.py:1657 msgid "Shape transformations ..." msgstr "Transformări de forme geometrice ..." -#: flatcamEditors/FlatCAMGeoEditor.py:3077 +#: flatcamEditors/FlatCAMGeoEditor.py:3174 #, python-brace-format msgid "[WARNING] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}" msgstr "" "[WARNING] Se editeaza un obiect tip Geometrie MultiGeo , unealta: {tool} cu " "diametrul: {dia}" -#: flatcamEditors/FlatCAMGeoEditor.py:3316 -#: flatcamEditors/FlatCAMGrbEditor.py:2267 flatcamGUI/FlatCAMGUI.py:2320 -#: flatcamGUI/FlatCAMGUI.py:2332 -msgid "[success] Done." -msgstr "[success] Executat." - -#: flatcamEditors/FlatCAMGeoEditor.py:3449 +#: flatcamEditors/FlatCAMGeoEditor.py:3546 msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." msgstr "" "[WARNING_NOTCL] Copiere anulata. Nici-o forma geometrică nu este selectată." -#: flatcamEditors/FlatCAMGeoEditor.py:3456 flatcamGUI/FlatCAMGUI.py:2623 -#: flatcamGUI/FlatCAMGUI.py:2657 flatcamGUI/FlatCAMGUI.py:2675 -#: flatcamGUI/FlatCAMGUI.py:2813 flatcamGUI/FlatCAMGUI.py:2825 -#: flatcamGUI/FlatCAMGUI.py:2859 +#: flatcamEditors/FlatCAMGeoEditor.py:3553 flatcamGUI/FlatCAMGUI.py:2686 +#: flatcamGUI/FlatCAMGUI.py:2732 flatcamGUI/FlatCAMGUI.py:2750 +#: flatcamGUI/FlatCAMGUI.py:2881 flatcamGUI/FlatCAMGUI.py:2893 +#: flatcamGUI/FlatCAMGUI.py:2927 msgid "Click on target point." msgstr "Click pe punctul tinta." -#: flatcamEditors/FlatCAMGeoEditor.py:3699 +#: flatcamEditors/FlatCAMGeoEditor.py:3796 msgid "" "[WARNING_NOTCL] A selection of at least 2 geo items is required to do " "Intersection." @@ -3018,9 +3097,9 @@ msgstr "" "[WARNING_NOTCL] Cel puțin o selecţie de doua forme geometrice este necesară " "pentru a face o Intersecţie." -#: flatcamEditors/FlatCAMGeoEditor.py:3737 -#: flatcamEditors/FlatCAMGeoEditor.py:3774 -#: flatcamEditors/FlatCAMGeoEditor.py:3850 +#: flatcamEditors/FlatCAMGeoEditor.py:3834 +#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3947 msgid "" "[ERROR_NOTCL] Negative buffer value is not accepted. Use Buffer interior to " "generate an 'inside' shape" @@ -3028,57 +3107,57 @@ msgstr "" "[ERROR_NOTCL] O valoare de bufer negativă nu se acceptă. Folosete Bufer " "Interior pentru a genera o forma geo. interioara." -#: flatcamEditors/FlatCAMGeoEditor.py:3745 -#: flatcamEditors/FlatCAMGeoEditor.py:3783 -#: flatcamEditors/FlatCAMGeoEditor.py:3858 +#: flatcamEditors/FlatCAMGeoEditor.py:3842 +#: flatcamEditors/FlatCAMGeoEditor.py:3880 +#: flatcamEditors/FlatCAMGeoEditor.py:3955 msgid "[WARNING_NOTCL] Nothing selected for buffering." msgstr "" "[WARNING_NOTCL] Nici-o forma geometrică nu este selectată pentru a face " "Bufer." -#: flatcamEditors/FlatCAMGeoEditor.py:3749 -#: flatcamEditors/FlatCAMGeoEditor.py:3787 -#: flatcamEditors/FlatCAMGeoEditor.py:3862 +#: flatcamEditors/FlatCAMGeoEditor.py:3846 +#: flatcamEditors/FlatCAMGeoEditor.py:3884 +#: flatcamEditors/FlatCAMGeoEditor.py:3959 msgid "[WARNING_NOTCL] Invalid distance for buffering." msgstr "[WARNING_NOTCL] Distanta invalida pentru a face Bufer." -#: flatcamEditors/FlatCAMGeoEditor.py:3759 -#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3856 +#: flatcamEditors/FlatCAMGeoEditor.py:3968 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value." msgstr "" "[ERROR_NOTCL] Esuat, rezultatul este gol. Foloseşte o valoare diferita " "pentru Bufer." -#: flatcamEditors/FlatCAMGeoEditor.py:3767 +#: flatcamEditors/FlatCAMGeoEditor.py:3864 msgid "[success] Full buffer geometry created." msgstr "[success] Geometrie tip Bufer Complet creată." -#: flatcamEditors/FlatCAMGeoEditor.py:3797 +#: flatcamEditors/FlatCAMGeoEditor.py:3894 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value." msgstr "" "[ERROR_NOTCL] Esuat, rezultatul este gol. Foloseşte of valoare mai mica pt. " "Bufer." -#: flatcamEditors/FlatCAMGeoEditor.py:3812 +#: flatcamEditors/FlatCAMGeoEditor.py:3909 msgid "[success] Interior buffer geometry created." msgstr "[success] Geometrie Bufer interior creată." -#: flatcamEditors/FlatCAMGeoEditor.py:3883 +#: flatcamEditors/FlatCAMGeoEditor.py:3980 msgid "[success] Exterior buffer geometry created." msgstr "[success] Geometrie Bufer Exterior creată." -#: flatcamEditors/FlatCAMGeoEditor.py:3947 +#: flatcamEditors/FlatCAMGeoEditor.py:4044 msgid "[WARNING_NOTCL] Nothing selected for painting." msgstr "" "[WARNING_NOTCL] Nici-o forma geometrică nu este selectată pentru Paint." -#: flatcamEditors/FlatCAMGeoEditor.py:3953 +#: flatcamEditors/FlatCAMGeoEditor.py:4050 msgid "[WARNING] Invalid value for {}" msgstr "[WARNING] Valoare invalida pentru {}" -#: flatcamEditors/FlatCAMGeoEditor.py:3959 +#: flatcamEditors/FlatCAMGeoEditor.py:4056 msgid "" "[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " "(100%)." @@ -3086,7 +3165,7 @@ msgstr "" "[ERROR_NOTCL] Nu se poate face Paint. Valoarea de suprapunere trebuie să fie " "mai puțin de 1.00 (100%)." -#: flatcamEditors/FlatCAMGeoEditor.py:4018 +#: flatcamEditors/FlatCAMGeoEditor.py:4115 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -3097,106 +3176,179 @@ msgstr "" "Or o metoda diferita de Paint\n" "%s" -#: flatcamEditors/FlatCAMGeoEditor.py:4029 +#: flatcamEditors/FlatCAMGeoEditor.py:4126 msgid "[success] Paint done." msgstr "[success] Paint executat." -#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:63 +#: flatcamEditors/FlatCAMGrbEditor.py:52 +msgid "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table" +msgstr "" +"[WARNING_NOTCL] Pentru a adăuga un Pad mai intai selectează o apertură " +"(unealtă) in Tabela de Aperturi" + +#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:232 +msgid "" +"[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero." +msgstr "" +"[WARNING_NOTCL] Dimens. aperturii este zero. Trebuie sa fie mai mare ca zero." + +#: flatcamEditors/FlatCAMGrbEditor.py:81 flatcamEditors/FlatCAMGrbEditor.py:86 msgid "Click to place ..." msgstr "Click pt a plasa ..." -#: flatcamEditors/FlatCAMGrbEditor.py:149 -#: flatcamEditors/FlatCAMGrbEditor.py:386 +#: flatcamEditors/FlatCAMGrbEditor.py:191 +#: flatcamEditors/FlatCAMGrbEditor.py:469 msgid "" "Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'." msgstr "" "Tip de apertură incompatibil. Selectează o apertură cu tipul 'C', 'R' sau " "'O'." -#: flatcamEditors/FlatCAMGrbEditor.py:161 +#: flatcamEditors/FlatCAMGrbEditor.py:203 msgid "[success] Done. Adding Pad completed." msgstr "[success] Executat. Adăugarea padului terminată." -#: flatcamEditors/FlatCAMGrbEditor.py:215 -msgid "[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table" +#: flatcamEditors/FlatCAMGrbEditor.py:225 +msgid "" +"[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table" msgstr "" "[WARNING_NOTCL] Pentru a adăuga o arie de paduri mai intai selectează o " -"apertura (unealtă) in Tabela de Unelte" +"apertura (unealtă) in Tabela de Aperturi" -#: flatcamEditors/FlatCAMGrbEditor.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:304 msgid "Click on the Pad Circular Array Start position" msgstr "Click pe punctul de Start al ariei de paduri" -#: flatcamEditors/FlatCAMGrbEditor.py:411 +#: flatcamEditors/FlatCAMGrbEditor.py:494 msgid "[WARNING_NOTCL] Too many Pads for the selected spacing angle." msgstr "[WARNING_NOTCL] Prea multe paduri pentru unghiul selectat." -#: flatcamEditors/FlatCAMGrbEditor.py:433 +#: flatcamEditors/FlatCAMGrbEditor.py:516 msgid "[success] Done. Pad Array added." msgstr "[success] Executat. Aria de paduri a fost adăugată." -#: flatcamEditors/FlatCAMGrbEditor.py:482 -msgid "[success] Done. Region completed." -msgstr "[success] Executat. Adăugarea unei Regiuni terminată." +#: flatcamEditors/FlatCAMGrbEditor.py:537 +msgid "Select shape(s) and then click ..." +msgstr "Selectează formele si apoi click ..." -#: flatcamEditors/FlatCAMGrbEditor.py:527 +#: flatcamEditors/FlatCAMGrbEditor.py:548 +msgid "[ERROR_NOTCL] Failed. Nothing selected." +msgstr "[ERROR_NOTCL] Esuat. Nu este nimic selectat." + +#: flatcamEditors/FlatCAMGrbEditor.py:575 +msgid "[success] Done. Poligonize completed." +msgstr "[success] Executat. Poligonizare completă." + +#: flatcamEditors/FlatCAMGrbEditor.py:625 +#: flatcamEditors/FlatCAMGrbEditor.py:825 +#: flatcamEditors/FlatCAMGrbEditor.py:849 +msgid "Corner Mode 1: 45 degrees ..." +msgstr "Mod Colt 1: 45 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:813 +#: flatcamEditors/FlatCAMGrbEditor.py:846 +msgid "Corner Mode 2: Reverse 45 degrees ..." +msgstr "Mod Colt 2: Invers 45 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:816 +#: flatcamEditors/FlatCAMGrbEditor.py:843 +msgid "Corner Mode 3: 90 degrees ..." +msgstr "Mod Colt 3: 90 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:819 +#: flatcamEditors/FlatCAMGrbEditor.py:840 +msgid "Corner Mode 4: Reverse 90 degrees ..." +msgstr "Mod Colt 4: Invers 90 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:822 +#: flatcamEditors/FlatCAMGrbEditor.py:837 +msgid "Corner Mode 5: Free angle ..." +msgstr "Mod Colt 5: Unghi liber ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:875 +#: flatcamEditors/FlatCAMGrbEditor.py:1012 +#: flatcamEditors/FlatCAMGrbEditor.py:1050 +msgid "Track Mode 1: 45 degrees ..." +msgstr "Mod Traseu 1: 45 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:992 +#: flatcamEditors/FlatCAMGrbEditor.py:1045 +msgid "Track Mode 2: Reverse 45 degrees ..." +msgstr "Mod Traseu 2: Invers 45 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1040 +msgid "Track Mode 3: 90 degrees ..." +msgstr "Mod Traseu 3: 90 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1002 +#: flatcamEditors/FlatCAMGrbEditor.py:1035 +msgid "Track Mode 4: Reverse 90 degrees ..." +msgstr "Mod Traseu 4: Invers 90 grade ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1007 +#: flatcamEditors/FlatCAMGrbEditor.py:1030 +msgid "Track Mode 5: Free angle ..." +msgstr "Mod Traseu 5: Unghi liber ..." + +#: flatcamEditors/FlatCAMGrbEditor.py:1360 msgid "Scale the selected Gerber apertures ..." msgstr "Șterge aperturile Gerber selectate ..." -#: flatcamEditors/FlatCAMGrbEditor.py:564 +#: flatcamEditors/FlatCAMGrbEditor.py:1402 msgid "Buffer the selected apertures ..." msgstr "Bufereaza aperturile selectate." -#: flatcamEditors/FlatCAMGrbEditor.py:660 +#: flatcamEditors/FlatCAMGrbEditor.py:1503 msgid "[success] Done. Apertures Move completed." msgstr "[success] Executat. Mutarea Aperturilor terminată." -#: flatcamEditors/FlatCAMGrbEditor.py:710 +#: flatcamEditors/FlatCAMGrbEditor.py:1558 msgid "[success] Done. Apertures copied." msgstr "[success] Executat. Aperturile au fost copiate." -#: flatcamEditors/FlatCAMGrbEditor.py:833 flatcamGUI/FlatCAMGUI.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:1698 flatcamGUI/FlatCAMGUI.py:1574 msgid "Gerber Editor" msgstr "Editor Gerber" -#: flatcamEditors/FlatCAMGrbEditor.py:852 flatcamGUI/ObjectUI.py:192 +#: flatcamEditors/FlatCAMGrbEditor.py:1717 flatcamGUI/ObjectUI.py:192 msgid "Apertures:" msgstr "Aperturi:" -#: flatcamEditors/FlatCAMGrbEditor.py:854 flatcamGUI/ObjectUI.py:194 +#: flatcamEditors/FlatCAMGrbEditor.py:1719 flatcamGUI/ObjectUI.py:194 msgid "Apertures Table for the Gerber Object." msgstr "Tabela de aperturi pt obiectul Gerber." -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Code" msgstr "Cod" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 msgid "Type" msgstr "Tip" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Size" msgstr "Dimens." -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Dim" msgstr "Dim" -#: flatcamEditors/FlatCAMGrbEditor.py:869 flatcamGUI/ObjectUI.py:232 +#: flatcamEditors/FlatCAMGrbEditor.py:1734 flatcamGUI/ObjectUI.py:232 msgid "Index" msgstr "Index" -#: flatcamEditors/FlatCAMGrbEditor.py:871 flatcamGUI/ObjectUI.py:234 +#: flatcamEditors/FlatCAMGrbEditor.py:1736 flatcamGUI/ObjectUI.py:234 msgid "Aperture Code" msgstr "Cod" -#: flatcamEditors/FlatCAMGrbEditor.py:873 flatcamGUI/ObjectUI.py:236 +#: flatcamEditors/FlatCAMGrbEditor.py:1738 flatcamGUI/ObjectUI.py:236 msgid "Type of aperture: circular, rectangle, macros etc" msgstr "" "Tipul aperturilor:\n" @@ -3205,12 +3357,12 @@ msgstr "" "- macro-uri\n" "etc" -#: flatcamEditors/FlatCAMGrbEditor.py:875 -#: flatcamEditors/FlatCAMGrbEditor.py:908 flatcamGUI/ObjectUI.py:238 +#: flatcamEditors/FlatCAMGrbEditor.py:1740 +#: flatcamEditors/FlatCAMGrbEditor.py:1773 flatcamGUI/ObjectUI.py:238 msgid "Aperture Size:" msgstr "Dim. aper." -#: flatcamEditors/FlatCAMGrbEditor.py:877 flatcamGUI/ObjectUI.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:1742 flatcamGUI/ObjectUI.py:240 msgid "" "Aperture Dimensions:\n" " - (width, height) for R, O type.\n" @@ -3220,15 +3372,15 @@ msgstr "" "- (latime, inaltime) pt tipurile R, O.\n" "- (diametru, nVertices) pt tipul P" -#: flatcamEditors/FlatCAMGrbEditor.py:898 +#: flatcamEditors/FlatCAMGrbEditor.py:1763 msgid "Aperture Code:" msgstr "Cod apertură" -#: flatcamEditors/FlatCAMGrbEditor.py:900 +#: flatcamEditors/FlatCAMGrbEditor.py:1765 msgid "Code for the new aperture" msgstr "Diametru pentru noua apertură" -#: flatcamEditors/FlatCAMGrbEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:1775 msgid "" "Size for the new aperture.\n" "If aperture type is 'R' or 'O' then\n" @@ -3241,11 +3393,11 @@ msgstr "" "valoarea este calculată automat prin:\n" "sqrt(lătime**2 + inăltime**2)" -#: flatcamEditors/FlatCAMGrbEditor.py:922 +#: flatcamEditors/FlatCAMGrbEditor.py:1787 msgid "Aperture Type:" msgstr "Tip aper." -#: flatcamEditors/FlatCAMGrbEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:1789 msgid "" "Select the type of new aperture. Can be:\n" "C = circular\n" @@ -3257,11 +3409,11 @@ msgstr "" "R = rectangular\n" "O = oval" -#: flatcamEditors/FlatCAMGrbEditor.py:935 +#: flatcamEditors/FlatCAMGrbEditor.py:1800 msgid "Aperture Dim:" msgstr "Dim. aper." -#: flatcamEditors/FlatCAMGrbEditor.py:937 +#: flatcamEditors/FlatCAMGrbEditor.py:1802 msgid "" "Dimensions for the new aperture.\n" "Active only for rectangular apertures (type R).\n" @@ -3271,48 +3423,31 @@ msgstr "" "Activă doar pentru aperturile rectangulare (tip 'R').\n" "Formatul este (lătime, inăltime)" -#: flatcamEditors/FlatCAMGrbEditor.py:946 -msgid "Add Aperture:" -msgstr "Adaugă aper." +#: flatcamEditors/FlatCAMGrbEditor.py:1811 +msgid "Add/Delete Aperture:" +msgstr "Adaugă/Șterge aper." -#: flatcamEditors/FlatCAMGrbEditor.py:948 -msgid "Add an aperture to the aperture list" -msgstr "Adaugă o apertură in lista de aperturi" +#: flatcamEditors/FlatCAMGrbEditor.py:1813 +msgid "Add/Delete an aperture in the aperture table" +msgstr "Adaugă/Șterge o apertură din lista de aperturi." -#: flatcamEditors/FlatCAMGrbEditor.py:952 -#: flatcamEditors/FlatCAMGrbEditor.py:965 -msgid "Go" -msgstr "Fă!" - -#: flatcamEditors/FlatCAMGrbEditor.py:954 +#: flatcamEditors/FlatCAMGrbEditor.py:1822 msgid "Add a new aperture to the aperture list." msgstr "Adaugă o nouă apertură in lista de aperturi." -#: flatcamEditors/FlatCAMGrbEditor.py:958 -msgid "Del Aperture:" -msgstr "Șterge apertura:" - -#: flatcamEditors/FlatCAMGrbEditor.py:960 -msgid "" -"Delete a aperture in the aperture list.\n" -"It will delete also the associated geometry." -msgstr "" -"Sterge o apertură in lista de aperturi.\n" -"Va sterge si geometriile asociate." - -#: flatcamEditors/FlatCAMGrbEditor.py:967 +#: flatcamEditors/FlatCAMGrbEditor.py:1827 msgid "Delete a aperture in the aperture list" msgstr "Șterge o apertură din lista de aperturi." -#: flatcamEditors/FlatCAMGrbEditor.py:982 +#: flatcamEditors/FlatCAMGrbEditor.py:1843 msgid "Buffer Aperture:" msgstr "Bufer pt apertură:" -#: flatcamEditors/FlatCAMGrbEditor.py:984 +#: flatcamEditors/FlatCAMGrbEditor.py:1845 msgid "Buffer a aperture in the aperture list" msgstr "Fă bufer pt o apertură din lista de aperturi" -#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1858 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded.\n" @@ -3326,24 +3461,24 @@ msgstr "" " - 'Beveled:' coltul este inlocuit cu o linie care uneste capetele liniilor " "care formează coltul" -#: flatcamEditors/FlatCAMGrbEditor.py:1012 flatcamGUI/FlatCAMGUI.py:695 -#: flatcamGUI/FlatCAMGUI.py:1867 +#: flatcamEditors/FlatCAMGrbEditor.py:1873 flatcamGUI/FlatCAMGUI.py:707 +#: flatcamGUI/FlatCAMGUI.py:1911 msgid "Buffer" msgstr "Bufer" -#: flatcamEditors/FlatCAMGrbEditor.py:1026 +#: flatcamEditors/FlatCAMGrbEditor.py:1887 msgid "Scale Aperture:" msgstr "Scalează ap.:" -#: flatcamEditors/FlatCAMGrbEditor.py:1028 +#: flatcamEditors/FlatCAMGrbEditor.py:1889 msgid "Scale a aperture in the aperture list" msgstr "Scalează o apertură in lista de aperturi" -#: flatcamEditors/FlatCAMGrbEditor.py:1036 +#: flatcamEditors/FlatCAMGrbEditor.py:1897 msgid "Scale factor:" msgstr "Factor Scalare:" -#: flatcamEditors/FlatCAMGrbEditor.py:1038 +#: flatcamEditors/FlatCAMGrbEditor.py:1899 msgid "" "The factor by which to scale the selected aperture.\n" "Values can be between 0.0000 and 999.9999" @@ -3351,16 +3486,16 @@ msgstr "" "Factorul cu care se va face scalarea aperturii selectate.\n" "Poate lua valori intre: 0.000 si 999.9999" -#: flatcamEditors/FlatCAMGrbEditor.py:1066 flatcamGUI/FlatCAMGUI.py:690 -#: flatcamGUI/FlatCAMGUI.py:1862 +#: flatcamEditors/FlatCAMGrbEditor.py:1927 flatcamGUI/FlatCAMGUI.py:696 +#: flatcamGUI/FlatCAMGUI.py:1906 msgid "Add Pad Array" msgstr "Adaugă o arie de paduri" -#: flatcamEditors/FlatCAMGrbEditor.py:1068 +#: flatcamEditors/FlatCAMGrbEditor.py:1929 msgid "Add an array of pads (linear or circular array)" msgstr "Adaugă o arie de paduri (arie lineara sau circulara)." -#: flatcamEditors/FlatCAMGrbEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:1935 msgid "" "Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular" @@ -3368,16 +3503,16 @@ msgstr "" "Selectează tipul de arii de paduri.\n" "Poate fi Liniar X(Y) sau Circular." -#: flatcamEditors/FlatCAMGrbEditor.py:1085 +#: flatcamEditors/FlatCAMGrbEditor.py:1946 msgid "Nr of pads:" msgstr "Nr. paduri:" -#: flatcamEditors/FlatCAMGrbEditor.py:1087 +#: flatcamEditors/FlatCAMGrbEditor.py:1948 msgid "Specify how many pads to be in the array." msgstr "Specifica cate paduri să fie incluse in arie." -#: flatcamEditors/FlatCAMGrbEditor.py:1536 -#: flatcamEditors/FlatCAMGrbEditor.py:1540 +#: flatcamEditors/FlatCAMGrbEditor.py:2420 +#: flatcamEditors/FlatCAMGrbEditor.py:2424 msgid "" "[WARNING_NOTCL] Aperture code value is missing or wrong format. Add it and " "retry." @@ -3385,7 +3520,7 @@ msgstr "" "[WARNING_NOTCL] Valoarea codului aperturii lipseste sau este in format " "greșit. Adaugă din nou și reîncearcă." -#: flatcamEditors/FlatCAMGrbEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:2461 msgid "" "[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. Add it " "in format (width, height) and retry." @@ -3393,7 +3528,7 @@ msgstr "" "[WARNING_NOTCL] Dimensiunile aperturii lipsesc sau sunt intr-un format " "greșit. Adaugă din nou și reîncearcă." -#: flatcamEditors/FlatCAMGrbEditor.py:1589 +#: flatcamEditors/FlatCAMGrbEditor.py:2473 msgid "" "[WARNING_NOTCL] Aperture size value is missing or wrong format. Add it and " "retry." @@ -3401,26 +3536,31 @@ msgstr "" "[WARNING_NOTCL] Valoarea mărimii aperturii lipseste sau este in format " "greșit. Adaugă din nou și reîncearcă." -#: flatcamEditors/FlatCAMGrbEditor.py:1601 +#: flatcamEditors/FlatCAMGrbEditor.py:2485 msgid "[WARNING_NOTCL] Aperture already in the aperture table." msgstr "[WARNING_NOTCL] Apertura este deja in lista de aperturi." -#: flatcamEditors/FlatCAMGrbEditor.py:1608 +#: flatcamEditors/FlatCAMGrbEditor.py:2492 #, python-brace-format msgid "[success] Added new aperture with code: {apid}" msgstr "[success] O nouă apertură este adăugată cu codul: {apid}" -#: flatcamEditors/FlatCAMGrbEditor.py:1660 +#: flatcamEditors/FlatCAMGrbEditor.py:2521 +#: flatcamEditors/FlatCAMGrbEditor.py:2527 +msgid "[WARNING_NOTCL] Select an aperture in Aperture Table" +msgstr "[WARNING_NOTCL] Selectează o unealtă in Tabela de Aperturi" + +#: flatcamEditors/FlatCAMGrbEditor.py:2550 #, python-brace-format msgid "[success] Deleted aperture with code: {del_dia}" msgstr "[success] Unealta cu diametrul: {del_dia} a fost stearsă" -#: flatcamEditors/FlatCAMGrbEditor.py:1902 +#: flatcamEditors/FlatCAMGrbEditor.py:2851 #, python-format msgid "Adding aperture: %s geo ..." msgstr "Se adaugă apertura: %s geo ..." -#: flatcamEditors/FlatCAMGrbEditor.py:2058 +#: flatcamEditors/FlatCAMGrbEditor.py:3015 msgid "" "[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber " "creation." @@ -3428,23 +3568,28 @@ msgstr "" "[ERROR_NOTCL] Nu există definitii de aperturi in fişier. Se anulează crearea " "de obiect Gerber." -#: flatcamEditors/FlatCAMGrbEditor.py:2067 +#: flatcamEditors/FlatCAMGrbEditor.py:3024 msgid "Creating Gerber." msgstr "Gerber in curs de creare." -#: flatcamEditors/FlatCAMGrbEditor.py:2075 +#: flatcamEditors/FlatCAMGrbEditor.py:3032 msgid "[success] Gerber editing finished." msgstr "[success] Editarea Gerber a fost terminată." -#: flatcamEditors/FlatCAMGrbEditor.py:2092 +#: flatcamEditors/FlatCAMGrbEditor.py:3049 msgid "[WARNING_NOTCL] Cancelled. No aperture is selected" msgstr "[WARNING_NOTCL] Anulat. Nici-o apertură nu este selectată." -#: flatcamEditors/FlatCAMGrbEditor.py:2555 -msgid "[success] Done. Apertures deleted." -msgstr "[success] Executat. Aperturile au fost șterse." +#: flatcamEditors/FlatCAMGrbEditor.py:3549 +msgid "[ERROR_NOTCL] Failed. No aperture geometry is selected." +msgstr "" +"[WARNING_NOTCL] Anulat. Nici-o geometrie de apertură nu este selectată." -#: flatcamEditors/FlatCAMGrbEditor.py:2683 +#: flatcamEditors/FlatCAMGrbEditor.py:3557 +msgid "[success] Done. Apertures geometry deleted." +msgstr "[success] Executat. Geometriile aperturilor au fost șterse." + +#: flatcamEditors/FlatCAMGrbEditor.py:3694 msgid "" "[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try " "again." @@ -3452,7 +3597,7 @@ msgstr "" "[WARNING_NOTCL] Nici-o apertura sel. pt a face bufer. Selectează cel puțin o " "apertura și încearcă din nou." -#: flatcamEditors/FlatCAMGrbEditor.py:2712 +#: flatcamEditors/FlatCAMGrbEditor.py:3723 msgid "" "[WARNING_NOTCL] Scale factor value is missing or wrong format. Add it and " "retry." @@ -3460,7 +3605,7 @@ msgstr "" "[WARNING_NOTCL] Valoarea factorului de scalare lipseste sau este in format " "gresit. Adaugă din nou și reîncearcă." -#: flatcamEditors/FlatCAMGrbEditor.py:2730 +#: flatcamEditors/FlatCAMGrbEditor.py:3741 msgid "" "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " "again." @@ -3468,7 +3613,7 @@ msgstr "" "[WARNING_NOTCL] Nici-o apertură sel. pt scalare. Selectează cel puțin o " "apertură și încearcă din nou." -#: flatcamEditors/FlatCAMGrbEditor.py:2746 +#: flatcamEditors/FlatCAMGrbEditor.py:3757 msgid "[success] Done. Scale Tool completed." msgstr "[success] Executat. Unealta Scalare a terminat." @@ -3512,7 +3657,8 @@ msgstr "Excellon\tL" msgid "Will create a new, empty Excellon Object." msgstr "Va crea un obiect nou de tip Excellon, fără continut." -#: flatcamGUI/FlatCAMGUI.py:78 +#: flatcamGUI/FlatCAMGUI.py:78 flatcamTools/ToolPcbWizard.py:63 +#: flatcamTools/ToolPcbWizard.py:71 msgid "Open" msgstr "Încarcă" @@ -3630,7 +3776,7 @@ msgstr "" msgid "Save &Defaults" msgstr "Salvează valori &Default" -#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:514 +#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:520 msgid "Save" msgstr "Salvează" @@ -3922,7 +4068,7 @@ msgstr "Copiaza Geo\tC" msgid "Delete Shape\tDEL" msgstr "Șterge forma Geo.\tDEL" -#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:489 +#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:495 msgid "Move\tM" msgstr "Muta\tM" @@ -3958,11 +4104,11 @@ msgstr "Adaugă Găurire\tD" msgid "Resize Drill(S)\tR" msgstr "Redimens. Găuriri\tR" -#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:482 +#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:488 msgid "Copy\tC" msgstr "Copiaza\tC" -#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:484 +#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:490 msgid "Delete\tDEL" msgstr "Șterge\tDEL" @@ -3991,291 +4137,315 @@ msgid "Add Region\tN" msgstr "Adaugă Regiune\tN" #: flatcamGUI/FlatCAMGUI.py:474 +msgid "Poligonize\tALT+N" +msgstr "Poligonizare\tALT+N" + +#: flatcamGUI/FlatCAMGUI.py:476 +msgid "Add SemiDisc\tE" +msgstr "Adaugă SemiDisc\tE" + +#: flatcamGUI/FlatCAMGUI.py:478 +msgid "Add Disc\tD" +msgstr "Adaugă Disc\tD" + +#: flatcamGUI/FlatCAMGUI.py:480 msgid "Buffer\tB" msgstr "Bufer\tB" -#: flatcamGUI/FlatCAMGUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:482 msgid "Scale\tS" msgstr "Scalare\tS" -#: flatcamGUI/FlatCAMGUI.py:478 +#: flatcamGUI/FlatCAMGUI.py:484 msgid "Transform\tALT+R" msgstr "Unealta Transformare\tALT+R" -#: flatcamGUI/FlatCAMGUI.py:505 +#: flatcamGUI/FlatCAMGUI.py:511 msgid "Enable Plot" msgstr "Activează Afișare" -#: flatcamGUI/FlatCAMGUI.py:506 +#: flatcamGUI/FlatCAMGUI.py:512 msgid "Disable Plot" msgstr "Dezactivează Afișare" -#: flatcamGUI/FlatCAMGUI.py:508 +#: flatcamGUI/FlatCAMGUI.py:514 msgid "Generate CNC" msgstr "Generează CNC" -#: flatcamGUI/FlatCAMGUI.py:509 +#: flatcamGUI/FlatCAMGUI.py:515 msgid "View Source" msgstr "Vizualiz. Sursa" -#: flatcamGUI/FlatCAMGUI.py:511 flatcamGUI/FlatCAMGUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1592 msgid "Edit" msgstr "Editează" -#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:523 flatcamGUI/FlatCAMGUI.py:1598 #: flatcamTools/ToolProperties.py:25 msgid "Properties" msgstr "Proprietati" -#: flatcamGUI/FlatCAMGUI.py:546 +#: flatcamGUI/FlatCAMGUI.py:552 msgid "File Toolbar" msgstr "Toolbar Fişiere" -#: flatcamGUI/FlatCAMGUI.py:550 +#: flatcamGUI/FlatCAMGUI.py:556 msgid "Edit Toolbar" msgstr "Toolbar Editare" -#: flatcamGUI/FlatCAMGUI.py:554 +#: flatcamGUI/FlatCAMGUI.py:560 msgid "View Toolbar" msgstr "Toolbar Vizualizare" -#: flatcamGUI/FlatCAMGUI.py:558 +#: flatcamGUI/FlatCAMGUI.py:564 msgid "Shell Toolbar" msgstr "Toolbar Linie de comanda" -#: flatcamGUI/FlatCAMGUI.py:562 +#: flatcamGUI/FlatCAMGUI.py:568 msgid "Tools Toolbar" msgstr "Toolbar Unelte" -#: flatcamGUI/FlatCAMGUI.py:566 +#: flatcamGUI/FlatCAMGUI.py:572 msgid "Excellon Editor Toolbar" msgstr "Toolbar Editor Excellon" -#: flatcamGUI/FlatCAMGUI.py:570 +#: flatcamGUI/FlatCAMGUI.py:576 msgid "Geometry Editor Toolbar" msgstr "Toolbar Editor Geometrii" -#: flatcamGUI/FlatCAMGUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:580 msgid "Gerber Editor Toolbar" msgstr "Toolbar Editor Gerber" -#: flatcamGUI/FlatCAMGUI.py:578 +#: flatcamGUI/FlatCAMGUI.py:584 msgid "Grid Toolbar" msgstr "Toolbar Grid-uri" -#: flatcamGUI/FlatCAMGUI.py:597 flatcamGUI/FlatCAMGUI.py:1765 +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1809 msgid "Open project" msgstr "Încarcă Proiect" -#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1766 +#: flatcamGUI/FlatCAMGUI.py:604 flatcamGUI/FlatCAMGUI.py:1810 msgid "Save project" msgstr "Salvează Proiect" -#: flatcamGUI/FlatCAMGUI.py:601 flatcamGUI/FlatCAMGUI.py:1769 +#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1813 msgid "New Blank Geometry" msgstr "Geometrie Noua (goală)" -#: flatcamGUI/FlatCAMGUI.py:602 +#: flatcamGUI/FlatCAMGUI.py:608 msgid "New Blank Gerber" msgstr "Gerber Nou (gol)" -#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1770 +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1814 msgid "New Blank Excellon" msgstr "Excellon nou (gol)" -#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1772 +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1816 msgid "Editor" msgstr "Editor" -#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1774 +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1818 msgid "Save Object and close the Editor" msgstr "Salvează Obiectul și inchide Editorul" -#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1778 +#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1822 msgid "&Delete" msgstr "&Șterge" -#: flatcamGUI/FlatCAMGUI.py:614 flatcamGUI/FlatCAMGUI.py:1781 +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1825 msgid "&Replot" msgstr "&Reafișare" -#: flatcamGUI/FlatCAMGUI.py:615 flatcamGUI/FlatCAMGUI.py:1782 +#: flatcamGUI/FlatCAMGUI.py:621 flatcamGUI/FlatCAMGUI.py:1826 msgid "&Clear plot" msgstr "&Șterge Afișare" -#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1783 +#: flatcamGUI/FlatCAMGUI.py:622 flatcamGUI/FlatCAMGUI.py:1827 msgid "Zoom In" msgstr "Marire" -#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1784 +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1828 msgid "Zoom Out" msgstr "Micsorare" -#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1518 -#: flatcamGUI/FlatCAMGUI.py:1785 +#: flatcamGUI/FlatCAMGUI.py:624 flatcamGUI/FlatCAMGUI.py:1562 +#: flatcamGUI/FlatCAMGUI.py:1829 msgid "Zoom Fit" msgstr "Marire și ajustare" -#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1790 +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1834 msgid "&Command Line" msgstr "&Linie de comanda" -#: flatcamGUI/FlatCAMGUI.py:626 flatcamGUI/FlatCAMGUI.py:1793 +#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1837 msgid "2Sided Tool" msgstr "Unealta 2-fețe" -#: flatcamGUI/FlatCAMGUI.py:627 flatcamGUI/FlatCAMGUI.py:1794 +#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1838 msgid "&Cutout Tool" msgstr "Unealta Decupare" -#: flatcamGUI/FlatCAMGUI.py:628 flatcamGUI/FlatCAMGUI.py:1795 -#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:284 +#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:285 msgid "NCC Tool" msgstr "Unealta NCC" -#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1799 +#: flatcamGUI/FlatCAMGUI.py:638 flatcamGUI/FlatCAMGUI.py:1843 msgid "Panel Tool" msgstr "Unealta Panel" -#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1800 +#: flatcamGUI/FlatCAMGUI.py:639 flatcamGUI/FlatCAMGUI.py:1844 #: flatcamTools/ToolFilm.py:204 msgid "Film Tool" msgstr "Unealta Film" -#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1802 +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1846 msgid "SolderPaste Tool" msgstr "Unealta Dispenser SP" -#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1806 +#: flatcamGUI/FlatCAMGUI.py:643 flatcamGUI/FlatCAMGUI.py:1850 msgid "Calculators Tool" msgstr "Unealta Calculatoare" -#: flatcamGUI/FlatCAMGUI.py:641 flatcamGUI/FlatCAMGUI.py:655 -#: flatcamGUI/FlatCAMGUI.py:688 flatcamGUI/FlatCAMGUI.py:1810 -#: flatcamGUI/FlatCAMGUI.py:1860 +#: flatcamGUI/FlatCAMGUI.py:647 flatcamGUI/FlatCAMGUI.py:661 +#: flatcamGUI/FlatCAMGUI.py:694 flatcamGUI/FlatCAMGUI.py:1854 +#: flatcamGUI/FlatCAMGUI.py:1904 msgid "Select" msgstr "Selectează" -#: flatcamGUI/FlatCAMGUI.py:642 flatcamGUI/FlatCAMGUI.py:1811 +#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1855 msgid "Add Drill Hole" msgstr "Adaugă o Găurire" -#: flatcamGUI/FlatCAMGUI.py:644 flatcamGUI/FlatCAMGUI.py:1813 +#: flatcamGUI/FlatCAMGUI.py:650 flatcamGUI/FlatCAMGUI.py:1857 msgid "Add Drill Hole Array" msgstr "Adaugă o arie de Găuriri" -#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1814 +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1858 msgid "Resize Drill" msgstr "Redimens. Găurire" -#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1817 +#: flatcamGUI/FlatCAMGUI.py:654 flatcamGUI/FlatCAMGUI.py:1861 msgid "Copy Drill" msgstr "Copiaza Găurire" -#: flatcamGUI/FlatCAMGUI.py:649 flatcamGUI/FlatCAMGUI.py:1819 +#: flatcamGUI/FlatCAMGUI.py:655 flatcamGUI/FlatCAMGUI.py:1863 msgid "Delete Drill" msgstr "Șterge Găurire" -#: flatcamGUI/FlatCAMGUI.py:652 flatcamGUI/FlatCAMGUI.py:1822 +#: flatcamGUI/FlatCAMGUI.py:658 flatcamGUI/FlatCAMGUI.py:1866 msgid "Move Drill" msgstr "Muta Găurire" -#: flatcamGUI/FlatCAMGUI.py:656 flatcamGUI/FlatCAMGUI.py:1826 +#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1870 msgid "Add Circle" msgstr "Adaugă Cerc" -#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1827 +#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1871 msgid "Add Arc" msgstr "Adaugă Arc" -#: flatcamGUI/FlatCAMGUI.py:659 flatcamGUI/FlatCAMGUI.py:1829 +#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1873 msgid "Add Rectangle" msgstr "Adaugă Patrulater" -#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1832 +#: flatcamGUI/FlatCAMGUI.py:668 flatcamGUI/FlatCAMGUI.py:1876 msgid "Add Path" msgstr "Adaugă Cale" -#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1834 +#: flatcamGUI/FlatCAMGUI.py:669 flatcamGUI/FlatCAMGUI.py:1878 msgid "Add Polygon" msgstr "Adaugă Poligon" -#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1836 +#: flatcamGUI/FlatCAMGUI.py:671 flatcamGUI/FlatCAMGUI.py:1880 msgid "Add Text" msgstr "Adaugă Text" -#: flatcamGUI/FlatCAMGUI.py:666 flatcamGUI/FlatCAMGUI.py:1838 +#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1882 msgid "Add Buffer" msgstr "Adaugă Bufer" -#: flatcamGUI/FlatCAMGUI.py:667 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/FlatCAMGUI.py:673 flatcamGUI/FlatCAMGUI.py:1883 msgid "Paint Shape" msgstr "Paint o forma" -#: flatcamGUI/FlatCAMGUI.py:670 flatcamGUI/FlatCAMGUI.py:1842 +#: flatcamGUI/FlatCAMGUI.py:676 flatcamGUI/FlatCAMGUI.py:1886 msgid "Polygon Union" msgstr "Uniune Poligoane" -#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1844 +#: flatcamGUI/FlatCAMGUI.py:678 flatcamGUI/FlatCAMGUI.py:1888 msgid "Polygon Intersection" msgstr "Intersecţie Poligoane" -#: flatcamGUI/FlatCAMGUI.py:674 flatcamGUI/FlatCAMGUI.py:1846 +#: flatcamGUI/FlatCAMGUI.py:680 flatcamGUI/FlatCAMGUI.py:1890 msgid "Polygon Subtraction" msgstr "Substracţie Poligoane" -#: flatcamGUI/FlatCAMGUI.py:677 flatcamGUI/FlatCAMGUI.py:1849 +#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:1893 msgid "Cut Path" msgstr "Taie Cale" -#: flatcamGUI/FlatCAMGUI.py:678 +#: flatcamGUI/FlatCAMGUI.py:684 msgid "Copy Shape(s)" msgstr "Copiaza forme geo." -#: flatcamGUI/FlatCAMGUI.py:681 +#: flatcamGUI/FlatCAMGUI.py:687 msgid "Delete Shape '-'" msgstr "Șterge forme geo." -#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:702 -#: flatcamGUI/FlatCAMGUI.py:1854 flatcamGUI/FlatCAMGUI.py:1874 +#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:714 +#: flatcamGUI/FlatCAMGUI.py:1898 flatcamGUI/FlatCAMGUI.py:1918 msgid "Transformations" msgstr "Transformări" -#: flatcamGUI/FlatCAMGUI.py:685 +#: flatcamGUI/FlatCAMGUI.py:691 msgid "Move Objects " msgstr "Muta obiecte" -#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:1861 +#: flatcamGUI/FlatCAMGUI.py:695 flatcamGUI/FlatCAMGUI.py:1905 msgid "Add Pad" msgstr "Adaugă Pad" -#: flatcamGUI/FlatCAMGUI.py:691 flatcamGUI/FlatCAMGUI.py:1863 +#: flatcamGUI/FlatCAMGUI.py:697 flatcamGUI/FlatCAMGUI.py:1907 msgid "Add Track" msgstr "Adaugă Traseu" -#: flatcamGUI/FlatCAMGUI.py:692 flatcamGUI/FlatCAMGUI.py:1864 +#: flatcamGUI/FlatCAMGUI.py:698 flatcamGUI/FlatCAMGUI.py:1908 msgid "Add Region" msgstr "Adaugă Regiune" -#: flatcamGUI/FlatCAMGUI.py:704 flatcamGUI/FlatCAMGUI.py:1528 -#: flatcamGUI/FlatCAMGUI.py:1538 flatcamGUI/FlatCAMGUI.py:1553 -#: flatcamGUI/FlatCAMGUI.py:1876 flatcamTools/ToolMove.py:26 +#: flatcamGUI/FlatCAMGUI.py:700 +msgid "Poligonize" +msgstr "Poligonizare" + +#: flatcamGUI/FlatCAMGUI.py:703 +msgid "SemiDisc" +msgstr "SemiDisc" + +#: flatcamGUI/FlatCAMGUI.py:704 +msgid "Disc" +msgstr "Disc" + +#: flatcamGUI/FlatCAMGUI.py:716 flatcamGUI/FlatCAMGUI.py:1572 +#: flatcamGUI/FlatCAMGUI.py:1582 flatcamGUI/FlatCAMGUI.py:1597 +#: flatcamGUI/FlatCAMGUI.py:1920 flatcamTools/ToolMove.py:26 msgid "Move" msgstr "Mutare" -#: flatcamGUI/FlatCAMGUI.py:710 flatcamGUI/FlatCAMGUI.py:1882 +#: flatcamGUI/FlatCAMGUI.py:722 flatcamGUI/FlatCAMGUI.py:1926 msgid "Snap to grid" msgstr "Lipire la grid" -#: flatcamGUI/FlatCAMGUI.py:713 flatcamGUI/FlatCAMGUI.py:1885 +#: flatcamGUI/FlatCAMGUI.py:725 flatcamGUI/FlatCAMGUI.py:1929 msgid "Grid X snapping distance" msgstr "Distanta de lipire la grid pe axa X" -#: flatcamGUI/FlatCAMGUI.py:718 flatcamGUI/FlatCAMGUI.py:1890 +#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1934 msgid "Grid Y snapping distance" msgstr "Distanta de lipire la grid pe axa Y" -#: flatcamGUI/FlatCAMGUI.py:724 flatcamGUI/FlatCAMGUI.py:1896 +#: flatcamGUI/FlatCAMGUI.py:736 flatcamGUI/FlatCAMGUI.py:1940 msgid "" "When active, value on Grid_X\n" "is copied to the Grid_Y value." @@ -4283,64 +4453,64 @@ msgstr "" "când este activ, valoarea de pe Grid_X\n" "este copiata și in Grid_Y" -#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1902 +#: flatcamGUI/FlatCAMGUI.py:742 flatcamGUI/FlatCAMGUI.py:1946 msgid "Snap to corner" msgstr "Lipire la colt" -#: flatcamGUI/FlatCAMGUI.py:734 flatcamGUI/FlatCAMGUI.py:1906 -#: flatcamGUI/FlatCAMGUI.py:3197 +#: flatcamGUI/FlatCAMGUI.py:746 flatcamGUI/FlatCAMGUI.py:1950 +#: flatcamGUI/FlatCAMGUI.py:3286 msgid "Max. magnet distance" msgstr "Distanta magnetica maxima" -#: flatcamGUI/FlatCAMGUI.py:748 flatcamGUI/FlatCAMGUI.py:1512 +#: flatcamGUI/FlatCAMGUI.py:760 flatcamGUI/FlatCAMGUI.py:1556 msgid "Project" msgstr "Proiect" -#: flatcamGUI/FlatCAMGUI.py:757 +#: flatcamGUI/FlatCAMGUI.py:769 msgid "Selected" msgstr "Selectat" -#: flatcamGUI/FlatCAMGUI.py:776 flatcamGUI/FlatCAMGUI.py:784 +#: flatcamGUI/FlatCAMGUI.py:788 flatcamGUI/FlatCAMGUI.py:796 msgid "Plot Area" msgstr "Arie Afișare" -#: flatcamGUI/FlatCAMGUI.py:808 +#: flatcamGUI/FlatCAMGUI.py:820 msgid "General" msgstr "General" -#: flatcamGUI/FlatCAMGUI.py:817 +#: flatcamGUI/FlatCAMGUI.py:829 msgid "APP. DEFAULTS" msgstr "Default for App" -#: flatcamGUI/FlatCAMGUI.py:818 +#: flatcamGUI/FlatCAMGUI.py:830 msgid "PROJ. OPTIONS " msgstr "Opțiuni Proiect" -#: flatcamGUI/FlatCAMGUI.py:829 +#: flatcamGUI/FlatCAMGUI.py:841 msgid "GERBER" msgstr "GERBER" -#: flatcamGUI/FlatCAMGUI.py:838 +#: flatcamGUI/FlatCAMGUI.py:850 msgid "EXCELLON" msgstr "EXCELLON" -#: flatcamGUI/FlatCAMGUI.py:847 +#: flatcamGUI/FlatCAMGUI.py:859 msgid "GEOMETRY" msgstr "GEOMETRIE" -#: flatcamGUI/FlatCAMGUI.py:857 +#: flatcamGUI/FlatCAMGUI.py:869 msgid "CNC-JOB" msgstr "CNCJob" -#: flatcamGUI/FlatCAMGUI.py:866 +#: flatcamGUI/FlatCAMGUI.py:878 msgid "TOOLS" msgstr "Unelte" -#: flatcamGUI/FlatCAMGUI.py:883 +#: flatcamGUI/FlatCAMGUI.py:895 msgid "Import Preferences" msgstr "Importa Preferințele" -#: flatcamGUI/FlatCAMGUI.py:886 +#: flatcamGUI/FlatCAMGUI.py:898 msgid "" "Import a full set of FlatCAM settings from a file\n" "previously saved on HDD.\n" @@ -4354,11 +4524,11 @@ msgstr "" "FlatCAM salvează automat un fişier numit 'factory_defaults'\n" "la prima pornire. Nu șterge acel fişier." -#: flatcamGUI/FlatCAMGUI.py:893 +#: flatcamGUI/FlatCAMGUI.py:905 msgid "Export Preferences" msgstr "Exporta Preferințele" -#: flatcamGUI/FlatCAMGUI.py:896 +#: flatcamGUI/FlatCAMGUI.py:908 msgid "" "Export a full set of FlatCAM settings in a file\n" "that is saved on HDD." @@ -4366,19 +4536,19 @@ msgstr "" "Exporta un set complet de setari ale FlatCAM\n" "intr-un fişier care se salvează pe HDD." -#: flatcamGUI/FlatCAMGUI.py:901 +#: flatcamGUI/FlatCAMGUI.py:913 msgid "Open Pref Folder" msgstr "Deschide Pref Dir" -#: flatcamGUI/FlatCAMGUI.py:904 +#: flatcamGUI/FlatCAMGUI.py:916 msgid "Open the folder where FlatCAM save the preferences files." msgstr "Deschide directorul unde FlatCAM salvează fişierele cu setari." -#: flatcamGUI/FlatCAMGUI.py:912 +#: flatcamGUI/FlatCAMGUI.py:924 msgid "Save Preferences" msgstr "Salvează Pref" -#: flatcamGUI/FlatCAMGUI.py:915 +#: flatcamGUI/FlatCAMGUI.py:927 msgid "" "Save the current settings in the 'current_defaults' file\n" "which is the file storing the working default preferences." @@ -4386,7 +4556,7 @@ msgstr "" "Salvează setarile curente in fişierul numit: 'current_defaults'\n" "fişier care este cel unde se salvează preferințele cu care se va lucra." -#: flatcamGUI/FlatCAMGUI.py:941 +#: flatcamGUI/FlatCAMGUI.py:953 msgid "" "General Shortcut list
\n" "  \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4596,6 +4770,10 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4692,6 +4870,10 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -4722,7 +4904,7 @@ msgstr "" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -4734,16 +4916,16 @@ msgstr "" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -4759,7 +4941,7 @@ msgstr "" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -4771,7 +4953,7 @@ msgstr "" " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" @@ -4870,6 +5052,10 @@ msgstr "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4936,282 +5122,7 @@ msgstr "" " \n" " " -#: flatcamGUI/FlatCAMGUI.py:1218 -#| msgid "" -#| "General Shortcut list
\n" -#| "
B New Gerber
E Edit Object (if selected)
 Paint Area Tool
ALT+Q PDF Import Tool
ALT+R Transformations Tool
 
B Gerber Nou
E Editează Obiectul (daca este selectat)\n" @@ -4710,11 +4892,11 @@ msgstr "" "
M Muta Obj Mută Obj
N Geometrie Noua Geometrie Nouă
O
Q Schimbă Unitatile Schimbă Unitătile
P
S Comuta Shell (linia de comanda) Comută Shell (linia de comandă)
T Adaugă o Unealta (când focus-ul este in " -"Tab-ul Selectat pt Geo, sau in Unealta NCC sau unealtă Paint) Adaugă o Unealtă (când focus-ul este in " +"Tab-ul Selectat pt Geo, sau in Unealta NCC sau unealta Paint)
V Mareste È™i potriveste Măreste È™i potriveste
X
'-' Mareste Măreste
 
CTRL+C Copiaza Obiect Copiază Obiect
CTRL+E Unealta Paint
ALT+Q Unealta de import PDF
ALT+R Unealta Transformări
\n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| " \n" -#| "
F3 SHOW SHORTCUT LIST
  
1 Switch to Project Tab
2 Switch to Selected Tab
3 Switch to Tool Tab
  
E Edit Object (if selected)
G Grid On/Off
J Jump to Coordinates
L New Excellon
M Move Obj
N New Geometry
O Set Origin
Q Change Units
P Open Properties Tool
R Rotate by 90 degree CW
S Shell Toggle
T Add a Tool (when in Geometry Selected " -#| "Tab or in Tools NCC or Tools Paint)
V Zoom Fit
X Flip on X_axis
Y Flip on Y_axis
'='\n" -#| "  Zoom Out
'-'\n" -#| "  Zoom In
  
CTRL+A Select All
CTRL+C Copy Obj
CTRL+E Open Excellon File
CTRL+G Open Gerber File
CTRL+N New Project
CTRL+M Measurement Tool
CTRL+O Open Project
CTRL+S Save Project As
CTRL+F10 Toggle Plot Area
  
SHIFT+C Copy Obj_Name
SHIFT+E Toggle Code Editor
SHIFT+G Toggle the axis
SHIFT+P Open Preferences Window
SHIFT+R Rotate by 90 degree CCW
SHIFT+S Run a Script
SHIFT+W Toggle the workspace
SHIFT+X Skew on X axis
SHIFT+Y Skew on Y axis
  
ALT+C Calculators Tool
ALT+D 2-Sided PCB Tool
ALT+K Solder Paste Dispensing Tool
ALT+L Film PCB Tool
ALT+N Non-Copper Clearing Tool
ALT+P Paint Area Tool
ALT+R Transformations Tool
ALT+S View File Source
ALT+U Cutout PCB Tool
ALT+1 Enable all Plots
ALT+2 Disable all Plots
ALT+3 Disable Non-selected Plots
ALT+F10 Toggle Full Screen
  
F1 Open Online Manual
F4 Open Online Tutorials
Del Delete Object
Del Alternate: Delete Tool
'`' (left to Key_1)Toogle Notebook Area " -#| "(Left Side)
SPACE En(Dis)able Obj Plot
Escape Deselects all objects
\n" -#| " \n" -#| " " +#: flatcamGUI/FlatCAMGUI.py:1238 msgid "" "Editor Shortcut list
\n" "
\n" @@ -5235,6 +5146,11 @@ msgid "" "  Copy Geo Item\n" " \n" " \n" +" D\n" +"  Within Add Arc will toogle the ARC " +"direction: CW or CCW\n" +" \n" +" \n" " E\n" "  Polygon Intersection Tool\n" " \n" @@ -5255,6 +5171,11 @@ msgid "" "  Move Geo Item\n" " \n" " \n" +" M\n" +"  Within Add Arc will cycle through the ARC " +"modes\n" +" \n" +" \n" " N\n" "  Draw a Polygon\n" " \n" @@ -5439,6 +5360,14 @@ msgid "" "  Copy\n" " \n" " \n" +" D\n" +"  Add Disc\n" +" \n" +" \n" +" E\n" +"  Add SemiDisc\n" +" \n" +" \n" " J\n" "  Jump to Location (x, y)\n" " \n" @@ -5455,6 +5384,11 @@ msgid "" "  Add Pad\n" " \n" " \n" +" R\n" +"  Within Track & Region Tools will cycle in " +"REVERSE the bend modes\n" +" \n" +" \n" " S\n" "  Scale\n" " \n" @@ -5463,6 +5397,11 @@ msgid "" "  Add Track\n" " \n" " \n" +" T\n" +"  Within Track & Region Tools will cycle " +"FORWARD the bend modes\n" +" \n" +" \n" "  \n" "  \n" " \n" @@ -5520,6 +5459,11 @@ msgstr "" "  Copiaza o geometrie\n" " \n" " \n" +" D\n" +"  Pt cazul Adauga Arc va schimba directia " +"curbei: CW sau CCW\n" +" \n" +" \n" " E\n" "  Unealta Intersectie Poligoane\n" " \n" @@ -5540,6 +5484,11 @@ msgstr "" "  Muta geometrie\n" " \n" " \n" +" M\n" +"  Pt cazul Adauga Arc va parcurge modurile " +"de realizare a curbelor\n" +" \n" +" \n" " N\n" "  Deseneaza un Poligon\n" " \n" @@ -5727,6 +5676,10 @@ msgstr "" " C\n" "  Copiere\n" " \n" +" \n" +" D\n" +"  Adauga Disc\n" +" \n" " \n" " J\n" "  Sari la locatia (x, y)\n" @@ -5744,6 +5697,11 @@ msgstr "" "  Adauga Pad\n" " \n" " \n" +" R\n" +"  In uneltele Traseu si Regiune va parcurge " +"in Revers modurile de indoire\n" +" \n" +" \n" " S\n" "  Scalare\n" " \n" @@ -5752,6 +5710,11 @@ msgstr "" "  Adauga Traseu\n" " \n" " \n" +" R\n" +"  In uneltele Traseu si Regiune va parcurge " +"in Avans modurile de indoire\n" +" \n" +" \n" "  \n" "  \n" " \n" @@ -5788,105 +5751,105 @@ msgstr "" " \n" " " -#: flatcamGUI/FlatCAMGUI.py:1506 +#: flatcamGUI/FlatCAMGUI.py:1550 msgid "Disable" msgstr "Dezactivează" -#: flatcamGUI/FlatCAMGUI.py:1508 +#: flatcamGUI/FlatCAMGUI.py:1552 msgid "New" msgstr "Nou" -#: flatcamGUI/FlatCAMGUI.py:1509 +#: flatcamGUI/FlatCAMGUI.py:1553 msgid "Geometry" msgstr "Geometrie" -#: flatcamGUI/FlatCAMGUI.py:1510 +#: flatcamGUI/FlatCAMGUI.py:1554 msgid "Excellon" msgstr "Excellon" -#: flatcamGUI/FlatCAMGUI.py:1515 +#: flatcamGUI/FlatCAMGUI.py:1559 msgid "Grids" msgstr "Grid-uri" -#: flatcamGUI/FlatCAMGUI.py:1517 +#: flatcamGUI/FlatCAMGUI.py:1561 msgid "View" msgstr "Vizualizare" -#: flatcamGUI/FlatCAMGUI.py:1519 +#: flatcamGUI/FlatCAMGUI.py:1563 msgid "Clear Plot" msgstr "Șterge AfiÈ™are" -#: flatcamGUI/FlatCAMGUI.py:1520 +#: flatcamGUI/FlatCAMGUI.py:1564 msgid "Replot" msgstr "ReafiÈ™are" -#: flatcamGUI/FlatCAMGUI.py:1523 +#: flatcamGUI/FlatCAMGUI.py:1567 msgid "Geo Editor" msgstr "Editor Geometrii" -#: flatcamGUI/FlatCAMGUI.py:1524 +#: flatcamGUI/FlatCAMGUI.py:1568 msgid "Line" msgstr "Linie" -#: flatcamGUI/FlatCAMGUI.py:1525 +#: flatcamGUI/FlatCAMGUI.py:1569 msgid "Rectangle" msgstr "Patrulater" -#: flatcamGUI/FlatCAMGUI.py:1526 flatcamGUI/FlatCAMGUI.py:5021 +#: flatcamGUI/FlatCAMGUI.py:1570 flatcamGUI/FlatCAMGUI.py:5110 #: flatcamGUI/ObjectUI.py:1360 msgid "Cut" msgstr "Tăiere" -#: flatcamGUI/FlatCAMGUI.py:1531 +#: flatcamGUI/FlatCAMGUI.py:1575 msgid "Pad" msgstr "Pad" -#: flatcamGUI/FlatCAMGUI.py:1532 +#: flatcamGUI/FlatCAMGUI.py:1576 msgid "Pad Array" msgstr "Arie de paduri" -#: flatcamGUI/FlatCAMGUI.py:1533 +#: flatcamGUI/FlatCAMGUI.py:1577 msgid "Track" msgstr "Traseu" -#: flatcamGUI/FlatCAMGUI.py:1534 +#: flatcamGUI/FlatCAMGUI.py:1578 msgid "Region" msgstr "Regiune" -#: flatcamGUI/FlatCAMGUI.py:1540 +#: flatcamGUI/FlatCAMGUI.py:1584 msgid "Exc Editor" msgstr "Editor EXC." -#: flatcamGUI/FlatCAMGUI.py:1541 +#: flatcamGUI/FlatCAMGUI.py:1585 msgid "Add Drill" msgstr "Adaugă găurire" -#: flatcamGUI/FlatCAMGUI.py:1543 +#: flatcamGUI/FlatCAMGUI.py:1587 msgid "Copy Drill(s)" msgstr "Copiaza Găurire" -#: flatcamGUI/FlatCAMGUI.py:1574 +#: flatcamGUI/FlatCAMGUI.py:1618 msgid "Print Preview" msgstr "Preview tiparire" -#: flatcamGUI/FlatCAMGUI.py:1575 +#: flatcamGUI/FlatCAMGUI.py:1619 msgid "Print Code" msgstr "Tipareste Cod" -#: flatcamGUI/FlatCAMGUI.py:1576 +#: flatcamGUI/FlatCAMGUI.py:1620 msgid "Find in Code" msgstr "Cauta in Cod" -#: flatcamGUI/FlatCAMGUI.py:1581 +#: flatcamGUI/FlatCAMGUI.py:1625 msgid "Replace With" msgstr "Inlocuieste cu" -#: flatcamGUI/FlatCAMGUI.py:1585 flatcamGUI/FlatCAMGUI.py:5019 -#: flatcamGUI/FlatCAMGUI.py:5529 flatcamGUI/ObjectUI.py:1358 +#: flatcamGUI/FlatCAMGUI.py:1629 flatcamGUI/FlatCAMGUI.py:5108 +#: flatcamGUI/FlatCAMGUI.py:5618 flatcamGUI/ObjectUI.py:1358 msgid "All" msgstr "Toate" -#: flatcamGUI/FlatCAMGUI.py:1587 +#: flatcamGUI/FlatCAMGUI.py:1631 msgid "" "When checked it will replace all instances in the 'Find' box\n" "with the text in the 'Replace' box.." @@ -5895,15 +5858,15 @@ msgstr "" "'Cauta'\n" "cu textul din casuta 'Inlocuieste'" -#: flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1634 msgid "Open Code" msgstr "Deschide Cod" -#: flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1635 msgid "Save Code" msgstr "Salvează Cod" -#: flatcamGUI/FlatCAMGUI.py:1626 +#: flatcamGUI/FlatCAMGUI.py:1670 msgid "" "Relative neasurement.\n" "Reference is last click position" @@ -5911,7 +5874,7 @@ msgstr "" "Masuratoare relativa.\n" "ReferinÈ›a este poziÅ£ia ultimului click pe canvas." -#: flatcamGUI/FlatCAMGUI.py:1632 +#: flatcamGUI/FlatCAMGUI.py:1676 msgid "" "Absolute neasurement.\n" "Reference is (X=0, Y= 0) position" @@ -5919,23 +5882,23 @@ msgstr "" "Masuratoare absoluta.\n" "ReferinÈ›a este originea (0, 0)." -#: flatcamGUI/FlatCAMGUI.py:1825 +#: flatcamGUI/FlatCAMGUI.py:1869 msgid "Select 'Esc'" msgstr "Select" -#: flatcamGUI/FlatCAMGUI.py:1850 +#: flatcamGUI/FlatCAMGUI.py:1894 msgid "Copy Objects" msgstr "Copiaza Obiecte" -#: flatcamGUI/FlatCAMGUI.py:1852 +#: flatcamGUI/FlatCAMGUI.py:1896 msgid "Delete Shape" msgstr "Șterge forme geo" -#: flatcamGUI/FlatCAMGUI.py:1857 +#: flatcamGUI/FlatCAMGUI.py:1901 msgid "Move Objects" msgstr "Muta Obiecte" -#: flatcamGUI/FlatCAMGUI.py:2266 +#: flatcamGUI/FlatCAMGUI.py:2319 msgid "" "Please first select a geometry item to be cutted\n" "then select the geometry item that will be cutted\n" @@ -5946,17 +5909,17 @@ msgstr "" "apoi selectează forma geo. taietoare. La final apasa tasta ~X~ sau\n" "butonul corespunzator din Toolbar." -#: flatcamGUI/FlatCAMGUI.py:2273 flatcamGUI/FlatCAMGUI.py:2405 -#: flatcamGUI/FlatCAMGUI.py:2464 flatcamGUI/FlatCAMGUI.py:2484 +#: flatcamGUI/FlatCAMGUI.py:2326 flatcamGUI/FlatCAMGUI.py:2463 +#: flatcamGUI/FlatCAMGUI.py:2522 flatcamGUI/FlatCAMGUI.py:2542 msgid "Warning" msgstr "AtenÅ£ie" -#: flatcamGUI/FlatCAMGUI.py:2340 flatcamGUI/FlatCAMGUI.py:2537 -#: flatcamGUI/FlatCAMGUI.py:2735 +#: flatcamGUI/FlatCAMGUI.py:2393 flatcamGUI/FlatCAMGUI.py:2592 +#: flatcamGUI/FlatCAMGUI.py:2803 msgid "[WARNING_NOTCL] Cancelled." msgstr "[WARNING_NOTCL] Anulat." -#: flatcamGUI/FlatCAMGUI.py:2400 +#: flatcamGUI/FlatCAMGUI.py:2458 msgid "" "Please select geometry items \n" "on which to perform Intersection Tool." @@ -5964,7 +5927,7 @@ msgstr "" "Selectează forma geometrică asupra careia să se\n" "aplice Unealta IntersecÅ£ie." -#: flatcamGUI/FlatCAMGUI.py:2459 +#: flatcamGUI/FlatCAMGUI.py:2517 msgid "" "Please select geometry items \n" "on which to perform Substraction Tool." @@ -5972,7 +5935,7 @@ msgstr "" "Selectează forma geometrică asupra careia să se\n" "aplice Unealta SubstracÅ£ie." -#: flatcamGUI/FlatCAMGUI.py:2479 +#: flatcamGUI/FlatCAMGUI.py:2537 msgid "" "Please select geometry items \n" "on which to perform union." @@ -5980,51 +5943,55 @@ msgstr "" "Selectează forma geometrică asupra careia să se\n" "aplice Unealta Uniune." -#: flatcamGUI/FlatCAMGUI.py:2552 flatcamGUI/FlatCAMGUI.py:2752 +#: flatcamGUI/FlatCAMGUI.py:2608 flatcamGUI/FlatCAMGUI.py:2820 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to delete." msgstr "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentru È™tergere." -#: flatcamGUI/FlatCAMGUI.py:2629 flatcamGUI/FlatCAMGUI.py:2819 +#: flatcamGUI/FlatCAMGUI.py:2692 flatcamGUI/FlatCAMGUI.py:2887 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to copy." msgstr "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentru copiere." -#: flatcamGUI/FlatCAMGUI.py:2663 flatcamGUI/FlatCAMGUI.py:2865 +#: flatcamGUI/FlatCAMGUI.py:2738 flatcamGUI/FlatCAMGUI.py:2933 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to move." msgstr "[WARNING_NOTCL] Anulat. Nimic nu este selectat pentru mutare." -#: flatcamGUI/FlatCAMGUI.py:2879 +#: flatcamGUI/FlatCAMGUI.py:2947 msgid "New Tool ..." msgstr "O noua Unealta ..." -#: flatcamGUI/FlatCAMGUI.py:2880 +#: flatcamGUI/FlatCAMGUI.py:2948 msgid "Enter a Tool Diameter:" msgstr "Introdu un Diametru de Unealta:" -#: flatcamGUI/FlatCAMGUI.py:3182 +#: flatcamGUI/FlatCAMGUI.py:2990 +msgid "Measurement Tool exit..." +msgstr "Măsurătoarea s-a terminat ..." + +#: flatcamGUI/FlatCAMGUI.py:3271 msgid "Grid X value:" msgstr "Valoarea Grid_X:" -#: flatcamGUI/FlatCAMGUI.py:3184 +#: flatcamGUI/FlatCAMGUI.py:3273 msgid "This is the Grid snap value on X axis." msgstr "Aceasta este valoare pentru lipire pe Grid pe axa X." -#: flatcamGUI/FlatCAMGUI.py:3189 +#: flatcamGUI/FlatCAMGUI.py:3278 msgid "Grid Y value:" msgstr "Valoarea Grid_Y:" -#: flatcamGUI/FlatCAMGUI.py:3191 +#: flatcamGUI/FlatCAMGUI.py:3280 msgid "This is the Grid snap value on Y axis." msgstr "Aceasta este valoare pentru lipire pe Grid pe axa Y." -#: flatcamGUI/FlatCAMGUI.py:3196 +#: flatcamGUI/FlatCAMGUI.py:3285 msgid "Snap Max:" msgstr "Lipire Max:" -#: flatcamGUI/FlatCAMGUI.py:3201 +#: flatcamGUI/FlatCAMGUI.py:3290 msgid "Workspace:" msgstr "Spatiu de lucru:" -#: flatcamGUI/FlatCAMGUI.py:3203 +#: flatcamGUI/FlatCAMGUI.py:3292 msgid "" "Draw a delimiting rectangle on canvas.\n" "The purpose is to illustrate the limits for our work." @@ -6032,11 +5999,11 @@ msgstr "" "Desenează un patrulater care delimitează o asuprafata de lucru.\n" "Scopul este de a ilustra limitele suprafetei noastre de lucru." -#: flatcamGUI/FlatCAMGUI.py:3206 +#: flatcamGUI/FlatCAMGUI.py:3295 msgid "Wk. format:" msgstr "Format SL:" -#: flatcamGUI/FlatCAMGUI.py:3208 +#: flatcamGUI/FlatCAMGUI.py:3297 msgid "" "Select the type of rectangle to be used on canvas,\n" "as valid workspace." @@ -6044,11 +6011,11 @@ msgstr "" "Selectează tipul de patrulater care va fi desenat pe canvas,\n" "pentru a delimita suprafata de lucru disponibila (SL)." -#: flatcamGUI/FlatCAMGUI.py:3221 +#: flatcamGUI/FlatCAMGUI.py:3310 msgid "Plot Fill:" msgstr "Culoare AfiÈ™are:" -#: flatcamGUI/FlatCAMGUI.py:3223 +#: flatcamGUI/FlatCAMGUI.py:3312 msgid "" "Set the fill color for plotted objects.\n" "First 6 digits are the color and the last 2\n" @@ -6058,28 +6025,28 @@ msgstr "" "Primii 6 digiti sunt culoarea efectiva È™i ultimii\n" "doi sunt pentru nivelul de transparenţă (alfa)." -#: flatcamGUI/FlatCAMGUI.py:3237 flatcamGUI/FlatCAMGUI.py:3287 -#: flatcamGUI/FlatCAMGUI.py:3337 +#: flatcamGUI/FlatCAMGUI.py:3326 flatcamGUI/FlatCAMGUI.py:3376 +#: flatcamGUI/FlatCAMGUI.py:3426 msgid "Alpha Level:" msgstr "Nivel Alfa:" -#: flatcamGUI/FlatCAMGUI.py:3239 +#: flatcamGUI/FlatCAMGUI.py:3328 msgid "Set the fill transparency for plotted objects." msgstr "Setează nivelul de transparenÅ£a pentru obiectele afisate." -#: flatcamGUI/FlatCAMGUI.py:3256 +#: flatcamGUI/FlatCAMGUI.py:3345 msgid "Plot Line:" msgstr "Culoare contur:" -#: flatcamGUI/FlatCAMGUI.py:3258 +#: flatcamGUI/FlatCAMGUI.py:3347 msgid "Set the line color for plotted objects." msgstr "Setează culoarea conturului." -#: flatcamGUI/FlatCAMGUI.py:3270 +#: flatcamGUI/FlatCAMGUI.py:3359 msgid "Sel. Fill:" msgstr "Culoare SelecÅ£ie:" -#: flatcamGUI/FlatCAMGUI.py:3272 +#: flatcamGUI/FlatCAMGUI.py:3361 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from left to right.\n" @@ -6091,27 +6058,27 @@ msgstr "" "Primii 6 digiti sunt culoarea efectiva È™i ultimii\n" "doi sunt pentru nivelul de transparenţă (alfa)." -#: flatcamGUI/FlatCAMGUI.py:3289 +#: flatcamGUI/FlatCAMGUI.py:3378 msgid "Set the fill transparency for the 'left to right' selection box." msgstr "" "Setează transparenÅ£a formei de selecÅ£ie când selectia\n" "se face de la stânga la dreapta." -#: flatcamGUI/FlatCAMGUI.py:3306 +#: flatcamGUI/FlatCAMGUI.py:3395 msgid "Sel. Line:" msgstr "Contur SelecÅ£ie:" -#: flatcamGUI/FlatCAMGUI.py:3308 +#: flatcamGUI/FlatCAMGUI.py:3397 msgid "Set the line color for the 'left to right' selection box." msgstr "" "Setează transparenÅ£a conturului formei de selecÅ£ie\n" "când selectia se face de la stânga la dreapta." -#: flatcamGUI/FlatCAMGUI.py:3320 +#: flatcamGUI/FlatCAMGUI.py:3409 msgid "Sel2. Fill:" msgstr "Culoare SelecÅ£ie 2:" -#: flatcamGUI/FlatCAMGUI.py:3322 +#: flatcamGUI/FlatCAMGUI.py:3411 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from right to left.\n" @@ -6123,49 +6090,49 @@ msgstr "" "Primii 6 digiti sunt culoarea efectiva È™i ultimii\n" "doi sunt pentru nivelul de transparenţă (alfa)." -#: flatcamGUI/FlatCAMGUI.py:3339 +#: flatcamGUI/FlatCAMGUI.py:3428 msgid "Set the fill transparency for selection 'right to left' box." msgstr "" "Setează transparenÅ£a formei de selecÅ£ie când selectia\n" "se face de la dreapta la stânga." -#: flatcamGUI/FlatCAMGUI.py:3356 +#: flatcamGUI/FlatCAMGUI.py:3445 msgid "Sel2. Line:" msgstr "Contur SelecÅ£ie 2:" -#: flatcamGUI/FlatCAMGUI.py:3358 +#: flatcamGUI/FlatCAMGUI.py:3447 msgid "Set the line color for the 'right to left' selection box." msgstr "" "Setează transparenÅ£a conturului formei de selecÅ£ie\n" "când selectia se face de la dreapta la stânga." -#: flatcamGUI/FlatCAMGUI.py:3370 +#: flatcamGUI/FlatCAMGUI.py:3459 msgid "Editor Draw:" msgstr "Desen Editor:" -#: flatcamGUI/FlatCAMGUI.py:3372 +#: flatcamGUI/FlatCAMGUI.py:3461 msgid "Set the color for the shape." msgstr "Setează culoarea pentru forma geometrică din Editor." -#: flatcamGUI/FlatCAMGUI.py:3384 +#: flatcamGUI/FlatCAMGUI.py:3473 msgid "Editor Draw Sel.:" msgstr "Sel. Desen Editor:" -#: flatcamGUI/FlatCAMGUI.py:3386 +#: flatcamGUI/FlatCAMGUI.py:3475 msgid "Set the color of the shape when selected." msgstr "" "Setează culoarea formei geometrice in Editor\n" "când se face o selecÅ£ie." -#: flatcamGUI/FlatCAMGUI.py:3433 +#: flatcamGUI/FlatCAMGUI.py:3522 msgid "GUI Settings" msgstr "Setari GUI" -#: flatcamGUI/FlatCAMGUI.py:3440 +#: flatcamGUI/FlatCAMGUI.py:3529 msgid "Layout:" msgstr "Amplasare:" -#: flatcamGUI/FlatCAMGUI.py:3442 +#: flatcamGUI/FlatCAMGUI.py:3531 msgid "" "Select an layout for FlatCAM.\n" "It is applied immediately." @@ -6173,11 +6140,11 @@ msgstr "" "Selectează un stil de amplasare a elementelor GUI in FlatCAM.\n" "Se aplica imediat." -#: flatcamGUI/FlatCAMGUI.py:3458 +#: flatcamGUI/FlatCAMGUI.py:3547 msgid "Style:" msgstr "Stil:" -#: flatcamGUI/FlatCAMGUI.py:3460 +#: flatcamGUI/FlatCAMGUI.py:3549 msgid "" "Select an style for FlatCAM.\n" "It will be applied at the next app start." @@ -6185,11 +6152,11 @@ msgstr "" "Selectează un stil pentru FlatCAM.\n" "Se va aplica la urmatoarea pornire a aplicaÅ£iei." -#: flatcamGUI/FlatCAMGUI.py:3471 +#: flatcamGUI/FlatCAMGUI.py:3560 msgid "HDPI Support:" msgstr "Suport H-DPI:" -#: flatcamGUI/FlatCAMGUI.py:3473 +#: flatcamGUI/FlatCAMGUI.py:3562 msgid "" "Enable High DPI support for FlatCAM.\n" "It will be applied at the next app start." @@ -6198,11 +6165,11 @@ msgstr "" "Util pentru monitoarele 4k.\n" "Va fi aplicată la următoarea pornire a aplicaÅ£iei." -#: flatcamGUI/FlatCAMGUI.py:3486 +#: flatcamGUI/FlatCAMGUI.py:3575 msgid "Clear GUI Settings:" msgstr "Șterge setarile GUI:" -#: flatcamGUI/FlatCAMGUI.py:3488 +#: flatcamGUI/FlatCAMGUI.py:3577 msgid "" "Clear the GUI settings for FlatCAM,\n" "such as: layout, gui state, style, hdpi support etc." @@ -6210,15 +6177,15 @@ msgstr "" "Șterge setarile GUI pentru FlatCAM,\n" "cum ar fi: amplasare, stare UI, suport HDPI sau traducerea." -#: flatcamGUI/FlatCAMGUI.py:3491 +#: flatcamGUI/FlatCAMGUI.py:3580 msgid "Clear" msgstr "Șterge" -#: flatcamGUI/FlatCAMGUI.py:3495 +#: flatcamGUI/FlatCAMGUI.py:3584 msgid "Hover Shape:" msgstr "Forma Hover:" -#: flatcamGUI/FlatCAMGUI.py:3497 +#: flatcamGUI/FlatCAMGUI.py:3586 msgid "" "Enable display of a hover shape for FlatCAM objects.\n" "It is displayed whenever the mouse cursor is hovering\n" @@ -6228,23 +6195,23 @@ msgstr "" "in canvas-ul FlatCAM. Forma este afiÈ™ată doar daca obiectul \n" "nu este selectat." -#: flatcamGUI/FlatCAMGUI.py:3537 +#: flatcamGUI/FlatCAMGUI.py:3626 msgid "Are you sure you want to delete the GUI Settings? \n" msgstr "Esti sigur că doreÈ™ti să È™tergi setarile GUI?\n" -#: flatcamGUI/FlatCAMGUI.py:3540 +#: flatcamGUI/FlatCAMGUI.py:3629 msgid "Clear GUI Settings" msgstr "Șterge Setarile GUI" -#: flatcamGUI/FlatCAMGUI.py:3561 +#: flatcamGUI/FlatCAMGUI.py:3650 msgid "App Preferences" msgstr "PreferinÈ›ele AplicaÅ£ie" -#: flatcamGUI/FlatCAMGUI.py:3567 +#: flatcamGUI/FlatCAMGUI.py:3656 msgid "Units:" msgstr "Unitati:" -#: flatcamGUI/FlatCAMGUI.py:3568 +#: flatcamGUI/FlatCAMGUI.py:3657 msgid "" "The default value for FlatCAM units.\n" "Whatever is selected here is set every time\n" @@ -6253,11 +6220,11 @@ msgstr "" "Unitatea de masura pt FlatCAM.\n" "Este setată la fiecare pornire a programului." -#: flatcamGUI/FlatCAMGUI.py:3575 +#: flatcamGUI/FlatCAMGUI.py:3664 msgid "APP. LEVEL:" msgstr "Nivel aplic.:" -#: flatcamGUI/FlatCAMGUI.py:3576 +#: flatcamGUI/FlatCAMGUI.py:3665 msgid "" "Choose the default level of usage for FlatCAM.\n" "BASIC level -> reduced functionality, best for beginner's.\n" @@ -6273,31 +6240,31 @@ msgstr "" "Alegerea efectuata aici va influenta ce aparamtri sunt disponibili\n" "in Tab-ul SELECTAT dar È™i in alte parti ale FlatCAM." -#: flatcamGUI/FlatCAMGUI.py:3581 flatcamGUI/FlatCAMGUI.py:4206 +#: flatcamGUI/FlatCAMGUI.py:3670 flatcamGUI/FlatCAMGUI.py:4295 msgid "Basic" msgstr "Baza" -#: flatcamGUI/FlatCAMGUI.py:3582 +#: flatcamGUI/FlatCAMGUI.py:3671 msgid "Advanced" msgstr "Avansat" -#: flatcamGUI/FlatCAMGUI.py:3585 +#: flatcamGUI/FlatCAMGUI.py:3674 msgid "Languages:" msgstr "Traduceri:" -#: flatcamGUI/FlatCAMGUI.py:3586 +#: flatcamGUI/FlatCAMGUI.py:3675 msgid "Set the language used throughout FlatCAM." msgstr "Setează limba folosita pentru textele din FlatCAM." -#: flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:3678 msgid "Apply Language" msgstr "Aplica Traducere" -#: flatcamGUI/FlatCAMGUI.py:3592 +#: flatcamGUI/FlatCAMGUI.py:3681 msgid "Shell at StartUp:" msgstr "Shell la pornire:" -#: flatcamGUI/FlatCAMGUI.py:3594 flatcamGUI/FlatCAMGUI.py:3599 +#: flatcamGUI/FlatCAMGUI.py:3683 flatcamGUI/FlatCAMGUI.py:3688 msgid "" "Check this box if you want the shell to\n" "start automatically at startup." @@ -6306,11 +6273,11 @@ msgstr "" "automata a ferestrei Shell (linia de comanda)\n" "la initializarea aplicaÅ£iei." -#: flatcamGUI/FlatCAMGUI.py:3604 +#: flatcamGUI/FlatCAMGUI.py:3693 msgid "Version Check:" msgstr "Verificare versiune:" -#: flatcamGUI/FlatCAMGUI.py:3606 flatcamGUI/FlatCAMGUI.py:3611 +#: flatcamGUI/FlatCAMGUI.py:3695 flatcamGUI/FlatCAMGUI.py:3700 msgid "" "Check this box if you want to check\n" "for a new version automatically at startup." @@ -6319,11 +6286,11 @@ msgstr "" "daca exista o versiune mai noua,\n" "la pornirea aplicaÅ£iei." -#: flatcamGUI/FlatCAMGUI.py:3616 +#: flatcamGUI/FlatCAMGUI.py:3705 msgid "Send Stats:" msgstr "Statistici:" -#: flatcamGUI/FlatCAMGUI.py:3618 flatcamGUI/FlatCAMGUI.py:3623 +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:3712 msgid "" "Check this box if you agree to send anonymous\n" "stats automatically at startup, to help improve FlatCAM." @@ -6333,11 +6300,11 @@ msgstr "" "aplicaÅ£ia. In acest fel dezvoltatorii vor sti unde să se focalizeze\n" "in crearea de inbunatatiri." -#: flatcamGUI/FlatCAMGUI.py:3630 +#: flatcamGUI/FlatCAMGUI.py:3719 msgid "Pan Button:" msgstr "Buton Pan (miÈ™care):" -#: flatcamGUI/FlatCAMGUI.py:3631 +#: flatcamGUI/FlatCAMGUI.py:3720 msgid "" "Select the mouse button to use for panning:\n" "- MMB --> Middle Mouse Button\n" @@ -6347,35 +6314,35 @@ msgstr "" "- MMB - butonul din mijloc al mouse-ului\n" "- RMB - butonul in dreapta al mouse-ului." -#: flatcamGUI/FlatCAMGUI.py:3634 +#: flatcamGUI/FlatCAMGUI.py:3723 msgid "MMB" msgstr "MMB" -#: flatcamGUI/FlatCAMGUI.py:3635 +#: flatcamGUI/FlatCAMGUI.py:3724 msgid "RMB" msgstr "RMB" -#: flatcamGUI/FlatCAMGUI.py:3638 +#: flatcamGUI/FlatCAMGUI.py:3727 msgid "Multiple Sel:" msgstr "Sel. multipla:" -#: flatcamGUI/FlatCAMGUI.py:3639 +#: flatcamGUI/FlatCAMGUI.py:3728 msgid "Select the key used for multiple selection." msgstr "Selectează tasta folosita pentru selectia multipla." -#: flatcamGUI/FlatCAMGUI.py:3640 +#: flatcamGUI/FlatCAMGUI.py:3729 msgid "CTRL" msgstr "CTRL" -#: flatcamGUI/FlatCAMGUI.py:3641 +#: flatcamGUI/FlatCAMGUI.py:3730 msgid "SHIFT" msgstr "SHIFT" -#: flatcamGUI/FlatCAMGUI.py:3644 +#: flatcamGUI/FlatCAMGUI.py:3733 msgid "Project at StartUp:" msgstr "Proiect la pornire:" -#: flatcamGUI/FlatCAMGUI.py:3646 flatcamGUI/FlatCAMGUI.py:3651 +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:3740 msgid "" "Check this box if you want the project/selected/tool tab area to\n" "to be shown automatically at startup." @@ -6383,11 +6350,11 @@ msgstr "" "Bifează aici daca doreÈ™ti ca zona Notebook să fie\n" "afiÈ™ată automat la pornire." -#: flatcamGUI/FlatCAMGUI.py:3656 +#: flatcamGUI/FlatCAMGUI.py:3745 msgid "Project AutoHide:" msgstr "Ascundere Proiect:" -#: flatcamGUI/FlatCAMGUI.py:3658 flatcamGUI/FlatCAMGUI.py:3664 +#: flatcamGUI/FlatCAMGUI.py:3747 flatcamGUI/FlatCAMGUI.py:3753 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" @@ -6397,11 +6364,11 @@ msgstr "" "când nu sunt obiecte incărcate È™i să fie afiÈ™ată automat\n" "când un obiect nou este creat/incărcat." -#: flatcamGUI/FlatCAMGUI.py:3670 +#: flatcamGUI/FlatCAMGUI.py:3759 msgid "Enable ToolTips:" msgstr "Activează ToolTip-uri:" -#: flatcamGUI/FlatCAMGUI.py:3672 flatcamGUI/FlatCAMGUI.py:3677 +#: flatcamGUI/FlatCAMGUI.py:3761 flatcamGUI/FlatCAMGUI.py:3766 msgid "" "Check this box if you want to have toolTips displayed\n" "when hovering with mouse over items throughout the App." @@ -6409,11 +6376,11 @@ msgstr "" "Bifează daca doreÈ™ti ca să fie afisate texte explicative când se\n" "tine mouse-ul deasupra diverselor texte din FlatCAM." -#: flatcamGUI/FlatCAMGUI.py:3680 +#: flatcamGUI/FlatCAMGUI.py:3769 msgid "Workers number:" msgstr "Număr de worker's:" -#: flatcamGUI/FlatCAMGUI.py:3682 flatcamGUI/FlatCAMGUI.py:3691 +#: flatcamGUI/FlatCAMGUI.py:3771 flatcamGUI/FlatCAMGUI.py:3780 msgid "" "The number of Qthreads made available to the App.\n" "A bigger number may finish the jobs more quickly but\n" @@ -6429,11 +6396,11 @@ msgstr "" "Valoarea standard este 2.\n" "Dupa schimbarea valoarii, se va aplica la următoarea pornire a aplicatiei." -#: flatcamGUI/FlatCAMGUI.py:3732 +#: flatcamGUI/FlatCAMGUI.py:3821 msgid "Save Compressed Project" msgstr "Salvează Proiectul comprimat" -#: flatcamGUI/FlatCAMGUI.py:3734 +#: flatcamGUI/FlatCAMGUI.py:3823 msgid "" "Whether to save a compressed or uncompressed project.\n" "When checked it will save a compressed FlatCAM project." @@ -6442,11 +6409,11 @@ msgstr "" "Când este bifat aici, se va salva o arhiva a proiectului\n" "lucru care poate reduce dimensiunea semnificativ." -#: flatcamGUI/FlatCAMGUI.py:3745 +#: flatcamGUI/FlatCAMGUI.py:3834 msgid "Compression Level:" msgstr "Nivel compresie:" -#: flatcamGUI/FlatCAMGUI.py:3747 +#: flatcamGUI/FlatCAMGUI.py:3836 msgid "" "The level of compression used when saving\n" "a FlatCAM project. Higher value means better compression\n" @@ -6457,49 +6424,49 @@ msgstr "" "dar cu consum redus de resurse in timp ce valoarea 9 cere multa memorie RAM\n" "È™i in plus, durează semnificativ mai mult." -#: flatcamGUI/FlatCAMGUI.py:3773 flatcamGUI/FlatCAMGUI.py:4014 -#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/FlatCAMGUI.py:4993 +#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/FlatCAMGUI.py:4103 +#: flatcamGUI/FlatCAMGUI.py:4758 flatcamGUI/FlatCAMGUI.py:5082 #: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:505 #: flatcamGUI/ObjectUI.py:830 flatcamGUI/ObjectUI.py:1344 msgid "Plot Options:" msgstr "OpÈ›iuni afiÈ™are:" -#: flatcamGUI/FlatCAMGUI.py:3780 flatcamGUI/FlatCAMGUI.py:4026 +#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/FlatCAMGUI.py:4115 #: flatcamGUI/ObjectUI.py:506 msgid "Solid" msgstr "Solid" -#: flatcamGUI/FlatCAMGUI.py:3782 flatcamGUI/ObjectUI.py:158 +#: flatcamGUI/FlatCAMGUI.py:3871 flatcamGUI/ObjectUI.py:158 msgid "Solid color polygons." msgstr "Poligoane color solide." -#: flatcamGUI/FlatCAMGUI.py:3787 +#: flatcamGUI/FlatCAMGUI.py:3876 msgid "M-Color" msgstr "M-Color" -#: flatcamGUI/FlatCAMGUI.py:3789 flatcamGUI/ObjectUI.py:166 +#: flatcamGUI/FlatCAMGUI.py:3878 flatcamGUI/ObjectUI.py:166 msgid "Draw polygons in different colors." msgstr "" "Desenează poligoanele Gerber din multiple culori\n" "alese in mod aleator." -#: flatcamGUI/FlatCAMGUI.py:3794 flatcamGUI/FlatCAMGUI.py:4020 -#: flatcamGUI/FlatCAMGUI.py:4673 flatcamGUI/ObjectUI.py:172 +#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:4109 +#: flatcamGUI/FlatCAMGUI.py:4762 flatcamGUI/ObjectUI.py:172 msgid "Plot" msgstr "Afisează" -#: flatcamGUI/FlatCAMGUI.py:3796 flatcamGUI/FlatCAMGUI.py:4675 +#: flatcamGUI/FlatCAMGUI.py:3885 flatcamGUI/FlatCAMGUI.py:4764 #: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:546 #: flatcamGUI/ObjectUI.py:876 flatcamGUI/ObjectUI.py:1431 msgid "Plot (show) this object." msgstr "Afisează (arata) acest obiect." -#: flatcamGUI/FlatCAMGUI.py:3801 flatcamGUI/FlatCAMGUI.py:4682 -#: flatcamGUI/FlatCAMGUI.py:5029 +#: flatcamGUI/FlatCAMGUI.py:3890 flatcamGUI/FlatCAMGUI.py:4771 +#: flatcamGUI/FlatCAMGUI.py:5118 msgid "Circle Steps:" msgstr "Aprox. Cerc" -#: flatcamGUI/FlatCAMGUI.py:3803 +#: flatcamGUI/FlatCAMGUI.py:3892 msgid "" "The number of circle steps for Gerber \n" "circular aperture linear approximation." @@ -6507,15 +6474,15 @@ msgstr "" "Numărul de segmente utilizate pentru\n" "aproximarea lineara a aperturilor Gerber circulare." -#: flatcamGUI/FlatCAMGUI.py:3818 +#: flatcamGUI/FlatCAMGUI.py:3907 msgid "Gerber Options" msgstr "OpÈ›iuni Gerber" -#: flatcamGUI/FlatCAMGUI.py:3822 flatcamGUI/ObjectUI.py:251 +#: flatcamGUI/FlatCAMGUI.py:3911 flatcamGUI/ObjectUI.py:251 msgid "Isolation Routing:" msgstr "Izolare:" -#: flatcamGUI/FlatCAMGUI.py:3824 flatcamGUI/ObjectUI.py:253 +#: flatcamGUI/FlatCAMGUI.py:3913 flatcamGUI/ObjectUI.py:253 msgid "" "Create a Geometry object with\n" "toolpaths to cut outside polygons." @@ -6524,17 +6491,17 @@ msgstr "" "care să fie taiate in afara poligoanelor,\n" "urmărindu-le conturul." -#: flatcamGUI/FlatCAMGUI.py:3835 flatcamGUI/FlatCAMGUI.py:4392 -#: flatcamGUI/FlatCAMGUI.py:5317 flatcamGUI/ObjectUI.py:785 +#: flatcamGUI/FlatCAMGUI.py:3924 flatcamGUI/FlatCAMGUI.py:4481 +#: flatcamGUI/FlatCAMGUI.py:5406 flatcamGUI/ObjectUI.py:785 #: flatcamGUI/ObjectUI.py:801 msgid "Diameter of the cutting tool." msgstr "Diametrul uneltei taietoare." -#: flatcamGUI/FlatCAMGUI.py:3842 +#: flatcamGUI/FlatCAMGUI.py:3931 msgid "Width (# passes):" msgstr "Latime(# treceri):" -#: flatcamGUI/FlatCAMGUI.py:3844 flatcamGUI/ObjectUI.py:275 +#: flatcamGUI/FlatCAMGUI.py:3933 flatcamGUI/ObjectUI.py:275 msgid "" "Width of the isolation gap in\n" "number (integer) of tool widths." @@ -6542,11 +6509,11 @@ msgstr "" "Lăţimea spatiului de izolare\n" "in număr intreg de grosimi ale uneltei." -#: flatcamGUI/FlatCAMGUI.py:3852 flatcamGUI/ObjectUI.py:283 +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:283 msgid "Pass overlap:" msgstr "Suprapunere:" -#: flatcamGUI/FlatCAMGUI.py:3854 flatcamGUI/ObjectUI.py:285 +#: flatcamGUI/FlatCAMGUI.py:3943 flatcamGUI/ObjectUI.py:285 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -6560,11 +6527,11 @@ msgstr "" "Exemplu:\n" "O valoare de 0.25 reprezinta o suprapunere de 25%% din diametrul uneltei." -#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/ObjectUI.py:295 +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:295 msgid "Milling Type:" msgstr "Tip Frezare:" -#: flatcamGUI/FlatCAMGUI.py:3864 flatcamGUI/ObjectUI.py:297 +#: flatcamGUI/FlatCAMGUI.py:3953 flatcamGUI/ObjectUI.py:297 msgid "" "Milling type:\n" "- climb / best for precision milling and to reduce tool usage\n" @@ -6575,27 +6542,27 @@ msgstr "" "uneltei\n" "- conventional -> pentru cazul când nu exista o compensare a 'backlash-ului'" -#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/ObjectUI.py:302 +#: flatcamGUI/FlatCAMGUI.py:3958 flatcamGUI/ObjectUI.py:302 msgid "Climb" msgstr "Urcare" -#: flatcamGUI/FlatCAMGUI.py:3870 flatcamGUI/ObjectUI.py:303 +#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:303 msgid "Conv." msgstr "Conv." -#: flatcamGUI/FlatCAMGUI.py:3874 +#: flatcamGUI/FlatCAMGUI.py:3963 msgid "Combine Passes" msgstr "Combina" -#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/ObjectUI.py:309 +#: flatcamGUI/FlatCAMGUI.py:3965 flatcamGUI/ObjectUI.py:309 msgid "Combine all passes into one object" msgstr "Combina toate trecerile intr-un singur obiect" -#: flatcamGUI/FlatCAMGUI.py:3881 +#: flatcamGUI/FlatCAMGUI.py:3970 msgid "Clear non-copper:" msgstr "Curăță non-Cu:" -#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:5205 +#: flatcamGUI/FlatCAMGUI.py:3972 flatcamGUI/FlatCAMGUI.py:5294 #: flatcamGUI/ObjectUI.py:386 msgid "" "Create a Geometry object with\n" @@ -6605,12 +6572,12 @@ msgstr "" "care să curete de cupru toate zonele unde se doreste să nu \n" "fie cupru." -#: flatcamGUI/FlatCAMGUI.py:3892 flatcamGUI/FlatCAMGUI.py:3918 +#: flatcamGUI/FlatCAMGUI.py:3981 flatcamGUI/FlatCAMGUI.py:4007 #: flatcamGUI/ObjectUI.py:430 flatcamGUI/ObjectUI.py:464 msgid "Boundary Margin:" msgstr "Margine:" -#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/ObjectUI.py:432 +#: flatcamGUI/FlatCAMGUI.py:3983 flatcamGUI/ObjectUI.py:432 msgid "" "Specify the edge of the PCB\n" "by drawing a box around all\n" @@ -6621,11 +6588,11 @@ msgstr "" "unei forme patratice de jur imprejurul la toate obiectele\n" "la o distanÅ£a minima cu valoarea din acest câmp." -#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:3927 +#: flatcamGUI/FlatCAMGUI.py:3993 flatcamGUI/FlatCAMGUI.py:4016 msgid "Rounded corners" msgstr "C. rotunjite" -#: flatcamGUI/FlatCAMGUI.py:3906 +#: flatcamGUI/FlatCAMGUI.py:3995 msgid "" "Creates a Geometry objects with polygons\n" "covering the copper-free areas of the PCB." @@ -6633,11 +6600,11 @@ msgstr "" "Crează un obiect tip Geometrie conÈ›inând poligoane\n" "care acopera toate suprafetele libere de cupru ale PCB-ului." -#: flatcamGUI/FlatCAMGUI.py:3912 flatcamGUI/ObjectUI.py:454 +#: flatcamGUI/FlatCAMGUI.py:4001 flatcamGUI/ObjectUI.py:454 msgid "Bounding Box:" msgstr "Forma înconjurătoare::" -#: flatcamGUI/FlatCAMGUI.py:3920 flatcamGUI/ObjectUI.py:466 +#: flatcamGUI/FlatCAMGUI.py:4009 flatcamGUI/ObjectUI.py:466 msgid "" "Distance of the edges of the box\n" "to the nearest polygon." @@ -6645,7 +6612,7 @@ msgstr "" "Distanta de la marginile formei înconjurătoare\n" "pana la cel mai apropiat poligon." -#: flatcamGUI/FlatCAMGUI.py:3929 flatcamGUI/ObjectUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/ObjectUI.py:476 msgid "" "If the bounding box is \n" "to have rounded corners\n" @@ -6655,15 +6622,15 @@ msgstr "" "Daca forma înconjurătoare să aibă colÈ›uri rotunjite.\n" "Raza acesor colÈ›uri va fi egală cu parametrul Margine." -#: flatcamGUI/FlatCAMGUI.py:3943 +#: flatcamGUI/FlatCAMGUI.py:4032 msgid "Gerber Adv. Options" msgstr "OpÈ›iuni Av. Gerber" -#: flatcamGUI/FlatCAMGUI.py:3947 +#: flatcamGUI/FlatCAMGUI.py:4036 msgid "Advanced Param.:" msgstr "Param. avansati.:" -#: flatcamGUI/FlatCAMGUI.py:3949 +#: flatcamGUI/FlatCAMGUI.py:4038 msgid "" "A list of Gerber advanced parameters.\n" "Those parameters are available only for\n" @@ -6674,11 +6641,11 @@ msgstr "" "când este selectat Nivelul Avansat pentru\n" "aplicaÅ£ie in PreferinÈ›e - > General" -#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:314 +#: flatcamGUI/FlatCAMGUI.py:4048 flatcamGUI/ObjectUI.py:314 msgid "\"Follow\"" msgstr "\"Urmareste\"" -#: flatcamGUI/FlatCAMGUI.py:3961 flatcamGUI/ObjectUI.py:316 +#: flatcamGUI/FlatCAMGUI.py:4050 flatcamGUI/ObjectUI.py:316 msgid "" "Generate a 'Follow' geometry.\n" "This means that it will cut through\n" @@ -6688,11 +6655,11 @@ msgstr "" "Mai exact, in loc să se genereze un poligon se va genera o 'linie'.\n" "In acest fel se taie prin mijlocul unui traseu È™i nu in jurul lui." -#: flatcamGUI/FlatCAMGUI.py:3969 +#: flatcamGUI/FlatCAMGUI.py:4058 msgid "Table Show/Hide" msgstr "Arata/Ascunde Tabela" -#: flatcamGUI/FlatCAMGUI.py:3971 +#: flatcamGUI/FlatCAMGUI.py:4060 msgid "" "Toggle the display of the Gerber Apertures Table.\n" "Also, on hide, it will delete all mark shapes\n" @@ -6702,11 +6669,11 @@ msgstr "" "când se ascunde aceasta, se vor È™terge È™i toate\n" "posibil afisatele marcaje ale aperturilor." -#: flatcamGUI/FlatCAMGUI.py:3979 +#: flatcamGUI/FlatCAMGUI.py:4068 msgid "Ap. Scale Factor:" msgstr "Factor scalare ap.:" -#: flatcamGUI/FlatCAMGUI.py:3981 +#: flatcamGUI/FlatCAMGUI.py:4070 msgid "" "Change the size of the selected apertures.\n" "Factor by which to multiply\n" @@ -6716,11 +6683,11 @@ msgstr "" "Factor cu care se multiplica geometriile\n" "acestui obiect." -#: flatcamGUI/FlatCAMGUI.py:3991 +#: flatcamGUI/FlatCAMGUI.py:4080 msgid "Ap. Buffer Factor:" msgstr "Factor bufer ap.:" -#: flatcamGUI/FlatCAMGUI.py:3993 +#: flatcamGUI/FlatCAMGUI.py:4082 msgid "" "Change the size of the selected apertures.\n" "Factor by which to expand/shrink\n" @@ -6730,15 +6697,15 @@ msgstr "" "Valoare cu care se mareste/micsorează\n" "geometriile acestui obiect." -#: flatcamGUI/FlatCAMGUI.py:4011 +#: flatcamGUI/FlatCAMGUI.py:4100 msgid "Excellon General" msgstr "Excellon General" -#: flatcamGUI/FlatCAMGUI.py:4033 +#: flatcamGUI/FlatCAMGUI.py:4122 msgid "Excellon Format:" msgstr "Formatul Excellon" -#: flatcamGUI/FlatCAMGUI.py:4035 +#: flatcamGUI/FlatCAMGUI.py:4124 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -6784,18 +6751,18 @@ msgstr "" "Sprint Layout 2:4 INCH LZ\n" "KiCAD 3:5 INCH TZ" -#: flatcamGUI/FlatCAMGUI.py:4060 +#: flatcamGUI/FlatCAMGUI.py:4149 msgid "INCH:" msgstr "Inch" -#: flatcamGUI/FlatCAMGUI.py:4063 +#: flatcamGUI/FlatCAMGUI.py:4152 msgid "Default values for INCH are 2:4" msgstr "" "Valorile default pentru Inch sunt 2:4\n" "adica 2 parti intregi È™i 4 zecimale." -#: flatcamGUI/FlatCAMGUI.py:4071 flatcamGUI/FlatCAMGUI.py:4104 -#: flatcamGUI/FlatCAMGUI.py:4581 +#: flatcamGUI/FlatCAMGUI.py:4160 flatcamGUI/FlatCAMGUI.py:4193 +#: flatcamGUI/FlatCAMGUI.py:4670 msgid "" "This numbers signify the number of digits in\n" "the whole part of Excellon coordinates." @@ -6803,8 +6770,8 @@ msgstr "" "Acest număr reprezinta numărul de digiti din partea\n" "intreaga a coordonatelor Excellon." -#: flatcamGUI/FlatCAMGUI.py:4085 flatcamGUI/FlatCAMGUI.py:4118 -#: flatcamGUI/FlatCAMGUI.py:4595 +#: flatcamGUI/FlatCAMGUI.py:4174 flatcamGUI/FlatCAMGUI.py:4207 +#: flatcamGUI/FlatCAMGUI.py:4684 msgid "" "This numbers signify the number of digits in\n" "the decimal part of Excellon coordinates." @@ -6812,21 +6779,21 @@ msgstr "" "Acest număr reprezinta numărul de digiti din partea\n" "zecimala a coordonatelor Excellon." -#: flatcamGUI/FlatCAMGUI.py:4093 +#: flatcamGUI/FlatCAMGUI.py:4182 msgid "METRIC:" msgstr "Metric" -#: flatcamGUI/FlatCAMGUI.py:4096 +#: flatcamGUI/FlatCAMGUI.py:4185 msgid "Default values for METRIC are 3:3" msgstr "" "Valorile default pentru Metric sunt 3:3\n" "adica 3 parti intregi È™i 3 zecimale." -#: flatcamGUI/FlatCAMGUI.py:4127 +#: flatcamGUI/FlatCAMGUI.py:4216 msgid "Default Zeros:" msgstr "Suprimare Zero:" -#: flatcamGUI/FlatCAMGUI.py:4130 flatcamGUI/FlatCAMGUI.py:4630 +#: flatcamGUI/FlatCAMGUI.py:4219 flatcamGUI/FlatCAMGUI.py:4719 msgid "" "This sets the type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -6842,15 +6809,15 @@ msgstr "" "cele de la final sunt pastrate.\n" "(Invers fata de fiÅŸierele Gerber)." -#: flatcamGUI/FlatCAMGUI.py:4138 flatcamGUI/FlatCAMGUI.py:4637 +#: flatcamGUI/FlatCAMGUI.py:4227 flatcamGUI/FlatCAMGUI.py:4726 msgid "LZ" msgstr "LZ" -#: flatcamGUI/FlatCAMGUI.py:4139 flatcamGUI/FlatCAMGUI.py:4638 +#: flatcamGUI/FlatCAMGUI.py:4228 flatcamGUI/FlatCAMGUI.py:4727 msgid "TZ" msgstr "TZ" -#: flatcamGUI/FlatCAMGUI.py:4141 +#: flatcamGUI/FlatCAMGUI.py:4230 msgid "" "This sets the default type of Excellon zeros.\n" "If it is not detected in the parsed file the value here\n" @@ -6869,11 +6836,11 @@ msgstr "" "cele de la final sunt pastrate.\n" "(Invers fata de fiÅŸierele Gerber)." -#: flatcamGUI/FlatCAMGUI.py:4155 +#: flatcamGUI/FlatCAMGUI.py:4244 msgid "Default Units:" msgstr "Unitati Excellon:" -#: flatcamGUI/FlatCAMGUI.py:4158 +#: flatcamGUI/FlatCAMGUI.py:4247 msgid "" "This sets the default units of Excellon files.\n" "If it is not detected in the parsed file the value here\n" @@ -6887,15 +6854,15 @@ msgstr "" "(unde se gasesc unitatile) È™i atunci se va folosi\n" "aceasta valoare." -#: flatcamGUI/FlatCAMGUI.py:4166 flatcamGUI/FlatCAMGUI.py:4557 +#: flatcamGUI/FlatCAMGUI.py:4255 flatcamGUI/FlatCAMGUI.py:4646 msgid "INCH" msgstr "Inch" -#: flatcamGUI/FlatCAMGUI.py:4167 flatcamGUI/FlatCAMGUI.py:4558 +#: flatcamGUI/FlatCAMGUI.py:4256 flatcamGUI/FlatCAMGUI.py:4647 msgid "MM" msgstr "MM" -#: flatcamGUI/FlatCAMGUI.py:4169 +#: flatcamGUI/FlatCAMGUI.py:4258 msgid "" "This sets the units of Excellon files.\n" "Some Excellon files don't have an header\n" @@ -6908,15 +6875,15 @@ msgstr "" "(unde se gasesc unitatile) È™i atunci se va folosi\n" "aceasta valoare." -#: flatcamGUI/FlatCAMGUI.py:4185 +#: flatcamGUI/FlatCAMGUI.py:4274 msgid "Excellon Optimization:" msgstr "Optimizarea traseului Excellon:" -#: flatcamGUI/FlatCAMGUI.py:4192 +#: flatcamGUI/FlatCAMGUI.py:4281 msgid "Algorithm: " msgstr "Algoritm:" -#: flatcamGUI/FlatCAMGUI.py:4195 flatcamGUI/FlatCAMGUI.py:4208 +#: flatcamGUI/FlatCAMGUI.py:4284 flatcamGUI/FlatCAMGUI.py:4297 msgid "" "This sets the optimization type for the Excellon drill path.\n" "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" @@ -6940,15 +6907,15 @@ msgstr "" "care nu este compatibila cu pachetul OR Tools È™i in acest caz se foloseÅŸte\n" "algoritmul default: Travelling Salesman (vanzatorul ambulant)." -#: flatcamGUI/FlatCAMGUI.py:4205 +#: flatcamGUI/FlatCAMGUI.py:4294 msgid "MH" msgstr "MH" -#: flatcamGUI/FlatCAMGUI.py:4220 +#: flatcamGUI/FlatCAMGUI.py:4309 msgid "Optimization Time: " msgstr "Durata optimiz.:" -#: flatcamGUI/FlatCAMGUI.py:4223 +#: flatcamGUI/FlatCAMGUI.py:4312 msgid "" "When OR-Tools Metaheuristic (MH) is enabled there is a\n" "maximum threshold for how much time is spent doing the\n" @@ -6959,15 +6926,15 @@ msgstr "" "reprezinta cat timp se sta pentru fiecare element in\n" "incercarea de a afla calea optima." -#: flatcamGUI/FlatCAMGUI.py:4264 +#: flatcamGUI/FlatCAMGUI.py:4353 msgid "Excellon Options" msgstr "OpÈ›iuni Excellon" -#: flatcamGUI/FlatCAMGUI.py:4267 flatcamGUI/ObjectUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:4356 flatcamGUI/ObjectUI.py:584 msgid "Create CNC Job" msgstr "Crează CNCJob" -#: flatcamGUI/FlatCAMGUI.py:4269 +#: flatcamGUI/FlatCAMGUI.py:4358 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object." @@ -6975,13 +6942,13 @@ msgstr "" "Parametrii folositi pentru a crea un obiect FlatCAM tip CNCJob\n" "din acest obiect Excellon." -#: flatcamGUI/FlatCAMGUI.py:4277 flatcamGUI/FlatCAMGUI.py:4733 -#: flatcamGUI/FlatCAMGUI.py:5741 flatcamGUI/ObjectUI.py:595 +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/FlatCAMGUI.py:4822 +#: flatcamGUI/FlatCAMGUI.py:5830 flatcamGUI/ObjectUI.py:595 #: flatcamGUI/ObjectUI.py:1059 flatcamTools/ToolCalculators.py:108 msgid "Cut Z:" msgstr "Z tăiere:" -#: flatcamGUI/FlatCAMGUI.py:4279 flatcamGUI/ObjectUI.py:597 +#: flatcamGUI/FlatCAMGUI.py:4368 flatcamGUI/ObjectUI.py:597 msgid "" "Drill depth (negative)\n" "below the copper surface." @@ -6990,12 +6957,12 @@ msgstr "" "Daca se foloseÅŸte o val. pozitivă, aplicaÅ£ia\n" "va incerca in mod automat să schimbe semnul." -#: flatcamGUI/FlatCAMGUI.py:4286 flatcamGUI/FlatCAMGUI.py:4766 +#: flatcamGUI/FlatCAMGUI.py:4375 flatcamGUI/FlatCAMGUI.py:4855 #: flatcamGUI/ObjectUI.py:605 flatcamGUI/ObjectUI.py:1095 msgid "Travel Z:" msgstr "Z Deplasare:" -#: flatcamGUI/FlatCAMGUI.py:4288 flatcamGUI/ObjectUI.py:607 +#: flatcamGUI/FlatCAMGUI.py:4377 flatcamGUI/ObjectUI.py:607 msgid "" "Tool height when travelling\n" "across the XY plane." @@ -7004,11 +6971,11 @@ msgstr "" "in planul X-Y, fără a efectua taieri, adica\n" "in afara materialului." -#: flatcamGUI/FlatCAMGUI.py:4296 flatcamGUI/FlatCAMGUI.py:4776 +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/FlatCAMGUI.py:4865 msgid "Tool change:" msgstr "Schimbare unealtă:" -#: flatcamGUI/FlatCAMGUI.py:4298 flatcamGUI/FlatCAMGUI.py:4778 +#: flatcamGUI/FlatCAMGUI.py:4387 flatcamGUI/FlatCAMGUI.py:4867 #: flatcamGUI/ObjectUI.py:617 msgid "" "Include tool-change sequence\n" @@ -7018,11 +6985,11 @@ msgstr "" "in codul G-Code (pauza pentru schimbare unealtă).\n" "De obicei este folosita comanda G-Code M6." -#: flatcamGUI/FlatCAMGUI.py:4305 flatcamGUI/FlatCAMGUI.py:4786 +#: flatcamGUI/FlatCAMGUI.py:4394 flatcamGUI/FlatCAMGUI.py:4875 msgid "Toolchange Z:" msgstr "Z schimb. unealtă:" -#: flatcamGUI/FlatCAMGUI.py:4307 flatcamGUI/FlatCAMGUI.py:4788 +#: flatcamGUI/FlatCAMGUI.py:4396 flatcamGUI/FlatCAMGUI.py:4877 msgid "Toolchange Z position." msgstr "" "ÃŽnălÅ£imea la care se efectuează schimbarea uneltei.\n" @@ -7030,11 +6997,11 @@ msgstr "" "'toolchanger' automat sau acolo unde utilizatorul\n" "schimba unealtă manual." -#: flatcamGUI/FlatCAMGUI.py:4313 +#: flatcamGUI/FlatCAMGUI.py:4402 msgid "Feedrate:" msgstr "Feedrate:" -#: flatcamGUI/FlatCAMGUI.py:4315 +#: flatcamGUI/FlatCAMGUI.py:4404 msgid "" "Tool speed while drilling\n" "(in units per minute)." @@ -7042,11 +7009,11 @@ msgstr "" "Viteza cu care se misca unealtă (burghiul) când se fac\n" "operaÈ›iuni de găurire. In unitati pe minut." -#: flatcamGUI/FlatCAMGUI.py:4323 +#: flatcamGUI/FlatCAMGUI.py:4412 msgid "Spindle Speed:" msgstr "Viteza Motor:" -#: flatcamGUI/FlatCAMGUI.py:4325 flatcamGUI/FlatCAMGUI.py:4818 +#: flatcamGUI/FlatCAMGUI.py:4414 flatcamGUI/FlatCAMGUI.py:4907 #: flatcamGUI/ObjectUI.py:681 msgid "" "Speed of the spindle\n" @@ -7057,12 +7024,12 @@ msgstr "" "Acest parametru este optional È™i se poate lasa gol\n" "daca nu se foloseÅŸte." -#: flatcamGUI/FlatCAMGUI.py:4333 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:4422 flatcamGUI/FlatCAMGUI.py:4915 #: flatcamGUI/ObjectUI.py:689 flatcamGUI/ObjectUI.py:1218 msgid "Dwell:" msgstr "Pauza:" -#: flatcamGUI/FlatCAMGUI.py:4335 flatcamGUI/FlatCAMGUI.py:4828 +#: flatcamGUI/FlatCAMGUI.py:4424 flatcamGUI/FlatCAMGUI.py:4917 #: flatcamGUI/ObjectUI.py:691 flatcamGUI/ObjectUI.py:1221 msgid "" "Pause to allow the spindle to reach its\n" @@ -7071,21 +7038,21 @@ msgstr "" "O pauza care permite motorului să ajunga la turatia specificata,\n" "inainte de a incepe miÈ™carea spre poziÅ£ia de tăiere (găurire)." -#: flatcamGUI/FlatCAMGUI.py:4338 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:4427 flatcamGUI/FlatCAMGUI.py:4920 msgid "Duration:" msgstr "Durata:" -#: flatcamGUI/FlatCAMGUI.py:4340 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:4429 flatcamGUI/FlatCAMGUI.py:4922 #: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1228 msgid "Number of milliseconds for spindle to dwell." msgstr "Timpul (ori secunde ori milisec) cat se sta in pauza." -#: flatcamGUI/FlatCAMGUI.py:4352 flatcamGUI/FlatCAMGUI.py:4843 +#: flatcamGUI/FlatCAMGUI.py:4441 flatcamGUI/FlatCAMGUI.py:4932 #: flatcamGUI/ObjectUI.py:704 msgid "Postprocessor:" msgstr "Postprocesor:" -#: flatcamGUI/FlatCAMGUI.py:4354 +#: flatcamGUI/FlatCAMGUI.py:4443 msgid "" "The postprocessor file that dictates\n" "gcode output." @@ -7094,11 +7061,11 @@ msgstr "" "respecte un anumit format care să fie inteles de diverse\n" "utilaje. Este responsabil de 'personalizarea' G-Code." -#: flatcamGUI/FlatCAMGUI.py:4364 +#: flatcamGUI/FlatCAMGUI.py:4453 msgid "Gcode: " msgstr "G-Code:" -#: flatcamGUI/FlatCAMGUI.py:4366 +#: flatcamGUI/FlatCAMGUI.py:4455 msgid "" "Choose what to use for GCode generation:\n" "'Drills', 'Slots' or 'Both'.\n" @@ -7112,55 +7079,55 @@ msgstr "" "Când se alege Sloturi sau Ambele, sloturile vor fi convertite in serii de " "găuri." -#: flatcamGUI/FlatCAMGUI.py:4371 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4460 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:752 msgid "Drills" msgstr "Găuri" -#: flatcamGUI/FlatCAMGUI.py:4372 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4461 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:753 msgid "Slots" msgstr "Sloturi" -#: flatcamGUI/FlatCAMGUI.py:4373 flatcamGUI/ObjectUI.py:754 +#: flatcamGUI/FlatCAMGUI.py:4462 flatcamGUI/ObjectUI.py:754 msgid "Both" msgstr "Ambele" -#: flatcamGUI/FlatCAMGUI.py:4382 flatcamGUI/ObjectUI.py:769 +#: flatcamGUI/FlatCAMGUI.py:4471 flatcamGUI/ObjectUI.py:769 msgid "Mill Holes" msgstr "Frezare găuri" -#: flatcamGUI/FlatCAMGUI.py:4384 flatcamGUI/ObjectUI.py:771 +#: flatcamGUI/FlatCAMGUI.py:4473 flatcamGUI/ObjectUI.py:771 msgid "Create Geometry for milling holes." msgstr "Crează un obiect tip Geometrie pentru frezarea găurilor." -#: flatcamGUI/FlatCAMGUI.py:4390 +#: flatcamGUI/FlatCAMGUI.py:4479 msgid "Drill Tool dia:" msgstr "Dia. Burghiu Găurire:" -#: flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/FlatCAMGUI.py:4486 msgid "Slot Tool dia:" msgstr "Dia. Freza Slot:" -#: flatcamGUI/FlatCAMGUI.py:4399 +#: flatcamGUI/FlatCAMGUI.py:4488 msgid "" "Diameter of the cutting tool\n" "when milling slots." msgstr "Diametrul frezei când se frezează sloturile." -#: flatcamGUI/FlatCAMGUI.py:4411 +#: flatcamGUI/FlatCAMGUI.py:4500 msgid "Defaults" msgstr "Val. Implicite" -#: flatcamGUI/FlatCAMGUI.py:4424 +#: flatcamGUI/FlatCAMGUI.py:4513 msgid "Excellon Adv. Options" msgstr "OpÈ›iuni Avans. Excellon" -#: flatcamGUI/FlatCAMGUI.py:4430 flatcamGUI/FlatCAMGUI.py:4866 +#: flatcamGUI/FlatCAMGUI.py:4519 flatcamGUI/FlatCAMGUI.py:4955 msgid "Advanced Options:" msgstr "OpÈ›iuni avansate:" -#: flatcamGUI/FlatCAMGUI.py:4432 +#: flatcamGUI/FlatCAMGUI.py:4521 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object that are shown when App Level is Advanced." @@ -7169,11 +7136,11 @@ msgstr "" "pt acest obiect Excellon, parametri care sunt disponibili\n" "doar in modul Avansat al aplicaÅ£iei." -#: flatcamGUI/FlatCAMGUI.py:4440 +#: flatcamGUI/FlatCAMGUI.py:4529 msgid "Offset Z:" msgstr "Z ofset:" -#: flatcamGUI/FlatCAMGUI.py:4442 flatcamGUI/ObjectUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:4531 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" @@ -7186,20 +7153,20 @@ msgstr "" "Valoarea de aici efectuează o compensare asupra\n" "parametrului >Z tăiere<." -#: flatcamGUI/FlatCAMGUI.py:4449 flatcamGUI/FlatCAMGUI.py:4877 +#: flatcamGUI/FlatCAMGUI.py:4538 flatcamGUI/FlatCAMGUI.py:4966 msgid "Toolchange X,Y:" msgstr "X,Y schimb. unealtă:" -#: flatcamGUI/FlatCAMGUI.py:4451 flatcamGUI/FlatCAMGUI.py:4879 +#: flatcamGUI/FlatCAMGUI.py:4540 flatcamGUI/FlatCAMGUI.py:4968 msgid "Toolchange X,Y position." msgstr "PoziÅ£ia X,Y in format (x,y) unde se face schimbarea uneltei." -#: flatcamGUI/FlatCAMGUI.py:4457 flatcamGUI/FlatCAMGUI.py:4886 +#: flatcamGUI/FlatCAMGUI.py:4546 flatcamGUI/FlatCAMGUI.py:4975 #: flatcamGUI/ObjectUI.py:634 msgid "Start move Z:" msgstr "Z pornire:" -#: flatcamGUI/FlatCAMGUI.py:4459 +#: flatcamGUI/FlatCAMGUI.py:4548 msgid "" "Height of the tool just after start.\n" "Delete the value if you don't need this feature." @@ -7207,23 +7174,23 @@ msgstr "" "ÃŽnălÅ£imea uneltei imediat dupa ce se porneste operatia CNC.\n" "Lasa casuta goala daca nu se foloseÅŸte." -#: flatcamGUI/FlatCAMGUI.py:4466 flatcamGUI/FlatCAMGUI.py:4896 +#: flatcamGUI/FlatCAMGUI.py:4555 flatcamGUI/FlatCAMGUI.py:4985 #: flatcamGUI/ObjectUI.py:644 flatcamGUI/ObjectUI.py:1141 msgid "End move Z:" msgstr "Z oprire:" -#: flatcamGUI/FlatCAMGUI.py:4468 flatcamGUI/FlatCAMGUI.py:4898 +#: flatcamGUI/FlatCAMGUI.py:4557 flatcamGUI/FlatCAMGUI.py:4987 msgid "" "Height of the tool after\n" "the last move at the end of the job." msgstr "ÃŽnălÅ£imea la care se parchează freza dupa ce se termina lucrul." -#: flatcamGUI/FlatCAMGUI.py:4475 flatcamGUI/FlatCAMGUI.py:4906 +#: flatcamGUI/FlatCAMGUI.py:4564 flatcamGUI/FlatCAMGUI.py:4995 #: flatcamGUI/ObjectUI.py:665 msgid "Feedrate Rapids:" msgstr "Feedrate rapizi:" -#: flatcamGUI/FlatCAMGUI.py:4477 flatcamGUI/ObjectUI.py:667 +#: flatcamGUI/FlatCAMGUI.py:4566 flatcamGUI/ObjectUI.py:667 msgid "" "Tool speed while drilling\n" "(in units per minute).\n" @@ -7236,12 +7203,12 @@ msgstr "" "printerul 3D Marlin, implicit când se foloseÅŸte fiÅŸierul\n" "postprocesor: Marlin. Ignora aceasta parametru in rest." -#: flatcamGUI/FlatCAMGUI.py:4488 flatcamGUI/FlatCAMGUI.py:4930 +#: flatcamGUI/FlatCAMGUI.py:4577 flatcamGUI/FlatCAMGUI.py:5019 #: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1250 msgid "Probe Z depth:" msgstr "Z sonda:" -#: flatcamGUI/FlatCAMGUI.py:4490 flatcamGUI/FlatCAMGUI.py:4932 +#: flatcamGUI/FlatCAMGUI.py:4579 flatcamGUI/FlatCAMGUI.py:5021 #: flatcamGUI/ObjectUI.py:717 flatcamGUI/ObjectUI.py:1253 msgid "" "The maximum depth that the probe is allowed\n" @@ -7250,21 +7217,21 @@ msgstr "" "Adâncimea maxima la care este permis sondei să coboare.\n" "Are o valoare negativă, in unitatile curente." -#: flatcamGUI/FlatCAMGUI.py:4498 flatcamGUI/FlatCAMGUI.py:4940 +#: flatcamGUI/FlatCAMGUI.py:4587 flatcamGUI/FlatCAMGUI.py:5029 #: flatcamGUI/ObjectUI.py:727 flatcamGUI/ObjectUI.py:1264 msgid "Feedrate Probe:" msgstr "Feedrate sonda:" -#: flatcamGUI/FlatCAMGUI.py:4500 flatcamGUI/FlatCAMGUI.py:4942 +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/FlatCAMGUI.py:5031 #: flatcamGUI/ObjectUI.py:729 flatcamGUI/ObjectUI.py:1267 msgid "The feedrate used while the probe is probing." msgstr "Viteza sondei când aceasta coboara." -#: flatcamGUI/FlatCAMGUI.py:4506 flatcamGUI/FlatCAMGUI.py:4949 +#: flatcamGUI/FlatCAMGUI.py:4595 flatcamGUI/FlatCAMGUI.py:5038 msgid "Fast Plunge:" msgstr "Plonjare rapida:" -#: flatcamGUI/FlatCAMGUI.py:4508 flatcamGUI/FlatCAMGUI.py:4951 +#: flatcamGUI/FlatCAMGUI.py:4597 flatcamGUI/FlatCAMGUI.py:5040 msgid "" "By checking this, the vertical move from\n" "Z_Toolchange to Z_move is done with G0,\n" @@ -7281,11 +7248,11 @@ msgstr "" "schimba\n" "unealta. Daca aveti ceva plasat sub unealtă ceva se va strica." -#: flatcamGUI/FlatCAMGUI.py:4517 +#: flatcamGUI/FlatCAMGUI.py:4606 msgid "Fast Retract:" msgstr "Retragere rapida:" -#: flatcamGUI/FlatCAMGUI.py:4519 +#: flatcamGUI/FlatCAMGUI.py:4608 msgid "" "Exit hole strategy.\n" " - When uncheked, while exiting the drilled hole the drill bit\n" @@ -7304,15 +7271,15 @@ msgstr "" "adâncimea\n" "de deplasare cu viteza maxima G0, intr-o singură miÈ™care." -#: flatcamGUI/FlatCAMGUI.py:4538 +#: flatcamGUI/FlatCAMGUI.py:4627 msgid "Excellon Export" msgstr "Export Excellon" -#: flatcamGUI/FlatCAMGUI.py:4541 +#: flatcamGUI/FlatCAMGUI.py:4630 msgid "Export Options:" msgstr "OpÈ›iuni Export::" -#: flatcamGUI/FlatCAMGUI.py:4543 +#: flatcamGUI/FlatCAMGUI.py:4632 msgid "" "The parameters set here are used in the file exported\n" "when using the File -> Export -> Export Excellon menu entry." @@ -7321,19 +7288,19 @@ msgstr "" "se exporta un fiÅŸier Excellon folosind:\n" "File -> Exporta -> Exporta Excellon" -#: flatcamGUI/FlatCAMGUI.py:4552 +#: flatcamGUI/FlatCAMGUI.py:4641 msgid "Units:" msgstr "Unitati:" -#: flatcamGUI/FlatCAMGUI.py:4554 flatcamGUI/FlatCAMGUI.py:4560 +#: flatcamGUI/FlatCAMGUI.py:4643 flatcamGUI/FlatCAMGUI.py:4649 msgid "The units used in the Excellon file." msgstr "Unitatile de masura folosite in fiÅŸierul Excellon." -#: flatcamGUI/FlatCAMGUI.py:4566 +#: flatcamGUI/FlatCAMGUI.py:4655 msgid "Int/Decimals:" msgstr "Int/Zecimale:" -#: flatcamGUI/FlatCAMGUI.py:4568 +#: flatcamGUI/FlatCAMGUI.py:4657 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -7345,11 +7312,11 @@ msgstr "" "Aici se setează formatul Excellon când nu se utilizează\n" "coordonate cu zecimale." -#: flatcamGUI/FlatCAMGUI.py:4604 +#: flatcamGUI/FlatCAMGUI.py:4693 msgid "Format:" msgstr "Format:" -#: flatcamGUI/FlatCAMGUI.py:4606 flatcamGUI/FlatCAMGUI.py:4616 +#: flatcamGUI/FlatCAMGUI.py:4695 flatcamGUI/FlatCAMGUI.py:4705 msgid "" "Select the kind of coordinates format used.\n" "Coordinates can be saved with decimal point or without.\n" @@ -7368,19 +7335,19 @@ msgstr "" "- LZ = zerourile prefix sunt pastrate È™i cele sufix eliminate\n" "- TZ = zerourile prefix sunt eliminate È™i cele sufix pastrate." -#: flatcamGUI/FlatCAMGUI.py:4613 +#: flatcamGUI/FlatCAMGUI.py:4702 msgid "Decimal" msgstr "Cu dec." -#: flatcamGUI/FlatCAMGUI.py:4614 +#: flatcamGUI/FlatCAMGUI.py:4703 msgid "No-Decimal" msgstr "Fără dec." -#: flatcamGUI/FlatCAMGUI.py:4627 +#: flatcamGUI/FlatCAMGUI.py:4716 msgid "Zeros:" msgstr "Zero-uri:" -#: flatcamGUI/FlatCAMGUI.py:4640 +#: flatcamGUI/FlatCAMGUI.py:4729 msgid "" "This sets the default type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -7392,11 +7359,11 @@ msgstr "" "- LZ = zerourile prefix sunt pastrate È™i cele sufix eliminate\n" "- TZ = zerourile prefix sunt eliminate È™i cele sufix pastrate." -#: flatcamGUI/FlatCAMGUI.py:4666 +#: flatcamGUI/FlatCAMGUI.py:4755 msgid "Geometry General" msgstr "Geometrie General" -#: flatcamGUI/FlatCAMGUI.py:4684 +#: flatcamGUI/FlatCAMGUI.py:4773 msgid "" "The number of circle steps for Geometry \n" "circle and arc shapes linear approximation." @@ -7404,29 +7371,29 @@ msgstr "" "Numărul de segmente utilizate pentru\n" "aproximarea lineara a Geometriilor circulare." -#: flatcamGUI/FlatCAMGUI.py:4692 +#: flatcamGUI/FlatCAMGUI.py:4781 msgid "Tools" msgstr "Unelte" -#: flatcamGUI/FlatCAMGUI.py:4699 +#: flatcamGUI/FlatCAMGUI.py:4788 msgid "Tool dia: " msgstr "Dia Unealta:" -#: flatcamGUI/FlatCAMGUI.py:4701 +#: flatcamGUI/FlatCAMGUI.py:4790 msgid "" "The diameter of the cutting\n" "tool.." msgstr "Diametrul uneltei taietoare ..." -#: flatcamGUI/FlatCAMGUI.py:4716 +#: flatcamGUI/FlatCAMGUI.py:4805 msgid "Geometry Options" msgstr "OpÈ›iuni Geometrie" -#: flatcamGUI/FlatCAMGUI.py:4721 +#: flatcamGUI/FlatCAMGUI.py:4810 msgid "Create CNC Job:" msgstr "Crează CNCJob:" -#: flatcamGUI/FlatCAMGUI.py:4723 +#: flatcamGUI/FlatCAMGUI.py:4812 msgid "" "Create a CNC Job object\n" "tracing the contours of this\n" @@ -7435,7 +7402,7 @@ msgstr "" "Crează un obiect CNCJob care urmareste conturul\n" "acestui obiect tip Geometrie." -#: flatcamGUI/FlatCAMGUI.py:4735 flatcamGUI/ObjectUI.py:1062 +#: flatcamGUI/FlatCAMGUI.py:4824 flatcamGUI/ObjectUI.py:1062 msgid "" "Cutting depth (negative)\n" "below the copper surface." @@ -7443,21 +7410,21 @@ msgstr "" "Adâncimea la care se taie sub suprafata de cupru.\n" "Valoare negativă." -#: flatcamGUI/FlatCAMGUI.py:4743 +#: flatcamGUI/FlatCAMGUI.py:4832 msgid "Multidepth" msgstr "MultiPas" -#: flatcamGUI/FlatCAMGUI.py:4745 +#: flatcamGUI/FlatCAMGUI.py:4834 msgid "Multidepth usage: True or False." msgstr "" "Daca se folosesc sau nu pasi multipli de tăiere\n" "pentru a ajunge la adâncimea de tăiere." -#: flatcamGUI/FlatCAMGUI.py:4750 +#: flatcamGUI/FlatCAMGUI.py:4839 msgid "Depth/Pass:" msgstr "Adanc./Trecere" -#: flatcamGUI/FlatCAMGUI.py:4752 +#: flatcamGUI/FlatCAMGUI.py:4841 msgid "" "The depth to cut on each pass,\n" "when multidepth is enabled.\n" @@ -7470,7 +7437,7 @@ msgstr "" "Valoarea este pozitivă desi reprezinta o fracÅ£ie\n" "a adancimii de tăiere care este o valoare negativă." -#: flatcamGUI/FlatCAMGUI.py:4768 flatcamGUI/ObjectUI.py:1098 +#: flatcamGUI/FlatCAMGUI.py:4857 flatcamGUI/ObjectUI.py:1098 msgid "" "Height of the tool when\n" "moving without cutting." @@ -7478,11 +7445,11 @@ msgstr "" "ÃŽnălÅ£imea la care se misca unealta când nu taie,\n" "deasupra materialului." -#: flatcamGUI/FlatCAMGUI.py:4795 flatcamGUI/ObjectUI.py:1153 +#: flatcamGUI/FlatCAMGUI.py:4884 flatcamGUI/ObjectUI.py:1153 msgid "Feed Rate X-Y:" msgstr "Feedrate X-Y:" -#: flatcamGUI/FlatCAMGUI.py:4797 flatcamGUI/ObjectUI.py:1156 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:1156 msgid "" "Cutting speed in the XY\n" "plane in units per minute" @@ -7490,11 +7457,11 @@ msgstr "" "Viteza de tăiere in planul X-Y\n" "in unitati pe minut." -#: flatcamGUI/FlatCAMGUI.py:4805 +#: flatcamGUI/FlatCAMGUI.py:4894 msgid "Feed Rate Z:" msgstr "Feedrate Z:" -#: flatcamGUI/FlatCAMGUI.py:4807 +#: flatcamGUI/FlatCAMGUI.py:4896 msgid "" "Cutting speed in the XY\n" "plane in units per minute.\n" @@ -7504,12 +7471,12 @@ msgstr "" "in unitati pe minut.\n" "Mai este numita È™i viteza de plonjare." -#: flatcamGUI/FlatCAMGUI.py:4816 flatcamGUI/ObjectUI.py:679 +#: flatcamGUI/FlatCAMGUI.py:4905 flatcamGUI/ObjectUI.py:679 #: flatcamGUI/ObjectUI.py:1205 msgid "Spindle speed:" msgstr "Viteza motor:" -#: flatcamGUI/FlatCAMGUI.py:4845 +#: flatcamGUI/FlatCAMGUI.py:4934 msgid "" "The postprocessor file that dictates\n" "Machine Code output." @@ -7518,11 +7485,11 @@ msgstr "" "respecte un anumit format care să fie inteles de diverse\n" "utilaje. Este responsabil de 'personalizarea' G-Code." -#: flatcamGUI/FlatCAMGUI.py:4861 +#: flatcamGUI/FlatCAMGUI.py:4950 msgid "Geometry Adv. Options" msgstr "OpÈ›iuni Avans. Geometrie" -#: flatcamGUI/FlatCAMGUI.py:4868 +#: flatcamGUI/FlatCAMGUI.py:4957 msgid "" "Parameters to create a CNC Job object\n" "tracing the contours of a Geometry object." @@ -7530,7 +7497,7 @@ msgstr "" "Parametrii folositi pentru a crea un obiect CNCJob,\n" "urmărind contururile unui obiect tip Geometrie." -#: flatcamGUI/FlatCAMGUI.py:4888 +#: flatcamGUI/FlatCAMGUI.py:4977 msgid "" "Height of the tool just after starting the work.\n" "Delete the value if you don't need this feature." @@ -7538,7 +7505,7 @@ msgstr "" "ÃŽnălÅ£imea uneltei la care se gaseste la inceputul lucrului.\n" "Lasa câmpul gol daca nu foloseÈ™ti aceasta." -#: flatcamGUI/FlatCAMGUI.py:4908 +#: flatcamGUI/FlatCAMGUI.py:4997 msgid "" "Cutting speed in the XY plane\n" "(in units per minute).\n" @@ -7551,11 +7518,11 @@ msgstr "" "Este utila doar când se foloseÅŸte cu un printer 3D Marlin,\n" "pentru toate celelalte cazuri ignora acest parametru." -#: flatcamGUI/FlatCAMGUI.py:4920 +#: flatcamGUI/FlatCAMGUI.py:5009 msgid "Re-cut 1st pt." msgstr "Re-tăiere 1-ul pt." -#: flatcamGUI/FlatCAMGUI.py:4922 flatcamGUI/ObjectUI.py:1196 +#: flatcamGUI/FlatCAMGUI.py:5011 flatcamGUI/ObjectUI.py:1196 msgid "" "In order to remove possible\n" "copper leftovers where first cut\n" @@ -7567,11 +7534,11 @@ msgstr "" "cu sfârÅŸitul acesteia (este vorba de un contur), sunt eliminate\n" "prin taierea peste acest punct." -#: flatcamGUI/FlatCAMGUI.py:4961 +#: flatcamGUI/FlatCAMGUI.py:5050 msgid "Seg. X size:" msgstr "Dim. seg X." -#: flatcamGUI/FlatCAMGUI.py:4963 +#: flatcamGUI/FlatCAMGUI.py:5052 msgid "" "The size of the trace segment on the X axis.\n" "Useful for auto-leveling.\n" @@ -7582,11 +7549,11 @@ msgstr "" "O valoare de 0 inseamnaca nu se face segmentare\n" "pe axa X." -#: flatcamGUI/FlatCAMGUI.py:4972 +#: flatcamGUI/FlatCAMGUI.py:5061 msgid "Seg. Y size:" msgstr "Dim. seg Y." -#: flatcamGUI/FlatCAMGUI.py:4974 +#: flatcamGUI/FlatCAMGUI.py:5063 msgid "" "The size of the trace segment on the Y axis.\n" "Useful for auto-leveling.\n" @@ -7597,20 +7564,20 @@ msgstr "" "O valoare de 0 inseamnaca nu se face segmentare\n" "pe axa Y." -#: flatcamGUI/FlatCAMGUI.py:4990 +#: flatcamGUI/FlatCAMGUI.py:5079 msgid "CNC Job General" msgstr "CNCJob General" -#: flatcamGUI/FlatCAMGUI.py:5003 flatcamGUI/ObjectUI.py:544 +#: flatcamGUI/FlatCAMGUI.py:5092 flatcamGUI/ObjectUI.py:544 #: flatcamGUI/ObjectUI.py:874 flatcamGUI/ObjectUI.py:1428 msgid "Plot Object" msgstr "Afisează" -#: flatcamGUI/FlatCAMGUI.py:5010 +#: flatcamGUI/FlatCAMGUI.py:5099 msgid "Plot kind:" msgstr "Tip afiÈ™are:" -#: flatcamGUI/FlatCAMGUI.py:5012 flatcamGUI/ObjectUI.py:1350 +#: flatcamGUI/FlatCAMGUI.py:5101 flatcamGUI/ObjectUI.py:1350 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" @@ -7623,11 +7590,11 @@ msgstr "" "- Tăiere -> miscarile in material, tăiere\n" "- Amandoua" -#: flatcamGUI/FlatCAMGUI.py:5020 flatcamGUI/ObjectUI.py:1359 +#: flatcamGUI/FlatCAMGUI.py:5109 flatcamGUI/ObjectUI.py:1359 msgid "Travel" msgstr "Voiaj" -#: flatcamGUI/FlatCAMGUI.py:5031 +#: flatcamGUI/FlatCAMGUI.py:5120 msgid "" "The number of circle steps for GCode \n" "circle and arc shapes linear approximation." @@ -7635,17 +7602,17 @@ msgstr "" "Numărul de segmente utilizate pentru\n" "aproximarea lineara a reprezentarilor GCodului circular." -#: flatcamGUI/FlatCAMGUI.py:5041 +#: flatcamGUI/FlatCAMGUI.py:5130 msgid "" "Diameter of the tool to be\n" "rendered in the plot." msgstr "Diametrul uneltei care să fie redat prin afiÈ™are." -#: flatcamGUI/FlatCAMGUI.py:5049 +#: flatcamGUI/FlatCAMGUI.py:5138 msgid "Coords dec.:" msgstr "Coord. zec.:" -#: flatcamGUI/FlatCAMGUI.py:5051 +#: flatcamGUI/FlatCAMGUI.py:5140 msgid "" "The number of decimals to be used for \n" "the X, Y, Z coordinates in CNC code (GCODE, etc.)" @@ -7653,11 +7620,11 @@ msgstr "" "Numărul de zecimale care să fie folosit in \n" "coordonatele X,Y,Z in codul CNC (GCode etc)." -#: flatcamGUI/FlatCAMGUI.py:5059 +#: flatcamGUI/FlatCAMGUI.py:5148 msgid "Feedrate dec.:" msgstr "Feedrate zec.:" -#: flatcamGUI/FlatCAMGUI.py:5061 +#: flatcamGUI/FlatCAMGUI.py:5150 msgid "" "The number of decimals to be used for \n" "the Feedrate parameter in CNC code (GCODE, etc.)" @@ -7665,15 +7632,15 @@ msgstr "" "Numărul de zecimale care să fie folosit in \n" "parametrul >Feedrate< in codul CNC (GCode etc)." -#: flatcamGUI/FlatCAMGUI.py:5076 +#: flatcamGUI/FlatCAMGUI.py:5165 msgid "CNC Job Options" msgstr "OpÈ›iuni CNCJob" -#: flatcamGUI/FlatCAMGUI.py:5079 flatcamGUI/FlatCAMGUI.py:5120 +#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/FlatCAMGUI.py:5209 msgid "Export G-Code:" msgstr "Exporta G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5081 flatcamGUI/FlatCAMGUI.py:5122 +#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/FlatCAMGUI.py:5211 #: flatcamGUI/ObjectUI.py:1464 msgid "" "Export and save G-Code to\n" @@ -7682,11 +7649,11 @@ msgstr "" "Exporta È™i salvează codul G-Code intr-un fiÅŸier\n" "care este salvat pe HDD." -#: flatcamGUI/FlatCAMGUI.py:5087 +#: flatcamGUI/FlatCAMGUI.py:5176 msgid "Prepend to G-Code:" msgstr "Adaugă la inceputul G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5089 +#: flatcamGUI/FlatCAMGUI.py:5178 msgid "" "Type here any G-Code commands you would\n" "like to add at the beginning of the G-Code file." @@ -7694,11 +7661,11 @@ msgstr "" "Adaugă aici orice comenzi G-Code care se doreste să fie\n" "inserate la inceputul codului G-Code." -#: flatcamGUI/FlatCAMGUI.py:5098 +#: flatcamGUI/FlatCAMGUI.py:5187 msgid "Append to G-Code:" msgstr "Adaugă la sfârÅŸitul G-Code:" -#: flatcamGUI/FlatCAMGUI.py:5100 flatcamGUI/ObjectUI.py:1486 +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamGUI/ObjectUI.py:1486 msgid "" "Type here any G-Code commands you would\n" "like to append to the generated file.\n" @@ -7707,15 +7674,15 @@ msgstr "" "Adaugă aici orice comenzi G-Code care se doreste să fie\n" "inserate la sfârÅŸitul codului G-Code." -#: flatcamGUI/FlatCAMGUI.py:5117 +#: flatcamGUI/FlatCAMGUI.py:5206 msgid "CNC Job Adv. Options" msgstr "OpÈ›iuni Avans. CNCJob" -#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/ObjectUI.py:1504 +#: flatcamGUI/FlatCAMGUI.py:5217 flatcamGUI/ObjectUI.py:1504 msgid "Toolchange G-Code:" msgstr "G-Code pt schimb unealtă:" -#: flatcamGUI/FlatCAMGUI.py:5130 +#: flatcamGUI/FlatCAMGUI.py:5219 msgid "" "Type here any G-Code commands you would\n" "like to be executed when Toolchange event is encountered.\n" @@ -7727,11 +7694,11 @@ msgstr "" "Comanda M6 este inlocuita.\n" "Aceata va constitui un macro pentru schimbul uneltelor." -#: flatcamGUI/FlatCAMGUI.py:5144 flatcamGUI/ObjectUI.py:1526 +#: flatcamGUI/FlatCAMGUI.py:5233 flatcamGUI/ObjectUI.py:1526 msgid "Use Toolchange Macro" msgstr "Fol. Macro schimb unealtă" -#: flatcamGUI/FlatCAMGUI.py:5146 flatcamGUI/ObjectUI.py:1529 +#: flatcamGUI/FlatCAMGUI.py:5235 flatcamGUI/ObjectUI.py:1529 msgid "" "Check this box if you want to use\n" "a Custom Toolchange GCode (macro)." @@ -7739,7 +7706,7 @@ msgstr "" "Bifează aici daca doreÈ™ti să foloseÈ™ti Macro pentru\n" "schimb unelte." -#: flatcamGUI/FlatCAMGUI.py:5158 flatcamGUI/ObjectUI.py:1538 +#: flatcamGUI/FlatCAMGUI.py:5247 flatcamGUI/ObjectUI.py:1538 msgid "" "A list of the FlatCAM variables that can be used\n" "in the Toolchange event.\n" @@ -7749,78 +7716,78 @@ msgstr "" "de schimb al uneltei (când se intalneste comanda M6).\n" "Este necesar să fie inconjurate de simbolul '%'." -#: flatcamGUI/FlatCAMGUI.py:5165 flatcamGUI/ObjectUI.py:1545 +#: flatcamGUI/FlatCAMGUI.py:5254 flatcamGUI/ObjectUI.py:1545 msgid "Parameters" msgstr "Parametri" -#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/ObjectUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:5257 flatcamGUI/ObjectUI.py:1548 msgid "FlatCAM CNC parameters" msgstr "Parametri FlatCAM CNC" -#: flatcamGUI/FlatCAMGUI.py:5169 flatcamGUI/ObjectUI.py:1549 +#: flatcamGUI/FlatCAMGUI.py:5258 flatcamGUI/ObjectUI.py:1549 msgid "tool = tool number" msgstr "tool = numărul uneltei" -#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/ObjectUI.py:1550 +#: flatcamGUI/FlatCAMGUI.py:5259 flatcamGUI/ObjectUI.py:1550 msgid "tooldia = tool diameter" msgstr "tooldia = dimaetrul uneltei" -#: flatcamGUI/FlatCAMGUI.py:5171 flatcamGUI/ObjectUI.py:1551 +#: flatcamGUI/FlatCAMGUI.py:5260 flatcamGUI/ObjectUI.py:1551 msgid "t_drills = for Excellon, total number of drills" msgstr "t_drills = pt Excellom, numărul total de operaÈ›iuni găurire" -#: flatcamGUI/FlatCAMGUI.py:5172 flatcamGUI/ObjectUI.py:1552 +#: flatcamGUI/FlatCAMGUI.py:5261 flatcamGUI/ObjectUI.py:1552 msgid "x_toolchange = X coord for Toolchange" msgstr "x_toolchange = coord. X pt schimb unealtă" -#: flatcamGUI/FlatCAMGUI.py:5173 flatcamGUI/ObjectUI.py:1553 +#: flatcamGUI/FlatCAMGUI.py:5262 flatcamGUI/ObjectUI.py:1553 msgid "y_toolchange = Y coord for Toolchange" msgstr "y_toolchange = coord. Y pt schimb unealtă" -#: flatcamGUI/FlatCAMGUI.py:5174 flatcamGUI/ObjectUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:5263 flatcamGUI/ObjectUI.py:1554 msgid "z_toolchange = Z coord for Toolchange" msgstr "z_toolchange = coord. Z pt schimb unealtă" -#: flatcamGUI/FlatCAMGUI.py:5175 +#: flatcamGUI/FlatCAMGUI.py:5264 msgid "z_cut = Z depth for the cut" msgstr "z_cut = Z adâncimea de tăiere" -#: flatcamGUI/FlatCAMGUI.py:5176 +#: flatcamGUI/FlatCAMGUI.py:5265 msgid "z_move = Z height for travel" msgstr "z_move = Z ÃŽnălÅ£imea deplasare" -#: flatcamGUI/FlatCAMGUI.py:5177 flatcamGUI/ObjectUI.py:1557 +#: flatcamGUI/FlatCAMGUI.py:5266 flatcamGUI/ObjectUI.py:1557 msgid "z_depthpercut = the step value for multidepth cut" msgstr "z_depthpercut = pasul pentru taierea progresiva" -#: flatcamGUI/FlatCAMGUI.py:5178 flatcamGUI/ObjectUI.py:1558 +#: flatcamGUI/FlatCAMGUI.py:5267 flatcamGUI/ObjectUI.py:1558 msgid "spindlesspeed = the value for the spindle speed" msgstr "spindlesspeed = valoarea viteza motor" -#: flatcamGUI/FlatCAMGUI.py:5179 flatcamGUI/ObjectUI.py:1559 +#: flatcamGUI/FlatCAMGUI.py:5268 flatcamGUI/ObjectUI.py:1559 msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" msgstr "dwelltime = durata de asteptare ca motorul să ajunga la turatia setată" -#: flatcamGUI/FlatCAMGUI.py:5200 +#: flatcamGUI/FlatCAMGUI.py:5289 msgid "NCC Tool Options" msgstr "OpÈ›iuni Unealta NCC" -#: flatcamGUI/FlatCAMGUI.py:5203 flatcamGUI/FlatCAMGUI.py:5304 -#: flatcamGUI/FlatCAMGUI.py:5383 flatcamGUI/FlatCAMGUI.py:5442 -#: flatcamGUI/FlatCAMGUI.py:5545 flatcamGUI/FlatCAMGUI.py:5606 -#: flatcamGUI/FlatCAMGUI.py:5805 flatcamGUI/FlatCAMGUI.py:5932 +#: flatcamGUI/FlatCAMGUI.py:5292 flatcamGUI/FlatCAMGUI.py:5393 +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamGUI/FlatCAMGUI.py:5531 +#: flatcamGUI/FlatCAMGUI.py:5634 flatcamGUI/FlatCAMGUI.py:5695 +#: flatcamGUI/FlatCAMGUI.py:5894 flatcamGUI/FlatCAMGUI.py:6021 msgid "Parameters:" msgstr "Parametri:" -#: flatcamGUI/FlatCAMGUI.py:5213 flatcamGUI/FlatCAMGUI.py:5943 +#: flatcamGUI/FlatCAMGUI.py:5302 flatcamGUI/FlatCAMGUI.py:6032 msgid "Tools dia:" msgstr "Dia unealtă:" -#: flatcamGUI/FlatCAMGUI.py:5215 +#: flatcamGUI/FlatCAMGUI.py:5304 msgid "Diameters of the cutting tools, separated by ','" msgstr "Diametrele pentru unelte taietoare, separate cu virgula" -#: flatcamGUI/FlatCAMGUI.py:5223 flatcamTools/ToolNonCopperClear.py:167 +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolNonCopperClear.py:167 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -7846,11 +7813,11 @@ msgstr "" "Valori mari= procesare lenta cat È™i o execuÅ£ie la fel de lenta a PCB-ului,\n" "datorita numărului mai mare de treceri-tăiere." -#: flatcamGUI/FlatCAMGUI.py:5239 flatcamTools/ToolNonCopperClear.py:183 +#: flatcamGUI/FlatCAMGUI.py:5328 flatcamTools/ToolNonCopperClear.py:183 msgid "Bounding box margin." msgstr "Marginea pentru forma înconjurătoare." -#: flatcamGUI/FlatCAMGUI.py:5248 flatcamTools/ToolNonCopperClear.py:192 +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolNonCopperClear.py:192 #: flatcamTools/ToolPaint.py:190 msgid "" "Algorithm for non-copper clearing:
Standard: Fixed step inwards." @@ -7861,12 +7828,12 @@ msgstr "" "
Punct-samanta: De la punctul samanta, spre expterior.
Linii " "drepte: Linii paralele." -#: flatcamGUI/FlatCAMGUI.py:5280 flatcamTools/ToolNonCopperClear.py:224 +#: flatcamGUI/FlatCAMGUI.py:5369 flatcamTools/ToolNonCopperClear.py:224 #: flatcamTools/ToolPaint.py:222 msgid "Rest M.:" msgstr "Rest M.:" -#: flatcamGUI/FlatCAMGUI.py:5282 +#: flatcamGUI/FlatCAMGUI.py:5371 msgid "" "If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" @@ -7884,11 +7851,11 @@ msgstr "" "precedenta.\n" "Daca nu este bifat, foloseşte algoritmul standard." -#: flatcamGUI/FlatCAMGUI.py:5301 +#: flatcamGUI/FlatCAMGUI.py:5390 msgid "Cutout Tool Options" msgstr "Opțiuni Unealta Decupare" -#: flatcamGUI/FlatCAMGUI.py:5306 flatcamGUI/ObjectUI.py:402 +#: flatcamGUI/FlatCAMGUI.py:5395 flatcamGUI/ObjectUI.py:402 msgid "" "Create toolpaths to cut around\n" "the PCB and separate it from\n" @@ -7898,17 +7865,17 @@ msgstr "" "lasand punţi pentru a separa PCB-ul de \n" "placa din care a fost taiat." -#: flatcamGUI/FlatCAMGUI.py:5325 +#: flatcamGUI/FlatCAMGUI.py:5414 msgid "" "Distance from objects at which\n" "to draw the cutout." msgstr "Distanta de obiecte la care să se deseneze forma taietoare." -#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCutOut.py:96 +#: flatcamGUI/FlatCAMGUI.py:5421 flatcamTools/ToolCutOut.py:96 msgid "Gap size:" msgstr "Dim. punte:" -#: flatcamGUI/FlatCAMGUI.py:5334 +#: flatcamGUI/FlatCAMGUI.py:5423 msgid "" "Size of the gaps in the toolpath\n" "that will remain to hold the\n" @@ -7918,11 +7885,11 @@ msgstr "" "care vor mentine PCB-ul in poziţie, fără să cada\n" "din placa 'mama' dupa decupare." -#: flatcamGUI/FlatCAMGUI.py:5342 flatcamTools/ToolCutOut.py:133 +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolCutOut.py:133 msgid "Gaps:" msgstr "Punţi:" -#: flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5433 msgid "" "Number of bridge gaps used for the cutout.\n" "There can be maximum 8 bridges/gaps.\n" @@ -7944,21 +7911,21 @@ msgstr "" "- 2tb = 2* sus - 2* jos\n" "- 8 = 2* stânga - 2* dreapta - 2* sus - 2* jos" -#: flatcamGUI/FlatCAMGUI.py:5365 flatcamTools/ToolCutOut.py:115 +#: flatcamGUI/FlatCAMGUI.py:5454 flatcamTools/ToolCutOut.py:115 msgid "Convex Sh.:" msgstr "Formă Conv." -#: flatcamGUI/FlatCAMGUI.py:5367 flatcamTools/ToolCutOut.py:117 +#: flatcamGUI/FlatCAMGUI.py:5456 flatcamTools/ToolCutOut.py:117 msgid "Create a convex shape surrounding the entire PCB." msgstr "" "Generează un obiect tip Geometrie care va inconjura\n" "tot PCB-ul. Forma sa este convexa." -#: flatcamGUI/FlatCAMGUI.py:5380 +#: flatcamGUI/FlatCAMGUI.py:5469 msgid "2Sided Tool Options" msgstr "Opțiuni Unealta 2Fețe" -#: flatcamGUI/FlatCAMGUI.py:5385 +#: flatcamGUI/FlatCAMGUI.py:5474 msgid "" "A tool to help in creating a double sided\n" "PCB using alignment holes." @@ -7966,44 +7933,44 @@ msgstr "" "O unealtă care ajuta in crearea de PCB-uri cu 2 fețe\n" "folosind găuri de aliniere." -#: flatcamGUI/FlatCAMGUI.py:5395 flatcamTools/ToolDblSided.py:235 +#: flatcamGUI/FlatCAMGUI.py:5484 flatcamTools/ToolDblSided.py:235 msgid "Drill diam.:" msgstr "Dia gaura:" -#: flatcamGUI/FlatCAMGUI.py:5397 flatcamTools/ToolDblSided.py:226 +#: flatcamGUI/FlatCAMGUI.py:5486 flatcamTools/ToolDblSided.py:226 #: flatcamTools/ToolDblSided.py:237 msgid "Diameter of the drill for the alignment holes." msgstr "Diametrul găurii pentru găurile de aliniere." -#: flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5493 msgid "X" msgstr "X" -#: flatcamGUI/FlatCAMGUI.py:5405 +#: flatcamGUI/FlatCAMGUI.py:5494 msgid "Y" msgstr "Y" -#: flatcamGUI/FlatCAMGUI.py:5406 flatcamTools/ToolDblSided.py:120 +#: flatcamGUI/FlatCAMGUI.py:5495 flatcamTools/ToolDblSided.py:120 msgid "Mirror Axis:" msgstr "Axe oglindire:" -#: flatcamGUI/FlatCAMGUI.py:5408 flatcamTools/ToolDblSided.py:122 +#: flatcamGUI/FlatCAMGUI.py:5497 flatcamTools/ToolDblSided.py:122 msgid "Mirror vertically (X) or horizontally (Y)." msgstr "Oglindește vertical (X) sau orizontal (Y)." -#: flatcamGUI/FlatCAMGUI.py:5417 +#: flatcamGUI/FlatCAMGUI.py:5506 msgid "Point" msgstr "Punct" -#: flatcamGUI/FlatCAMGUI.py:5418 +#: flatcamGUI/FlatCAMGUI.py:5507 msgid "Box" msgstr "Forma" -#: flatcamGUI/FlatCAMGUI.py:5419 flatcamTools/ToolDblSided.py:133 +#: flatcamGUI/FlatCAMGUI.py:5508 flatcamTools/ToolDblSided.py:133 msgid "Axis Ref:" msgstr "Axa de ref.:" -#: flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamGUI/FlatCAMGUI.py:5510 msgid "" "The axis should pass through a point or cut\n" " a specified box (in a Geometry object) in \n" @@ -8012,11 +7979,11 @@ msgstr "" "Axa de referinţă ar trebui să treaca printr-un punct ori să strabata\n" " o forma (specificata un obiect tip Geometrie) prin mijloc." -#: flatcamGUI/FlatCAMGUI.py:5437 +#: flatcamGUI/FlatCAMGUI.py:5526 msgid "Paint Tool Options" msgstr "Opțiuni Unealta Paint" -#: flatcamGUI/FlatCAMGUI.py:5444 flatcamGUI/ObjectUI.py:1299 +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamGUI/ObjectUI.py:1299 msgid "" "Creates tool paths to cover the\n" "whole area of a polygon (remove\n" @@ -8029,7 +7996,7 @@ msgstr "" "singur poligon se va cere să faceti click pe poligonul\n" "dorit." -#: flatcamGUI/FlatCAMGUI.py:5468 +#: flatcamGUI/FlatCAMGUI.py:5557 msgid "" "How much (fraction) of the tool\n" "width to overlap each tool pass." @@ -8037,23 +8004,23 @@ msgstr "" "Cat de mult (o fracţie din diametrul uneltei) din diametrul uneltei,\n" "(lăţimea de tăiere) să se suprapună peste trecerea anterioară." -#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolPaint.py:237 +#: flatcamGUI/FlatCAMGUI.py:5611 flatcamTools/ToolPaint.py:237 msgid "Selection:" msgstr "Selecţie:" -#: flatcamGUI/FlatCAMGUI.py:5524 +#: flatcamGUI/FlatCAMGUI.py:5613 msgid "How to select the polygons to paint." msgstr "Cum să se selecteze poligoanele de pictat (paint)." -#: flatcamGUI/FlatCAMGUI.py:5528 +#: flatcamGUI/FlatCAMGUI.py:5617 msgid "Single" msgstr "Unic" -#: flatcamGUI/FlatCAMGUI.py:5542 +#: flatcamGUI/FlatCAMGUI.py:5631 msgid "Film Tool Options" msgstr "Opțiuni Unealta Film" -#: flatcamGUI/FlatCAMGUI.py:5547 +#: flatcamGUI/FlatCAMGUI.py:5636 msgid "" "Create a PCB film from a Gerber or Geometry\n" "FlatCAM object.\n" @@ -8062,19 +8029,19 @@ msgstr "" "Crează un film PCB dintr-un obiect Gerber sau tip Geometrie.\n" "Fişierul este salvat in format SVG." -#: flatcamGUI/FlatCAMGUI.py:5556 +#: flatcamGUI/FlatCAMGUI.py:5645 msgid "Pos" msgstr "Pozitiv" -#: flatcamGUI/FlatCAMGUI.py:5557 +#: flatcamGUI/FlatCAMGUI.py:5646 msgid "Neg" msgstr "Negativ" -#: flatcamGUI/FlatCAMGUI.py:5558 flatcamTools/ToolFilm.py:116 +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolFilm.py:116 msgid "Film Type:" msgstr "Tip film:" -#: flatcamGUI/FlatCAMGUI.py:5560 flatcamTools/ToolFilm.py:118 +#: flatcamGUI/FlatCAMGUI.py:5649 flatcamTools/ToolFilm.py:118 msgid "" "Generate a Positive black film or a Negative film.\n" "Positive means that it will print the features\n" @@ -8088,11 +8055,11 @@ msgstr "" "Negativ = traseele vor fi albe pe un fundal negru.\n" "Formatul fişierului pt filmul salvat este SVG." -#: flatcamGUI/FlatCAMGUI.py:5571 flatcamTools/ToolFilm.py:130 +#: flatcamGUI/FlatCAMGUI.py:5660 flatcamTools/ToolFilm.py:130 msgid "Border:" msgstr "Bordura:" -#: flatcamGUI/FlatCAMGUI.py:5573 flatcamTools/ToolFilm.py:132 +#: flatcamGUI/FlatCAMGUI.py:5662 flatcamTools/ToolFilm.py:132 msgid "" "Specify a border around the object.\n" "Only for negative film.\n" @@ -8109,11 +8076,11 @@ msgstr "" "Va crea o bara solida neagra in jurul printului efectiv permitand o\n" "delimitare exacta" -#: flatcamGUI/FlatCAMGUI.py:5586 flatcamTools/ToolFilm.py:144 +#: flatcamGUI/FlatCAMGUI.py:5675 flatcamTools/ToolFilm.py:144 msgid "Scale Stroke:" msgstr "Scalează:" -#: flatcamGUI/FlatCAMGUI.py:5588 flatcamTools/ToolFilm.py:146 +#: flatcamGUI/FlatCAMGUI.py:5677 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 " @@ -8123,11 +8090,11 @@ msgstr "" "Scalează grosimea conturului fiecarui element din fişierul SVG.\n" "Elementele mai mici vor fi afectate mai mult." -#: flatcamGUI/FlatCAMGUI.py:5603 +#: flatcamGUI/FlatCAMGUI.py:5692 msgid "Panelize Tool Options" msgstr "Opțiuni Unealta Panelizare" -#: flatcamGUI/FlatCAMGUI.py:5608 +#: flatcamGUI/FlatCAMGUI.py:5697 msgid "" "Create an object that contains an array of (x, y) elements,\n" "each element is a copy of the source object spaced\n" @@ -8137,11 +8104,11 @@ msgstr "" "unde fiecare element este o copie a obiectului sursa, separat la o\n" "distanţă X, Y unul de celalalt." -#: flatcamGUI/FlatCAMGUI.py:5619 flatcamTools/ToolPanelize.py:113 +#: flatcamGUI/FlatCAMGUI.py:5708 flatcamTools/ToolPanelize.py:113 msgid "Spacing cols:" msgstr "Sep. coloane:" -#: flatcamGUI/FlatCAMGUI.py:5621 flatcamTools/ToolPanelize.py:115 +#: flatcamGUI/FlatCAMGUI.py:5710 flatcamTools/ToolPanelize.py:115 msgid "" "Spacing between columns of the desired panel.\n" "In current units." @@ -8149,11 +8116,11 @@ msgstr "" "Spatiul de separare între coloane.\n" "In unitatile curente." -#: flatcamGUI/FlatCAMGUI.py:5629 flatcamTools/ToolPanelize.py:122 +#: flatcamGUI/FlatCAMGUI.py:5718 flatcamTools/ToolPanelize.py:122 msgid "Spacing rows:" msgstr "Sep. linii:" -#: flatcamGUI/FlatCAMGUI.py:5631 flatcamTools/ToolPanelize.py:124 +#: flatcamGUI/FlatCAMGUI.py:5720 flatcamTools/ToolPanelize.py:124 msgid "" "Spacing between rows of the desired panel.\n" "In current units." @@ -8161,35 +8128,35 @@ msgstr "" "Spatiul de separare între linii.\n" "In unitatile curente." -#: flatcamGUI/FlatCAMGUI.py:5639 flatcamTools/ToolPanelize.py:131 +#: flatcamGUI/FlatCAMGUI.py:5728 flatcamTools/ToolPanelize.py:131 msgid "Columns:" msgstr "Coloane:" -#: flatcamGUI/FlatCAMGUI.py:5641 flatcamTools/ToolPanelize.py:133 +#: flatcamGUI/FlatCAMGUI.py:5730 flatcamTools/ToolPanelize.py:133 msgid "Number of columns of the desired panel" msgstr "Numărul de coloane ale panel-ului dorit." -#: flatcamGUI/FlatCAMGUI.py:5648 flatcamTools/ToolPanelize.py:139 +#: flatcamGUI/FlatCAMGUI.py:5737 flatcamTools/ToolPanelize.py:139 msgid "Rows:" msgstr "Linii:" -#: flatcamGUI/FlatCAMGUI.py:5650 flatcamTools/ToolPanelize.py:141 +#: flatcamGUI/FlatCAMGUI.py:5739 flatcamTools/ToolPanelize.py:141 msgid "Number of rows of the desired panel" msgstr "Numărul de linii ale panel-ului dorit." -#: flatcamGUI/FlatCAMGUI.py:5656 +#: flatcamGUI/FlatCAMGUI.py:5745 msgid "Gerber" msgstr "Gerber" -#: flatcamGUI/FlatCAMGUI.py:5657 +#: flatcamGUI/FlatCAMGUI.py:5746 msgid "Geo" msgstr "Geo" -#: flatcamGUI/FlatCAMGUI.py:5658 flatcamTools/ToolPanelize.py:148 +#: flatcamGUI/FlatCAMGUI.py:5747 flatcamTools/ToolPanelize.py:148 msgid "Panel Type:" msgstr "Tip panel:" -#: flatcamGUI/FlatCAMGUI.py:5660 +#: flatcamGUI/FlatCAMGUI.py:5749 msgid "" "Choose the type of object for the panel object:\n" "- Gerber\n" @@ -8199,11 +8166,11 @@ msgstr "" "- Gerber\n" "- Geometrie" -#: flatcamGUI/FlatCAMGUI.py:5669 +#: flatcamGUI/FlatCAMGUI.py:5758 msgid "Constrain within:" msgstr "Constrange:" -#: flatcamGUI/FlatCAMGUI.py:5671 flatcamTools/ToolPanelize.py:160 +#: flatcamGUI/FlatCAMGUI.py:5760 flatcamTools/ToolPanelize.py:160 msgid "" "Area define by DX and DY within to constrain the panel.\n" "DX and DY values are in current units.\n" @@ -8217,11 +8184,11 @@ msgstr "" "panelul final va contine numai acel număr de linii/coloane care se inscrie\n" "complet in aria desemnata." -#: flatcamGUI/FlatCAMGUI.py:5680 flatcamTools/ToolPanelize.py:169 +#: flatcamGUI/FlatCAMGUI.py:5769 flatcamTools/ToolPanelize.py:169 msgid "Width (DX):" msgstr "Latime (Dx):" -#: flatcamGUI/FlatCAMGUI.py:5682 flatcamTools/ToolPanelize.py:171 +#: flatcamGUI/FlatCAMGUI.py:5771 flatcamTools/ToolPanelize.py:171 msgid "" "The width (DX) within which the panel must fit.\n" "In current units." @@ -8229,11 +8196,11 @@ msgstr "" "Lăţimea (Dx) in care panelul trebuie să se inscrie.\n" "In unitati curente." -#: flatcamGUI/FlatCAMGUI.py:5689 flatcamTools/ToolPanelize.py:177 +#: flatcamGUI/FlatCAMGUI.py:5778 flatcamTools/ToolPanelize.py:177 msgid "Height (DY):" msgstr "Inaltime (Dy):" -#: flatcamGUI/FlatCAMGUI.py:5691 flatcamTools/ToolPanelize.py:179 +#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolPanelize.py:179 msgid "" "The height (DY)within which the panel must fit.\n" "In current units." @@ -8241,15 +8208,15 @@ msgstr "" "Înălţimea (Dy) in care panelul trebuie să se inscrie.\n" "In unitati curente." -#: flatcamGUI/FlatCAMGUI.py:5705 +#: flatcamGUI/FlatCAMGUI.py:5794 msgid "Calculators Tool Options" msgstr "Opțiuni Unealta Calculatoare" -#: flatcamGUI/FlatCAMGUI.py:5708 +#: flatcamGUI/FlatCAMGUI.py:5797 msgid "V-Shape Tool Calculator:" msgstr "Calculator: Unealta V-shape" -#: flatcamGUI/FlatCAMGUI.py:5710 +#: flatcamGUI/FlatCAMGUI.py:5799 msgid "" "Calculate the tool diameter for a given V-shape tool,\n" "having the tip diameter, tip angle and\n" @@ -8259,11 +8226,11 @@ msgstr "" "avand diametrul vârfului și unghiul la vârf cat și\n" "adâncimea de tăiere, ca parametri." -#: flatcamGUI/FlatCAMGUI.py:5721 flatcamTools/ToolCalculators.py:94 +#: flatcamGUI/FlatCAMGUI.py:5810 flatcamTools/ToolCalculators.py:94 msgid "Tip Diameter:" msgstr "Dia vârf:" -#: flatcamGUI/FlatCAMGUI.py:5723 +#: flatcamGUI/FlatCAMGUI.py:5812 msgid "" "This is the tool tip diameter.\n" "It is specified by manufacturer." @@ -8271,11 +8238,11 @@ msgstr "" "Acesta este diametrul la vârf al uneltei.\n" "Este specificat de producator." -#: flatcamGUI/FlatCAMGUI.py:5731 +#: flatcamGUI/FlatCAMGUI.py:5820 msgid "Tip angle:" msgstr "Unghiul la vârf:" -#: flatcamGUI/FlatCAMGUI.py:5733 +#: flatcamGUI/FlatCAMGUI.py:5822 msgid "" "This is the angle on the tip of the tool.\n" "It is specified by manufacturer." @@ -8283,7 +8250,7 @@ msgstr "" "Acesta este unghiul la vârf al uneltei.\n" "Este specificat de producator." -#: flatcamGUI/FlatCAMGUI.py:5743 +#: flatcamGUI/FlatCAMGUI.py:5832 msgid "" "This is depth to cut into material.\n" "In the CNCJob object it is the CutZ parameter." @@ -8291,11 +8258,11 @@ msgstr "" "Aceasta este adâncimea la care se taie in material.\n" "In obiectul CNCJob este parametrul >Z tăiere<." -#: flatcamGUI/FlatCAMGUI.py:5750 +#: flatcamGUI/FlatCAMGUI.py:5839 msgid "ElectroPlating Calculator:" msgstr "Calculator Electroplacare:" -#: flatcamGUI/FlatCAMGUI.py:5752 flatcamTools/ToolCalculators.py:152 +#: flatcamGUI/FlatCAMGUI.py:5841 flatcamTools/ToolCalculators.py:152 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 " @@ -8307,31 +8274,31 @@ msgstr "" "- clorura paladiu\n" "- hipofosfit de calciu" -#: flatcamGUI/FlatCAMGUI.py:5762 flatcamTools/ToolCalculators.py:161 +#: flatcamGUI/FlatCAMGUI.py:5851 flatcamTools/ToolCalculators.py:161 msgid "Board Length:" msgstr "Lung. placii:" -#: flatcamGUI/FlatCAMGUI.py:5764 flatcamTools/ToolCalculators.py:165 +#: flatcamGUI/FlatCAMGUI.py:5853 flatcamTools/ToolCalculators.py:165 msgid "This is the board length. In centimeters." msgstr "" "Aceasta este lungimea PCB-ului.\n" "In centimetri. " -#: flatcamGUI/FlatCAMGUI.py:5770 flatcamTools/ToolCalculators.py:167 +#: flatcamGUI/FlatCAMGUI.py:5859 flatcamTools/ToolCalculators.py:167 msgid "Board Width:" msgstr "Lat. placii:" -#: flatcamGUI/FlatCAMGUI.py:5772 flatcamTools/ToolCalculators.py:171 +#: flatcamGUI/FlatCAMGUI.py:5861 flatcamTools/ToolCalculators.py:171 msgid "This is the board width.In centimeters." msgstr "" "Aceasta este lăţimea PCB-ului.\n" "In centimetri. " -#: flatcamGUI/FlatCAMGUI.py:5777 flatcamTools/ToolCalculators.py:173 +#: flatcamGUI/FlatCAMGUI.py:5866 flatcamTools/ToolCalculators.py:173 msgid "Current Density:" msgstr "Densitate I:" -#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolCalculators.py:177 +#: flatcamGUI/FlatCAMGUI.py:5869 flatcamTools/ToolCalculators.py:177 msgid "" "Current density to pass through the board. \n" "In Amps per Square Feet ASF." @@ -8339,11 +8306,11 @@ msgstr "" "Densitatea de curent care să treaca prin placa.\n" "In ASF (amperi pe picior la patrat)." -#: flatcamGUI/FlatCAMGUI.py:5786 flatcamTools/ToolCalculators.py:181 +#: flatcamGUI/FlatCAMGUI.py:5875 flatcamTools/ToolCalculators.py:181 msgid "Copper Growth:" msgstr "Grosime Cu:" -#: flatcamGUI/FlatCAMGUI.py:5789 flatcamTools/ToolCalculators.py:185 +#: flatcamGUI/FlatCAMGUI.py:5878 flatcamTools/ToolCalculators.py:185 msgid "" "How thick the copper growth is intended to be.\n" "In microns." @@ -8351,11 +8318,11 @@ msgstr "" "Cat de gros se doreste să fie stratul de cupru depus.\n" "In microni." -#: flatcamGUI/FlatCAMGUI.py:5802 +#: flatcamGUI/FlatCAMGUI.py:5891 msgid "Transform Tool Options" msgstr "Opțiuni Unealta Transformare" -#: flatcamGUI/FlatCAMGUI.py:5807 +#: flatcamGUI/FlatCAMGUI.py:5896 msgid "" "Various transformations that can be applied\n" "on a FlatCAM object." @@ -8368,47 +8335,47 @@ msgstr "" "- deformare\n" "- oglindire" -#: flatcamGUI/FlatCAMGUI.py:5817 +#: flatcamGUI/FlatCAMGUI.py:5906 msgid "Rotate Angle:" msgstr "Unghi Rotaţie:" -#: flatcamGUI/FlatCAMGUI.py:5819 +#: flatcamGUI/FlatCAMGUI.py:5908 msgid "Angle for rotation. In degrees." msgstr "Unnghiul pentru rotaţie. In grade." -#: flatcamGUI/FlatCAMGUI.py:5826 +#: flatcamGUI/FlatCAMGUI.py:5915 msgid "Skew_X angle:" msgstr "Unghi Deform_X:" -#: flatcamGUI/FlatCAMGUI.py:5828 +#: flatcamGUI/FlatCAMGUI.py:5917 msgid "Angle for Skew/Shear on X axis. In degrees." msgstr "Unghiul pentru deformare pe axa X. In grade." -#: flatcamGUI/FlatCAMGUI.py:5835 +#: flatcamGUI/FlatCAMGUI.py:5924 msgid "Skew_Y angle:" msgstr "Unghi Deform_Y:" -#: flatcamGUI/FlatCAMGUI.py:5837 +#: flatcamGUI/FlatCAMGUI.py:5926 msgid "Angle for Skew/Shear on Y axis. In degrees." msgstr "Unghiul pentru deformare pe axa Y. In grade." -#: flatcamGUI/FlatCAMGUI.py:5844 +#: flatcamGUI/FlatCAMGUI.py:5933 msgid "Scale_X factor:" msgstr "Factor Scal_X:" -#: flatcamGUI/FlatCAMGUI.py:5846 +#: flatcamGUI/FlatCAMGUI.py:5935 msgid "Factor for scaling on X axis." msgstr "Factor de scalare pe axa X." -#: flatcamGUI/FlatCAMGUI.py:5853 +#: flatcamGUI/FlatCAMGUI.py:5942 msgid "Scale_Y factor:" msgstr "Factor Scal_Y:" -#: flatcamGUI/FlatCAMGUI.py:5855 +#: flatcamGUI/FlatCAMGUI.py:5944 msgid "Factor for scaling on Y axis." msgstr "Factor de scalare pe axa Y." -#: flatcamGUI/FlatCAMGUI.py:5863 +#: flatcamGUI/FlatCAMGUI.py:5952 msgid "" "Scale the selected object(s)\n" "using the Scale_X factor for both axis." @@ -8416,7 +8383,7 @@ msgstr "" "Scalează obiectele selectate folosind\n" "Factor Scal_X pentru ambele axe." -#: flatcamGUI/FlatCAMGUI.py:5871 flatcamTools/ToolTransform.py:210 +#: flatcamGUI/FlatCAMGUI.py:5960 flatcamTools/ToolTransform.py:210 msgid "" "Scale the selected object(s)\n" "using the origin reference when checked,\n" @@ -8429,27 +8396,27 @@ msgstr "" "centrul formei inconjuatoare care cuprinde\n" "toate obiectele selectate." -#: flatcamGUI/FlatCAMGUI.py:5880 +#: flatcamGUI/FlatCAMGUI.py:5969 msgid "Offset_X val:" msgstr "Ofset_X:" -#: flatcamGUI/FlatCAMGUI.py:5882 +#: flatcamGUI/FlatCAMGUI.py:5971 msgid "Distance to offset on X axis. In current units." msgstr "Distanta la care se face ofset pe axa X. In unitatile curente." -#: flatcamGUI/FlatCAMGUI.py:5889 +#: flatcamGUI/FlatCAMGUI.py:5978 msgid "Offset_Y val:" msgstr "Ofset_Y:" -#: flatcamGUI/FlatCAMGUI.py:5891 +#: flatcamGUI/FlatCAMGUI.py:5980 msgid "Distance to offset on Y axis. In current units." msgstr "Distanta la care se face ofset pe axa Y. In unitatile curente." -#: flatcamGUI/FlatCAMGUI.py:5897 +#: flatcamGUI/FlatCAMGUI.py:5986 msgid "Mirror Reference" msgstr "Referinţă Oglindire" -#: flatcamGUI/FlatCAMGUI.py:5899 flatcamTools/ToolTransform.py:314 +#: flatcamGUI/FlatCAMGUI.py:5988 flatcamTools/ToolTransform.py:314 msgid "" "Flip the selected object(s)\n" "around the point in Point Entry Field.\n" @@ -8472,11 +8439,11 @@ msgstr "" "in forma (x, y).\n" "La final apasa butonul de oglindire pe axa dorita. " -#: flatcamGUI/FlatCAMGUI.py:5910 +#: flatcamGUI/FlatCAMGUI.py:5999 msgid " Mirror Ref. Point:" msgstr "Pt. Ref. Oglindire:" -#: flatcamGUI/FlatCAMGUI.py:5912 flatcamTools/ToolTransform.py:327 +#: flatcamGUI/FlatCAMGUI.py:6001 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" @@ -8487,11 +8454,11 @@ msgstr "" "X din (x,y) se va folosi când se face oglindirea pe axa X\n" "Y din (x,y) se va folosi când se face oglindirea pe axa Y." -#: flatcamGUI/FlatCAMGUI.py:5929 +#: flatcamGUI/FlatCAMGUI.py:6018 msgid "SolderPaste Tool Options" msgstr "Opțiuni Unealta Pasta Fludor" -#: flatcamGUI/FlatCAMGUI.py:5934 +#: flatcamGUI/FlatCAMGUI.py:6023 msgid "" "A tool to create GCode for dispensing\n" "solder paste onto a PCB." @@ -8499,49 +8466,49 @@ msgstr "" "O unealtă care crează cod G-Code pentru dispensarea de pastă de fludor\n" "pe padurile unui PCB." -#: flatcamGUI/FlatCAMGUI.py:5945 +#: flatcamGUI/FlatCAMGUI.py:6034 msgid "Diameters of nozzle tools, separated by ','" msgstr "Diametrele uneltelor (nozzle), separate prin virgula." -#: flatcamGUI/FlatCAMGUI.py:5952 +#: flatcamGUI/FlatCAMGUI.py:6041 msgid "New Nozzle Dia:" msgstr "Nou Dia::" -#: flatcamGUI/FlatCAMGUI.py:5954 flatcamTools/ToolSolderPaste.py:103 +#: flatcamGUI/FlatCAMGUI.py:6043 flatcamTools/ToolSolderPaste.py:103 msgid "Diameter for the new Nozzle tool to add in the Tool Table" msgstr "" "Valoarea pentru diametrul unei noi unelte (nozzle) pentru adaugare in Tabela " "de Unelte" -#: flatcamGUI/FlatCAMGUI.py:5962 flatcamTools/ToolSolderPaste.py:166 +#: flatcamGUI/FlatCAMGUI.py:6051 flatcamTools/ToolSolderPaste.py:166 msgid "Z Dispense Start:" msgstr "Z start disp.:" -#: flatcamGUI/FlatCAMGUI.py:5964 flatcamTools/ToolSolderPaste.py:168 +#: flatcamGUI/FlatCAMGUI.py:6053 flatcamTools/ToolSolderPaste.py:168 msgid "The height (Z) when solder paste dispensing starts." msgstr "Înălţimea (Z) când incepe dispensarea de pastă de fludor." -#: flatcamGUI/FlatCAMGUI.py:5971 flatcamTools/ToolSolderPaste.py:174 +#: flatcamGUI/FlatCAMGUI.py:6060 flatcamTools/ToolSolderPaste.py:174 msgid "Z Dispense:" msgstr "Z disp.:" -#: flatcamGUI/FlatCAMGUI.py:5973 flatcamTools/ToolSolderPaste.py:176 +#: flatcamGUI/FlatCAMGUI.py:6062 flatcamTools/ToolSolderPaste.py:176 msgid "The height (Z) when doing solder paste dispensing." msgstr "Înălţimea (Z) in timp ce se face dispensarea de pastă de fludor." -#: flatcamGUI/FlatCAMGUI.py:5980 flatcamTools/ToolSolderPaste.py:183 +#: flatcamGUI/FlatCAMGUI.py:6069 flatcamTools/ToolSolderPaste.py:183 msgid "Z Dispense Stop:" msgstr "Z stop disp.:" -#: flatcamGUI/FlatCAMGUI.py:5982 flatcamTools/ToolSolderPaste.py:185 +#: flatcamGUI/FlatCAMGUI.py:6071 flatcamTools/ToolSolderPaste.py:185 msgid "The height (Z) when solder paste dispensing stops." msgstr "Înălţimea (Z) când se opreste dispensarea de pastă de fludor." -#: flatcamGUI/FlatCAMGUI.py:5989 flatcamTools/ToolSolderPaste.py:191 +#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:191 msgid "Z Travel:" msgstr "Z deplasare:" -#: flatcamGUI/FlatCAMGUI.py:5991 flatcamTools/ToolSolderPaste.py:193 +#: flatcamGUI/FlatCAMGUI.py:6080 flatcamTools/ToolSolderPaste.py:193 msgid "" "The height (Z) for travel between pads\n" "(without dispensing solder paste)." @@ -8549,19 +8516,19 @@ msgstr "" "Înălţimea (Z) când se face deplasare între pad-uri.\n" "(fără dispensare de pastă de fludor)." -#: flatcamGUI/FlatCAMGUI.py:5999 flatcamTools/ToolSolderPaste.py:200 +#: flatcamGUI/FlatCAMGUI.py:6088 flatcamTools/ToolSolderPaste.py:200 msgid "Z Toolchange:" msgstr "Z schimb. unealtă:" -#: flatcamGUI/FlatCAMGUI.py:6001 flatcamTools/ToolSolderPaste.py:202 +#: flatcamGUI/FlatCAMGUI.py:6090 flatcamTools/ToolSolderPaste.py:202 msgid "The height (Z) for tool (nozzle) change." msgstr "Înălţimea (Z) când se schimbă unealta (nozzle-ul)." -#: flatcamGUI/FlatCAMGUI.py:6008 flatcamTools/ToolSolderPaste.py:208 +#: flatcamGUI/FlatCAMGUI.py:6097 flatcamTools/ToolSolderPaste.py:208 msgid "XY Toolchange:" msgstr "XY schimb unealtă:" -#: flatcamGUI/FlatCAMGUI.py:6010 flatcamTools/ToolSolderPaste.py:210 +#: flatcamGUI/FlatCAMGUI.py:6099 flatcamTools/ToolSolderPaste.py:210 msgid "" "The X,Y location for tool (nozzle) change.\n" "The format is (x, y) where x and y are real numbers." @@ -8569,30 +8536,30 @@ msgstr "" "Coordonatele X, Y pentru schimbarea uneltei (nozzle).\n" "Formatul este (x,y) unde x și y sunt numere Reale." -#: flatcamGUI/FlatCAMGUI.py:6018 flatcamTools/ToolSolderPaste.py:217 +#: flatcamGUI/FlatCAMGUI.py:6107 flatcamTools/ToolSolderPaste.py:217 msgid "Feedrate X-Y:" msgstr "Feedrate X-Y:" -#: flatcamGUI/FlatCAMGUI.py:6020 flatcamTools/ToolSolderPaste.py:219 +#: flatcamGUI/FlatCAMGUI.py:6109 flatcamTools/ToolSolderPaste.py:219 msgid "Feedrate (speed) while moving on the X-Y plane." msgstr "Viteza de deplasare a uneltei când se deplasează in planul X-Y." -#: flatcamGUI/FlatCAMGUI.py:6027 flatcamTools/ToolSolderPaste.py:225 +#: flatcamGUI/FlatCAMGUI.py:6116 flatcamTools/ToolSolderPaste.py:225 msgid "Feedrate Z:" msgstr "Feedrate Z:" -#: flatcamGUI/FlatCAMGUI.py:6029 flatcamTools/ToolSolderPaste.py:227 +#: flatcamGUI/FlatCAMGUI.py:6118 flatcamTools/ToolSolderPaste.py:227 msgid "" "Feedrate (speed) while moving vertically\n" "(on Z plane)." msgstr "" "Viteza de deplasare a uneltei când se misca in plan vertical (planul Z)." -#: flatcamGUI/FlatCAMGUI.py:6037 flatcamTools/ToolSolderPaste.py:234 +#: flatcamGUI/FlatCAMGUI.py:6126 flatcamTools/ToolSolderPaste.py:234 msgid "Feedrate Z Dispense:" msgstr "Feedrate Z disp.:" -#: flatcamGUI/FlatCAMGUI.py:6039 flatcamTools/ToolSolderPaste.py:236 +#: flatcamGUI/FlatCAMGUI.py:6128 flatcamTools/ToolSolderPaste.py:236 msgid "" "Feedrate (speed) while moving up vertically\n" " to Dispense position (on Z plane)." @@ -8600,11 +8567,11 @@ msgstr "" "Viteza de deplasare la mișcarea pe verticala spre\n" "poziţia de dispensare (in planul Z)." -#: flatcamGUI/FlatCAMGUI.py:6047 flatcamTools/ToolSolderPaste.py:243 +#: flatcamGUI/FlatCAMGUI.py:6136 flatcamTools/ToolSolderPaste.py:243 msgid "Spindle Speed FWD:" msgstr "Viteza motor inainte:" -#: flatcamGUI/FlatCAMGUI.py:6049 flatcamTools/ToolSolderPaste.py:245 +#: flatcamGUI/FlatCAMGUI.py:6138 flatcamTools/ToolSolderPaste.py:245 msgid "" "The dispenser speed while pushing solder paste\n" "through the dispenser nozzle." @@ -8612,19 +8579,19 @@ msgstr "" "Viteza motorului de dispensare in timp ce impinge pastă de fludor\n" "prin orificiul uneltei de dispensare." -#: flatcamGUI/FlatCAMGUI.py:6057 flatcamTools/ToolSolderPaste.py:252 +#: flatcamGUI/FlatCAMGUI.py:6146 flatcamTools/ToolSolderPaste.py:252 msgid "Dwell FWD:" msgstr "Pauza dupa disp.:" -#: flatcamGUI/FlatCAMGUI.py:6059 flatcamTools/ToolSolderPaste.py:254 +#: flatcamGUI/FlatCAMGUI.py:6148 flatcamTools/ToolSolderPaste.py:254 msgid "Pause after solder dispensing." msgstr "Pauza dupa dispensarea de pastă de fludor." -#: flatcamGUI/FlatCAMGUI.py:6066 flatcamTools/ToolSolderPaste.py:260 +#: flatcamGUI/FlatCAMGUI.py:6155 flatcamTools/ToolSolderPaste.py:260 msgid "Spindle Speed REV:" msgstr "Viteza motor reverse:" -#: flatcamGUI/FlatCAMGUI.py:6068 flatcamTools/ToolSolderPaste.py:262 +#: flatcamGUI/FlatCAMGUI.py:6157 flatcamTools/ToolSolderPaste.py:262 msgid "" "The dispenser speed while retracting solder paste\n" "through the dispenser nozzle." @@ -8632,11 +8599,11 @@ msgstr "" "Viteza motorului de dispensare in timp ce retrage pasta de fludor\n" "prin orificiul uneltei de dispensare." -#: flatcamGUI/FlatCAMGUI.py:6076 flatcamTools/ToolSolderPaste.py:269 +#: flatcamGUI/FlatCAMGUI.py:6165 flatcamTools/ToolSolderPaste.py:269 msgid "Dwell REV:" msgstr "Pauza dupa rev:" -#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:271 +#: flatcamGUI/FlatCAMGUI.py:6167 flatcamTools/ToolSolderPaste.py:271 msgid "" "Pause after solder paste dispenser retracted,\n" "to allow pressure equilibrium." @@ -8644,23 +8611,23 @@ msgstr "" "Pauza dupa ce pasta de fludor a fost retrasă,\n" "necesară pt a ajunge la un echilibru al presiunilor." -#: flatcamGUI/FlatCAMGUI.py:6085 flatcamTools/ToolSolderPaste.py:277 +#: flatcamGUI/FlatCAMGUI.py:6174 flatcamTools/ToolSolderPaste.py:277 msgid "PostProcessors:" msgstr "Postprocesoare:" -#: flatcamGUI/FlatCAMGUI.py:6087 flatcamTools/ToolSolderPaste.py:279 +#: flatcamGUI/FlatCAMGUI.py:6176 flatcamTools/ToolSolderPaste.py:279 msgid "Files that control the GCode generation." msgstr "Fişiere care controlează generarea codului G-Code." -#: flatcamGUI/FlatCAMGUI.py:6117 flatcamGUI/FlatCAMGUI.py:6123 +#: flatcamGUI/FlatCAMGUI.py:6206 flatcamGUI/FlatCAMGUI.py:6212 msgid "Idle." msgstr "Inactiv." -#: flatcamGUI/FlatCAMGUI.py:6147 +#: flatcamGUI/FlatCAMGUI.py:6236 msgid "Application started ..." msgstr "Aplicaţia a pornit ..." -#: flatcamGUI/FlatCAMGUI.py:6148 +#: flatcamGUI/FlatCAMGUI.py:6237 msgid "Hello!" msgstr "Bună!" @@ -9926,7 +9893,7 @@ msgstr "" "se va apasa tasta 'Escape'." #: flatcamTools/ToolCutOut.py:338 flatcamTools/ToolCutOut.py:483 -#: flatcamTools/ToolNonCopperClear.py:665 flatcamTools/ToolPaint.py:763 +#: flatcamTools/ToolNonCopperClear.py:666 flatcamTools/ToolPaint.py:764 #: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 #, python-format msgid "[ERROR_NOTCL] Could not retrieve object: %s" @@ -9994,7 +9961,7 @@ msgstr "" msgid "[success] Any form CutOut operation finished." msgstr "[success] Operatia de decupaj cu forma libera s-a terminat." -#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:767 +#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:768 #: flatcamTools/ToolPanelize.py:299 #, python-format msgid "[ERROR_NOTCL] Object not found: %s" @@ -10581,23 +10548,19 @@ msgstr "Distanta euclidiana de la punct la punct." msgid "Measure" msgstr "Masoara:" -#: flatcamTools/ToolMeasurement.py:126 +#: flatcamTools/ToolMeasurement.py:132 msgid "Meas. Tool" msgstr "Unealta Masur." -#: flatcamTools/ToolMeasurement.py:221 +#: flatcamTools/ToolMeasurement.py:177 msgid "MEASURING: Click on the Start point ..." msgstr "Masoara: Click pe punctul de Start ..." -#: flatcamTools/ToolMeasurement.py:231 -msgid "Measurement Tool exit..." -msgstr "Măsurătoarea s-a terminat ..." - -#: flatcamTools/ToolMeasurement.py:258 +#: flatcamTools/ToolMeasurement.py:270 msgid "MEASURING: Click on the Destination point ..." msgstr "Masoara: Click pe punctul Destinaţie..." -#: flatcamTools/ToolMeasurement.py:276 +#: flatcamTools/ToolMeasurement.py:278 #, python-brace-format msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" msgstr "Masoara: Rrezultat D(x) = {d_x} | D(y) = {d_y} | Distanta = {d_z}" @@ -10742,29 +10705,29 @@ msgstr "" msgid "Generate Geometry" msgstr "Genereza Geometrie" -#: flatcamTools/ToolNonCopperClear.py:484 flatcamTools/ToolPaint.py:543 -#: flatcamTools/ToolSolderPaste.py:760 +#: flatcamTools/ToolNonCopperClear.py:485 flatcamTools/ToolPaint.py:544 +#: flatcamTools/ToolSolderPaste.py:761 msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." msgstr "" "[WARNING_NOTCL] Introduce diametrul unei unelte pt a fi adăugată, in format " "Real." -#: flatcamTools/ToolNonCopperClear.py:512 flatcamTools/ToolPaint.py:567 +#: flatcamTools/ToolNonCopperClear.py:513 flatcamTools/ToolPaint.py:568 msgid "[WARNING_NOTCL] Adding tool cancelled. Tool already in Tool Table." msgstr "" "[WARNING_NOTCL] Adaugarea unei unelte noi este anulata. Unealta exista deja " "in Tabela de Unelte." -#: flatcamTools/ToolNonCopperClear.py:517 flatcamTools/ToolPaint.py:572 +#: flatcamTools/ToolNonCopperClear.py:518 flatcamTools/ToolPaint.py:573 msgid "[success] New tool added to Tool Table." msgstr "[success] O noua unealtă a fost adăugată in Tabela de Unelte." -#: flatcamTools/ToolNonCopperClear.py:559 flatcamTools/ToolPaint.py:615 +#: flatcamTools/ToolNonCopperClear.py:560 flatcamTools/ToolPaint.py:616 msgid "[success] Tool from Tool Table was edited." msgstr "[success] O unealtă din Tabela de Unelte a fost editata." -#: flatcamTools/ToolNonCopperClear.py:570 flatcamTools/ToolPaint.py:626 -#: flatcamTools/ToolSolderPaste.py:846 +#: flatcamTools/ToolNonCopperClear.py:571 flatcamTools/ToolPaint.py:627 +#: flatcamTools/ToolSolderPaste.py:847 msgid "" "[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " "Table." @@ -10772,45 +10735,45 @@ msgstr "" "[WARNING_NOTCL] Editare eșuata. Noua valoare pt diametrul uneltei este deja " "in Tabela de Unelte." -#: flatcamTools/ToolNonCopperClear.py:609 flatcamTools/ToolPaint.py:723 +#: flatcamTools/ToolNonCopperClear.py:610 flatcamTools/ToolPaint.py:724 msgid "[WARNING_NOTCL] Delete failed. Select a tool to delete." msgstr "[WARNING_NOTCL] Ștergere eșuata. Selectează o unealtă pt ștergere." -#: flatcamTools/ToolNonCopperClear.py:614 flatcamTools/ToolPaint.py:728 +#: flatcamTools/ToolNonCopperClear.py:615 flatcamTools/ToolPaint.py:729 msgid "[success] Tool(s) deleted from Tool Table." msgstr "[success] Au fost șterse unelte din Tabela de Unelte." -#: flatcamTools/ToolNonCopperClear.py:632 flatcamTools/ToolPaint.py:747 +#: flatcamTools/ToolNonCopperClear.py:633 flatcamTools/ToolPaint.py:748 msgid "" "[ERROR_NOTCL] Overlap value must be between 0 (inclusive) and 1 (exclusive), " msgstr "" "[ERROR_NOTCL] Valoarea de suprapunere trrebuie sa ia valori intre 0 " "(inclusiv) si 1 (exclusiv)." -#: flatcamTools/ToolNonCopperClear.py:672 +#: flatcamTools/ToolNonCopperClear.py:673 msgid "[ERROR_NOTCL] No Gerber file available." msgstr "[ERROR_NOTCL] Nici-un fisier Gerber nu este disponibil." -#: flatcamTools/ToolNonCopperClear.py:710 -#: flatcamTools/ToolNonCopperClear.py:832 +#: flatcamTools/ToolNonCopperClear.py:711 +#: flatcamTools/ToolNonCopperClear.py:833 msgid "Clearing Non-Copper areas." msgstr "Se curăță PCB-ul de cuprul in exces." -#: flatcamTools/ToolNonCopperClear.py:728 +#: flatcamTools/ToolNonCopperClear.py:729 #, python-format msgid "[success] Non-Copper Clearing with ToolDia = %s started." msgstr "[success] Curățarea de Cupru in exces cu Dia Unealta = %s a inceput." -#: flatcamTools/ToolNonCopperClear.py:797 +#: flatcamTools/ToolNonCopperClear.py:798 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" -#: flatcamTools/ToolNonCopperClear.py:802 +#: flatcamTools/ToolNonCopperClear.py:803 msgid "[success] NCC Tool finished." msgstr "[success] Unealta NCC s-a terminat." -#: flatcamTools/ToolNonCopperClear.py:804 +#: flatcamTools/ToolNonCopperClear.py:805 msgid "" "[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " "cleared. Check the result." @@ -10818,17 +10781,17 @@ msgstr "" "[WARNING_NOTCL] Unealta NCC a terminat lucrul dar unele zone PCB nu au putut " "fi curățate de Cu. Verifică rezultatul." -#: flatcamTools/ToolNonCopperClear.py:850 +#: flatcamTools/ToolNonCopperClear.py:851 #, python-format msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." msgstr "[success] Curățarea de Cupru tip Rest cu dia unealtă = %s a inceput.." -#: flatcamTools/ToolNonCopperClear.py:948 +#: flatcamTools/ToolNonCopperClear.py:949 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" msgstr "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" -#: flatcamTools/ToolNonCopperClear.py:956 +#: flatcamTools/ToolNonCopperClear.py:957 msgid "" "[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " "settings." @@ -10836,6 +10799,31 @@ msgstr "" "[ERROR_NOTCL] Unealta NCC a termiant lucrul dar nu a putut curăța de Cu " "obiectul cu setarile curente." +#: flatcamTools/ToolPDF.py:37 +msgid "PDF Import Tool" +msgstr "Unealta import PDF" + +#: flatcamTools/ToolPDF.py:142 flatcamTools/ToolPDF.py:146 +msgid "Open PDF" +msgstr "Încarcă PDF" + +#: flatcamTools/ToolPDF.py:149 +msgid "[WARNING_NOTCL] Open PDF cancelled." +msgstr "[WARNING_NOTCL] Incărcarea fişier PDF anulata." + +#: flatcamTools/ToolPDF.py:170 +msgid "Parsing PDF file ..." +msgstr "Se parsează fisierul PDF ..." + +#: flatcamTools/ToolPDF.py:266 +#, python-format +msgid "Rendering PDF layer #%d ..." +msgstr "Se generează layer-ul PDF #%d ..." + +#: flatcamTools/ToolPDF.py:270 +msgid "[ERROR_NOTCL] Open PDF file failed." +msgstr "[ERROR_NOTCL] Deschiderea unui fişier PDF a eșuat." + #: flatcamTools/ToolPaint.py:24 msgid "Paint Area" msgstr "Unealta Paint" @@ -10922,37 +10910,37 @@ msgstr "" "selectat, operatia de 'pictare' va incepe imediat dupa click.
Un nou " "obiect Geometrie va fi creat." -#: flatcamTools/ToolPaint.py:732 +#: flatcamTools/ToolPaint.py:733 msgid "geometry_on_paint_button" msgstr "geometry_on_paint_button" -#: flatcamTools/ToolPaint.py:751 flatcamTools/ToolPaint.py:786 +#: flatcamTools/ToolPaint.py:752 flatcamTools/ToolPaint.py:787 msgid "[WARNING_NOTCL] Click inside the desired polygon." msgstr "" "[WARNING_NOTCL] Click in interiorul poligonului care se doreste să fie " "'pictat'." -#: flatcamTools/ToolPaint.py:773 +#: flatcamTools/ToolPaint.py:774 msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." msgstr "[ERROR_NOTCL] Nu se poate face 'pictare' pe geometrii MultiGeo ..." -#: flatcamTools/ToolPaint.py:795 flatcamTools/ToolPaint.py:998 +#: flatcamTools/ToolPaint.py:796 flatcamTools/ToolPaint.py:999 msgid "Painting polygon..." msgstr "Se 'pictează' un poligon..." -#: flatcamTools/ToolPaint.py:846 +#: flatcamTools/ToolPaint.py:847 msgid "[WARNING] No polygon found." msgstr "[WARNING] Nu s-a gasit nici-un poligon." -#: flatcamTools/ToolPaint.py:849 +#: flatcamTools/ToolPaint.py:850 msgid "Painting polygon." msgstr "Se 'pictează' un poligon." -#: flatcamTools/ToolPaint.py:891 +#: flatcamTools/ToolPaint.py:892 msgid "[ERROR_NOTCL] Geometry could not be painted completely" msgstr "[ERROR_NOTCL] Geometria nu a putut să fie 'pictata' complet." -#: flatcamTools/ToolPaint.py:917 +#: flatcamTools/ToolPaint.py:918 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -10963,16 +10951,16 @@ msgstr "" "diferita de parametri. Sau o strategie diferita de 'pictare'.\n" "%s" -#: flatcamTools/ToolPaint.py:959 +#: flatcamTools/ToolPaint.py:960 #, python-format msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" msgstr "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" -#: flatcamTools/ToolPaint.py:965 flatcamTools/ToolPaint.py:1258 +#: flatcamTools/ToolPaint.py:966 flatcamTools/ToolPaint.py:1259 msgid "Polygon Paint started ..." msgstr "Paint pt poligon a inceput ..." -#: flatcamTools/ToolPaint.py:1114 flatcamTools/ToolPaint.py:1203 +#: flatcamTools/ToolPaint.py:1115 flatcamTools/ToolPaint.py:1204 #, python-format msgid "" "[ERROR] Could not do Paint All. Try a different combination of parameters. " @@ -10983,7 +10971,7 @@ msgstr "" "combinaţie diferita de parametri. Sau încearcă o alta metoda de 'pictat'\n" "%s" -#: flatcamTools/ToolPaint.py:1138 +#: flatcamTools/ToolPaint.py:1139 msgid "" "[ERROR] There is no Painting Geometry in the file.\n" "Usually it means that the tool diameter is too big for the painted " @@ -10995,11 +10983,11 @@ msgstr "" "geometrice.\n" "Schimbă parametrii de 'pictare' și încearcă din nou." -#: flatcamTools/ToolPaint.py:1147 +#: flatcamTools/ToolPaint.py:1148 msgid "[success] Paint All Done." msgstr "[success] 'Paint' pt toate poligoanele a fost efectuata." -#: flatcamTools/ToolPaint.py:1233 +#: flatcamTools/ToolPaint.py:1234 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 " @@ -11011,7 +10999,7 @@ msgstr "" "pt a fi folosit in obiectul Geometrie de 'pictat'.\n" "Schimbă parametrii de 'pictat' și încearcă din nou." -#: flatcamTools/ToolPaint.py:1242 +#: flatcamTools/ToolPaint.py:1243 msgid "[success] Paint All with Rest-Machining done." msgstr "" "[success] 'Paint' pentru toate poligoanele cu strategia Rest a fost " @@ -11124,6 +11112,167 @@ msgstr "" msgid "[success] Panel created successfully." msgstr "[success] Panel creat cu succes." +#: flatcamTools/ToolPcbWizard.py:32 +msgid "PcbWizard Import Tool" +msgstr "Unealta import PcbWizard" + +#: flatcamTools/ToolPcbWizard.py:40 +msgid "Import 2-file Excellon" +msgstr "Importa un Excellon bi-fisier" + +#: flatcamTools/ToolPcbWizard.py:57 +msgid "Excellon file:" +msgstr "Fisier Excellon:" + +#: flatcamTools/ToolPcbWizard.py:59 +msgid "" +"Load the Excellon file.\n" +"Usually it has a .DRL extension" +msgstr "" +"Incarcă fisierul Excellon.\n" +"De obicei are extensia .DRL." + +#: flatcamTools/ToolPcbWizard.py:66 +msgid "INF file:" +msgstr "Fisierul INF:" + +#: flatcamTools/ToolPcbWizard.py:68 +msgid "Load the INF file." +msgstr "Incarca fisierul INF." + +#: flatcamTools/ToolPcbWizard.py:81 +msgid "Tool Number" +msgstr "Număr unealtă:" + +#: flatcamTools/ToolPcbWizard.py:83 +msgid "Tool diameter in file units." +msgstr "Dimaetrul uneltei in unitătile fisierului." + +#: flatcamTools/ToolPcbWizard.py:97 +msgid "Int. digits:" +msgstr "Parte intreagă:" + +#: flatcamTools/ToolPcbWizard.py:99 +msgid "The number of digits for the integral part of the coordinates." +msgstr "" +"Acest număr reprezinta numărul de digiti din partea\n" +"intreagă a coordonatelor." + +#: flatcamTools/ToolPcbWizard.py:106 +msgid "Frac. digits:" +msgstr "Parte zecimală:" + +#: flatcamTools/ToolPcbWizard.py:108 +msgid "The number of digits for the fractional part of the coordinates." +msgstr "" +"Acest număr reprezinta numărul de digiti din partea\n" +"zecimala a coordonatelor." + +#: flatcamTools/ToolPcbWizard.py:116 +msgid "Zeros supp.:" +msgstr "Supresie Zerouri:" + +#: flatcamTools/ToolPcbWizard.py:118 +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 "" +"Tipul de supresie de zerouri care\n" +"este folosit.\n" +"Poate fi:\n" +"- LZ = zerourile din fată sunt păstrate\n" +"- TZ = zerourile de la coadă sunt păstrate\n" +"- Fără Supresie = nu se face supresie de zerouri" + +#: flatcamTools/ToolPcbWizard.py:129 +msgid "Units" +msgstr "Unităti" + +#: flatcamTools/ToolPcbWizard.py:131 +msgid "" +"The type of units that the coordinates and tool\n" +"diameters are using. Can be INCH or MM." +msgstr "" +"Tipul de unităti folosite pt coordonate si\n" +"pentru diametrul uneltelor. Poate fi INCH sau MM." + +#: flatcamTools/ToolPcbWizard.py:138 +msgid "Import Excellon" +msgstr "Importă Excellon" + +#: flatcamTools/ToolPcbWizard.py:140 +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 "" +"Importă in FlatCAM un fisier Excellon\n" +"care isi stochează informatia in 2 fisiere.\n" +"Unul are de obicei extensia .DRL in timp\n" +"ce celălalt are extensia .INF." + +#: flatcamTools/ToolPcbWizard.py:194 +msgid "PCBWizard Tool" +msgstr "Unealta PCBWizard" + +#: flatcamTools/ToolPcbWizard.py:288 flatcamTools/ToolPcbWizard.py:292 +msgid "Load PcbWizard Excellon file" +msgstr "Incarcă un fisier Excellon tip PCBWizard" + +#: flatcamTools/ToolPcbWizard.py:312 flatcamTools/ToolPcbWizard.py:316 +msgid "Load PcbWizard INF file" +msgstr "Incarcă un fisier INF tip PCBWizard" + +#: flatcamTools/ToolPcbWizard.py:363 +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 "" +"[ERROR] Fisierul INF nu contine tabela de unelte.\n" +"Incearcă să deschizi fisierul Excellon din Fisier -> Deschide -> \n" +"Excellon si să editezi manual diametrele uneltelor." + +#: flatcamTools/ToolPcbWizard.py:383 +msgid "[success] PcbWizard .INF file loaded." +msgstr "[success] Fisierul .INF tip PCBWizard a fost incărcat." + +#: flatcamTools/ToolPcbWizard.py:387 +msgid "[success] Main PcbWizard Excellon file loaded." +msgstr "[success] Fişierul Excellon tip PCBWizard a fost incărcat." + +#: flatcamTools/ToolPcbWizard.py:424 +#, python-format +msgid "[ERROR_NOTCL] Cannot parse file: %s" +msgstr "[ERROR_NOTCL] Fişierul %s nu se poate parsa." + +#: flatcamTools/ToolPcbWizard.py:447 +msgid "Importing Excellon." +msgstr "Excellon in curs de import." + +#: flatcamTools/ToolPcbWizard.py:454 +msgid "[ERROR_NOTCL] Import Excellon file failed." +msgstr "[ERROR_NOTCL] Fişierul Excellon nu a putut fi importat." + +#: flatcamTools/ToolPcbWizard.py:461 +#, python-format +msgid "[success] Imported: %s" +msgstr "[success] Importat: %s" + +#: flatcamTools/ToolPcbWizard.py:464 +msgid "[WARNING_NOTCL] Excellon merging is in progress. Please wait..." +msgstr "" +"[WARNING_NOTCL] Fuziunea fisiere Excellon este in curs. Vă rugăm " +"aşteptați ..." + +#: flatcamTools/ToolPcbWizard.py:466 +msgid "[ERROR_NOTCL] The imported Excellon file is None." +msgstr "[ERROR_NOTCL] Fişierul Excellon importat este gol." + #: flatcamTools/ToolProperties.py:103 msgid "[ERROR_NOTCL] Properties Tool was not displayed. No object selected." msgstr "" @@ -11340,51 +11489,51 @@ msgstr "" msgid "Delete Object" msgstr "Șterge Obiectul" -#: flatcamTools/ToolSolderPaste.py:788 +#: flatcamTools/ToolSolderPaste.py:789 msgid "" "[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." msgstr "" "[WARNING_NOTCL] Adaugarea unei unelte Nozzle a fost anulata. Unealta exista " "deja in Tabela de Unelte." -#: flatcamTools/ToolSolderPaste.py:793 +#: flatcamTools/ToolSolderPaste.py:794 msgid "[success] New Nozzle tool added to Tool Table." msgstr "[success] A fost adăugată o noua unealtă Nozzle in Tabela de Unelte." -#: flatcamTools/ToolSolderPaste.py:835 +#: flatcamTools/ToolSolderPaste.py:836 msgid "[success] Nozzle tool from Tool Table was edited." msgstr "[success] Unealta Nozzle din Tabela de Unelte a fost editata." -#: flatcamTools/ToolSolderPaste.py:891 +#: flatcamTools/ToolSolderPaste.py:892 msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." msgstr "" "[WARNING_NOTCL] Ștergerea a eșuat. Selectează o unealtă Nozzle pt a o șterge." -#: flatcamTools/ToolSolderPaste.py:896 +#: flatcamTools/ToolSolderPaste.py:897 msgid "[success] Nozzle tool(s) deleted from Tool Table." msgstr "[success] Uneltele (nozzle) au fost șterse din Tabela de Unelte." -#: flatcamTools/ToolSolderPaste.py:951 +#: flatcamTools/ToolSolderPaste.py:952 msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." msgstr "" "[WARNING_NOTCL] Nu este incărcat un obiect Gerber cu informatia mastii pt " "pastă de fludor." -#: flatcamTools/ToolSolderPaste.py:968 +#: flatcamTools/ToolSolderPaste.py:969 msgid "Creating Solder Paste dispensing geometry." msgstr "Se creează Geometrie pt dispensare pastă de fludor." -#: flatcamTools/ToolSolderPaste.py:980 +#: flatcamTools/ToolSolderPaste.py:981 msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." msgstr "[WARNING_NOTCL] Nu sunt unelte Nozzle in Tabela de Unelte." -#: flatcamTools/ToolSolderPaste.py:1109 +#: flatcamTools/ToolSolderPaste.py:1110 msgid "[success] Solder Paste geometry generated successfully..." msgstr "" "[success] Obiectul Geometrie pt dispens. de pastă de fludor a fost generat " "cu succes ..." -#: flatcamTools/ToolSolderPaste.py:1115 +#: flatcamTools/ToolSolderPaste.py:1116 msgid "" "[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " "diameters..." @@ -11392,15 +11541,15 @@ msgstr "" "[WARNING_NOTCL] Cel puțin unele pad-uri nu au pastă de fludor datorita " "diametrelor uneltelor (nozzle) ne adecvate." -#: flatcamTools/ToolSolderPaste.py:1129 +#: flatcamTools/ToolSolderPaste.py:1130 msgid "Generating Solder Paste dispensing geometry..." msgstr "Se generează Geometria de dispensare a pastei de fludor ..." -#: flatcamTools/ToolSolderPaste.py:1149 +#: flatcamTools/ToolSolderPaste.py:1150 msgid "[WARNING_NOTCL] There is no Geometry object available." msgstr "[WARNING_NOTCL] Nu exista obiect Geometrie disponibil." -#: flatcamTools/ToolSolderPaste.py:1153 +#: flatcamTools/ToolSolderPaste.py:1154 msgid "" "[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " "geometry." @@ -11408,13 +11557,13 @@ msgstr "" "[WARNING_NOTCL] Acest obiect Geometrie nu poate fi procesat Nu este o " "Geometrie tip solder_paste_tool." -#: flatcamTools/ToolSolderPaste.py:1258 +#: flatcamTools/ToolSolderPaste.py:1259 #, python-format msgid "[success] ToolSolderPaste CNCjob created: %s" msgstr "[success] Obiectul CNCJob tip solder_paste_tool a fost creat: %s" -#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 -#: flatcamTools/ToolSolderPaste.py:1345 +#: flatcamTools/ToolSolderPaste.py:1291 flatcamTools/ToolSolderPaste.py:1295 +#: flatcamTools/ToolSolderPaste.py:1346 msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " "solder_paste_tool CNCJob object." @@ -11422,20 +11571,20 @@ msgstr "" "[WARNING_NOTCL] Acest obiect CNCJob nu poate fi procesat. Nu este un obiect " "CNCJob tip 'solder_paste_tool'" -#: flatcamTools/ToolSolderPaste.py:1317 +#: flatcamTools/ToolSolderPaste.py:1318 msgid "[ERROR_NOTCL] No Gcode in the object..." msgstr "[ERROR_NOTCL] Nu exista cod GCode in acest obiect ..." -#: flatcamTools/ToolSolderPaste.py:1326 +#: flatcamTools/ToolSolderPaste.py:1327 #, python-format msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" msgstr "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" -#: flatcamTools/ToolSolderPaste.py:1355 +#: flatcamTools/ToolSolderPaste.py:1356 msgid "Export GCode ..." msgstr "Exporta GCode ..." -#: flatcamTools/ToolSolderPaste.py:1393 +#: flatcamTools/ToolSolderPaste.py:1394 #, python-format msgid "[success] Solder paste dispenser GCode file saved to: %s" msgstr "" @@ -11558,6 +11707,31 @@ msgstr "" msgid "CNCJob objects can't be offseted." msgstr "Obiectele tip CNCJob nu pot fi deplasate." +#~ msgid "Done." +#~ msgstr "Executat." + +#~ msgid "Click on CENTER ..." +#~ msgstr "Click in Centru ..." + +#~ msgid "[success] Done. Region completed." +#~ msgstr "[success] Executat. Adăugarea unei Regiuni terminată." + +#~ msgid "Add an aperture to the aperture list" +#~ msgstr "Adaugă o apertură in lista de aperturi" + +#~ msgid "Go" +#~ msgstr "Fă!" + +#~ msgid "Del Aperture:" +#~ msgstr "Șterge apertura:" + +#~ msgid "" +#~ "Delete a aperture in the aperture list.\n" +#~ "It will delete also the associated geometry." +#~ msgstr "" +#~ "Sterge o apertură in lista de aperturi.\n" +#~ "Va sterge si geometriile asociate." + #~ msgid "" #~ "[ERROR_NOTCL] The aperture scale factor value is missing or wrong format." #~ msgstr "" @@ -11567,12 +11741,6 @@ msgstr "Obiectele tip CNCJob nu pot fi deplasate." #~ msgid "[ERROR_NOTCL] The aperture buffer value is missing or wrong format." #~ msgstr "[ERROR_NOTCL] Valoarea pt bufer apertura lipseste " -#~ msgid "[ERROR_NOTCL] Creation of Gerber failed." -#~ msgstr "[ERROR_NOTCL] Crearea unui fişier Gerber a eșuat." - -#~ msgid "[success] Created: %s" -#~ msgstr "[success] Creat: %s" - #~ msgid "" #~ "Editor Shortcut list
\n" #~ "
\n" diff --git a/locale_template/strings.pot b/locale_template/strings.pot index 9f379fc3..806b49b7 100644 --- a/locale_template/strings.pot +++ b/locale_template/strings.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"POT-Creation-Date: 2019-04-12 21:44+0300\n" +"POT-Creation-Date: 2019-04-23 17:49+0300\n" "PO-Revision-Date: 2019-03-25 15:08+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -27,136 +27,137 @@ msgstr "" msgid "[ERROR] Could not find the Language files. The App strings are missing." msgstr "" -#: FlatCAMApp.py:1888 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +#: FlatCAMApp.py:1889 ObjectCollection.py:80 flatcamTools/ToolImage.py:213 +#: flatcamTools/ToolPcbWizard.py:299 flatcamTools/ToolPcbWizard.py:322 msgid "Open cancelled." msgstr "" -#: FlatCAMApp.py:1902 +#: FlatCAMApp.py:1903 msgid "Open Config file failed." msgstr "" -#: FlatCAMApp.py:1916 +#: FlatCAMApp.py:1917 msgid "Open Script file failed." msgstr "" -#: FlatCAMApp.py:2098 -msgid "[WARNING_NOTCL] Select a Geometry or Excellon Object to edit." +#: FlatCAMApp.py:2102 +msgid "[WARNING_NOTCL] Select a Geometry, Gerber or Excellon Object to edit." msgstr "" -#: FlatCAMApp.py:2108 +#: FlatCAMApp.py:2112 msgid "" "[WARNING_NOTCL] Simultanoeus editing of tools geometry in a MultiGeo " "Geometry is not possible.\n" -" Edit only one geometry at a time." +"Edit only one geometry at a time." msgstr "" -#: FlatCAMApp.py:2144 +#: FlatCAMApp.py:2149 msgid "[WARNING_NOTCL] Editor is activated ..." msgstr "" -#: FlatCAMApp.py:2171 +#: FlatCAMApp.py:2168 msgid "Do you want to save the edited object?" msgstr "" -#: FlatCAMApp.py:2172 flatcamGUI/FlatCAMGUI.py:1549 +#: FlatCAMApp.py:2169 flatcamGUI/FlatCAMGUI.py:1593 msgid "Close Editor" msgstr "" -#: FlatCAMApp.py:2175 FlatCAMApp.py:3255 FlatCAMApp.py:5564 -#: FlatCAMTranslation.py:89 flatcamGUI/FlatCAMGUI.py:3542 +#: FlatCAMApp.py:2172 FlatCAMApp.py:3254 FlatCAMApp.py:5559 +#: FlatCAMTranslation.py:89 flatcamGUI/FlatCAMGUI.py:3631 msgid "Yes" msgstr "" -#: FlatCAMApp.py:2176 FlatCAMApp.py:3256 FlatCAMApp.py:5565 -#: FlatCAMTranslation.py:90 flatcamGUI/FlatCAMGUI.py:3543 +#: FlatCAMApp.py:2173 FlatCAMApp.py:3255 FlatCAMApp.py:5560 +#: FlatCAMTranslation.py:90 flatcamGUI/FlatCAMGUI.py:3632 msgid "No" msgstr "" -#: FlatCAMApp.py:2177 FlatCAMApp.py:3257 FlatCAMApp.py:3589 FlatCAMApp.py:5566 +#: FlatCAMApp.py:2174 FlatCAMApp.py:3256 FlatCAMApp.py:3588 FlatCAMApp.py:5561 msgid "Cancel" msgstr "" -#: FlatCAMApp.py:2199 FlatCAMApp.py:2224 +#: FlatCAMApp.py:2196 FlatCAMApp.py:2221 msgid "[WARNING] Object empty after edit." msgstr "" -#: FlatCAMApp.py:2233 FlatCAMApp.py:2245 FlatCAMApp.py:2257 +#: FlatCAMApp.py:2230 FlatCAMApp.py:2244 FlatCAMApp.py:2256 msgid "[WARNING_NOTCL] Select a Gerber, Geometry or Excellon Object to update." msgstr "" -#: FlatCAMApp.py:2236 +#: FlatCAMApp.py:2233 #, python-format msgid "[selected] %s is updated, returning to App..." msgstr "" -#: FlatCAMApp.py:2593 +#: FlatCAMApp.py:2592 msgid "[ERROR] Could not load defaults file." msgstr "" -#: FlatCAMApp.py:2605 +#: FlatCAMApp.py:2604 msgid "[ERROR] Failed to parse defaults file." msgstr "" -#: FlatCAMApp.py:2626 FlatCAMApp.py:2629 +#: FlatCAMApp.py:2625 FlatCAMApp.py:2628 msgid "Import FlatCAM Preferences" msgstr "" -#: FlatCAMApp.py:2634 +#: FlatCAMApp.py:2633 msgid "[WARNING_NOTCL] FlatCAM preferences import cancelled." msgstr "" -#: FlatCAMApp.py:2642 FlatCAMApp.py:2689 FlatCAMApp.py:3134 +#: FlatCAMApp.py:2641 FlatCAMApp.py:2688 FlatCAMApp.py:3133 msgid "[ERROR_NOTCL] Could not load defaults file." msgstr "" -#: FlatCAMApp.py:2650 FlatCAMApp.py:3143 +#: FlatCAMApp.py:2649 FlatCAMApp.py:3142 msgid "[ERROR_NOTCL] Failed to parse defaults file." msgstr "" -#: FlatCAMApp.py:2653 +#: FlatCAMApp.py:2652 #, python-format msgid "[success] Imported Defaults from %s" msgstr "" -#: FlatCAMApp.py:2663 FlatCAMApp.py:2667 +#: FlatCAMApp.py:2662 FlatCAMApp.py:2666 msgid "Export FlatCAM Preferences" msgstr "" -#: FlatCAMApp.py:2673 +#: FlatCAMApp.py:2672 msgid "[WARNING_NOTCL] FlatCAM preferences export cancelled." msgstr "" -#: FlatCAMApp.py:2708 FlatCAMApp.py:3188 +#: FlatCAMApp.py:2707 FlatCAMApp.py:3187 msgid "[ERROR_NOTCL] Failed to write defaults to file." msgstr "" -#: FlatCAMApp.py:2760 +#: FlatCAMApp.py:2759 msgid "[ERROR_NOTCL] Failed to open recent files file for writing." msgstr "" -#: FlatCAMApp.py:2845 camlib.py:4430 +#: FlatCAMApp.py:2844 camlib.py:4493 msgid "[ERROR_NOTCL] An internal error has ocurred. See shell.\n" msgstr "" -#: FlatCAMApp.py:2846 +#: FlatCAMApp.py:2845 #, python-brace-format msgid "" "Object ({kind}) failed because: {error} \n" "\n" msgstr "" -#: FlatCAMApp.py:2866 +#: FlatCAMApp.py:2865 msgid "Converting units to " msgstr "" -#: FlatCAMApp.py:2936 FlatCAMApp.py:2939 FlatCAMApp.py:2942 FlatCAMApp.py:2945 +#: FlatCAMApp.py:2935 FlatCAMApp.py:2938 FlatCAMApp.py:2941 FlatCAMApp.py:2944 #, python-brace-format msgid "" "[selected] {kind} created/selected: {name}" msgstr "" -#: FlatCAMApp.py:3039 +#: FlatCAMApp.py:3038 #, python-brace-format msgid "" "FlatCAM
Version {version} {beta} ({date}) - " @@ -170,41 +171,41 @@ msgid "" "downloads/\">here.
" msgstr "" -#: FlatCAMApp.py:3192 +#: FlatCAMApp.py:3191 msgid "[success] Defaults saved." msgstr "" -#: FlatCAMApp.py:3213 +#: FlatCAMApp.py:3212 msgid "[ERROR_NOTCL] Could not load factory defaults file." msgstr "" -#: FlatCAMApp.py:3222 +#: FlatCAMApp.py:3221 msgid "[ERROR_NOTCL] Failed to parse factory defaults file." msgstr "" -#: FlatCAMApp.py:3236 +#: FlatCAMApp.py:3235 msgid "[ERROR_NOTCL] Failed to write factory defaults to file." msgstr "" -#: FlatCAMApp.py:3240 +#: FlatCAMApp.py:3239 msgid "Factory defaults saved." msgstr "" -#: FlatCAMApp.py:3245 flatcamGUI/FlatCAMGUI.py:2974 +#: FlatCAMApp.py:3244 flatcamGUI/FlatCAMGUI.py:3063 msgid "[WARNING_NOTCL] Application is saving the project. Please wait ..." msgstr "" -#: FlatCAMApp.py:3250 +#: FlatCAMApp.py:3249 msgid "" "There are files/objects modified in FlatCAM. \n" "Do you want to Save the project?" msgstr "" -#: FlatCAMApp.py:3253 FlatCAMApp.py:5562 +#: FlatCAMApp.py:3252 FlatCAMApp.py:5557 msgid "Save changes" msgstr "" -#: FlatCAMApp.py:3320 +#: FlatCAMApp.py:3319 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 " @@ -214,431 +215,438 @@ msgid "" "Check the generated GCODE." msgstr "" -#: FlatCAMApp.py:3361 +#: FlatCAMApp.py:3360 msgid "[ERROR_NOTCL] Failed. Excellon joining works only on Excellon objects." msgstr "" -#: FlatCAMApp.py:3383 +#: FlatCAMApp.py:3382 msgid "[ERROR_NOTCL] Failed. Gerber joining works only on Gerber objects." msgstr "" -#: FlatCAMApp.py:3398 FlatCAMApp.py:3423 +#: FlatCAMApp.py:3397 FlatCAMApp.py:3422 msgid "[ERROR_NOTCL] Failed. Select a Geometry Object and try again." msgstr "" -#: FlatCAMApp.py:3402 FlatCAMApp.py:3427 +#: FlatCAMApp.py:3401 FlatCAMApp.py:3426 #, python-format msgid "[ERROR_NOTCL] Expected a FlatCAMGeometry, got %s" msgstr "" -#: FlatCAMApp.py:3415 +#: FlatCAMApp.py:3414 msgid "[success] A Geometry object was converted to MultiGeo type." msgstr "" -#: FlatCAMApp.py:3441 +#: FlatCAMApp.py:3440 msgid "[success] A Geometry object was converted to SingleGeo type." msgstr "" -#: FlatCAMApp.py:3588 FlatCAMApp.py:4353 FlatCAMApp.py:5829 FlatCAMApp.py:5840 -#: FlatCAMApp.py:6026 FlatCAMApp.py:6036 +#: FlatCAMApp.py:3587 FlatCAMApp.py:4352 FlatCAMApp.py:5824 FlatCAMApp.py:5835 +#: FlatCAMApp.py:6021 FlatCAMApp.py:6031 msgid "Ok" msgstr "" -#: FlatCAMApp.py:3629 +#: FlatCAMApp.py:3628 #, python-format msgid "[success] Converted units to %s" msgstr "" -#: FlatCAMApp.py:3640 +#: FlatCAMApp.py:3639 msgid "[WARNING_NOTCL] Units conversion cancelled." msgstr "" -#: FlatCAMApp.py:4222 +#: FlatCAMApp.py:4221 msgid "Open file" msgstr "" -#: FlatCAMApp.py:4253 FlatCAMApp.py:4258 +#: FlatCAMApp.py:4252 FlatCAMApp.py:4257 msgid "Export G-Code ..." msgstr "" -#: FlatCAMApp.py:4261 +#: FlatCAMApp.py:4260 msgid "[WARNING_NOTCL] Export Code cancelled." msgstr "" -#: FlatCAMApp.py:4271 +#: FlatCAMApp.py:4270 msgid "[WARNING] No such file or directory" msgstr "" -#: FlatCAMApp.py:4278 +#: FlatCAMApp.py:4277 #, python-format msgid "Saved to: %s" msgstr "" -#: FlatCAMApp.py:4341 FlatCAMApp.py:4374 FlatCAMApp.py:4385 FlatCAMApp.py:4396 -#: flatcamTools/ToolNonCopperClear.py:488 flatcamTools/ToolSolderPaste.py:764 +#: FlatCAMApp.py:4340 FlatCAMApp.py:4373 FlatCAMApp.py:4384 FlatCAMApp.py:4395 +#: flatcamTools/ToolNonCopperClear.py:489 flatcamTools/ToolSolderPaste.py:765 msgid "" "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float " "format." msgstr "" -#: FlatCAMApp.py:4346 FlatCAMApp.py:4379 FlatCAMApp.py:4390 FlatCAMApp.py:4401 -#: flatcamGUI/FlatCAMGUI.py:2891 +#: FlatCAMApp.py:4345 FlatCAMApp.py:4378 FlatCAMApp.py:4389 FlatCAMApp.py:4400 +#: flatcamGUI/FlatCAMGUI.py:2959 msgid "[WARNING_NOTCL] Adding Tool cancelled ..." msgstr "" -#: FlatCAMApp.py:4349 +#: FlatCAMApp.py:4348 msgid "" "Adding Tool works only when Advanced is checked.\n" "Go to Preferences -> General - Show Advanced Options." msgstr "" -#: FlatCAMApp.py:4455 +#: FlatCAMApp.py:4454 msgid "Object(s) deleted ..." msgstr "" -#: FlatCAMApp.py:4459 +#: FlatCAMApp.py:4458 msgid "Failed. No object(s) selected..." msgstr "" -#: FlatCAMApp.py:4461 +#: FlatCAMApp.py:4460 msgid "Save the work in Editor and try again ..." msgstr "" -#: FlatCAMApp.py:4474 +#: FlatCAMApp.py:4473 msgid "Click to set the origin ..." msgstr "" -#: FlatCAMApp.py:4487 +#: FlatCAMApp.py:4485 msgid "Jump to ..." msgstr "" -#: FlatCAMApp.py:4488 +#: FlatCAMApp.py:4486 msgid "Enter the coordinates in format X,Y:" msgstr "" -#: FlatCAMApp.py:4495 +#: FlatCAMApp.py:4493 msgid "Wrong coordinates. Enter coordinates in format: X,Y" msgstr "" -#: FlatCAMApp.py:4513 -msgid "Done." +#: FlatCAMApp.py:4511 flatcamEditors/FlatCAMGeoEditor.py:3413 +#: flatcamEditors/FlatCAMGrbEditor.py:790 +#: flatcamEditors/FlatCAMGrbEditor.py:885 +#: flatcamEditors/FlatCAMGrbEditor.py:1122 +#: flatcamEditors/FlatCAMGrbEditor.py:1343 +#: flatcamEditors/FlatCAMGrbEditor.py:3235 +#: flatcamEditors/FlatCAMGrbEditor.py:3248 flatcamGUI/FlatCAMGUI.py:2373 +#: flatcamGUI/FlatCAMGUI.py:2385 +msgid "[success] Done." msgstr "" -#: FlatCAMApp.py:4672 +#: FlatCAMApp.py:4670 msgid "[success] Origin set ..." msgstr "" -#: FlatCAMApp.py:4690 +#: FlatCAMApp.py:4688 msgid "Preferences" msgstr "" -#: FlatCAMApp.py:4710 +#: FlatCAMApp.py:4708 msgid "[WARNING_NOTCL] No object selected to Flip on Y axis." msgstr "" -#: FlatCAMApp.py:4735 +#: FlatCAMApp.py:4733 msgid "[success] Flip on Y axis done." msgstr "" -#: FlatCAMApp.py:4737 FlatCAMApp.py:4777 -#: flatcamEditors/FlatCAMGeoEditor.py:1353 -#: flatcamEditors/FlatCAMGrbEditor.py:3522 flatcamTools/ToolTransform.py:750 +#: FlatCAMApp.py:4735 FlatCAMApp.py:4775 +#: flatcamEditors/FlatCAMGeoEditor.py:1354 +#: flatcamEditors/FlatCAMGrbEditor.py:4533 flatcamTools/ToolTransform.py:750 #, python-format msgid "[ERROR_NOTCL] Due of %s, Flip action was not executed." msgstr "" -#: FlatCAMApp.py:4750 +#: FlatCAMApp.py:4748 msgid "[WARNING_NOTCL] No object selected to Flip on X axis." msgstr "" -#: FlatCAMApp.py:4775 +#: FlatCAMApp.py:4773 msgid "[success] Flip on X axis done." msgstr "" -#: FlatCAMApp.py:4790 +#: FlatCAMApp.py:4788 msgid "[WARNING_NOTCL] No object selected to Rotate." msgstr "" -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Transform" msgstr "" -#: FlatCAMApp.py:4793 FlatCAMApp.py:4838 FlatCAMApp.py:4869 +#: FlatCAMApp.py:4791 FlatCAMApp.py:4836 FlatCAMApp.py:4867 msgid "Enter the Angle value:" msgstr "" -#: FlatCAMApp.py:4823 +#: FlatCAMApp.py:4821 msgid "[success] Rotation done." msgstr "" -#: FlatCAMApp.py:4825 flatcamEditors/FlatCAMGeoEditor.py:1296 -#: flatcamEditors/FlatCAMGrbEditor.py:3465 flatcamTools/ToolTransform.py:678 +#: FlatCAMApp.py:4823 flatcamEditors/FlatCAMGeoEditor.py:1297 +#: flatcamEditors/FlatCAMGrbEditor.py:4476 flatcamTools/ToolTransform.py:678 #, python-format msgid "[ERROR_NOTCL] Due of %s, rotation movement was not executed." msgstr "" -#: FlatCAMApp.py:4836 +#: FlatCAMApp.py:4834 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on X axis." msgstr "" -#: FlatCAMApp.py:4857 +#: FlatCAMApp.py:4855 msgid "[success] Skew on X axis done." msgstr "" -#: FlatCAMApp.py:4867 +#: FlatCAMApp.py:4865 msgid "[WARNING_NOTCL] No object selected to Skew/Shear on Y axis." msgstr "" -#: FlatCAMApp.py:4888 +#: FlatCAMApp.py:4886 msgid "[success] Skew on Y axis done." msgstr "" -#: FlatCAMApp.py:4984 FlatCAMApp.py:5011 +#: FlatCAMApp.py:4982 FlatCAMApp.py:5009 msgid "" "[WARNING_NOTCL] Please enter a grid value with non-zero value, in Float " "format." msgstr "" -#: FlatCAMApp.py:4990 +#: FlatCAMApp.py:4988 msgid "[success] New Grid added ..." msgstr "" -#: FlatCAMApp.py:4993 +#: FlatCAMApp.py:4991 msgid "[WARNING_NOTCL] Grid already exists ..." msgstr "" -#: FlatCAMApp.py:4996 +#: FlatCAMApp.py:4994 msgid "[WARNING_NOTCL] Adding New Grid cancelled ..." msgstr "" -#: FlatCAMApp.py:5018 +#: FlatCAMApp.py:5016 msgid "[ERROR_NOTCL] Grid Value does not exist ..." msgstr "" -#: FlatCAMApp.py:5021 +#: FlatCAMApp.py:5019 msgid "[success] Grid Value deleted ..." msgstr "" -#: FlatCAMApp.py:5024 +#: FlatCAMApp.py:5022 msgid "[WARNING_NOTCL] Delete Grid value cancelled ..." msgstr "" -#: FlatCAMApp.py:5063 +#: FlatCAMApp.py:5061 msgid "[WARNING_NOTCL] No object selected to copy it's name" msgstr "" -#: FlatCAMApp.py:5067 +#: FlatCAMApp.py:5065 msgid "Name copied on clipboard ..." msgstr "" -#: FlatCAMApp.py:5362 FlatCAMApp.py:5365 FlatCAMApp.py:5368 FlatCAMApp.py:5371 -#: FlatCAMApp.py:5385 FlatCAMApp.py:5388 FlatCAMApp.py:5391 FlatCAMApp.py:5394 -#: FlatCAMApp.py:5433 FlatCAMApp.py:5436 FlatCAMApp.py:5439 FlatCAMApp.py:5442 +#: FlatCAMApp.py:5357 FlatCAMApp.py:5360 FlatCAMApp.py:5363 FlatCAMApp.py:5366 +#: FlatCAMApp.py:5380 FlatCAMApp.py:5383 FlatCAMApp.py:5386 FlatCAMApp.py:5389 +#: FlatCAMApp.py:5428 FlatCAMApp.py:5431 FlatCAMApp.py:5434 FlatCAMApp.py:5437 #: ObjectCollection.py:711 ObjectCollection.py:714 ObjectCollection.py:717 #: ObjectCollection.py:720 #, python-brace-format msgid "[selected]{name} selected" msgstr "" -#: FlatCAMApp.py:5559 +#: FlatCAMApp.py:5554 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 "" -#: FlatCAMApp.py:5580 +#: FlatCAMApp.py:5575 msgid "[success] New Project created..." msgstr "" -#: FlatCAMApp.py:5688 FlatCAMApp.py:5691 flatcamGUI/FlatCAMGUI.py:594 -#: flatcamGUI/FlatCAMGUI.py:1762 +#: FlatCAMApp.py:5683 FlatCAMApp.py:5686 flatcamGUI/FlatCAMGUI.py:600 +#: flatcamGUI/FlatCAMGUI.py:1806 msgid "Open Gerber" msgstr "" -#: FlatCAMApp.py:5696 +#: FlatCAMApp.py:5691 msgid "[WARNING_NOTCL] Open Gerber cancelled." msgstr "" -#: FlatCAMApp.py:5717 FlatCAMApp.py:5720 flatcamGUI/FlatCAMGUI.py:595 -#: flatcamGUI/FlatCAMGUI.py:1763 +#: FlatCAMApp.py:5712 FlatCAMApp.py:5715 flatcamGUI/FlatCAMGUI.py:601 +#: flatcamGUI/FlatCAMGUI.py:1807 msgid "Open Excellon" msgstr "" -#: FlatCAMApp.py:5725 +#: FlatCAMApp.py:5720 msgid "[WARNING_NOTCL] Open Excellon cancelled." msgstr "" -#: FlatCAMApp.py:5747 FlatCAMApp.py:5750 +#: FlatCAMApp.py:5742 FlatCAMApp.py:5745 msgid "Open G-Code" msgstr "" -#: FlatCAMApp.py:5755 +#: FlatCAMApp.py:5750 msgid "[WARNING_NOTCL] Open G-Code cancelled." msgstr "" -#: FlatCAMApp.py:5773 FlatCAMApp.py:5776 +#: FlatCAMApp.py:5768 FlatCAMApp.py:5771 msgid "Open Project" msgstr "" -#: FlatCAMApp.py:5784 +#: FlatCAMApp.py:5779 msgid "[WARNING_NOTCL] Open Project cancelled." msgstr "" -#: FlatCAMApp.py:5803 FlatCAMApp.py:5806 +#: FlatCAMApp.py:5798 FlatCAMApp.py:5801 msgid "Open Configuration File" msgstr "" -#: FlatCAMApp.py:5810 +#: FlatCAMApp.py:5805 msgid "[WARNING_NOTCL Open Config cancelled." msgstr "" -#: FlatCAMApp.py:5825 FlatCAMApp.py:6022 FlatCAMApp.py:8105 FlatCAMApp.py:8125 -#: FlatCAMApp.py:8146 FlatCAMApp.py:8168 +#: FlatCAMApp.py:5820 FlatCAMApp.py:6017 FlatCAMApp.py:8103 FlatCAMApp.py:8123 +#: FlatCAMApp.py:8144 FlatCAMApp.py:8166 msgid "[WARNING_NOTCL] No object selected." msgstr "" -#: FlatCAMApp.py:5826 FlatCAMApp.py:6023 +#: FlatCAMApp.py:5821 FlatCAMApp.py:6018 msgid "Please Select a Geometry object to export" msgstr "" -#: FlatCAMApp.py:5837 +#: FlatCAMApp.py:5832 msgid "[ERROR_NOTCL] Only Geometry, Gerber and CNCJob objects can be used." msgstr "" -#: FlatCAMApp.py:5850 FlatCAMApp.py:5854 +#: FlatCAMApp.py:5845 FlatCAMApp.py:5849 msgid "Export SVG" msgstr "" -#: FlatCAMApp.py:5859 +#: FlatCAMApp.py:5854 msgid "[WARNING_NOTCL] Export SVG cancelled." msgstr "" -#: FlatCAMApp.py:5873 +#: FlatCAMApp.py:5868 msgid "[[WARNING_NOTCL]] Data must be a 3D array with last dimension 3 or 4" msgstr "" -#: FlatCAMApp.py:5879 FlatCAMApp.py:5883 +#: FlatCAMApp.py:5874 FlatCAMApp.py:5878 msgid "Export PNG Image" msgstr "" -#: FlatCAMApp.py:5888 +#: FlatCAMApp.py:5883 msgid "Export PNG cancelled." msgstr "" -#: FlatCAMApp.py:5905 +#: FlatCAMApp.py:5900 msgid "" "[WARNING_NOTCL] No object selected. Please select an Gerber object to export." msgstr "" -#: FlatCAMApp.py:5910 +#: FlatCAMApp.py:5905 msgid "" "[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files..." msgstr "" -#: FlatCAMApp.py:5922 +#: FlatCAMApp.py:5917 msgid "Save Gerber source file" msgstr "" -#: FlatCAMApp.py:5927 +#: FlatCAMApp.py:5922 msgid "[WARNING_NOTCL] Save Gerber source file cancelled." msgstr "" -#: FlatCAMApp.py:5944 +#: FlatCAMApp.py:5939 msgid "" "[WARNING_NOTCL] No object selected. Please select an Excellon object to " "export." msgstr "" -#: FlatCAMApp.py:5949 FlatCAMApp.py:5988 +#: FlatCAMApp.py:5944 FlatCAMApp.py:5983 msgid "" "[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files..." msgstr "" -#: FlatCAMApp.py:5957 FlatCAMApp.py:5961 +#: FlatCAMApp.py:5952 FlatCAMApp.py:5956 msgid "Save Excellon source file" msgstr "" -#: FlatCAMApp.py:5966 +#: FlatCAMApp.py:5961 msgid "[WARNING_NOTCL] Saving Excellon source file cancelled." msgstr "" -#: FlatCAMApp.py:5983 +#: FlatCAMApp.py:5978 msgid "" "[WARNING_NOTCL] No object selected. Please Select an Excellon object to " "export." msgstr "" -#: FlatCAMApp.py:5996 FlatCAMApp.py:6000 +#: FlatCAMApp.py:5991 FlatCAMApp.py:5995 msgid "Export Excellon" msgstr "" -#: FlatCAMApp.py:6005 +#: FlatCAMApp.py:6000 msgid "[WARNING_NOTCL] Export Excellon cancelled." msgstr "" -#: FlatCAMApp.py:6033 +#: FlatCAMApp.py:6028 msgid "[ERROR_NOTCL] Only Geometry objects can be used." msgstr "" -#: FlatCAMApp.py:6047 FlatCAMApp.py:6051 +#: FlatCAMApp.py:6042 FlatCAMApp.py:6046 msgid "Export DXF" msgstr "" -#: FlatCAMApp.py:6056 +#: FlatCAMApp.py:6051 msgid "[WARNING_NOTCL] Export DXF cancelled." msgstr "" -#: FlatCAMApp.py:6074 FlatCAMApp.py:6077 +#: FlatCAMApp.py:6069 FlatCAMApp.py:6072 msgid "Import SVG" msgstr "" -#: FlatCAMApp.py:6085 +#: FlatCAMApp.py:6080 msgid "[WARNING_NOTCL] Open SVG cancelled." msgstr "" -#: FlatCAMApp.py:6104 FlatCAMApp.py:6107 +#: FlatCAMApp.py:6099 FlatCAMApp.py:6102 msgid "Import DXF" msgstr "" -#: FlatCAMApp.py:6115 +#: FlatCAMApp.py:6110 msgid "[WARNING_NOTCL] Open DXF cancelled." msgstr "" -#: FlatCAMApp.py:6133 +#: FlatCAMApp.py:6128 #, python-format msgid "%s" msgstr "" -#: FlatCAMApp.py:6153 +#: FlatCAMApp.py:6148 msgid "" "[WARNING_NOTCL] Select an Gerber or Excellon file to view it's source file." msgstr "" -#: FlatCAMApp.py:6160 +#: FlatCAMApp.py:6155 msgid "" "[WARNING_NOTCL] There is no selected object for which to see it's source " "file code." msgstr "" -#: FlatCAMApp.py:6168 +#: FlatCAMApp.py:6163 msgid "Source Editor" msgstr "" -#: FlatCAMApp.py:6178 +#: FlatCAMApp.py:6173 #, python-format msgid "[ERROR]App.on_view_source() -->%s" msgstr "" -#: FlatCAMApp.py:6190 FlatCAMApp.py:7211 FlatCAMObj.py:5257 +#: FlatCAMApp.py:6185 FlatCAMApp.py:7206 FlatCAMObj.py:5259 msgid "Code Editor" msgstr "" -#: FlatCAMApp.py:6202 +#: FlatCAMApp.py:6197 msgid "Script Editor" msgstr "" -#: FlatCAMApp.py:6205 +#: FlatCAMApp.py:6200 msgid "" "#\n" "# CREATE A NEW FLATCAM TCL SCRIPT\n" @@ -662,203 +670,204 @@ msgid "" "\n" msgstr "" -#: FlatCAMApp.py:6228 FlatCAMApp.py:6231 +#: FlatCAMApp.py:6223 FlatCAMApp.py:6226 msgid "Open TCL script" msgstr "" -#: FlatCAMApp.py:6239 +#: FlatCAMApp.py:6234 msgid "[WARNING_NOTCL] Open TCL script cancelled." msgstr "" -#: FlatCAMApp.py:6251 +#: FlatCAMApp.py:6246 #, python-format msgid "[ERROR]App.on_fileopenscript() -->%s" msgstr "" -#: FlatCAMApp.py:6277 FlatCAMApp.py:6280 +#: FlatCAMApp.py:6272 FlatCAMApp.py:6275 msgid "Run TCL script" msgstr "" -#: FlatCAMApp.py:6288 +#: FlatCAMApp.py:6283 msgid "[WARNING_NOTCL] Run TCL script cancelled." msgstr "" -#: FlatCAMApp.py:6334 FlatCAMApp.py:6338 +#: FlatCAMApp.py:6329 FlatCAMApp.py:6333 msgid "Save Project As ..." msgstr "" -#: FlatCAMApp.py:6335 +#: FlatCAMApp.py:6330 #, python-brace-format msgid "{l_save}/Project_{date}" msgstr "" -#: FlatCAMApp.py:6343 +#: FlatCAMApp.py:6338 msgid "[WARNING_NOTCL] Save Project cancelled." msgstr "" -#: FlatCAMApp.py:6388 +#: FlatCAMApp.py:6383 msgid "Exporting SVG" msgstr "" -#: FlatCAMApp.py:6421 FlatCAMApp.py:6526 FlatCAMApp.py:6640 +#: FlatCAMApp.py:6416 FlatCAMApp.py:6521 FlatCAMApp.py:6635 #, python-format msgid "[success] SVG file exported to %s" msgstr "" -#: FlatCAMApp.py:6452 FlatCAMApp.py:6572 +#: FlatCAMApp.py:6447 FlatCAMApp.py:6567 #, python-format msgid "[WARNING_NOTCL] No object Box. Using instead %s" msgstr "" -#: FlatCAMApp.py:6529 FlatCAMApp.py:6643 +#: FlatCAMApp.py:6524 FlatCAMApp.py:6638 msgid "Generating Film ... Please wait." msgstr "" -#: FlatCAMApp.py:6790 +#: FlatCAMApp.py:6785 #, python-format msgid "[success] Excellon file exported to %s" msgstr "" -#: FlatCAMApp.py:6797 +#: FlatCAMApp.py:6792 msgid "Exporting Excellon" msgstr "" -#: FlatCAMApp.py:6802 FlatCAMApp.py:6809 +#: FlatCAMApp.py:6797 FlatCAMApp.py:6804 msgid "[ERROR_NOTCL] Could not export Excellon file." msgstr "" -#: FlatCAMApp.py:6848 +#: FlatCAMApp.py:6843 #, python-format msgid "[success] DXF file exported to %s" msgstr "" -#: FlatCAMApp.py:6854 +#: FlatCAMApp.py:6849 msgid "Exporting DXF" msgstr "" -#: FlatCAMApp.py:6859 FlatCAMApp.py:6866 +#: FlatCAMApp.py:6854 FlatCAMApp.py:6861 msgid "[[WARNING_NOTCL]] Could not export DXF file." msgstr "" -#: FlatCAMApp.py:6886 FlatCAMApp.py:6928 FlatCAMApp.py:6969 +#: FlatCAMApp.py:6881 FlatCAMApp.py:6923 FlatCAMApp.py:6964 msgid "" "[ERROR_NOTCL] Not supported type is picked as parameter. Only Geometry and " "Gerber are supported" msgstr "" -#: FlatCAMApp.py:6896 +#: FlatCAMApp.py:6891 msgid "Importing SVG" msgstr "" -#: FlatCAMApp.py:6907 FlatCAMApp.py:6949 FlatCAMApp.py:6989 FlatCAMApp.py:7065 -#: FlatCAMApp.py:7132 FlatCAMApp.py:7197 +#: FlatCAMApp.py:6902 FlatCAMApp.py:6944 FlatCAMApp.py:6984 FlatCAMApp.py:7060 +#: FlatCAMApp.py:7127 FlatCAMApp.py:7192 flatcamTools/ToolPDF.py:275 #, python-format msgid "[success] Opened: %s" msgstr "" -#: FlatCAMApp.py:6938 +#: FlatCAMApp.py:6933 msgid "Importing DXF" msgstr "" -#: FlatCAMApp.py:6977 +#: FlatCAMApp.py:6972 msgid "Importing Image" msgstr "" -#: FlatCAMApp.py:7018 FlatCAMApp.py:7020 +#: FlatCAMApp.py:7013 FlatCAMApp.py:7015 #, python-format msgid "[ERROR_NOTCL] Failed to open file: %s" msgstr "" -#: FlatCAMApp.py:7023 +#: FlatCAMApp.py:7018 #, python-brace-format msgid "[ERROR_NOTCL] Failed to parse file: {name}. {error}" msgstr "" -#: FlatCAMApp.py:7029 FlatCAMObj.py:3961 -#: flatcamEditors/FlatCAMExcEditor.py:1927 -#: flatcamEditors/FlatCAMGrbEditor.py:2061 +#: FlatCAMApp.py:7024 FlatCAMObj.py:3963 +#: flatcamEditors/FlatCAMExcEditor.py:1977 +#: flatcamEditors/FlatCAMGrbEditor.py:3018 msgid "[ERROR] An internal error has ocurred. See shell.\n" msgstr "" -#: FlatCAMApp.py:7038 +#: FlatCAMApp.py:7033 msgid "" "[ERROR_NOTCL] Object is not Gerber file or empty. Aborting object creation." msgstr "" -#: FlatCAMApp.py:7046 +#: FlatCAMApp.py:7041 msgid "Opening Gerber" msgstr "" -#: FlatCAMApp.py:7056 +#: FlatCAMApp.py:7051 msgid "[ERROR_NOTCL] Open Gerber failed. Probable not a Gerber file." msgstr "" -#: FlatCAMApp.py:7091 +#: FlatCAMApp.py:7086 flatcamTools/ToolPcbWizard.py:421 msgid "[ERROR_NOTCL] This is not Excellon file." msgstr "" -#: FlatCAMApp.py:7094 +#: FlatCAMApp.py:7089 #, python-format msgid "[ERROR_NOTCL] Cannot open file: %s" msgstr "" -#: FlatCAMApp.py:7099 +#: FlatCAMApp.py:7094 flatcamTools/ToolPcbWizard.py:429 msgid "[ERROR_NOTCL] An internal error has occurred. See shell.\n" msgstr "" -#: FlatCAMApp.py:7115 +#: FlatCAMApp.py:7110 flatcamTools/ToolPDF.py:238 +#: flatcamTools/ToolPcbWizard.py:442 #, python-format msgid "[ERROR_NOTCL] No geometry found in file: %s" msgstr "" -#: FlatCAMApp.py:7118 +#: FlatCAMApp.py:7113 msgid "Opening Excellon." msgstr "" -#: FlatCAMApp.py:7125 +#: FlatCAMApp.py:7120 msgid "[ERROR_NOTCL] Open Excellon file failed. Probable not an Excellon file." msgstr "" -#: FlatCAMApp.py:7164 +#: FlatCAMApp.py:7159 #, python-format msgid "[ERROR_NOTCL] Failed to open %s" msgstr "" -#: FlatCAMApp.py:7174 +#: FlatCAMApp.py:7169 msgid "[ERROR_NOTCL] This is not GCODE" msgstr "" -#: FlatCAMApp.py:7180 +#: FlatCAMApp.py:7175 msgid "Opening G-Code." msgstr "" -#: FlatCAMApp.py:7188 +#: FlatCAMApp.py:7183 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 "" -#: FlatCAMApp.py:7228 +#: FlatCAMApp.py:7223 #, python-format msgid "[ERROR_NOTCL] Failed to open config file: %s" msgstr "" -#: FlatCAMApp.py:7253 FlatCAMApp.py:7269 +#: FlatCAMApp.py:7248 FlatCAMApp.py:7264 #, python-format msgid "[ERROR_NOTCL] Failed to open project file: %s" msgstr "" -#: FlatCAMApp.py:7295 +#: FlatCAMApp.py:7290 #, python-format msgid "[success] Project loaded from: %s" msgstr "" -#: FlatCAMApp.py:7425 +#: FlatCAMApp.py:7420 msgid "Available commands:\n" msgstr "" -#: FlatCAMApp.py:7427 +#: FlatCAMApp.py:7422 msgid "" "\n" "\n" @@ -866,23 +875,23 @@ msgid "" " Example: help open_gerber" msgstr "" -#: FlatCAMApp.py:7575 +#: FlatCAMApp.py:7570 msgid "Shows list of commands." msgstr "" -#: FlatCAMApp.py:7628 +#: FlatCAMApp.py:7626 msgid "[ERROR_NOTCL] Failed to load recent item list." msgstr "" -#: FlatCAMApp.py:7635 +#: FlatCAMApp.py:7633 msgid "[ERROR_NOTCL] Failed to parse recent item list." msgstr "" -#: FlatCAMApp.py:7696 flatcamGUI/FlatCAMGUI.py:929 +#: FlatCAMApp.py:7694 flatcamGUI/FlatCAMGUI.py:941 msgid "Shortcut Key List" msgstr "" -#: FlatCAMApp.py:7703 +#: FlatCAMApp.py:7701 msgid "" "\n" "

Selected Tab - Choose an Item from " @@ -932,64 +941,64 @@ msgid "" " " msgstr "" -#: FlatCAMApp.py:7807 +#: FlatCAMApp.py:7805 msgid "[WARNING_NOTCL] Failed checking for latest version. Could not connect." msgstr "" -#: FlatCAMApp.py:7814 +#: FlatCAMApp.py:7812 msgid "[ERROR_NOTCL] Could not parse information about latest version." msgstr "" -#: FlatCAMApp.py:7824 +#: FlatCAMApp.py:7822 msgid "[success] FlatCAM is up to date!" msgstr "" -#: FlatCAMApp.py:7829 +#: FlatCAMApp.py:7827 msgid "Newer Version Available" msgstr "" -#: FlatCAMApp.py:7830 +#: FlatCAMApp.py:7828 msgid "" "There is a newer version of FlatCAM available for download:\n" "\n" msgstr "" -#: FlatCAMApp.py:7832 +#: FlatCAMApp.py:7830 msgid "info" msgstr "" -#: FlatCAMApp.py:7851 +#: FlatCAMApp.py:7849 msgid "[success] All plots disabled." msgstr "" -#: FlatCAMApp.py:7857 +#: FlatCAMApp.py:7855 msgid "[success] All non selected plots disabled." msgstr "" -#: FlatCAMApp.py:7863 +#: FlatCAMApp.py:7861 msgid "[success] All plots enabled." msgstr "" -#: FlatCAMApp.py:7974 +#: FlatCAMApp.py:7972 msgid "Saving FlatCAM Project" msgstr "" -#: FlatCAMApp.py:7995 FlatCAMApp.py:8026 +#: FlatCAMApp.py:7993 FlatCAMApp.py:8024 #, python-format msgid "[success] Project saved to: %s" msgstr "" -#: FlatCAMApp.py:8013 +#: FlatCAMApp.py:8011 #, python-format msgid "[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." msgstr "" -#: FlatCAMApp.py:8020 +#: FlatCAMApp.py:8018 #, python-format msgid "[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." msgstr "" -#: FlatCAMApp.py:8028 +#: FlatCAMApp.py:8026 #, python-format msgid "[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." msgstr "" @@ -999,11 +1008,11 @@ msgstr "" msgid "[success] Name changed from {old} to {new}" msgstr "" -#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5156 +#: FlatCAMObj.py:535 FlatCAMObj.py:1741 FlatCAMObj.py:3006 FlatCAMObj.py:5158 msgid "Basic" msgstr "" -#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5162 +#: FlatCAMObj.py:547 FlatCAMObj.py:1757 FlatCAMObj.py:3028 FlatCAMObj.py:5164 msgid "Advanced" msgstr "" @@ -1016,32 +1025,32 @@ msgstr "" msgid "Plotting Apertures" msgstr "" -#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1293 +#: FlatCAMObj.py:1580 flatcamEditors/FlatCAMExcEditor.py:1327 msgid "Total Drills" msgstr "" -#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1325 +#: FlatCAMObj.py:1606 flatcamEditors/FlatCAMExcEditor.py:1359 msgid "Total Slots" msgstr "" -#: FlatCAMObj.py:1813 FlatCAMObj.py:3078 FlatCAMObj.py:3384 FlatCAMObj.py:3571 -#: FlatCAMObj.py:3584 FlatCAMObj.py:3701 FlatCAMObj.py:4109 FlatCAMObj.py:4342 -#: FlatCAMObj.py:4748 flatcamEditors/FlatCAMExcEditor.py:1400 +#: FlatCAMObj.py:1813 FlatCAMObj.py:3079 FlatCAMObj.py:3386 FlatCAMObj.py:3573 +#: FlatCAMObj.py:3586 FlatCAMObj.py:3703 FlatCAMObj.py:4111 FlatCAMObj.py:4344 +#: FlatCAMObj.py:4750 flatcamEditors/FlatCAMExcEditor.py:1434 #: flatcamTools/ToolCalculators.py:307 flatcamTools/ToolCalculators.py:318 #: flatcamTools/ToolCalculators.py:330 flatcamTools/ToolCalculators.py:345 #: flatcamTools/ToolCalculators.py:358 flatcamTools/ToolCalculators.py:372 #: flatcamTools/ToolCalculators.py:383 flatcamTools/ToolCalculators.py:394 #: flatcamTools/ToolCalculators.py:405 flatcamTools/ToolFilm.py:241 -#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:479 -#: flatcamTools/ToolNonCopperClear.py:550 -#: flatcamTools/ToolNonCopperClear.py:626 -#: flatcamTools/ToolNonCopperClear.py:643 flatcamTools/ToolPaint.py:537 -#: flatcamTools/ToolPaint.py:607 flatcamTools/ToolPaint.py:742 -#: flatcamTools/ToolPaint.py:839 flatcamTools/ToolPaint.py:994 +#: flatcamTools/ToolFilm.py:248 flatcamTools/ToolNonCopperClear.py:480 +#: flatcamTools/ToolNonCopperClear.py:551 +#: flatcamTools/ToolNonCopperClear.py:627 +#: flatcamTools/ToolNonCopperClear.py:644 flatcamTools/ToolPaint.py:538 +#: flatcamTools/ToolPaint.py:608 flatcamTools/ToolPaint.py:743 +#: flatcamTools/ToolPaint.py:840 flatcamTools/ToolPaint.py:995 #: flatcamTools/ToolPanelize.py:323 flatcamTools/ToolPanelize.py:335 #: flatcamTools/ToolPanelize.py:348 flatcamTools/ToolPanelize.py:361 #: flatcamTools/ToolPanelize.py:373 flatcamTools/ToolPanelize.py:384 -#: flatcamTools/ToolSolderPaste.py:755 flatcamTools/ToolSolderPaste.py:826 +#: flatcamTools/ToolSolderPaste.py:756 flatcamTools/ToolSolderPaste.py:827 msgid "[ERROR_NOTCL] Wrong value format entered, use a number." msgstr "" @@ -1060,10 +1069,10 @@ msgid "Tool_nr" msgstr "" #: FlatCAMObj.py:2058 FlatCAMObj.py:2152 FlatCAMObj.py:2263 -#: flatcamEditors/FlatCAMExcEditor.py:753 -#: flatcamEditors/FlatCAMExcEditor.py:1870 flatcamGUI/ObjectUI.py:556 +#: flatcamEditors/FlatCAMExcEditor.py:781 +#: flatcamEditors/FlatCAMExcEditor.py:1920 flatcamGUI/ObjectUI.py:556 #: flatcamTools/ToolNonCopperClear.py:83 flatcamTools/ToolPaint.py:80 -#: flatcamTools/ToolSolderPaste.py:81 +#: flatcamTools/ToolPcbWizard.py:78 flatcamTools/ToolSolderPaste.py:81 msgid "Diameter" msgstr "" @@ -1080,31 +1089,31 @@ msgid "" "[ERROR_NOTCL] Milling tool for SLOTS is larger than hole size. Cancelled." msgstr "" -#: FlatCAMObj.py:2303 FlatCAMObj.py:3997 FlatCAMObj.py:4208 FlatCAMObj.py:4523 +#: FlatCAMObj.py:2303 FlatCAMObj.py:3999 FlatCAMObj.py:4210 FlatCAMObj.py:4525 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"z_pdepth\"] or self." "options[\"z_pdepth\"]" msgstr "" -#: FlatCAMObj.py:2315 FlatCAMObj.py:4009 FlatCAMObj.py:4220 FlatCAMObj.py:4535 +#: FlatCAMObj.py:2315 FlatCAMObj.py:4011 FlatCAMObj.py:4222 FlatCAMObj.py:4537 msgid "" "[ERROR_NOTCL] Wrong value format for self.defaults[\"feedrate_probe\"] or " "self.options[\"feedrate_probe\"]" msgstr "" -#: FlatCAMObj.py:2347 FlatCAMObj.py:4410 FlatCAMObj.py:4415 FlatCAMObj.py:4561 +#: FlatCAMObj.py:2347 FlatCAMObj.py:4412 FlatCAMObj.py:4417 FlatCAMObj.py:4563 msgid "Generating CNC Code" msgstr "" -#: FlatCAMObj.py:2373 FlatCAMObj.py:4707 camlib.py:5141 camlib.py:5577 -#: camlib.py:5848 +#: FlatCAMObj.py:2373 FlatCAMObj.py:4709 camlib.py:5204 camlib.py:5653 +#: camlib.py:5924 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 "" -#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3247 +#: FlatCAMObj.py:2720 FlatCAMObj.py:2962 FlatCAMObj.py:3249 msgid "Path" msgstr "" @@ -1116,15 +1125,15 @@ msgstr "" msgid "Out" msgstr "" -#: FlatCAMObj.py:2720 FlatCAMObj.py:3043 FlatCAMObj.py:3616 +#: FlatCAMObj.py:2720 FlatCAMObj.py:3044 FlatCAMObj.py:3618 msgid "Custom" msgstr "" -#: FlatCAMObj.py:2721 FlatCAMObj.py:3627 FlatCAMObj.py:3628 FlatCAMObj.py:3637 +#: FlatCAMObj.py:2721 FlatCAMObj.py:3629 FlatCAMObj.py:3630 FlatCAMObj.py:3639 msgid "Iso" msgstr "" -#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3249 +#: FlatCAMObj.py:2721 FlatCAMObj.py:2964 FlatCAMObj.py:3251 msgid "Rough" msgstr "" @@ -1132,150 +1141,151 @@ msgstr "" msgid "Finish" msgstr "" -#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:512 flatcamGUI/FlatCAMGUI.py:698 -#: flatcamGUI/FlatCAMGUI.py:1536 flatcamGUI/FlatCAMGUI.py:1546 -#: flatcamGUI/FlatCAMGUI.py:1870 flatcamGUI/ObjectUI.py:996 +#: FlatCAMObj.py:2999 flatcamGUI/FlatCAMGUI.py:518 flatcamGUI/FlatCAMGUI.py:710 +#: flatcamGUI/FlatCAMGUI.py:1580 flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1914 flatcamGUI/ObjectUI.py:996 msgid "Copy" msgstr "" -#: FlatCAMObj.py:3001 flatcamGUI/FlatCAMGUI.py:513 flatcamGUI/FlatCAMGUI.py:700 -#: flatcamGUI/FlatCAMGUI.py:1537 flatcamGUI/FlatCAMGUI.py:1547 -#: flatcamGUI/FlatCAMGUI.py:1872 flatcamGUI/ObjectUI.py:1004 +#: FlatCAMObj.py:3001 flatcamEditors/FlatCAMGrbEditor.py:1825 +#: flatcamGUI/FlatCAMGUI.py:519 flatcamGUI/FlatCAMGUI.py:712 +#: flatcamGUI/FlatCAMGUI.py:1581 flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1916 flatcamGUI/ObjectUI.py:1004 #: flatcamTools/ToolNonCopperClear.py:146 flatcamTools/ToolPaint.py:143 -#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:480 +#: flatcamTools/ToolSolderPaste.py:121 flatcamTools/ToolSolderPaste.py:481 msgid "Delete" msgstr "" -#: FlatCAMObj.py:3219 +#: FlatCAMObj.py:3221 msgid "[ERROR_NOTCL] Please enter the desired tool diameter in Float format." msgstr "" -#: FlatCAMObj.py:3294 +#: FlatCAMObj.py:3296 msgid "[success] Tool added in Tool Table." msgstr "" -#: FlatCAMObj.py:3299 +#: FlatCAMObj.py:3301 msgid "[ERROR_NOTCL] Default Tool added. Wrong value format entered." msgstr "" -#: FlatCAMObj.py:3329 FlatCAMObj.py:3339 +#: FlatCAMObj.py:3331 FlatCAMObj.py:3341 msgid "[WARNING_NOTCL] Failed. Select a tool to copy." msgstr "" -#: FlatCAMObj.py:3368 +#: FlatCAMObj.py:3370 msgid "[success] Tool was copied in Tool Table." msgstr "" -#: FlatCAMObj.py:3401 +#: FlatCAMObj.py:3403 msgid "[success] Tool was edited in Tool Table." msgstr "" -#: FlatCAMObj.py:3432 FlatCAMObj.py:3442 +#: FlatCAMObj.py:3434 FlatCAMObj.py:3444 msgid "[WARNING_NOTCL] Failed. Select a tool to delete." msgstr "" -#: FlatCAMObj.py:3466 +#: FlatCAMObj.py:3468 msgid "[success] Tool was deleted in Tool Table." msgstr "" -#: FlatCAMObj.py:3880 +#: FlatCAMObj.py:3882 #, python-format msgid "" "[WARNING_NOTCL] This Geometry can't be processed because it is %s geometry." msgstr "" -#: FlatCAMObj.py:3897 +#: FlatCAMObj.py:3899 msgid "[ERROR_NOTCL] Wrong Tool Dia value format entered, use a number." msgstr "" -#: FlatCAMObj.py:3924 +#: FlatCAMObj.py:3926 msgid "[ERROR_NOTCL] Failed. No tool selected in the tool table ..." msgstr "" -#: FlatCAMObj.py:3962 +#: FlatCAMObj.py:3964 #, python-format msgid "FlatCAMObj.FlatCAMGeometry.mtool_gen_cncjob() --> %s" msgstr "" -#: FlatCAMObj.py:4118 FlatCAMObj.py:4351 +#: FlatCAMObj.py:4120 FlatCAMObj.py:4353 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 "" -#: FlatCAMObj.py:4232 flatcamTools/ToolSolderPaste.py:1106 -#: flatcamTools/ToolSolderPaste.py:1161 +#: FlatCAMObj.py:4234 flatcamTools/ToolSolderPaste.py:1107 +#: flatcamTools/ToolSolderPaste.py:1162 msgid "[ERROR_NOTCL] Cancelled. Empty file, it has no geometry..." msgstr "" -#: FlatCAMObj.py:4594 FlatCAMObj.py:4604 camlib.py:3410 camlib.py:3419 +#: FlatCAMObj.py:4596 FlatCAMObj.py:4606 camlib.py:3426 camlib.py:3435 msgid "[ERROR_NOTCL] Scale factor has to be a number: integer or float." msgstr "" -#: FlatCAMObj.py:4642 +#: FlatCAMObj.py:4644 msgid "[success] Geometry Scale done." msgstr "" -#: FlatCAMObj.py:4659 camlib.py:3481 +#: FlatCAMObj.py:4661 camlib.py:3497 msgid "" "[ERROR_NOTCL] An (x,y) pair of values are needed. Probable you entered only " "one value in the Offset field." msgstr "" -#: FlatCAMObj.py:4679 +#: FlatCAMObj.py:4681 msgid "[success] Geometry Offset done." msgstr "" -#: FlatCAMObj.py:5224 FlatCAMObj.py:5229 flatcamTools/ToolSolderPaste.py:1360 +#: FlatCAMObj.py:5226 FlatCAMObj.py:5231 flatcamTools/ToolSolderPaste.py:1361 msgid "Export Machine Code ..." msgstr "" -#: FlatCAMObj.py:5235 flatcamTools/ToolSolderPaste.py:1363 +#: FlatCAMObj.py:5237 flatcamTools/ToolSolderPaste.py:1364 msgid "[WARNING_NOTCL] Export Machine Code cancelled ..." msgstr "" -#: FlatCAMObj.py:5246 +#: FlatCAMObj.py:5248 #, python-format msgid "[success] Machine Code file saved to: %s" msgstr "" -#: FlatCAMObj.py:5268 +#: FlatCAMObj.py:5270 #, python-format msgid "[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s" msgstr "" -#: FlatCAMObj.py:5385 +#: FlatCAMObj.py:5387 #, python-format msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed because it is a %s " "CNCJob object." msgstr "" -#: FlatCAMObj.py:5438 +#: FlatCAMObj.py:5440 msgid "[ERROR_NOTCL] G-code does not have a units code: either G20 or G21" msgstr "" -#: FlatCAMObj.py:5451 +#: FlatCAMObj.py:5453 msgid "" "[ERROR_NOTCL] Cancelled. The Toolchange Custom code is enabled but it's " "empty." msgstr "" -#: FlatCAMObj.py:5458 +#: FlatCAMObj.py:5460 msgid "[success] Toolchange G-code was replaced by a custom code." msgstr "" -#: FlatCAMObj.py:5473 flatcamTools/ToolSolderPaste.py:1389 +#: FlatCAMObj.py:5475 flatcamTools/ToolSolderPaste.py:1390 msgid "[WARNING_NOTCL] No such file or directory" msgstr "" -#: FlatCAMObj.py:5492 FlatCAMObj.py:5504 +#: FlatCAMObj.py:5494 FlatCAMObj.py:5506 msgid "" "[WARNING_NOTCL] The used postprocessor file has to have in it's name: " "'toolchange_custom'" msgstr "" -#: FlatCAMObj.py:5510 +#: FlatCAMObj.py:5512 msgid "[ERROR] There is no postprocessor file." msgstr "" @@ -1289,90 +1299,101 @@ msgstr "" msgid "[ERROR] Cause of error: %s" msgstr "" -#: camlib.py:200 +#: camlib.py:202 msgid "[ERROR_NOTCL] self.solid_geometry is neither BaseGeometry or list." msgstr "" -#: camlib.py:1387 +#: camlib.py:1389 msgid "[success] Object was mirrored ..." msgstr "" -#: camlib.py:1389 +#: camlib.py:1391 msgid "[ERROR_NOTCL] Failed to mirror. No object selected" msgstr "" -#: camlib.py:1425 +#: camlib.py:1427 msgid "[success] Object was rotated ..." msgstr "" -#: camlib.py:1427 +#: camlib.py:1429 msgid "[ERROR_NOTCL] Failed to rotate. No object selected" msgstr "" -#: camlib.py:1461 +#: camlib.py:1463 msgid "[success] Object was skewed ..." msgstr "" -#: camlib.py:1463 +#: camlib.py:1465 msgid "[ERROR_NOTCL] Failed to skew. No object selected" msgstr "" -#: camlib.py:2728 camlib.py:2832 +#: camlib.py:2733 camlib.py:2837 #, python-format msgid "[WARNING] Coordinates missing, line ignored: %s" msgstr "" -#: camlib.py:2729 camlib.py:2833 +#: camlib.py:2734 camlib.py:2838 msgid "[WARNING_NOTCL] GERBER file might be CORRUPT. Check the file !!!" msgstr "" -#: camlib.py:2787 +#: camlib.py:2792 #, python-format msgid "" "[ERROR] Region does not have enough points. File will be processed but there " "are parser errors. Line number: %s" msgstr "" -#: camlib.py:3231 +#: camlib.py:3247 #, python-format msgid "" "[ERROR]Gerber Parser ERROR.\n" "%s:" msgstr "" -#: camlib.py:3448 +#: camlib.py:3464 msgid "[success] Gerber Scale done." msgstr "" -#: camlib.py:3505 +#: camlib.py:3521 msgid "[success] Gerber Offset done." msgstr "" -#: camlib.py:3887 +#: camlib.py:3915 #, python-format msgid "[ERROR_NOTCL] This is GCODE mark: %s" msgstr "" -#: camlib.py:4431 +#: camlib.py:4029 +#, 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 "" + +#: camlib.py:4494 #, python-brace-format msgid "" "[ERROR] Excellon Parser error.\n" "Parsing Failed. Line {l_nr}: {line}\n" msgstr "" -#: camlib.py:4508 +#: camlib.py:4571 msgid "" "[WARNING] Excellon.create_geometry() -> a drill location was skipped due of " "not having a tool associated.\n" "Check the resulting GCode." msgstr "" -#: camlib.py:5050 +#: camlib.py:5113 #, python-format msgid "[ERROR] There is no such parameter: %s" msgstr "" -#: camlib.py:5120 +#: camlib.py:5183 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "drill into material.\n" @@ -1381,27 +1402,27 @@ msgid "" "CNC code (Gcode etc)." msgstr "" -#: camlib.py:5127 camlib.py:5600 camlib.py:5871 +#: camlib.py:5190 camlib.py:5676 camlib.py:5947 #, python-format msgid "" "[WARNING] The Cut Z parameter is zero. There will be no cut, skipping %s file" msgstr "" -#: camlib.py:5343 camlib.py:5438 camlib.py:5489 +#: camlib.py:5412 camlib.py:5507 camlib.py:5565 msgid "[ERROR_NOTCL] The loaded Excellon file has no drills ..." msgstr "" -#: camlib.py:5443 +#: camlib.py:5512 msgid "[ERROR_NOTCL] Wrong optimization type selected." msgstr "" -#: camlib.py:5588 camlib.py:5859 +#: camlib.py:5664 camlib.py:5935 msgid "" "[ERROR_NOTCL] Cut_Z parameter is None or zero. Most likely a bad " "combinations of other parameters." msgstr "" -#: camlib.py:5593 camlib.py:5864 +#: camlib.py:5669 camlib.py:5940 msgid "" "[WARNING] The Cut Z parameter has positive value. It is the depth value to " "cut into material.\n" @@ -1410,11 +1431,11 @@ msgid "" "code (Gcode etc)." msgstr "" -#: camlib.py:5605 camlib.py:5876 +#: camlib.py:5681 camlib.py:5952 msgid "[ERROR_NOTCL] Travel Z parameter is None or zero." msgstr "" -#: camlib.py:5609 camlib.py:5880 +#: camlib.py:5685 camlib.py:5956 msgid "" "[WARNING] The Travel Z parameter has negative value. It is the height value " "to travel between cuts.\n" @@ -1423,232 +1444,232 @@ msgid "" "code (Gcode etc)." msgstr "" -#: camlib.py:5616 camlib.py:5887 +#: camlib.py:5692 camlib.py:5963 #, python-format msgid "" "[WARNING] The Z Travel parameter is zero. This is dangerous, skipping %s file" msgstr "" -#: camlib.py:5746 +#: camlib.py:5822 #, python-format msgid "[ERROR]Expected a Geometry, got %s" msgstr "" -#: camlib.py:5752 +#: camlib.py:5828 msgid "" "[ERROR_NOTCL] Trying to generate a CNC Job from a Geometry object without " "solid_geometry." msgstr "" -#: camlib.py:5791 +#: camlib.py:5867 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 "" -#: camlib.py:6013 +#: camlib.py:6089 msgid "[ERROR_NOTCL] There is no tool data in the SolderPaste geometry." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:44 +#: flatcamEditors/FlatCAMExcEditor.py:46 msgid "[WARNING_NOTCL] To add a drill first select a tool" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:53 flatcamEditors/FlatCAMExcEditor.py:143 -#: flatcamEditors/FlatCAMExcEditor.py:420 -#: flatcamEditors/FlatCAMExcEditor.py:445 -#: flatcamEditors/FlatCAMGrbEditor.py:223 -#: flatcamEditors/FlatCAMGrbEditor.py:604 -#: flatcamEditors/FlatCAMGrbEditor.py:628 +#: flatcamEditors/FlatCAMExcEditor.py:62 flatcamEditors/FlatCAMExcEditor.py:164 +#: flatcamEditors/FlatCAMExcEditor.py:446 +#: flatcamEditors/FlatCAMExcEditor.py:471 +#: flatcamEditors/FlatCAMGrbEditor.py:287 +#: flatcamEditors/FlatCAMGrbEditor.py:1447 +#: flatcamEditors/FlatCAMGrbEditor.py:1471 msgid "Click on target location ..." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:93 +#: flatcamEditors/FlatCAMExcEditor.py:107 msgid "[success] Done. Drill added." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:135 +#: flatcamEditors/FlatCAMExcEditor.py:149 msgid "[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:160 +#: flatcamEditors/FlatCAMExcEditor.py:181 msgid "Click on the Drill Circular Array Start position" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:182 -#: flatcamEditors/FlatCAMGrbEditor.py:262 +#: flatcamEditors/FlatCAMExcEditor.py:203 +#: flatcamEditors/FlatCAMGrbEditor.py:330 msgid "" "[ERROR_NOTCL] The value is not Float. Check for comma instead of dot " "separator." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:185 -#: flatcamEditors/FlatCAMGrbEditor.py:265 +#: flatcamEditors/FlatCAMExcEditor.py:206 +#: flatcamEditors/FlatCAMGrbEditor.py:333 msgid "[ERROR_NOTCL] The value is mistyped. Check the value." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:278 +#: flatcamEditors/FlatCAMExcEditor.py:304 msgid "[WARNING_NOTCL] Too many drills for the selected spacing angle." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:295 +#: flatcamEditors/FlatCAMExcEditor.py:321 msgid "[success] Done. Drill Array added." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:306 +#: flatcamEditors/FlatCAMExcEditor.py:332 msgid "Click on the Drill(s) to resize ..." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:326 +#: flatcamEditors/FlatCAMExcEditor.py:352 msgid "" "[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:396 +#: flatcamEditors/FlatCAMExcEditor.py:422 msgid "[success] Done. Drill Resize completed." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:399 +#: flatcamEditors/FlatCAMExcEditor.py:425 msgid "[WARNING_NOTCL] Cancelled. No drills selected for resize ..." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:422 -#: flatcamEditors/FlatCAMGrbEditor.py:606 +#: flatcamEditors/FlatCAMExcEditor.py:448 +#: flatcamEditors/FlatCAMGrbEditor.py:1449 msgid "Click on reference location ..." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:477 +#: flatcamEditors/FlatCAMExcEditor.py:503 msgid "[success] Done. Drill(s) Move completed." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:530 +#: flatcamEditors/FlatCAMExcEditor.py:556 msgid "[success] Done. Drill(s) copied." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:712 +#: flatcamEditors/FlatCAMExcEditor.py:754 msgid "Excellon Editor" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:719 -#: flatcamEditors/FlatCAMGrbEditor.py:840 +#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMGrbEditor.py:1705 msgid "Name:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:739 flatcamTools/ToolNonCopperClear.py:72 +#: flatcamEditors/FlatCAMExcEditor.py:767 flatcamTools/ToolNonCopperClear.py:72 #: flatcamTools/ToolPaint.py:69 flatcamTools/ToolSolderPaste.py:70 msgid "Tools Table" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:741 flatcamGUI/ObjectUI.py:538 +#: flatcamEditors/FlatCAMExcEditor.py:769 flatcamGUI/ObjectUI.py:538 msgid "" "Tools in this Excellon object\n" "when are used for drilling." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:761 +#: flatcamEditors/FlatCAMExcEditor.py:789 msgid "Add/Delete Tool" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:763 +#: flatcamEditors/FlatCAMExcEditor.py:791 msgid "" "Add/Delete a tool to the tool list\n" "for this Excellon object." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:771 flatcamTools/ToolCutOut.py:77 +#: flatcamEditors/FlatCAMExcEditor.py:799 flatcamTools/ToolCutOut.py:77 msgid "Tool Dia:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:773 flatcamGUI/ObjectUI.py:975 +#: flatcamEditors/FlatCAMExcEditor.py:801 flatcamGUI/ObjectUI.py:975 msgid "Diameter for the new tool" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:782 +#: flatcamEditors/FlatCAMExcEditor.py:810 msgid "Add Tool" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:784 +#: flatcamEditors/FlatCAMExcEditor.py:812 msgid "" "Add a new tool to the tool list\n" "with the diameter specified above." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:794 +#: flatcamEditors/FlatCAMExcEditor.py:822 msgid "Delete Tool" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:796 +#: flatcamEditors/FlatCAMExcEditor.py:824 msgid "" "Delete a tool in the tool list\n" "by selecting a row in the tool table." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:814 +#: flatcamEditors/FlatCAMExcEditor.py:842 msgid "Resize Drill(s)" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:816 +#: flatcamEditors/FlatCAMExcEditor.py:844 msgid "Resize a drill or a selection of drills." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:823 +#: flatcamEditors/FlatCAMExcEditor.py:851 msgid "Resize Dia:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:825 +#: flatcamEditors/FlatCAMExcEditor.py:853 msgid "Diameter to resize to." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:833 +#: flatcamEditors/FlatCAMExcEditor.py:861 msgid "Resize" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:835 +#: flatcamEditors/FlatCAMExcEditor.py:863 msgid "Resize drill(s)" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:857 flatcamGUI/FlatCAMGUI.py:1542 +#: flatcamEditors/FlatCAMExcEditor.py:885 flatcamGUI/FlatCAMGUI.py:1586 msgid "Add Drill Array" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:859 +#: flatcamEditors/FlatCAMExcEditor.py:887 msgid "Add an array of drills (linear or circular array)" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:865 +#: flatcamEditors/FlatCAMExcEditor.py:893 msgid "" "Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:868 -#: flatcamEditors/FlatCAMGrbEditor.py:1077 +#: flatcamEditors/FlatCAMExcEditor.py:896 +#: flatcamEditors/FlatCAMGrbEditor.py:1938 msgid "Linear" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:869 -#: flatcamEditors/FlatCAMGrbEditor.py:1078 +#: flatcamEditors/FlatCAMExcEditor.py:897 +#: flatcamEditors/FlatCAMGrbEditor.py:1939 msgid "Circular" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:876 +#: flatcamEditors/FlatCAMExcEditor.py:904 msgid "Nr of drills:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:878 +#: flatcamEditors/FlatCAMExcEditor.py:906 msgid "Specify how many drills to be in the array." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:895 -#: flatcamEditors/FlatCAMExcEditor.py:940 -#: flatcamEditors/FlatCAMGrbEditor.py:1104 -#: flatcamEditors/FlatCAMGrbEditor.py:1149 +#: flatcamEditors/FlatCAMExcEditor.py:923 +#: flatcamEditors/FlatCAMExcEditor.py:968 +#: flatcamEditors/FlatCAMGrbEditor.py:1965 +#: flatcamEditors/FlatCAMGrbEditor.py:2010 msgid "Direction:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:897 -#: flatcamEditors/FlatCAMGrbEditor.py:1106 +#: flatcamEditors/FlatCAMExcEditor.py:925 +#: flatcamEditors/FlatCAMGrbEditor.py:1967 msgid "" "Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" @@ -1656,32 +1677,32 @@ msgid "" "- 'Angle' - a custom angle for the array inclination" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:906 -#: flatcamEditors/FlatCAMGrbEditor.py:1115 +#: flatcamEditors/FlatCAMExcEditor.py:934 +#: flatcamEditors/FlatCAMGrbEditor.py:1976 msgid "Angle" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:910 -#: flatcamEditors/FlatCAMGrbEditor.py:1119 +#: flatcamEditors/FlatCAMExcEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:1980 msgid "Pitch:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:912 -#: flatcamEditors/FlatCAMGrbEditor.py:1121 +#: flatcamEditors/FlatCAMExcEditor.py:940 +#: flatcamEditors/FlatCAMGrbEditor.py:1982 msgid "Pitch = Distance between elements of the array." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:919 -#: flatcamEditors/FlatCAMExcEditor.py:955 -#: flatcamEditors/FlatCAMGeoEditor.py:663 -#: flatcamEditors/FlatCAMGrbEditor.py:1128 -#: flatcamEditors/FlatCAMGrbEditor.py:1164 -#: flatcamEditors/FlatCAMGrbEditor.py:2822 flatcamTools/ToolTransform.py:68 +#: flatcamEditors/FlatCAMExcEditor.py:947 +#: flatcamEditors/FlatCAMExcEditor.py:983 +#: flatcamEditors/FlatCAMGeoEditor.py:664 +#: flatcamEditors/FlatCAMGrbEditor.py:1989 +#: flatcamEditors/FlatCAMGrbEditor.py:2025 +#: flatcamEditors/FlatCAMGrbEditor.py:3833 flatcamTools/ToolTransform.py:68 msgid "Angle:" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:921 -#: flatcamEditors/FlatCAMGrbEditor.py:1130 +#: flatcamEditors/FlatCAMExcEditor.py:949 +#: flatcamEditors/FlatCAMGrbEditor.py:1991 msgid "" "Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" @@ -1689,75 +1710,76 @@ msgid "" "Max value is: 360.00 degrees." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:942 -#: flatcamEditors/FlatCAMGrbEditor.py:1151 +#: flatcamEditors/FlatCAMExcEditor.py:970 +#: flatcamEditors/FlatCAMGrbEditor.py:2012 msgid "" "Direction for circular array.Can be CW = clockwise or CCW = counter " "clockwise." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:957 -#: flatcamEditors/FlatCAMGrbEditor.py:1166 +#: flatcamEditors/FlatCAMExcEditor.py:985 +#: flatcamEditors/FlatCAMGrbEditor.py:2027 msgid "Angle at which each element in circular array is placed." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1413 +#: flatcamEditors/FlatCAMExcEditor.py:1447 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 "" -#: flatcamEditors/FlatCAMExcEditor.py:1422 flatcamGUI/FlatCAMGUI.py:2888 +#: flatcamEditors/FlatCAMExcEditor.py:1456 flatcamGUI/FlatCAMGUI.py:2956 #, python-brace-format msgid "[success] Added new tool with dia: {dia} {units}" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:1638 +#: flatcamEditors/FlatCAMExcEditor.py:1488 msgid "[WARNING_NOTCL] Select a tool in Tool Table" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1486 +#: flatcamEditors/FlatCAMExcEditor.py:1521 #, python-brace-format msgid "[success] Deleted tool with dia: {del_dia} {units}" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1924 +#: flatcamEditors/FlatCAMExcEditor.py:1974 msgid "" "[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon " "creation." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1933 +#: flatcamEditors/FlatCAMExcEditor.py:1983 msgid "Creating Excellon." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1942 +#: flatcamEditors/FlatCAMExcEditor.py:1992 msgid "[success] Excellon editing finished." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:1959 +#: flatcamEditors/FlatCAMExcEditor.py:2009 msgid "[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected" msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:2458 +#: flatcamEditors/FlatCAMExcEditor.py:2508 msgid "[success] Done. Drill(s) deleted." msgstr "" -#: flatcamEditors/FlatCAMExcEditor.py:2528 -#: flatcamEditors/FlatCAMGrbEditor.py:2619 +#: flatcamEditors/FlatCAMExcEditor.py:2578 +#: flatcamEditors/FlatCAMGrbEditor.py:3621 msgid "Click on the circular array Center position" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:77 flatcamEditors/FlatCAMGrbEditor.py:994 +#: flatcamEditors/FlatCAMGeoEditor.py:78 +#: flatcamEditors/FlatCAMGrbEditor.py:1855 msgid "Buffer distance:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:78 flatcamEditors/FlatCAMGrbEditor.py:995 +#: flatcamEditors/FlatCAMGeoEditor.py:79 +#: flatcamEditors/FlatCAMGrbEditor.py:1856 msgid "Buffer corner:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:80 +#: flatcamEditors/FlatCAMGeoEditor.py:81 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded for exterior buffer.\n" @@ -1766,77 +1788,77 @@ msgid "" "meeting in the corner" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:86 -#: flatcamEditors/FlatCAMGrbEditor.py:1003 +#: flatcamEditors/FlatCAMGeoEditor.py:87 +#: flatcamEditors/FlatCAMGrbEditor.py:1864 msgid "Round" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:87 -#: flatcamEditors/FlatCAMGrbEditor.py:1004 +#: flatcamEditors/FlatCAMGeoEditor.py:88 +#: flatcamEditors/FlatCAMGrbEditor.py:1865 msgid "Square" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:88 -#: flatcamEditors/FlatCAMGrbEditor.py:1005 +#: flatcamEditors/FlatCAMGeoEditor.py:89 +#: flatcamEditors/FlatCAMGrbEditor.py:1866 msgid "Beveled" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:95 +#: flatcamEditors/FlatCAMGeoEditor.py:96 msgid "Buffer Interior" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:97 +#: flatcamEditors/FlatCAMGeoEditor.py:98 msgid "Buffer Exterior" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:103 +#: flatcamEditors/FlatCAMGeoEditor.py:104 msgid "Full Buffer" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:124 -#: flatcamEditors/FlatCAMGeoEditor.py:2505 +#: flatcamEditors/FlatCAMGeoEditor.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:2594 msgid "Buffer Tool" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:135 -#: flatcamEditors/FlatCAMGeoEditor.py:152 -#: flatcamEditors/FlatCAMGeoEditor.py:169 -#: flatcamEditors/FlatCAMGeoEditor.py:2523 -#: flatcamEditors/FlatCAMGeoEditor.py:2549 -#: flatcamEditors/FlatCAMGeoEditor.py:2575 -#: flatcamEditors/FlatCAMGrbEditor.py:2662 +#: flatcamEditors/FlatCAMGeoEditor.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:153 +#: flatcamEditors/FlatCAMGeoEditor.py:170 +#: flatcamEditors/FlatCAMGeoEditor.py:2612 +#: flatcamEditors/FlatCAMGeoEditor.py:2638 +#: flatcamEditors/FlatCAMGeoEditor.py:2664 +#: flatcamEditors/FlatCAMGrbEditor.py:3673 msgid "" "[WARNING_NOTCL] Buffer distance value is missing or wrong format. Add it and " "retry." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:341 msgid "Text Tool" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:398 flatcamGUI/FlatCAMGUI.py:764 +#: flatcamEditors/FlatCAMGeoEditor.py:399 flatcamGUI/FlatCAMGUI.py:776 msgid "Tool" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:429 flatcamGUI/FlatCAMGUI.py:3833 -#: flatcamGUI/FlatCAMGUI.py:5039 flatcamGUI/FlatCAMGUI.py:5315 -#: flatcamGUI/FlatCAMGUI.py:5455 flatcamGUI/ObjectUI.py:260 +#: flatcamEditors/FlatCAMGeoEditor.py:430 flatcamGUI/FlatCAMGUI.py:3922 +#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5544 flatcamGUI/ObjectUI.py:260 msgid "Tool dia:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:431 flatcamGUI/FlatCAMGUI.py:5457 +#: flatcamEditors/FlatCAMGeoEditor.py:432 flatcamGUI/FlatCAMGUI.py:5546 msgid "" "Diameter of the tool to\n" "be used in the operation." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:440 flatcamGUI/FlatCAMGUI.py:5221 -#: flatcamGUI/FlatCAMGUI.py:5466 flatcamTools/ToolNonCopperClear.py:165 +#: flatcamEditors/FlatCAMGeoEditor.py:441 flatcamGUI/FlatCAMGUI.py:5310 +#: flatcamGUI/FlatCAMGUI.py:5555 flatcamTools/ToolNonCopperClear.py:165 #: flatcamTools/ToolPaint.py:160 msgid "Overlap Rate:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:442 flatcamTools/ToolPaint.py:162 +#: flatcamEditors/FlatCAMGeoEditor.py:443 flatcamTools/ToolPaint.py:162 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -1851,14 +1873,14 @@ msgid "" "due of too many paths." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:458 flatcamGUI/FlatCAMGUI.py:5237 -#: flatcamGUI/FlatCAMGUI.py:5323 flatcamGUI/FlatCAMGUI.py:5476 +#: flatcamEditors/FlatCAMGeoEditor.py:459 flatcamGUI/FlatCAMGUI.py:5326 +#: flatcamGUI/FlatCAMGUI.py:5412 flatcamGUI/FlatCAMGUI.py:5565 #: flatcamTools/ToolCutOut.py:86 flatcamTools/ToolNonCopperClear.py:181 #: flatcamTools/ToolPaint.py:177 msgid "Margin:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:460 flatcamGUI/FlatCAMGUI.py:5478 +#: flatcamEditors/FlatCAMGeoEditor.py:461 flatcamGUI/FlatCAMGUI.py:5567 #: flatcamTools/ToolPaint.py:179 msgid "" "Distance by which to avoid\n" @@ -1866,76 +1888,76 @@ msgid "" "be painted." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:469 flatcamGUI/FlatCAMGUI.py:5246 -#: flatcamGUI/FlatCAMGUI.py:5487 flatcamTools/ToolNonCopperClear.py:190 +#: flatcamEditors/FlatCAMGeoEditor.py:470 flatcamGUI/FlatCAMGUI.py:5335 +#: flatcamGUI/FlatCAMGUI.py:5576 flatcamTools/ToolNonCopperClear.py:190 #: flatcamTools/ToolPaint.py:188 msgid "Method:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:471 flatcamGUI/FlatCAMGUI.py:5489 +#: flatcamEditors/FlatCAMGeoEditor.py:472 flatcamGUI/FlatCAMGUI.py:5578 msgid "" "Algorithm to paint the polygon:
Standard: Fixed step inwards." "
Seed-based: Outwards from seed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:477 flatcamGUI/FlatCAMGUI.py:5255 -#: flatcamGUI/FlatCAMGUI.py:5495 +#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5584 msgid "Standard" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:478 flatcamGUI/FlatCAMGUI.py:5256 -#: flatcamGUI/FlatCAMGUI.py:5496 +#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5345 +#: flatcamGUI/FlatCAMGUI.py:5585 msgid "Seed-based" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:479 flatcamGUI/FlatCAMGUI.py:5257 -#: flatcamGUI/FlatCAMGUI.py:5497 +#: flatcamEditors/FlatCAMGeoEditor.py:480 flatcamGUI/FlatCAMGUI.py:5346 +#: flatcamGUI/FlatCAMGUI.py:5586 msgid "Straight lines" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:484 flatcamGUI/FlatCAMGUI.py:5262 -#: flatcamGUI/FlatCAMGUI.py:5502 flatcamTools/ToolNonCopperClear.py:206 +#: flatcamEditors/FlatCAMGeoEditor.py:485 flatcamGUI/FlatCAMGUI.py:5351 +#: flatcamGUI/FlatCAMGUI.py:5591 flatcamTools/ToolNonCopperClear.py:206 #: flatcamTools/ToolPaint.py:204 msgid "Connect:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:486 flatcamGUI/FlatCAMGUI.py:5264 -#: flatcamGUI/FlatCAMGUI.py:5504 flatcamTools/ToolNonCopperClear.py:208 +#: flatcamEditors/FlatCAMGeoEditor.py:487 flatcamGUI/FlatCAMGUI.py:5353 +#: flatcamGUI/FlatCAMGUI.py:5593 flatcamTools/ToolNonCopperClear.py:208 #: flatcamTools/ToolPaint.py:206 msgid "" "Draw lines between resulting\n" "segments to minimize tool lifts." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:493 flatcamGUI/FlatCAMGUI.py:5271 -#: flatcamGUI/FlatCAMGUI.py:5512 flatcamTools/ToolNonCopperClear.py:215 +#: flatcamEditors/FlatCAMGeoEditor.py:494 flatcamGUI/FlatCAMGUI.py:5360 +#: flatcamGUI/FlatCAMGUI.py:5601 flatcamTools/ToolNonCopperClear.py:215 #: flatcamTools/ToolPaint.py:213 msgid "Contour:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:495 flatcamGUI/FlatCAMGUI.py:5273 -#: flatcamGUI/FlatCAMGUI.py:5514 flatcamTools/ToolNonCopperClear.py:217 +#: flatcamEditors/FlatCAMGeoEditor.py:496 flatcamGUI/FlatCAMGUI.py:5362 +#: flatcamGUI/FlatCAMGUI.py:5603 flatcamTools/ToolNonCopperClear.py:217 #: flatcamTools/ToolPaint.py:215 msgid "" "Cut around the perimeter of the polygon\n" "to trim rough edges." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:507 +#: flatcamEditors/FlatCAMGeoEditor.py:508 msgid "Paint" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:525 flatcamGUI/FlatCAMGUI.py:629 -#: flatcamGUI/FlatCAMGUI.py:1796 flatcamGUI/ObjectUI.py:1308 -#: flatcamTools/ToolPaint.py:340 +#: flatcamEditors/FlatCAMGeoEditor.py:526 flatcamGUI/FlatCAMGUI.py:635 +#: flatcamGUI/FlatCAMGUI.py:1840 flatcamGUI/ObjectUI.py:1308 +#: flatcamTools/ToolPaint.py:341 msgid "Paint Tool" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:561 +#: flatcamEditors/FlatCAMGeoEditor.py:562 msgid "[WARNING_NOTCL] Paint cancelled. No shape selected." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:572 flatcamTools/ToolCutOut.py:352 +#: flatcamEditors/FlatCAMGeoEditor.py:573 flatcamTools/ToolCutOut.py:352 #: flatcamTools/ToolCutOut.py:496 flatcamTools/ToolCutOut.py:616 #: flatcamTools/ToolCutOut.py:721 flatcamTools/ToolDblSided.py:363 msgid "" @@ -1943,74 +1965,74 @@ msgid "" "retry." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:583 +#: flatcamEditors/FlatCAMGeoEditor.py:584 msgid "" "[WARNING_NOTCL] Overlap value is missing or wrong format. Add it and retry." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:595 +#: flatcamEditors/FlatCAMGeoEditor.py:596 msgid "" "[WARNING_NOTCL] Margin distance value is missing or wrong format. Add it and " "retry." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:604 -#: flatcamEditors/FlatCAMGeoEditor.py:2530 -#: flatcamEditors/FlatCAMGeoEditor.py:2556 -#: flatcamEditors/FlatCAMGeoEditor.py:2582 flatcamTools/ToolMeasurement.py:202 -#: flatcamTools/ToolNonCopperClear.py:812 flatcamTools/ToolProperties.py:104 +#: flatcamEditors/FlatCAMGeoEditor.py:605 +#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2645 +#: flatcamEditors/FlatCAMGeoEditor.py:2671 +#: flatcamTools/ToolNonCopperClear.py:813 flatcamTools/ToolProperties.py:104 msgid "Tools" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:615 -#: flatcamEditors/FlatCAMGeoEditor.py:988 -#: flatcamEditors/FlatCAMGrbEditor.py:2774 -#: flatcamEditors/FlatCAMGrbEditor.py:3158 flatcamGUI/FlatCAMGUI.py:638 -#: flatcamGUI/FlatCAMGUI.py:1807 flatcamTools/ToolTransform.py:398 +#: flatcamEditors/FlatCAMGeoEditor.py:616 +#: flatcamEditors/FlatCAMGeoEditor.py:989 +#: flatcamEditors/FlatCAMGrbEditor.py:3785 +#: flatcamEditors/FlatCAMGrbEditor.py:4169 flatcamGUI/FlatCAMGUI.py:644 +#: flatcamGUI/FlatCAMGUI.py:1851 flatcamTools/ToolTransform.py:398 msgid "Transform Tool" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:616 -#: flatcamEditors/FlatCAMGeoEditor.py:677 -#: flatcamEditors/FlatCAMGrbEditor.py:2775 -#: flatcamEditors/FlatCAMGrbEditor.py:2836 flatcamTools/ToolTransform.py:24 +#: flatcamEditors/FlatCAMGeoEditor.py:617 +#: flatcamEditors/FlatCAMGeoEditor.py:678 +#: flatcamEditors/FlatCAMGrbEditor.py:3786 +#: flatcamEditors/FlatCAMGrbEditor.py:3847 flatcamTools/ToolTransform.py:24 #: flatcamTools/ToolTransform.py:82 msgid "Rotate" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:617 -#: flatcamEditors/FlatCAMGrbEditor.py:2776 flatcamTools/ToolTransform.py:25 +#: flatcamEditors/FlatCAMGeoEditor.py:618 +#: flatcamEditors/FlatCAMGrbEditor.py:3787 flatcamTools/ToolTransform.py:25 msgid "Skew/Shear" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:618 -#: flatcamEditors/FlatCAMGrbEditor.py:1049 -#: flatcamEditors/FlatCAMGrbEditor.py:2777 flatcamGUI/FlatCAMGUI.py:696 -#: flatcamGUI/FlatCAMGUI.py:1868 flatcamGUI/ObjectUI.py:100 +#: flatcamEditors/FlatCAMGeoEditor.py:619 +#: flatcamEditors/FlatCAMGrbEditor.py:1910 +#: flatcamEditors/FlatCAMGrbEditor.py:3788 flatcamGUI/FlatCAMGUI.py:708 +#: flatcamGUI/FlatCAMGUI.py:1912 flatcamGUI/ObjectUI.py:100 #: flatcamTools/ToolTransform.py:26 msgid "Scale" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:619 -#: flatcamEditors/FlatCAMGrbEditor.py:2778 flatcamTools/ToolTransform.py:27 +#: flatcamEditors/FlatCAMGeoEditor.py:620 +#: flatcamEditors/FlatCAMGrbEditor.py:3789 flatcamTools/ToolTransform.py:27 msgid "Mirror (Flip)" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:620 -#: flatcamEditors/FlatCAMGrbEditor.py:2779 flatcamGUI/ObjectUI.py:127 +#: flatcamEditors/FlatCAMGeoEditor.py:621 +#: flatcamEditors/FlatCAMGrbEditor.py:3790 flatcamGUI/ObjectUI.py:127 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 #: flatcamTools/ToolTransform.py:28 msgid "Offset" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:631 -#: flatcamEditors/FlatCAMGrbEditor.py:2790 +#: flatcamEditors/FlatCAMGeoEditor.py:632 +#: flatcamEditors/FlatCAMGrbEditor.py:3801 #, python-format msgid "Editor %s" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:665 -#: flatcamEditors/FlatCAMGrbEditor.py:2824 flatcamTools/ToolTransform.py:70 +#: flatcamEditors/FlatCAMGeoEditor.py:666 +#: flatcamEditors/FlatCAMGrbEditor.py:3835 flatcamTools/ToolTransform.py:70 msgid "" "Angle for Rotation action, in degrees.\n" "Float number between -360 and 359.\n" @@ -2018,115 +2040,115 @@ msgid "" "Negative numbers for CCW motion." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:679 -#: flatcamEditors/FlatCAMGrbEditor.py:2838 +#: flatcamEditors/FlatCAMGeoEditor.py:680 +#: flatcamEditors/FlatCAMGrbEditor.py:3849 msgid "" "Rotate the selected shape(s).\n" "The point of reference is the middle of\n" "the bounding box for all selected shapes." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:702 -#: flatcamEditors/FlatCAMGrbEditor.py:2861 flatcamTools/ToolTransform.py:107 +#: flatcamEditors/FlatCAMGeoEditor.py:703 +#: flatcamEditors/FlatCAMGrbEditor.py:3872 flatcamTools/ToolTransform.py:107 msgid "Angle X:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:704 -#: flatcamEditors/FlatCAMGeoEditor.py:722 -#: flatcamEditors/FlatCAMGrbEditor.py:2863 -#: flatcamEditors/FlatCAMGrbEditor.py:2881 flatcamTools/ToolTransform.py:109 +#: flatcamEditors/FlatCAMGeoEditor.py:705 +#: flatcamEditors/FlatCAMGeoEditor.py:723 +#: flatcamEditors/FlatCAMGrbEditor.py:3874 +#: flatcamEditors/FlatCAMGrbEditor.py:3892 flatcamTools/ToolTransform.py:109 #: flatcamTools/ToolTransform.py:127 msgid "" "Angle for Skew action, in degrees.\n" "Float number between -360 and 359." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:713 -#: flatcamEditors/FlatCAMGrbEditor.py:2872 flatcamTools/ToolTransform.py:118 +#: flatcamEditors/FlatCAMGeoEditor.py:714 +#: flatcamEditors/FlatCAMGrbEditor.py:3883 flatcamTools/ToolTransform.py:118 msgid "Skew X" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:715 -#: flatcamEditors/FlatCAMGeoEditor.py:733 -#: flatcamEditors/FlatCAMGrbEditor.py:2874 -#: flatcamEditors/FlatCAMGrbEditor.py:2892 +#: flatcamEditors/FlatCAMGeoEditor.py:716 +#: flatcamEditors/FlatCAMGeoEditor.py:734 +#: flatcamEditors/FlatCAMGrbEditor.py:3885 +#: flatcamEditors/FlatCAMGrbEditor.py:3903 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 "" -#: flatcamEditors/FlatCAMGeoEditor.py:720 -#: flatcamEditors/FlatCAMGrbEditor.py:2879 flatcamTools/ToolTransform.py:125 +#: flatcamEditors/FlatCAMGeoEditor.py:721 +#: flatcamEditors/FlatCAMGrbEditor.py:3890 flatcamTools/ToolTransform.py:125 msgid "Angle Y:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:731 -#: flatcamEditors/FlatCAMGrbEditor.py:2890 flatcamTools/ToolTransform.py:136 +#: flatcamEditors/FlatCAMGeoEditor.py:732 +#: flatcamEditors/FlatCAMGrbEditor.py:3901 flatcamTools/ToolTransform.py:136 msgid "Skew Y" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:759 -#: flatcamEditors/FlatCAMGrbEditor.py:2918 flatcamTools/ToolTransform.py:164 +#: flatcamEditors/FlatCAMGeoEditor.py:760 +#: flatcamEditors/FlatCAMGrbEditor.py:3929 flatcamTools/ToolTransform.py:164 msgid "Factor X:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:761 -#: flatcamEditors/FlatCAMGrbEditor.py:2920 flatcamTools/ToolTransform.py:166 +#: flatcamEditors/FlatCAMGeoEditor.py:762 +#: flatcamEditors/FlatCAMGrbEditor.py:3931 flatcamTools/ToolTransform.py:166 msgid "Factor for Scale action over X axis." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:769 -#: flatcamEditors/FlatCAMGrbEditor.py:2928 flatcamTools/ToolTransform.py:174 +#: flatcamEditors/FlatCAMGeoEditor.py:770 +#: flatcamEditors/FlatCAMGrbEditor.py:3939 flatcamTools/ToolTransform.py:174 msgid "Scale X" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:771 -#: flatcamEditors/FlatCAMGeoEditor.py:788 -#: flatcamEditors/FlatCAMGrbEditor.py:2930 -#: flatcamEditors/FlatCAMGrbEditor.py:2947 +#: flatcamEditors/FlatCAMGeoEditor.py:772 +#: flatcamEditors/FlatCAMGeoEditor.py:789 +#: flatcamEditors/FlatCAMGrbEditor.py:3941 +#: flatcamEditors/FlatCAMGrbEditor.py:3958 msgid "" "Scale the selected shape(s).\n" "The point of reference depends on \n" "the Scale reference checkbox state." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:776 -#: flatcamEditors/FlatCAMGrbEditor.py:2935 flatcamTools/ToolTransform.py:181 +#: flatcamEditors/FlatCAMGeoEditor.py:777 +#: flatcamEditors/FlatCAMGrbEditor.py:3946 flatcamTools/ToolTransform.py:181 msgid "Factor Y:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:778 -#: flatcamEditors/FlatCAMGrbEditor.py:2937 flatcamTools/ToolTransform.py:183 +#: flatcamEditors/FlatCAMGeoEditor.py:779 +#: flatcamEditors/FlatCAMGrbEditor.py:3948 flatcamTools/ToolTransform.py:183 msgid "Factor for Scale action over Y axis." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:786 -#: flatcamEditors/FlatCAMGrbEditor.py:2945 flatcamTools/ToolTransform.py:191 +#: flatcamEditors/FlatCAMGeoEditor.py:787 +#: flatcamEditors/FlatCAMGrbEditor.py:3956 flatcamTools/ToolTransform.py:191 msgid "Scale Y" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:795 -#: flatcamEditors/FlatCAMGrbEditor.py:2954 flatcamGUI/FlatCAMGUI.py:5861 +#: flatcamEditors/FlatCAMGeoEditor.py:796 +#: flatcamEditors/FlatCAMGrbEditor.py:3965 flatcamGUI/FlatCAMGUI.py:5950 #: flatcamTools/ToolTransform.py:200 msgid "Link" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:797 -#: flatcamEditors/FlatCAMGrbEditor.py:2956 +#: flatcamEditors/FlatCAMGeoEditor.py:798 +#: flatcamEditors/FlatCAMGrbEditor.py:3967 msgid "" "Scale the selected shape(s)\n" "using the Scale Factor X for both axis." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:803 -#: flatcamEditors/FlatCAMGrbEditor.py:2962 flatcamGUI/FlatCAMGUI.py:5869 +#: flatcamEditors/FlatCAMGeoEditor.py:804 +#: flatcamEditors/FlatCAMGrbEditor.py:3973 flatcamGUI/FlatCAMGUI.py:5958 #: flatcamTools/ToolTransform.py:208 msgid "Scale Reference" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:805 -#: flatcamEditors/FlatCAMGrbEditor.py:2964 +#: flatcamEditors/FlatCAMGeoEditor.py:806 +#: flatcamEditors/FlatCAMGrbEditor.py:3975 msgid "" "Scale the selected shape(s)\n" "using the origin reference when checked,\n" @@ -2134,72 +2156,72 @@ msgid "" "of the selected shapes when unchecked." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:833 -#: flatcamEditors/FlatCAMGrbEditor.py:2993 flatcamTools/ToolTransform.py:238 +#: flatcamEditors/FlatCAMGeoEditor.py:834 +#: flatcamEditors/FlatCAMGrbEditor.py:4004 flatcamTools/ToolTransform.py:238 msgid "Value X:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:835 -#: flatcamEditors/FlatCAMGrbEditor.py:2995 flatcamTools/ToolTransform.py:240 +#: flatcamEditors/FlatCAMGeoEditor.py:836 +#: flatcamEditors/FlatCAMGrbEditor.py:4006 flatcamTools/ToolTransform.py:240 msgid "Value for Offset action on X axis." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:843 -#: flatcamEditors/FlatCAMGrbEditor.py:3003 flatcamTools/ToolTransform.py:248 +#: flatcamEditors/FlatCAMGeoEditor.py:844 +#: flatcamEditors/FlatCAMGrbEditor.py:4014 flatcamTools/ToolTransform.py:248 msgid "Offset X" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:845 -#: flatcamEditors/FlatCAMGeoEditor.py:863 -#: flatcamEditors/FlatCAMGrbEditor.py:3005 -#: flatcamEditors/FlatCAMGrbEditor.py:3023 +#: flatcamEditors/FlatCAMGeoEditor.py:846 +#: flatcamEditors/FlatCAMGeoEditor.py:864 +#: flatcamEditors/FlatCAMGrbEditor.py:4016 +#: flatcamEditors/FlatCAMGrbEditor.py:4034 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 "" -#: flatcamEditors/FlatCAMGeoEditor.py:851 -#: flatcamEditors/FlatCAMGrbEditor.py:3011 flatcamTools/ToolTransform.py:255 +#: flatcamEditors/FlatCAMGeoEditor.py:852 +#: flatcamEditors/FlatCAMGrbEditor.py:4022 flatcamTools/ToolTransform.py:255 msgid "Value Y:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:853 -#: flatcamEditors/FlatCAMGrbEditor.py:3013 flatcamTools/ToolTransform.py:257 +#: flatcamEditors/FlatCAMGeoEditor.py:854 +#: flatcamEditors/FlatCAMGrbEditor.py:4024 flatcamTools/ToolTransform.py:257 msgid "Value for Offset action on Y axis." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:861 -#: flatcamEditors/FlatCAMGrbEditor.py:3021 flatcamTools/ToolTransform.py:265 +#: flatcamEditors/FlatCAMGeoEditor.py:862 +#: flatcamEditors/FlatCAMGrbEditor.py:4032 flatcamTools/ToolTransform.py:265 msgid "Offset Y" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:892 -#: flatcamEditors/FlatCAMGrbEditor.py:3052 flatcamTools/ToolTransform.py:295 +#: flatcamEditors/FlatCAMGeoEditor.py:893 +#: flatcamEditors/FlatCAMGrbEditor.py:4063 flatcamTools/ToolTransform.py:295 msgid "Flip on X" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:894 -#: flatcamEditors/FlatCAMGeoEditor.py:902 -#: flatcamEditors/FlatCAMGrbEditor.py:3054 -#: flatcamEditors/FlatCAMGrbEditor.py:3062 +#: flatcamEditors/FlatCAMGeoEditor.py:895 +#: flatcamEditors/FlatCAMGeoEditor.py:903 +#: flatcamEditors/FlatCAMGrbEditor.py:4065 +#: flatcamEditors/FlatCAMGrbEditor.py:4073 msgid "" "Flip the selected shape(s) over the X axis.\n" "Does not create a new shape." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:900 -#: flatcamEditors/FlatCAMGrbEditor.py:3060 flatcamTools/ToolTransform.py:303 +#: flatcamEditors/FlatCAMGeoEditor.py:901 +#: flatcamEditors/FlatCAMGrbEditor.py:4071 flatcamTools/ToolTransform.py:303 msgid "Flip on Y" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:909 -#: flatcamEditors/FlatCAMGrbEditor.py:3069 flatcamTools/ToolTransform.py:312 +#: flatcamEditors/FlatCAMGeoEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:4080 flatcamTools/ToolTransform.py:312 msgid "Ref Pt" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:911 -#: flatcamEditors/FlatCAMGrbEditor.py:3071 +#: flatcamEditors/FlatCAMGeoEditor.py:912 +#: flatcamEditors/FlatCAMGrbEditor.py:4082 msgid "" "Flip the selected shape(s)\n" "around the point in Point Entry Field.\n" @@ -2212,475 +2234,527 @@ msgid "" "Point Entry field and click Flip on X(Y)" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:923 -#: flatcamEditors/FlatCAMGrbEditor.py:3083 flatcamTools/ToolTransform.py:325 +#: flatcamEditors/FlatCAMGeoEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:4094 flatcamTools/ToolTransform.py:325 msgid "Point:" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:925 -#: flatcamEditors/FlatCAMGrbEditor.py:3085 +#: flatcamEditors/FlatCAMGeoEditor.py:926 +#: flatcamEditors/FlatCAMGrbEditor.py:4096 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 "" -#: flatcamEditors/FlatCAMGeoEditor.py:935 -#: flatcamEditors/FlatCAMGrbEditor.py:3095 flatcamGUI/ObjectUI.py:988 +#: flatcamEditors/FlatCAMGeoEditor.py:936 +#: flatcamEditors/FlatCAMGrbEditor.py:1820 +#: flatcamEditors/FlatCAMGrbEditor.py:4106 flatcamGUI/ObjectUI.py:988 #: flatcamTools/ToolDblSided.py:160 flatcamTools/ToolDblSided.py:208 #: flatcamTools/ToolNonCopperClear.py:134 flatcamTools/ToolPaint.py:131 -#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:478 +#: flatcamTools/ToolSolderPaste.py:115 flatcamTools/ToolSolderPaste.py:479 #: flatcamTools/ToolTransform.py:337 msgid "Add" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:937 -#: flatcamEditors/FlatCAMGrbEditor.py:3097 flatcamTools/ToolTransform.py:339 +#: flatcamEditors/FlatCAMGeoEditor.py:938 +#: flatcamEditors/FlatCAMGrbEditor.py:4108 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 "" -#: flatcamEditors/FlatCAMGeoEditor.py:1052 -#: flatcamEditors/FlatCAMGrbEditor.py:3222 +#: flatcamEditors/FlatCAMGeoEditor.py:1053 +#: flatcamEditors/FlatCAMGrbEditor.py:4233 msgid "[WARNING_NOTCL] Transformation cancelled. No shape selected." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1073 -#: flatcamEditors/FlatCAMGrbEditor.py:3242 flatcamTools/ToolTransform.py:468 +#: flatcamEditors/FlatCAMGeoEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:4253 flatcamTools/ToolTransform.py:468 msgid "[ERROR_NOTCL] Wrong value format entered for Rotate, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1110 -#: flatcamEditors/FlatCAMGrbEditor.py:3279 flatcamTools/ToolTransform.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:1111 +#: flatcamEditors/FlatCAMGrbEditor.py:4290 flatcamTools/ToolTransform.py:502 msgid "[ERROR_NOTCL] Wrong value format entered for Skew X, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1131 -#: flatcamEditors/FlatCAMGrbEditor.py:3300 flatcamTools/ToolTransform.py:520 +#: flatcamEditors/FlatCAMGeoEditor.py:1132 +#: flatcamEditors/FlatCAMGrbEditor.py:4311 flatcamTools/ToolTransform.py:520 msgid "[ERROR_NOTCL] Wrong value format entered for Skew Y, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1152 -#: flatcamEditors/FlatCAMGrbEditor.py:3321 flatcamTools/ToolTransform.py:538 +#: flatcamEditors/FlatCAMGeoEditor.py:1153 +#: flatcamEditors/FlatCAMGrbEditor.py:4332 flatcamTools/ToolTransform.py:538 msgid "[ERROR_NOTCL] Wrong value format entered for Scale X, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1189 -#: flatcamEditors/FlatCAMGrbEditor.py:3358 flatcamTools/ToolTransform.py:572 +#: flatcamEditors/FlatCAMGeoEditor.py:1190 +#: flatcamEditors/FlatCAMGrbEditor.py:4369 flatcamTools/ToolTransform.py:572 msgid "[ERROR_NOTCL] Wrong value format entered for Scale Y, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1221 -#: flatcamEditors/FlatCAMGrbEditor.py:3390 flatcamTools/ToolTransform.py:601 +#: flatcamEditors/FlatCAMGeoEditor.py:1222 +#: flatcamEditors/FlatCAMGrbEditor.py:4401 flatcamTools/ToolTransform.py:601 msgid "[ERROR_NOTCL] Wrong value format entered for Offset X, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1242 -#: flatcamEditors/FlatCAMGrbEditor.py:3411 flatcamTools/ToolTransform.py:619 +#: flatcamEditors/FlatCAMGeoEditor.py:1243 +#: flatcamEditors/FlatCAMGrbEditor.py:4422 flatcamTools/ToolTransform.py:619 msgid "[ERROR_NOTCL] Wrong value format entered for Offset Y, use a number." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1260 -#: flatcamEditors/FlatCAMGrbEditor.py:3429 +#: flatcamEditors/FlatCAMGeoEditor.py:1261 +#: flatcamEditors/FlatCAMGrbEditor.py:4440 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1263 -#: flatcamEditors/FlatCAMGrbEditor.py:3432 flatcamTools/ToolTransform.py:640 +#: flatcamEditors/FlatCAMGeoEditor.py:1264 +#: flatcamEditors/FlatCAMGrbEditor.py:4443 flatcamTools/ToolTransform.py:640 msgid "Appying Rotate" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1291 -#: flatcamEditors/FlatCAMGrbEditor.py:3460 +#: flatcamEditors/FlatCAMGeoEditor.py:1292 +#: flatcamEditors/FlatCAMGrbEditor.py:4471 msgid "[success] Done. Rotate completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1307 -#: flatcamEditors/FlatCAMGrbEditor.py:3476 +#: flatcamEditors/FlatCAMGeoEditor.py:1308 +#: flatcamEditors/FlatCAMGrbEditor.py:4487 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to flip!" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1310 -#: flatcamEditors/FlatCAMGrbEditor.py:3479 flatcamTools/ToolTransform.py:692 +#: flatcamEditors/FlatCAMGeoEditor.py:1311 +#: flatcamEditors/FlatCAMGrbEditor.py:4490 flatcamTools/ToolTransform.py:692 msgid "Applying Flip" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1340 -#: flatcamEditors/FlatCAMGrbEditor.py:3509 flatcamTools/ToolTransform.py:735 +#: flatcamEditors/FlatCAMGeoEditor.py:1341 +#: flatcamEditors/FlatCAMGrbEditor.py:4520 flatcamTools/ToolTransform.py:735 msgid "[success] Flip on the Y axis done ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1343 -#: flatcamEditors/FlatCAMGrbEditor.py:3512 flatcamTools/ToolTransform.py:745 +#: flatcamEditors/FlatCAMGeoEditor.py:1344 +#: flatcamEditors/FlatCAMGrbEditor.py:4523 flatcamTools/ToolTransform.py:745 msgid "[success] Flip on the X axis done ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1362 -#: flatcamEditors/FlatCAMGrbEditor.py:3531 +#: flatcamEditors/FlatCAMGeoEditor.py:1363 +#: flatcamEditors/FlatCAMGrbEditor.py:4542 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1365 -#: flatcamEditors/FlatCAMGrbEditor.py:3534 flatcamTools/ToolTransform.py:762 +#: flatcamEditors/FlatCAMGeoEditor.py:1366 +#: flatcamEditors/FlatCAMGrbEditor.py:4545 flatcamTools/ToolTransform.py:762 msgid "Applying Skew" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1390 -#: flatcamEditors/FlatCAMGrbEditor.py:3559 flatcamTools/ToolTransform.py:793 +#: flatcamEditors/FlatCAMGeoEditor.py:1391 +#: flatcamEditors/FlatCAMGrbEditor.py:4570 flatcamTools/ToolTransform.py:793 #, python-format msgid "[success] Skew on the %s axis done ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1394 -#: flatcamEditors/FlatCAMGrbEditor.py:3563 flatcamTools/ToolTransform.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:1395 +#: flatcamEditors/FlatCAMGrbEditor.py:4574 flatcamTools/ToolTransform.py:797 #, python-format msgid "[ERROR_NOTCL] Due of %s, Skew action was not executed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1405 -#: flatcamEditors/FlatCAMGrbEditor.py:3574 +#: flatcamEditors/FlatCAMGeoEditor.py:1406 +#: flatcamEditors/FlatCAMGrbEditor.py:4585 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to scale!" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1408 -#: flatcamEditors/FlatCAMGrbEditor.py:3577 flatcamTools/ToolTransform.py:811 +#: flatcamEditors/FlatCAMGeoEditor.py:1409 +#: flatcamEditors/FlatCAMGrbEditor.py:4588 flatcamTools/ToolTransform.py:811 msgid "Applying Scale" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1441 -#: flatcamEditors/FlatCAMGrbEditor.py:3610 flatcamTools/ToolTransform.py:849 +#: flatcamEditors/FlatCAMGeoEditor.py:1442 +#: flatcamEditors/FlatCAMGrbEditor.py:4621 flatcamTools/ToolTransform.py:849 #, python-format msgid "[success] Scale on the %s axis done ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1444 -#: flatcamEditors/FlatCAMGrbEditor.py:3613 flatcamTools/ToolTransform.py:852 +#: flatcamEditors/FlatCAMGeoEditor.py:1445 +#: flatcamEditors/FlatCAMGrbEditor.py:4624 flatcamTools/ToolTransform.py:852 #, python-format msgid "[ERROR_NOTCL] Due of %s, Scale action was not executed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1453 -#: flatcamEditors/FlatCAMGrbEditor.py:3622 +#: flatcamEditors/FlatCAMGeoEditor.py:1454 +#: flatcamEditors/FlatCAMGrbEditor.py:4633 msgid "[WARNING_NOTCL] No shape selected. Please Select a shape to offset!" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1456 -#: flatcamEditors/FlatCAMGrbEditor.py:3625 flatcamTools/ToolTransform.py:864 +#: flatcamEditors/FlatCAMGeoEditor.py:1457 +#: flatcamEditors/FlatCAMGrbEditor.py:4636 flatcamTools/ToolTransform.py:864 msgid "Applying Offset" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1480 -#: flatcamEditors/FlatCAMGrbEditor.py:3649 flatcamTools/ToolTransform.py:894 +#: flatcamEditors/FlatCAMGeoEditor.py:1481 +#: flatcamEditors/FlatCAMGrbEditor.py:4660 flatcamTools/ToolTransform.py:894 #, python-format msgid "[success] Offset on the %s axis done ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1484 -#: flatcamEditors/FlatCAMGrbEditor.py:3653 flatcamTools/ToolTransform.py:898 +#: flatcamEditors/FlatCAMGeoEditor.py:1485 +#: flatcamEditors/FlatCAMGrbEditor.py:4664 flatcamTools/ToolTransform.py:898 #, python-format msgid "[ERROR_NOTCL] Due of %s, Offset action was not executed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1488 -#: flatcamEditors/FlatCAMGrbEditor.py:3657 +#: flatcamEditors/FlatCAMGeoEditor.py:1489 +#: flatcamEditors/FlatCAMGrbEditor.py:4668 msgid "Rotate ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1489 -#: flatcamEditors/FlatCAMGeoEditor.py:1546 -#: flatcamEditors/FlatCAMGeoEditor.py:1563 -#: flatcamEditors/FlatCAMGrbEditor.py:3658 -#: flatcamEditors/FlatCAMGrbEditor.py:3715 -#: flatcamEditors/FlatCAMGrbEditor.py:3732 +#: flatcamEditors/FlatCAMGeoEditor.py:1490 +#: flatcamEditors/FlatCAMGeoEditor.py:1547 +#: flatcamEditors/FlatCAMGeoEditor.py:1564 +#: flatcamEditors/FlatCAMGrbEditor.py:4669 +#: flatcamEditors/FlatCAMGrbEditor.py:4726 +#: flatcamEditors/FlatCAMGrbEditor.py:4743 msgid "Enter an Angle Value (degrees):" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1498 -#: flatcamEditors/FlatCAMGrbEditor.py:3667 +#: flatcamEditors/FlatCAMGeoEditor.py:1499 +#: flatcamEditors/FlatCAMGrbEditor.py:4678 msgid "[success] Geometry shape rotate done..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1503 -#: flatcamEditors/FlatCAMGrbEditor.py:3672 +#: flatcamEditors/FlatCAMGeoEditor.py:1504 +#: flatcamEditors/FlatCAMGrbEditor.py:4683 msgid "[WARNING_NOTCL] Geometry shape rotate cancelled..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1509 -#: flatcamEditors/FlatCAMGrbEditor.py:3678 +#: flatcamEditors/FlatCAMGeoEditor.py:1510 +#: flatcamEditors/FlatCAMGrbEditor.py:4689 msgid "Offset on X axis ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1510 -#: flatcamEditors/FlatCAMGeoEditor.py:1529 -#: flatcamEditors/FlatCAMGrbEditor.py:3679 -#: flatcamEditors/FlatCAMGrbEditor.py:3698 +#: flatcamEditors/FlatCAMGeoEditor.py:1511 +#: flatcamEditors/FlatCAMGeoEditor.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:4690 +#: flatcamEditors/FlatCAMGrbEditor.py:4709 #, python-format msgid "Enter a distance Value (%s):" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1519 -#: flatcamEditors/FlatCAMGrbEditor.py:3688 +#: flatcamEditors/FlatCAMGeoEditor.py:1520 +#: flatcamEditors/FlatCAMGrbEditor.py:4699 msgid "[success] Geometry shape offset on X axis done..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1523 -#: flatcamEditors/FlatCAMGrbEditor.py:3692 +#: flatcamEditors/FlatCAMGeoEditor.py:1524 +#: flatcamEditors/FlatCAMGrbEditor.py:4703 msgid "[WARNING_NOTCL] Geometry shape offset X cancelled..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1528 -#: flatcamEditors/FlatCAMGrbEditor.py:3697 +#: flatcamEditors/FlatCAMGeoEditor.py:1529 +#: flatcamEditors/FlatCAMGrbEditor.py:4708 msgid "Offset on Y axis ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1538 -#: flatcamEditors/FlatCAMGrbEditor.py:3707 +#: flatcamEditors/FlatCAMGeoEditor.py:1539 +#: flatcamEditors/FlatCAMGrbEditor.py:4718 msgid "[success] Geometry shape offset on Y axis done..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1542 -#: flatcamEditors/FlatCAMGrbEditor.py:3711 +#: flatcamEditors/FlatCAMGeoEditor.py:1543 +#: flatcamEditors/FlatCAMGrbEditor.py:4722 msgid "[WARNING_NOTCL] Geometry shape offset Y cancelled..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1545 -#: flatcamEditors/FlatCAMGrbEditor.py:3714 +#: flatcamEditors/FlatCAMGeoEditor.py:1546 +#: flatcamEditors/FlatCAMGrbEditor.py:4725 msgid "Skew on X axis ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1555 -#: flatcamEditors/FlatCAMGrbEditor.py:3724 +#: flatcamEditors/FlatCAMGeoEditor.py:1556 +#: flatcamEditors/FlatCAMGrbEditor.py:4735 msgid "[success] Geometry shape skew on X axis done..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1559 -#: flatcamEditors/FlatCAMGrbEditor.py:3728 +#: flatcamEditors/FlatCAMGeoEditor.py:1560 +#: flatcamEditors/FlatCAMGrbEditor.py:4739 msgid "[WARNING_NOTCL] Geometry shape skew X cancelled..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1562 -#: flatcamEditors/FlatCAMGrbEditor.py:3731 +#: flatcamEditors/FlatCAMGeoEditor.py:1563 +#: flatcamEditors/FlatCAMGrbEditor.py:4742 msgid "Skew on Y axis ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1572 -#: flatcamEditors/FlatCAMGrbEditor.py:3741 +#: flatcamEditors/FlatCAMGeoEditor.py:1573 +#: flatcamEditors/FlatCAMGrbEditor.py:4752 msgid "[success] Geometry shape skew on Y axis done..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1576 -#: flatcamEditors/FlatCAMGrbEditor.py:3745 +#: flatcamEditors/FlatCAMGeoEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:4756 msgid "[WARNING_NOTCL] Geometry shape skew Y cancelled..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1934 -#: flatcamEditors/FlatCAMGeoEditor.py:1973 -msgid "Click on CENTER ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1942 +#: flatcamEditors/FlatCAMGeoEditor.py:1943 +#: flatcamEditors/FlatCAMGeoEditor.py:1987 +#: flatcamEditors/FlatCAMGeoEditor.py:1988 +#: flatcamEditors/FlatCAMGrbEditor.py:1081 +#: flatcamEditors/FlatCAMGrbEditor.py:1082 +#: flatcamEditors/FlatCAMGrbEditor.py:1135 +#: flatcamEditors/FlatCAMGrbEditor.py:1136 +msgid "Click on Center point ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1941 -msgid "Click on Circle perimeter point to complete ..." +#: flatcamEditors/FlatCAMGeoEditor.py:1950 +#: flatcamEditors/FlatCAMGrbEditor.py:1090 +msgid "Click on Perimeter point to complete ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1965 +#: flatcamEditors/FlatCAMGeoEditor.py:1979 msgid "[success] Done. Adding Circle completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1992 -msgid "Click on Start arc point ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2008 +#: flatcamEditors/FlatCAMGrbEditor.py:1161 +msgid "Click on Start point ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:1996 -msgid "Click on End arc point to complete ..." +#: flatcamEditors/FlatCAMGeoEditor.py:2010 +#: flatcamEditors/FlatCAMGrbEditor.py:1163 +msgid "Click on Point3 ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2151 +#: flatcamEditors/FlatCAMGeoEditor.py:2012 +#: flatcamEditors/FlatCAMGrbEditor.py:1165 +msgid "Click on Stop point ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2017 +#: flatcamEditors/FlatCAMGrbEditor.py:1170 +msgid "Click on Stop point to complete ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2019 +#: flatcamEditors/FlatCAMGrbEditor.py:1172 +msgid "Click on Point2 to complete ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2021 +#: flatcamEditors/FlatCAMGrbEditor.py:1174 +msgid "Click on Center point to complete ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2033 +#: flatcamEditors/FlatCAMGrbEditor.py:1186 +#, python-format +msgid "Direction: %s" +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2043 +#: flatcamEditors/FlatCAMGrbEditor.py:1196 +msgid "Mode: Start -> Stop -> Center. Click on Start point ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2046 +#: flatcamEditors/FlatCAMGrbEditor.py:1199 +msgid "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2049 +#: flatcamEditors/FlatCAMGrbEditor.py:1202 +msgid "Mode: Center -> Start -> Stop. Click on Center point ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2187 msgid "[success] Done. Arc completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2163 +#: flatcamEditors/FlatCAMGeoEditor.py:2206 msgid "Click on 1st corner ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2191 +#: flatcamEditors/FlatCAMGeoEditor.py:2239 msgid "[success] Done. Rectangle completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2203 -#: flatcamEditors/FlatCAMGrbEditor.py:452 +#: flatcamEditors/FlatCAMGeoEditor.py:2258 +#: flatcamEditors/FlatCAMGrbEditor.py:627 msgid "Click on 1st point ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2210 -#: flatcamEditors/FlatCAMGrbEditor.py:459 +#: flatcamEditors/FlatCAMGeoEditor.py:2265 +#: flatcamEditors/FlatCAMGrbEditor.py:637 +#: flatcamEditors/FlatCAMGrbEditor.py:904 msgid "Click on next Point or click Right mouse button to complete ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2233 +#: flatcamEditors/FlatCAMGeoEditor.py:2293 msgid "[success] Done. Polygon completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2252 -#: flatcamEditors/FlatCAMGrbEditor.py:502 +#: flatcamEditors/FlatCAMGeoEditor.py:2303 +#: flatcamEditors/FlatCAMGeoEditor.py:2349 +#: flatcamEditors/FlatCAMGrbEditor.py:808 +#: flatcamEditors/FlatCAMGrbEditor.py:981 +msgid "Backtracked one point ..." +msgstr "" + +#: flatcamEditors/FlatCAMGeoEditor.py:2331 msgid "[success] Done. Path completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2354 -#: flatcamEditors/FlatCAMGeoEditor.py:3442 +#: flatcamEditors/FlatCAMGeoEditor.py:2443 +#: flatcamEditors/FlatCAMGeoEditor.py:3539 msgid "[WARNING_NOTCL] Move cancelled. No shape selected." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2358 +#: flatcamEditors/FlatCAMGeoEditor.py:2447 msgid "Click on reference point." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2361 +#: flatcamEditors/FlatCAMGeoEditor.py:2450 msgid "Click on destination point." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2392 +#: flatcamEditors/FlatCAMGeoEditor.py:2481 msgid "[success] Done. Geometry(s) Move completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2437 +#: flatcamEditors/FlatCAMGeoEditor.py:2526 msgid "[success] Done. Geometry(s) Copy completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2449 +#: flatcamEditors/FlatCAMGeoEditor.py:2538 msgid "Click on the Destination point..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2463 +#: flatcamEditors/FlatCAMGeoEditor.py:2552 #, python-format msgid "" "[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are " "supported. Error: %s" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2473 +#: flatcamEditors/FlatCAMGeoEditor.py:2562 msgid "[success] Done. Adding Text completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2501 +#: flatcamEditors/FlatCAMGeoEditor.py:2590 msgid "Create buffer geometry ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2512 -#: flatcamEditors/FlatCAMGeoEditor.py:2538 -#: flatcamEditors/FlatCAMGeoEditor.py:2564 +#: flatcamEditors/FlatCAMGeoEditor.py:2601 +#: flatcamEditors/FlatCAMGeoEditor.py:2627 +#: flatcamEditors/FlatCAMGeoEditor.py:2653 msgid "[WARNING_NOTCL] Buffer cancelled. No shape selected." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2534 -#: flatcamEditors/FlatCAMGrbEditor.py:2698 +#: flatcamEditors/FlatCAMGeoEditor.py:2623 +#: flatcamEditors/FlatCAMGrbEditor.py:3709 msgid "[success] Done. Buffer Tool completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2560 +#: flatcamEditors/FlatCAMGeoEditor.py:2649 msgid "[success] Done. Buffer Int Tool completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2586 +#: flatcamEditors/FlatCAMGeoEditor.py:2675 msgid "[success] Done. Buffer Ext Tool completed." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2619 +#: flatcamEditors/FlatCAMGeoEditor.py:2708 msgid "Create Paint geometry ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:2633 -#: flatcamEditors/FlatCAMGrbEditor.py:797 +#: flatcamEditors/FlatCAMGeoEditor.py:2722 +#: flatcamEditors/FlatCAMGrbEditor.py:1657 msgid "Shape transformations ..." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3077 +#: flatcamEditors/FlatCAMGeoEditor.py:3174 #, python-brace-format msgid "[WARNING] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3316 -#: flatcamEditors/FlatCAMGrbEditor.py:2267 flatcamGUI/FlatCAMGUI.py:2320 -#: flatcamGUI/FlatCAMGUI.py:2332 -msgid "[success] Done." -msgstr "" - -#: flatcamEditors/FlatCAMGeoEditor.py:3449 +#: flatcamEditors/FlatCAMGeoEditor.py:3546 msgid "[WARNING_NOTCL] Copy cancelled. No shape selected." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3456 flatcamGUI/FlatCAMGUI.py:2623 -#: flatcamGUI/FlatCAMGUI.py:2657 flatcamGUI/FlatCAMGUI.py:2675 -#: flatcamGUI/FlatCAMGUI.py:2813 flatcamGUI/FlatCAMGUI.py:2825 -#: flatcamGUI/FlatCAMGUI.py:2859 +#: flatcamEditors/FlatCAMGeoEditor.py:3553 flatcamGUI/FlatCAMGUI.py:2686 +#: flatcamGUI/FlatCAMGUI.py:2732 flatcamGUI/FlatCAMGUI.py:2750 +#: flatcamGUI/FlatCAMGUI.py:2881 flatcamGUI/FlatCAMGUI.py:2893 +#: flatcamGUI/FlatCAMGUI.py:2927 msgid "Click on target point." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3699 +#: flatcamEditors/FlatCAMGeoEditor.py:3796 msgid "" "[WARNING_NOTCL] A selection of at least 2 geo items is required to do " "Intersection." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3737 -#: flatcamEditors/FlatCAMGeoEditor.py:3774 -#: flatcamEditors/FlatCAMGeoEditor.py:3850 +#: flatcamEditors/FlatCAMGeoEditor.py:3834 +#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3947 msgid "" "[ERROR_NOTCL] Negative buffer value is not accepted. Use Buffer interior to " "generate an 'inside' shape" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3745 -#: flatcamEditors/FlatCAMGeoEditor.py:3783 -#: flatcamEditors/FlatCAMGeoEditor.py:3858 +#: flatcamEditors/FlatCAMGeoEditor.py:3842 +#: flatcamEditors/FlatCAMGeoEditor.py:3880 +#: flatcamEditors/FlatCAMGeoEditor.py:3955 msgid "[WARNING_NOTCL] Nothing selected for buffering." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3749 -#: flatcamEditors/FlatCAMGeoEditor.py:3787 -#: flatcamEditors/FlatCAMGeoEditor.py:3862 +#: flatcamEditors/FlatCAMGeoEditor.py:3846 +#: flatcamEditors/FlatCAMGeoEditor.py:3884 +#: flatcamEditors/FlatCAMGeoEditor.py:3959 msgid "[WARNING_NOTCL] Invalid distance for buffering." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3759 -#: flatcamEditors/FlatCAMGeoEditor.py:3871 +#: flatcamEditors/FlatCAMGeoEditor.py:3856 +#: flatcamEditors/FlatCAMGeoEditor.py:3968 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3767 +#: flatcamEditors/FlatCAMGeoEditor.py:3864 msgid "[success] Full buffer geometry created." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3797 +#: flatcamEditors/FlatCAMGeoEditor.py:3894 msgid "" "[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3812 +#: flatcamEditors/FlatCAMGeoEditor.py:3909 msgid "[success] Interior buffer geometry created." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3883 +#: flatcamEditors/FlatCAMGeoEditor.py:3980 msgid "[success] Exterior buffer geometry created." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3947 +#: flatcamEditors/FlatCAMGeoEditor.py:4044 msgid "[WARNING_NOTCL] Nothing selected for painting." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3953 +#: flatcamEditors/FlatCAMGeoEditor.py:4050 msgid "[WARNING] Invalid value for {}" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:3959 +#: flatcamEditors/FlatCAMGeoEditor.py:4056 msgid "" "[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 " "(100%)." msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:4018 +#: flatcamEditors/FlatCAMGeoEditor.py:4115 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -2688,126 +2762,196 @@ msgid "" "%s" msgstr "" -#: flatcamEditors/FlatCAMGeoEditor.py:4029 +#: flatcamEditors/FlatCAMGeoEditor.py:4126 msgid "[success] Paint done." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:63 +#: flatcamEditors/FlatCAMGrbEditor.py:52 +msgid "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table" +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:58 flatcamEditors/FlatCAMGrbEditor.py:232 +msgid "" +"[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:81 flatcamEditors/FlatCAMGrbEditor.py:86 msgid "Click to place ..." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:149 -#: flatcamEditors/FlatCAMGrbEditor.py:386 +#: flatcamEditors/FlatCAMGrbEditor.py:191 +#: flatcamEditors/FlatCAMGrbEditor.py:469 msgid "" "Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:161 +#: flatcamEditors/FlatCAMGrbEditor.py:203 msgid "[success] Done. Adding Pad completed." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:215 -msgid "[WARNING_NOTCL] To add an Pad Array first select a tool in Tool Table" +#: flatcamEditors/FlatCAMGrbEditor.py:225 +msgid "" +"[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:304 msgid "Click on the Pad Circular Array Start position" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:411 +#: flatcamEditors/FlatCAMGrbEditor.py:494 msgid "[WARNING_NOTCL] Too many Pads for the selected spacing angle." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:433 +#: flatcamEditors/FlatCAMGrbEditor.py:516 msgid "[success] Done. Pad Array added." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:482 -msgid "[success] Done. Region completed." +#: flatcamEditors/FlatCAMGrbEditor.py:537 +msgid "Select shape(s) and then click ..." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:527 +#: flatcamEditors/FlatCAMGrbEditor.py:548 +msgid "[ERROR_NOTCL] Failed. Nothing selected." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:575 +msgid "[success] Done. Poligonize completed." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:625 +#: flatcamEditors/FlatCAMGrbEditor.py:825 +#: flatcamEditors/FlatCAMGrbEditor.py:849 +msgid "Corner Mode 1: 45 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:813 +#: flatcamEditors/FlatCAMGrbEditor.py:846 +msgid "Corner Mode 2: Reverse 45 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:816 +#: flatcamEditors/FlatCAMGrbEditor.py:843 +msgid "Corner Mode 3: 90 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:819 +#: flatcamEditors/FlatCAMGrbEditor.py:840 +msgid "Corner Mode 4: Reverse 90 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:822 +#: flatcamEditors/FlatCAMGrbEditor.py:837 +msgid "Corner Mode 5: Free angle ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:875 +#: flatcamEditors/FlatCAMGrbEditor.py:1012 +#: flatcamEditors/FlatCAMGrbEditor.py:1050 +msgid "Track Mode 1: 45 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:992 +#: flatcamEditors/FlatCAMGrbEditor.py:1045 +msgid "Track Mode 2: Reverse 45 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1040 +msgid "Track Mode 3: 90 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:1002 +#: flatcamEditors/FlatCAMGrbEditor.py:1035 +msgid "Track Mode 4: Reverse 90 degrees ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:1007 +#: flatcamEditors/FlatCAMGrbEditor.py:1030 +msgid "Track Mode 5: Free angle ..." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:1360 msgid "Scale the selected Gerber apertures ..." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:564 +#: flatcamEditors/FlatCAMGrbEditor.py:1402 msgid "Buffer the selected apertures ..." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:660 +#: flatcamEditors/FlatCAMGrbEditor.py:1503 msgid "[success] Done. Apertures Move completed." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:710 +#: flatcamEditors/FlatCAMGrbEditor.py:1558 msgid "[success] Done. Apertures copied." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:833 flatcamGUI/FlatCAMGUI.py:1530 +#: flatcamEditors/FlatCAMGrbEditor.py:1698 flatcamGUI/FlatCAMGUI.py:1574 msgid "Gerber Editor" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:852 flatcamGUI/ObjectUI.py:192 +#: flatcamEditors/FlatCAMGrbEditor.py:1717 flatcamGUI/ObjectUI.py:192 msgid "Apertures:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:854 flatcamGUI/ObjectUI.py:194 +#: flatcamEditors/FlatCAMGrbEditor.py:1719 flatcamGUI/ObjectUI.py:194 msgid "Apertures Table for the Gerber Object." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Code" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 #: flatcamGUI/ObjectUI.py:888 flatcamGUI/ObjectUI.py:1446 msgid "Type" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Size" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:865 -#: flatcamEditors/FlatCAMGrbEditor.py:1970 flatcamGUI/ObjectUI.py:228 +#: flatcamEditors/FlatCAMGrbEditor.py:1730 +#: flatcamEditors/FlatCAMGrbEditor.py:2927 flatcamGUI/ObjectUI.py:228 msgid "Dim" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:869 flatcamGUI/ObjectUI.py:232 +#: flatcamEditors/FlatCAMGrbEditor.py:1734 flatcamGUI/ObjectUI.py:232 msgid "Index" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:871 flatcamGUI/ObjectUI.py:234 +#: flatcamEditors/FlatCAMGrbEditor.py:1736 flatcamGUI/ObjectUI.py:234 msgid "Aperture Code" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:873 flatcamGUI/ObjectUI.py:236 +#: flatcamEditors/FlatCAMGrbEditor.py:1738 flatcamGUI/ObjectUI.py:236 msgid "Type of aperture: circular, rectangle, macros etc" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:875 -#: flatcamEditors/FlatCAMGrbEditor.py:908 flatcamGUI/ObjectUI.py:238 +#: flatcamEditors/FlatCAMGrbEditor.py:1740 +#: flatcamEditors/FlatCAMGrbEditor.py:1773 flatcamGUI/ObjectUI.py:238 msgid "Aperture Size:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:877 flatcamGUI/ObjectUI.py:240 +#: flatcamEditors/FlatCAMGrbEditor.py:1742 flatcamGUI/ObjectUI.py:240 msgid "" "Aperture Dimensions:\n" " - (width, height) for R, O type.\n" " - (dia, nVertices) for P type" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:898 +#: flatcamEditors/FlatCAMGrbEditor.py:1763 msgid "Aperture Code:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:900 +#: flatcamEditors/FlatCAMGrbEditor.py:1765 msgid "Code for the new aperture" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:910 +#: flatcamEditors/FlatCAMGrbEditor.py:1775 msgid "" "Size for the new aperture.\n" "If aperture type is 'R' or 'O' then\n" @@ -2816,11 +2960,11 @@ msgid "" "sqrt(width**2 + height**2)" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:922 +#: flatcamEditors/FlatCAMGrbEditor.py:1787 msgid "Aperture Type:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:924 +#: flatcamEditors/FlatCAMGrbEditor.py:1789 msgid "" "Select the type of new aperture. Can be:\n" "C = circular\n" @@ -2828,57 +2972,42 @@ msgid "" "O = oblong" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:935 +#: flatcamEditors/FlatCAMGrbEditor.py:1800 msgid "Aperture Dim:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:937 +#: flatcamEditors/FlatCAMGrbEditor.py:1802 msgid "" "Dimensions for the new aperture.\n" "Active only for rectangular apertures (type R).\n" "The format is (width, height)" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:946 -msgid "Add Aperture:" +#: flatcamEditors/FlatCAMGrbEditor.py:1811 +msgid "Add/Delete Aperture:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:948 -msgid "Add an aperture to the aperture list" +#: flatcamEditors/FlatCAMGrbEditor.py:1813 +msgid "Add/Delete an aperture in the aperture table" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:952 -#: flatcamEditors/FlatCAMGrbEditor.py:965 -msgid "Go" -msgstr "" - -#: flatcamEditors/FlatCAMGrbEditor.py:954 +#: flatcamEditors/FlatCAMGrbEditor.py:1822 msgid "Add a new aperture to the aperture list." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:958 -msgid "Del Aperture:" -msgstr "" - -#: flatcamEditors/FlatCAMGrbEditor.py:960 -msgid "" -"Delete a aperture in the aperture list.\n" -"It will delete also the associated geometry." -msgstr "" - -#: flatcamEditors/FlatCAMGrbEditor.py:967 +#: flatcamEditors/FlatCAMGrbEditor.py:1827 msgid "Delete a aperture in the aperture list" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:982 +#: flatcamEditors/FlatCAMGrbEditor.py:1843 msgid "Buffer Aperture:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:984 +#: flatcamEditors/FlatCAMGrbEditor.py:1845 msgid "Buffer a aperture in the aperture list" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:997 +#: flatcamEditors/FlatCAMGrbEditor.py:1858 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded.\n" @@ -2887,131 +3016,140 @@ msgid "" "meeting in the corner" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1012 flatcamGUI/FlatCAMGUI.py:695 -#: flatcamGUI/FlatCAMGUI.py:1867 +#: flatcamEditors/FlatCAMGrbEditor.py:1873 flatcamGUI/FlatCAMGUI.py:707 +#: flatcamGUI/FlatCAMGUI.py:1911 msgid "Buffer" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1026 +#: flatcamEditors/FlatCAMGrbEditor.py:1887 msgid "Scale Aperture:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1028 +#: flatcamEditors/FlatCAMGrbEditor.py:1889 msgid "Scale a aperture in the aperture list" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1036 +#: flatcamEditors/FlatCAMGrbEditor.py:1897 msgid "Scale factor:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1038 +#: flatcamEditors/FlatCAMGrbEditor.py:1899 msgid "" "The factor by which to scale the selected aperture.\n" "Values can be between 0.0000 and 999.9999" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1066 flatcamGUI/FlatCAMGUI.py:690 -#: flatcamGUI/FlatCAMGUI.py:1862 +#: flatcamEditors/FlatCAMGrbEditor.py:1927 flatcamGUI/FlatCAMGUI.py:696 +#: flatcamGUI/FlatCAMGUI.py:1906 msgid "Add Pad Array" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1068 +#: flatcamEditors/FlatCAMGrbEditor.py:1929 msgid "Add an array of pads (linear or circular array)" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1074 +#: flatcamEditors/FlatCAMGrbEditor.py:1935 msgid "" "Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1085 +#: flatcamEditors/FlatCAMGrbEditor.py:1946 msgid "Nr of pads:" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1087 +#: flatcamEditors/FlatCAMGrbEditor.py:1948 msgid "Specify how many pads to be in the array." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1536 -#: flatcamEditors/FlatCAMGrbEditor.py:1540 +#: flatcamEditors/FlatCAMGrbEditor.py:2420 +#: flatcamEditors/FlatCAMGrbEditor.py:2424 msgid "" "[WARNING_NOTCL] Aperture code value is missing or wrong format. Add it and " "retry." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1577 +#: flatcamEditors/FlatCAMGrbEditor.py:2461 msgid "" "[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. Add it " "in format (width, height) and retry." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1589 +#: flatcamEditors/FlatCAMGrbEditor.py:2473 msgid "" "[WARNING_NOTCL] Aperture size value is missing or wrong format. Add it and " "retry." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1601 +#: flatcamEditors/FlatCAMGrbEditor.py:2485 msgid "[WARNING_NOTCL] Aperture already in the aperture table." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1608 +#: flatcamEditors/FlatCAMGrbEditor.py:2492 #, python-brace-format msgid "[success] Added new aperture with code: {apid}" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1660 +#: flatcamEditors/FlatCAMGrbEditor.py:2521 +#: flatcamEditors/FlatCAMGrbEditor.py:2527 +msgid "[WARNING_NOTCL] Select an aperture in Aperture Table" +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:2550 #, python-brace-format msgid "[success] Deleted aperture with code: {del_dia}" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:1902 +#: flatcamEditors/FlatCAMGrbEditor.py:2851 #, python-format msgid "Adding aperture: %s geo ..." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2058 +#: flatcamEditors/FlatCAMGrbEditor.py:3015 msgid "" "[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber " "creation." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2067 +#: flatcamEditors/FlatCAMGrbEditor.py:3024 msgid "Creating Gerber." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2075 +#: flatcamEditors/FlatCAMGrbEditor.py:3032 msgid "[success] Gerber editing finished." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2092 +#: flatcamEditors/FlatCAMGrbEditor.py:3049 msgid "[WARNING_NOTCL] Cancelled. No aperture is selected" msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2555 -msgid "[success] Done. Apertures deleted." +#: flatcamEditors/FlatCAMGrbEditor.py:3549 +msgid "[ERROR_NOTCL] Failed. No aperture geometry is selected." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2683 +#: flatcamEditors/FlatCAMGrbEditor.py:3557 +msgid "[success] Done. Apertures geometry deleted." +msgstr "" + +#: flatcamEditors/FlatCAMGrbEditor.py:3694 msgid "" "[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try " "again." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2712 +#: flatcamEditors/FlatCAMGrbEditor.py:3723 msgid "" "[WARNING_NOTCL] Scale factor value is missing or wrong format. Add it and " "retry." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2730 +#: flatcamEditors/FlatCAMGrbEditor.py:3741 msgid "" "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try " "again." msgstr "" -#: flatcamEditors/FlatCAMGrbEditor.py:2746 +#: flatcamEditors/FlatCAMGrbEditor.py:3757 msgid "[success] Done. Scale Tool completed." msgstr "" @@ -3055,7 +3193,8 @@ msgstr "" msgid "Will create a new, empty Excellon Object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:78 +#: flatcamGUI/FlatCAMGUI.py:78 flatcamTools/ToolPcbWizard.py:63 +#: flatcamTools/ToolPcbWizard.py:71 msgid "Open" msgstr "" @@ -3164,7 +3303,7 @@ msgstr "" msgid "Save &Defaults" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:514 +#: flatcamGUI/FlatCAMGUI.py:197 flatcamGUI/FlatCAMGUI.py:520 msgid "Save" msgstr "" @@ -3445,7 +3584,7 @@ msgstr "" msgid "Delete Shape\tDEL" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:489 +#: flatcamGUI/FlatCAMGUI.py:422 flatcamGUI/FlatCAMGUI.py:495 msgid "Move\tM" msgstr "" @@ -3481,11 +3620,11 @@ msgstr "" msgid "Resize Drill(S)\tR" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:482 +#: flatcamGUI/FlatCAMGUI.py:449 flatcamGUI/FlatCAMGUI.py:488 msgid "Copy\tC" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:484 +#: flatcamGUI/FlatCAMGUI.py:451 flatcamGUI/FlatCAMGUI.py:490 msgid "Delete\tDEL" msgstr "" @@ -3514,354 +3653,378 @@ msgid "Add Region\tN" msgstr "" #: flatcamGUI/FlatCAMGUI.py:474 -msgid "Buffer\tB" +msgid "Poligonize\tALT+N" msgstr "" #: flatcamGUI/FlatCAMGUI.py:476 -msgid "Scale\tS" +msgid "Add SemiDisc\tE" msgstr "" #: flatcamGUI/FlatCAMGUI.py:478 +msgid "Add Disc\tD" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:480 +msgid "Buffer\tB" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:482 +msgid "Scale\tS" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:484 msgid "Transform\tALT+R" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:505 +#: flatcamGUI/FlatCAMGUI.py:511 msgid "Enable Plot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:506 +#: flatcamGUI/FlatCAMGUI.py:512 msgid "Disable Plot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:508 +#: flatcamGUI/FlatCAMGUI.py:514 msgid "Generate CNC" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:509 +#: flatcamGUI/FlatCAMGUI.py:515 msgid "View Source" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:511 flatcamGUI/FlatCAMGUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1592 msgid "Edit" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:517 flatcamGUI/FlatCAMGUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:523 flatcamGUI/FlatCAMGUI.py:1598 #: flatcamTools/ToolProperties.py:25 msgid "Properties" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:546 +#: flatcamGUI/FlatCAMGUI.py:552 msgid "File Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:550 +#: flatcamGUI/FlatCAMGUI.py:556 msgid "Edit Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:554 +#: flatcamGUI/FlatCAMGUI.py:560 msgid "View Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:558 +#: flatcamGUI/FlatCAMGUI.py:564 msgid "Shell Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:562 +#: flatcamGUI/FlatCAMGUI.py:568 msgid "Tools Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:566 +#: flatcamGUI/FlatCAMGUI.py:572 msgid "Excellon Editor Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:570 +#: flatcamGUI/FlatCAMGUI.py:576 msgid "Geometry Editor Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:580 msgid "Gerber Editor Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:578 +#: flatcamGUI/FlatCAMGUI.py:584 msgid "Grid Toolbar" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:597 flatcamGUI/FlatCAMGUI.py:1765 +#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1809 msgid "Open project" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:598 flatcamGUI/FlatCAMGUI.py:1766 +#: flatcamGUI/FlatCAMGUI.py:604 flatcamGUI/FlatCAMGUI.py:1810 msgid "Save project" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:601 flatcamGUI/FlatCAMGUI.py:1769 +#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1813 msgid "New Blank Geometry" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:602 +#: flatcamGUI/FlatCAMGUI.py:608 msgid "New Blank Gerber" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:603 flatcamGUI/FlatCAMGUI.py:1770 +#: flatcamGUI/FlatCAMGUI.py:609 flatcamGUI/FlatCAMGUI.py:1814 msgid "New Blank Excellon" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:605 flatcamGUI/FlatCAMGUI.py:1772 +#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1816 msgid "Editor" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:607 flatcamGUI/FlatCAMGUI.py:1774 +#: flatcamGUI/FlatCAMGUI.py:613 flatcamGUI/FlatCAMGUI.py:1818 msgid "Save Object and close the Editor" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:611 flatcamGUI/FlatCAMGUI.py:1778 +#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1822 msgid "&Delete" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:614 flatcamGUI/FlatCAMGUI.py:1781 +#: flatcamGUI/FlatCAMGUI.py:620 flatcamGUI/FlatCAMGUI.py:1825 msgid "&Replot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:615 flatcamGUI/FlatCAMGUI.py:1782 +#: flatcamGUI/FlatCAMGUI.py:621 flatcamGUI/FlatCAMGUI.py:1826 msgid "&Clear plot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:616 flatcamGUI/FlatCAMGUI.py:1783 +#: flatcamGUI/FlatCAMGUI.py:622 flatcamGUI/FlatCAMGUI.py:1827 msgid "Zoom In" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:617 flatcamGUI/FlatCAMGUI.py:1784 +#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1828 msgid "Zoom Out" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:618 flatcamGUI/FlatCAMGUI.py:1518 -#: flatcamGUI/FlatCAMGUI.py:1785 +#: flatcamGUI/FlatCAMGUI.py:624 flatcamGUI/FlatCAMGUI.py:1562 +#: flatcamGUI/FlatCAMGUI.py:1829 msgid "Zoom Fit" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:623 flatcamGUI/FlatCAMGUI.py:1790 +#: flatcamGUI/FlatCAMGUI.py:629 flatcamGUI/FlatCAMGUI.py:1834 msgid "&Command Line" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:626 flatcamGUI/FlatCAMGUI.py:1793 +#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1837 msgid "2Sided Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:627 flatcamGUI/FlatCAMGUI.py:1794 +#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1838 msgid "&Cutout Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:628 flatcamGUI/FlatCAMGUI.py:1795 -#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:284 +#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/ObjectUI.py:392 flatcamTools/ToolNonCopperClear.py:285 msgid "NCC Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:632 flatcamGUI/FlatCAMGUI.py:1799 +#: flatcamGUI/FlatCAMGUI.py:638 flatcamGUI/FlatCAMGUI.py:1843 msgid "Panel Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:633 flatcamGUI/FlatCAMGUI.py:1800 +#: flatcamGUI/FlatCAMGUI.py:639 flatcamGUI/FlatCAMGUI.py:1844 #: flatcamTools/ToolFilm.py:204 msgid "Film Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:634 flatcamGUI/FlatCAMGUI.py:1802 +#: flatcamGUI/FlatCAMGUI.py:640 flatcamGUI/FlatCAMGUI.py:1846 msgid "SolderPaste Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:637 flatcamGUI/FlatCAMGUI.py:1806 +#: flatcamGUI/FlatCAMGUI.py:643 flatcamGUI/FlatCAMGUI.py:1850 msgid "Calculators Tool" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:641 flatcamGUI/FlatCAMGUI.py:655 -#: flatcamGUI/FlatCAMGUI.py:688 flatcamGUI/FlatCAMGUI.py:1810 -#: flatcamGUI/FlatCAMGUI.py:1860 +#: flatcamGUI/FlatCAMGUI.py:647 flatcamGUI/FlatCAMGUI.py:661 +#: flatcamGUI/FlatCAMGUI.py:694 flatcamGUI/FlatCAMGUI.py:1854 +#: flatcamGUI/FlatCAMGUI.py:1904 msgid "Select" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:642 flatcamGUI/FlatCAMGUI.py:1811 +#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1855 msgid "Add Drill Hole" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:644 flatcamGUI/FlatCAMGUI.py:1813 +#: flatcamGUI/FlatCAMGUI.py:650 flatcamGUI/FlatCAMGUI.py:1857 msgid "Add Drill Hole Array" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:645 flatcamGUI/FlatCAMGUI.py:1814 +#: flatcamGUI/FlatCAMGUI.py:651 flatcamGUI/FlatCAMGUI.py:1858 msgid "Resize Drill" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:648 flatcamGUI/FlatCAMGUI.py:1817 +#: flatcamGUI/FlatCAMGUI.py:654 flatcamGUI/FlatCAMGUI.py:1861 msgid "Copy Drill" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:649 flatcamGUI/FlatCAMGUI.py:1819 +#: flatcamGUI/FlatCAMGUI.py:655 flatcamGUI/FlatCAMGUI.py:1863 msgid "Delete Drill" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:652 flatcamGUI/FlatCAMGUI.py:1822 +#: flatcamGUI/FlatCAMGUI.py:658 flatcamGUI/FlatCAMGUI.py:1866 msgid "Move Drill" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:656 flatcamGUI/FlatCAMGUI.py:1826 +#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1870 msgid "Add Circle" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:657 flatcamGUI/FlatCAMGUI.py:1827 +#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1871 msgid "Add Arc" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:659 flatcamGUI/FlatCAMGUI.py:1829 +#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1873 msgid "Add Rectangle" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:662 flatcamGUI/FlatCAMGUI.py:1832 +#: flatcamGUI/FlatCAMGUI.py:668 flatcamGUI/FlatCAMGUI.py:1876 msgid "Add Path" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:663 flatcamGUI/FlatCAMGUI.py:1834 +#: flatcamGUI/FlatCAMGUI.py:669 flatcamGUI/FlatCAMGUI.py:1878 msgid "Add Polygon" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:665 flatcamGUI/FlatCAMGUI.py:1836 +#: flatcamGUI/FlatCAMGUI.py:671 flatcamGUI/FlatCAMGUI.py:1880 msgid "Add Text" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:666 flatcamGUI/FlatCAMGUI.py:1838 +#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1882 msgid "Add Buffer" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:667 flatcamGUI/FlatCAMGUI.py:1839 +#: flatcamGUI/FlatCAMGUI.py:673 flatcamGUI/FlatCAMGUI.py:1883 msgid "Paint Shape" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:670 flatcamGUI/FlatCAMGUI.py:1842 +#: flatcamGUI/FlatCAMGUI.py:676 flatcamGUI/FlatCAMGUI.py:1886 msgid "Polygon Union" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:672 flatcamGUI/FlatCAMGUI.py:1844 +#: flatcamGUI/FlatCAMGUI.py:678 flatcamGUI/FlatCAMGUI.py:1888 msgid "Polygon Intersection" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:674 flatcamGUI/FlatCAMGUI.py:1846 +#: flatcamGUI/FlatCAMGUI.py:680 flatcamGUI/FlatCAMGUI.py:1890 msgid "Polygon Subtraction" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:677 flatcamGUI/FlatCAMGUI.py:1849 +#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:1893 msgid "Cut Path" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:678 +#: flatcamGUI/FlatCAMGUI.py:684 msgid "Copy Shape(s)" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:681 +#: flatcamGUI/FlatCAMGUI.py:687 msgid "Delete Shape '-'" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:683 flatcamGUI/FlatCAMGUI.py:702 -#: flatcamGUI/FlatCAMGUI.py:1854 flatcamGUI/FlatCAMGUI.py:1874 +#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:714 +#: flatcamGUI/FlatCAMGUI.py:1898 flatcamGUI/FlatCAMGUI.py:1918 msgid "Transformations" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:685 +#: flatcamGUI/FlatCAMGUI.py:691 msgid "Move Objects " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:689 flatcamGUI/FlatCAMGUI.py:1861 +#: flatcamGUI/FlatCAMGUI.py:695 flatcamGUI/FlatCAMGUI.py:1905 msgid "Add Pad" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:691 flatcamGUI/FlatCAMGUI.py:1863 +#: flatcamGUI/FlatCAMGUI.py:697 flatcamGUI/FlatCAMGUI.py:1907 msgid "Add Track" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:692 flatcamGUI/FlatCAMGUI.py:1864 +#: flatcamGUI/FlatCAMGUI.py:698 flatcamGUI/FlatCAMGUI.py:1908 msgid "Add Region" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:704 flatcamGUI/FlatCAMGUI.py:1528 -#: flatcamGUI/FlatCAMGUI.py:1538 flatcamGUI/FlatCAMGUI.py:1553 -#: flatcamGUI/FlatCAMGUI.py:1876 flatcamTools/ToolMove.py:26 +#: flatcamGUI/FlatCAMGUI.py:700 +msgid "Poligonize" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:703 +msgid "SemiDisc" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:704 +msgid "Disc" +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:716 flatcamGUI/FlatCAMGUI.py:1572 +#: flatcamGUI/FlatCAMGUI.py:1582 flatcamGUI/FlatCAMGUI.py:1597 +#: flatcamGUI/FlatCAMGUI.py:1920 flatcamTools/ToolMove.py:26 msgid "Move" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:710 flatcamGUI/FlatCAMGUI.py:1882 +#: flatcamGUI/FlatCAMGUI.py:722 flatcamGUI/FlatCAMGUI.py:1926 msgid "Snap to grid" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:713 flatcamGUI/FlatCAMGUI.py:1885 +#: flatcamGUI/FlatCAMGUI.py:725 flatcamGUI/FlatCAMGUI.py:1929 msgid "Grid X snapping distance" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:718 flatcamGUI/FlatCAMGUI.py:1890 +#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1934 msgid "Grid Y snapping distance" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:724 flatcamGUI/FlatCAMGUI.py:1896 +#: flatcamGUI/FlatCAMGUI.py:736 flatcamGUI/FlatCAMGUI.py:1940 msgid "" "When active, value on Grid_X\n" "is copied to the Grid_Y value." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:730 flatcamGUI/FlatCAMGUI.py:1902 +#: flatcamGUI/FlatCAMGUI.py:742 flatcamGUI/FlatCAMGUI.py:1946 msgid "Snap to corner" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:734 flatcamGUI/FlatCAMGUI.py:1906 -#: flatcamGUI/FlatCAMGUI.py:3197 +#: flatcamGUI/FlatCAMGUI.py:746 flatcamGUI/FlatCAMGUI.py:1950 +#: flatcamGUI/FlatCAMGUI.py:3286 msgid "Max. magnet distance" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:748 flatcamGUI/FlatCAMGUI.py:1512 +#: flatcamGUI/FlatCAMGUI.py:760 flatcamGUI/FlatCAMGUI.py:1556 msgid "Project" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:757 +#: flatcamGUI/FlatCAMGUI.py:769 msgid "Selected" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:776 flatcamGUI/FlatCAMGUI.py:784 +#: flatcamGUI/FlatCAMGUI.py:788 flatcamGUI/FlatCAMGUI.py:796 msgid "Plot Area" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:808 +#: flatcamGUI/FlatCAMGUI.py:820 msgid "General" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:817 +#: flatcamGUI/FlatCAMGUI.py:829 msgid "APP. DEFAULTS" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:818 +#: flatcamGUI/FlatCAMGUI.py:830 msgid "PROJ. OPTIONS " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:829 +#: flatcamGUI/FlatCAMGUI.py:841 msgid "GERBER" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:838 +#: flatcamGUI/FlatCAMGUI.py:850 msgid "EXCELLON" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:847 +#: flatcamGUI/FlatCAMGUI.py:859 msgid "GEOMETRY" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:857 +#: flatcamGUI/FlatCAMGUI.py:869 msgid "CNC-JOB" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:866 +#: flatcamGUI/FlatCAMGUI.py:878 msgid "TOOLS" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:883 +#: flatcamGUI/FlatCAMGUI.py:895 msgid "Import Preferences" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:886 +#: flatcamGUI/FlatCAMGUI.py:898 msgid "" "Import a full set of FlatCAM settings from a file\n" "previously saved on HDD.\n" @@ -3870,35 +4033,35 @@ msgid "" "on the first start. Do not delete that file." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:893 +#: flatcamGUI/FlatCAMGUI.py:905 msgid "Export Preferences" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:896 +#: flatcamGUI/FlatCAMGUI.py:908 msgid "" "Export a full set of FlatCAM settings in a file\n" "that is saved on HDD." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:901 +#: flatcamGUI/FlatCAMGUI.py:913 msgid "Open Pref Folder" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:904 +#: flatcamGUI/FlatCAMGUI.py:916 msgid "Open the folder where FlatCAM save the preferences files." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:912 +#: flatcamGUI/FlatCAMGUI.py:924 msgid "Save Preferences" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:915 +#: flatcamGUI/FlatCAMGUI.py:927 msgid "" "Save the current settings in the 'current_defaults' file\n" "which is the file storing the working default preferences." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:941 +#: flatcamGUI/FlatCAMGUI.py:953 msgid "" "General Shortcut list
\n" "  \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4108,6 +4275,10 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4174,7 +4345,7 @@ msgid "" " " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1218 +#: flatcamGUI/FlatCAMGUI.py:1238 msgid "" "Editor Shortcut list
\n" "
\n" @@ -4198,6 +4369,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4218,6 +4394,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4402,6 +4583,14 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4418,6 +4607,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4426,6 +4620,11 @@ msgid "" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -4462,147 +4661,147 @@ msgid "" " " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1506 +#: flatcamGUI/FlatCAMGUI.py:1550 msgid "Disable" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1508 +#: flatcamGUI/FlatCAMGUI.py:1552 msgid "New" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1509 +#: flatcamGUI/FlatCAMGUI.py:1553 msgid "Geometry" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1510 +#: flatcamGUI/FlatCAMGUI.py:1554 msgid "Excellon" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1515 +#: flatcamGUI/FlatCAMGUI.py:1559 msgid "Grids" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1517 +#: flatcamGUI/FlatCAMGUI.py:1561 msgid "View" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1519 +#: flatcamGUI/FlatCAMGUI.py:1563 msgid "Clear Plot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1520 +#: flatcamGUI/FlatCAMGUI.py:1564 msgid "Replot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1523 +#: flatcamGUI/FlatCAMGUI.py:1567 msgid "Geo Editor" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1524 +#: flatcamGUI/FlatCAMGUI.py:1568 msgid "Line" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1525 +#: flatcamGUI/FlatCAMGUI.py:1569 msgid "Rectangle" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1526 flatcamGUI/FlatCAMGUI.py:5021 +#: flatcamGUI/FlatCAMGUI.py:1570 flatcamGUI/FlatCAMGUI.py:5110 #: flatcamGUI/ObjectUI.py:1360 msgid "Cut" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1531 +#: flatcamGUI/FlatCAMGUI.py:1575 msgid "Pad" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1532 +#: flatcamGUI/FlatCAMGUI.py:1576 msgid "Pad Array" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1533 +#: flatcamGUI/FlatCAMGUI.py:1577 msgid "Track" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1534 +#: flatcamGUI/FlatCAMGUI.py:1578 msgid "Region" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1540 +#: flatcamGUI/FlatCAMGUI.py:1584 msgid "Exc Editor" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1541 +#: flatcamGUI/FlatCAMGUI.py:1585 msgid "Add Drill" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1543 +#: flatcamGUI/FlatCAMGUI.py:1587 msgid "Copy Drill(s)" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1574 +#: flatcamGUI/FlatCAMGUI.py:1618 msgid "Print Preview" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1575 +#: flatcamGUI/FlatCAMGUI.py:1619 msgid "Print Code" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1576 +#: flatcamGUI/FlatCAMGUI.py:1620 msgid "Find in Code" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1581 +#: flatcamGUI/FlatCAMGUI.py:1625 msgid "Replace With" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1585 flatcamGUI/FlatCAMGUI.py:5019 -#: flatcamGUI/FlatCAMGUI.py:5529 flatcamGUI/ObjectUI.py:1358 +#: flatcamGUI/FlatCAMGUI.py:1629 flatcamGUI/FlatCAMGUI.py:5108 +#: flatcamGUI/FlatCAMGUI.py:5618 flatcamGUI/ObjectUI.py:1358 msgid "All" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1587 +#: flatcamGUI/FlatCAMGUI.py:1631 msgid "" "When checked it will replace all instances in the 'Find' box\n" "with the text in the 'Replace' box.." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1590 +#: flatcamGUI/FlatCAMGUI.py:1634 msgid "Open Code" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1591 +#: flatcamGUI/FlatCAMGUI.py:1635 msgid "Save Code" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1626 +#: flatcamGUI/FlatCAMGUI.py:1670 msgid "" "Relative neasurement.\n" "Reference is last click position" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1632 +#: flatcamGUI/FlatCAMGUI.py:1676 msgid "" "Absolute neasurement.\n" "Reference is (X=0, Y= 0) position" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1825 +#: flatcamGUI/FlatCAMGUI.py:1869 msgid "Select 'Esc'" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1850 +#: flatcamGUI/FlatCAMGUI.py:1894 msgid "Copy Objects" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1852 +#: flatcamGUI/FlatCAMGUI.py:1896 msgid "Delete Shape" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:1857 +#: flatcamGUI/FlatCAMGUI.py:1901 msgid "Move Objects" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2266 +#: flatcamGUI/FlatCAMGUI.py:2319 msgid "" "Please first select a geometry item to be cutted\n" "then select the geometry item that will be cutted\n" @@ -4610,127 +4809,131 @@ msgid "" "the toolbar button." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2273 flatcamGUI/FlatCAMGUI.py:2405 -#: flatcamGUI/FlatCAMGUI.py:2464 flatcamGUI/FlatCAMGUI.py:2484 +#: flatcamGUI/FlatCAMGUI.py:2326 flatcamGUI/FlatCAMGUI.py:2463 +#: flatcamGUI/FlatCAMGUI.py:2522 flatcamGUI/FlatCAMGUI.py:2542 msgid "Warning" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2340 flatcamGUI/FlatCAMGUI.py:2537 -#: flatcamGUI/FlatCAMGUI.py:2735 +#: flatcamGUI/FlatCAMGUI.py:2393 flatcamGUI/FlatCAMGUI.py:2592 +#: flatcamGUI/FlatCAMGUI.py:2803 msgid "[WARNING_NOTCL] Cancelled." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2400 +#: flatcamGUI/FlatCAMGUI.py:2458 msgid "" "Please select geometry items \n" "on which to perform Intersection Tool." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2459 +#: flatcamGUI/FlatCAMGUI.py:2517 msgid "" "Please select geometry items \n" "on which to perform Substraction Tool." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2479 +#: flatcamGUI/FlatCAMGUI.py:2537 msgid "" "Please select geometry items \n" "on which to perform union." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2552 flatcamGUI/FlatCAMGUI.py:2752 +#: flatcamGUI/FlatCAMGUI.py:2608 flatcamGUI/FlatCAMGUI.py:2820 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to delete." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2629 flatcamGUI/FlatCAMGUI.py:2819 +#: flatcamGUI/FlatCAMGUI.py:2692 flatcamGUI/FlatCAMGUI.py:2887 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to copy." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2663 flatcamGUI/FlatCAMGUI.py:2865 +#: flatcamGUI/FlatCAMGUI.py:2738 flatcamGUI/FlatCAMGUI.py:2933 msgid "[WARNING_NOTCL] Cancelled. Nothing selected to move." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2879 +#: flatcamGUI/FlatCAMGUI.py:2947 msgid "New Tool ..." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:2880 +#: flatcamGUI/FlatCAMGUI.py:2948 msgid "Enter a Tool Diameter:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3182 +#: flatcamGUI/FlatCAMGUI.py:2990 +msgid "Measurement Tool exit..." +msgstr "" + +#: flatcamGUI/FlatCAMGUI.py:3271 msgid "Grid X value:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3184 +#: flatcamGUI/FlatCAMGUI.py:3273 msgid "This is the Grid snap value on X axis." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3189 +#: flatcamGUI/FlatCAMGUI.py:3278 msgid "Grid Y value:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3191 +#: flatcamGUI/FlatCAMGUI.py:3280 msgid "This is the Grid snap value on Y axis." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3196 +#: flatcamGUI/FlatCAMGUI.py:3285 msgid "Snap Max:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3201 +#: flatcamGUI/FlatCAMGUI.py:3290 msgid "Workspace:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3203 +#: flatcamGUI/FlatCAMGUI.py:3292 msgid "" "Draw a delimiting rectangle on canvas.\n" "The purpose is to illustrate the limits for our work." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3206 +#: flatcamGUI/FlatCAMGUI.py:3295 msgid "Wk. format:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3208 +#: flatcamGUI/FlatCAMGUI.py:3297 msgid "" "Select the type of rectangle to be used on canvas,\n" "as valid workspace." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3221 +#: flatcamGUI/FlatCAMGUI.py:3310 msgid "Plot Fill:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3223 +#: flatcamGUI/FlatCAMGUI.py:3312 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 "" -#: flatcamGUI/FlatCAMGUI.py:3237 flatcamGUI/FlatCAMGUI.py:3287 -#: flatcamGUI/FlatCAMGUI.py:3337 +#: flatcamGUI/FlatCAMGUI.py:3326 flatcamGUI/FlatCAMGUI.py:3376 +#: flatcamGUI/FlatCAMGUI.py:3426 msgid "Alpha Level:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3239 +#: flatcamGUI/FlatCAMGUI.py:3328 msgid "Set the fill transparency for plotted objects." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3256 +#: flatcamGUI/FlatCAMGUI.py:3345 msgid "Plot Line:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3258 +#: flatcamGUI/FlatCAMGUI.py:3347 msgid "Set the line color for plotted objects." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3270 +#: flatcamGUI/FlatCAMGUI.py:3359 msgid "Sel. Fill:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3272 +#: flatcamGUI/FlatCAMGUI.py:3361 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from left to right.\n" @@ -4738,23 +4941,23 @@ msgid "" "digits are for alpha (transparency) level." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3289 +#: flatcamGUI/FlatCAMGUI.py:3378 msgid "Set the fill transparency for the 'left to right' selection box." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3306 +#: flatcamGUI/FlatCAMGUI.py:3395 msgid "Sel. Line:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3308 +#: flatcamGUI/FlatCAMGUI.py:3397 msgid "Set the line color for the 'left to right' selection box." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3320 +#: flatcamGUI/FlatCAMGUI.py:3409 msgid "Sel2. Fill:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3322 +#: flatcamGUI/FlatCAMGUI.py:3411 msgid "" "Set the fill color for the selection box\n" "in case that the selection is done from right to left.\n" @@ -4762,121 +4965,121 @@ msgid "" "digits are for alpha (transparency) level." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3339 +#: flatcamGUI/FlatCAMGUI.py:3428 msgid "Set the fill transparency for selection 'right to left' box." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3356 +#: flatcamGUI/FlatCAMGUI.py:3445 msgid "Sel2. Line:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3358 +#: flatcamGUI/FlatCAMGUI.py:3447 msgid "Set the line color for the 'right to left' selection box." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3370 +#: flatcamGUI/FlatCAMGUI.py:3459 msgid "Editor Draw:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3372 +#: flatcamGUI/FlatCAMGUI.py:3461 msgid "Set the color for the shape." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3384 +#: flatcamGUI/FlatCAMGUI.py:3473 msgid "Editor Draw Sel.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3386 +#: flatcamGUI/FlatCAMGUI.py:3475 msgid "Set the color of the shape when selected." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3433 +#: flatcamGUI/FlatCAMGUI.py:3522 msgid "GUI Settings" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3440 +#: flatcamGUI/FlatCAMGUI.py:3529 msgid "Layout:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3442 +#: flatcamGUI/FlatCAMGUI.py:3531 msgid "" "Select an layout for FlatCAM.\n" "It is applied immediately." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3458 +#: flatcamGUI/FlatCAMGUI.py:3547 msgid "Style:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3460 +#: flatcamGUI/FlatCAMGUI.py:3549 msgid "" "Select an style for FlatCAM.\n" "It will be applied at the next app start." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3471 +#: flatcamGUI/FlatCAMGUI.py:3560 msgid "HDPI Support:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3473 +#: flatcamGUI/FlatCAMGUI.py:3562 msgid "" "Enable High DPI support for FlatCAM.\n" "It will be applied at the next app start." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3486 +#: flatcamGUI/FlatCAMGUI.py:3575 msgid "Clear GUI Settings:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3488 +#: flatcamGUI/FlatCAMGUI.py:3577 msgid "" "Clear the GUI settings for FlatCAM,\n" "such as: layout, gui state, style, hdpi support etc." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3491 +#: flatcamGUI/FlatCAMGUI.py:3580 msgid "Clear" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3495 +#: flatcamGUI/FlatCAMGUI.py:3584 msgid "Hover Shape:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3497 +#: flatcamGUI/FlatCAMGUI.py:3586 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 "" -#: flatcamGUI/FlatCAMGUI.py:3537 +#: flatcamGUI/FlatCAMGUI.py:3626 msgid "Are you sure you want to delete the GUI Settings? \n" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3540 +#: flatcamGUI/FlatCAMGUI.py:3629 msgid "Clear GUI Settings" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3561 +#: flatcamGUI/FlatCAMGUI.py:3650 msgid "App Preferences" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3567 +#: flatcamGUI/FlatCAMGUI.py:3656 msgid "Units:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3568 +#: flatcamGUI/FlatCAMGUI.py:3657 msgid "" "The default value for FlatCAM units.\n" "Whatever is selected here is set every time\n" "FLatCAM is started." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3575 +#: flatcamGUI/FlatCAMGUI.py:3664 msgid "APP. LEVEL:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3576 +#: flatcamGUI/FlatCAMGUI.py:3665 msgid "" "Choose the default level of usage for FlatCAM.\n" "BASIC level -> reduced functionality, best for beginner's.\n" @@ -4886,127 +5089,127 @@ msgid "" "the Selected Tab for all kinds of FlatCAM objects." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3581 flatcamGUI/FlatCAMGUI.py:4206 +#: flatcamGUI/FlatCAMGUI.py:3670 flatcamGUI/FlatCAMGUI.py:4295 msgid "Basic" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3582 +#: flatcamGUI/FlatCAMGUI.py:3671 msgid "Advanced" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3585 +#: flatcamGUI/FlatCAMGUI.py:3674 msgid "Languages:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3586 +#: flatcamGUI/FlatCAMGUI.py:3675 msgid "Set the language used throughout FlatCAM." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3589 +#: flatcamGUI/FlatCAMGUI.py:3678 msgid "Apply Language" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3592 +#: flatcamGUI/FlatCAMGUI.py:3681 msgid "Shell at StartUp:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3594 flatcamGUI/FlatCAMGUI.py:3599 +#: flatcamGUI/FlatCAMGUI.py:3683 flatcamGUI/FlatCAMGUI.py:3688 msgid "" "Check this box if you want the shell to\n" "start automatically at startup." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3604 +#: flatcamGUI/FlatCAMGUI.py:3693 msgid "Version Check:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3606 flatcamGUI/FlatCAMGUI.py:3611 +#: flatcamGUI/FlatCAMGUI.py:3695 flatcamGUI/FlatCAMGUI.py:3700 msgid "" "Check this box if you want to check\n" "for a new version automatically at startup." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3616 +#: flatcamGUI/FlatCAMGUI.py:3705 msgid "Send Stats:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3618 flatcamGUI/FlatCAMGUI.py:3623 +#: flatcamGUI/FlatCAMGUI.py:3707 flatcamGUI/FlatCAMGUI.py:3712 msgid "" "Check this box if you agree to send anonymous\n" "stats automatically at startup, to help improve FlatCAM." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3630 +#: flatcamGUI/FlatCAMGUI.py:3719 msgid "Pan Button:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3631 +#: flatcamGUI/FlatCAMGUI.py:3720 msgid "" "Select the mouse button to use for panning:\n" "- MMB --> Middle Mouse Button\n" "- RMB --> Right Mouse Button" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3634 +#: flatcamGUI/FlatCAMGUI.py:3723 msgid "MMB" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3635 +#: flatcamGUI/FlatCAMGUI.py:3724 msgid "RMB" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3638 +#: flatcamGUI/FlatCAMGUI.py:3727 msgid "Multiple Sel:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3639 +#: flatcamGUI/FlatCAMGUI.py:3728 msgid "Select the key used for multiple selection." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3640 +#: flatcamGUI/FlatCAMGUI.py:3729 msgid "CTRL" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3641 +#: flatcamGUI/FlatCAMGUI.py:3730 msgid "SHIFT" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3644 +#: flatcamGUI/FlatCAMGUI.py:3733 msgid "Project at StartUp:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3646 flatcamGUI/FlatCAMGUI.py:3651 +#: flatcamGUI/FlatCAMGUI.py:3735 flatcamGUI/FlatCAMGUI.py:3740 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:3656 +#: flatcamGUI/FlatCAMGUI.py:3745 msgid "Project AutoHide:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3658 flatcamGUI/FlatCAMGUI.py:3664 +#: flatcamGUI/FlatCAMGUI.py:3747 flatcamGUI/FlatCAMGUI.py:3753 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:3670 +#: flatcamGUI/FlatCAMGUI.py:3759 msgid "Enable ToolTips:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3672 flatcamGUI/FlatCAMGUI.py:3677 +#: flatcamGUI/FlatCAMGUI.py:3761 flatcamGUI/FlatCAMGUI.py:3766 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:3680 +#: flatcamGUI/FlatCAMGUI.py:3769 msgid "Workers number:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3682 flatcamGUI/FlatCAMGUI.py:3691 +#: flatcamGUI/FlatCAMGUI.py:3771 flatcamGUI/FlatCAMGUI.py:3780 msgid "" "The number of Qthreads made available to the App.\n" "A bigger number may finish the jobs more quickly but\n" @@ -5016,108 +5219,108 @@ msgid "" "After change, it will be applied at next App start." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3732 +#: flatcamGUI/FlatCAMGUI.py:3821 msgid "Save Compressed Project" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3734 +#: flatcamGUI/FlatCAMGUI.py:3823 msgid "" "Whether to save a compressed or uncompressed project.\n" "When checked it will save a compressed FlatCAM project." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3745 +#: flatcamGUI/FlatCAMGUI.py:3834 msgid "Compression Level:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3747 +#: flatcamGUI/FlatCAMGUI.py:3836 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:3773 flatcamGUI/FlatCAMGUI.py:4014 -#: flatcamGUI/FlatCAMGUI.py:4669 flatcamGUI/FlatCAMGUI.py:4993 +#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/FlatCAMGUI.py:4103 +#: flatcamGUI/FlatCAMGUI.py:4758 flatcamGUI/FlatCAMGUI.py:5082 #: flatcamGUI/ObjectUI.py:150 flatcamGUI/ObjectUI.py:505 #: flatcamGUI/ObjectUI.py:830 flatcamGUI/ObjectUI.py:1344 msgid "Plot Options:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3780 flatcamGUI/FlatCAMGUI.py:4026 +#: flatcamGUI/FlatCAMGUI.py:3869 flatcamGUI/FlatCAMGUI.py:4115 #: flatcamGUI/ObjectUI.py:506 msgid "Solid" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3782 flatcamGUI/ObjectUI.py:158 +#: flatcamGUI/FlatCAMGUI.py:3871 flatcamGUI/ObjectUI.py:158 msgid "Solid color polygons." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3787 +#: flatcamGUI/FlatCAMGUI.py:3876 msgid "M-Color" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3789 flatcamGUI/ObjectUI.py:166 +#: flatcamGUI/FlatCAMGUI.py:3878 flatcamGUI/ObjectUI.py:166 msgid "Draw polygons in different colors." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3794 flatcamGUI/FlatCAMGUI.py:4020 -#: flatcamGUI/FlatCAMGUI.py:4673 flatcamGUI/ObjectUI.py:172 +#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:4109 +#: flatcamGUI/FlatCAMGUI.py:4762 flatcamGUI/ObjectUI.py:172 msgid "Plot" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3796 flatcamGUI/FlatCAMGUI.py:4675 +#: flatcamGUI/FlatCAMGUI.py:3885 flatcamGUI/FlatCAMGUI.py:4764 #: flatcamGUI/ObjectUI.py:174 flatcamGUI/ObjectUI.py:546 #: flatcamGUI/ObjectUI.py:876 flatcamGUI/ObjectUI.py:1431 msgid "Plot (show) this object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3801 flatcamGUI/FlatCAMGUI.py:4682 -#: flatcamGUI/FlatCAMGUI.py:5029 +#: flatcamGUI/FlatCAMGUI.py:3890 flatcamGUI/FlatCAMGUI.py:4771 +#: flatcamGUI/FlatCAMGUI.py:5118 msgid "Circle Steps:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3803 +#: flatcamGUI/FlatCAMGUI.py:3892 msgid "" "The number of circle steps for Gerber \n" "circular aperture linear approximation." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3818 +#: flatcamGUI/FlatCAMGUI.py:3907 msgid "Gerber Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3822 flatcamGUI/ObjectUI.py:251 +#: flatcamGUI/FlatCAMGUI.py:3911 flatcamGUI/ObjectUI.py:251 msgid "Isolation Routing:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3824 flatcamGUI/ObjectUI.py:253 +#: flatcamGUI/FlatCAMGUI.py:3913 flatcamGUI/ObjectUI.py:253 msgid "" "Create a Geometry object with\n" "toolpaths to cut outside polygons." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3835 flatcamGUI/FlatCAMGUI.py:4392 -#: flatcamGUI/FlatCAMGUI.py:5317 flatcamGUI/ObjectUI.py:785 +#: flatcamGUI/FlatCAMGUI.py:3924 flatcamGUI/FlatCAMGUI.py:4481 +#: flatcamGUI/FlatCAMGUI.py:5406 flatcamGUI/ObjectUI.py:785 #: flatcamGUI/ObjectUI.py:801 msgid "Diameter of the cutting tool." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3842 +#: flatcamGUI/FlatCAMGUI.py:3931 msgid "Width (# passes):" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3844 flatcamGUI/ObjectUI.py:275 +#: flatcamGUI/FlatCAMGUI.py:3933 flatcamGUI/ObjectUI.py:275 msgid "" "Width of the isolation gap in\n" "number (integer) of tool widths." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3852 flatcamGUI/ObjectUI.py:283 +#: flatcamGUI/FlatCAMGUI.py:3941 flatcamGUI/ObjectUI.py:283 msgid "Pass overlap:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3854 flatcamGUI/ObjectUI.py:285 +#: flatcamGUI/FlatCAMGUI.py:3943 flatcamGUI/ObjectUI.py:285 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -5126,50 +5329,50 @@ msgid "" "above." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3862 flatcamGUI/ObjectUI.py:295 +#: flatcamGUI/FlatCAMGUI.py:3951 flatcamGUI/ObjectUI.py:295 msgid "Milling Type:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3864 flatcamGUI/ObjectUI.py:297 +#: flatcamGUI/FlatCAMGUI.py:3953 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:3869 flatcamGUI/ObjectUI.py:302 +#: flatcamGUI/FlatCAMGUI.py:3958 flatcamGUI/ObjectUI.py:302 msgid "Climb" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3870 flatcamGUI/ObjectUI.py:303 +#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:303 msgid "Conv." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3874 +#: flatcamGUI/FlatCAMGUI.py:3963 msgid "Combine Passes" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3876 flatcamGUI/ObjectUI.py:309 +#: flatcamGUI/FlatCAMGUI.py:3965 flatcamGUI/ObjectUI.py:309 msgid "Combine all passes into one object" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3881 +#: flatcamGUI/FlatCAMGUI.py:3970 msgid "Clear non-copper:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3883 flatcamGUI/FlatCAMGUI.py:5205 +#: flatcamGUI/FlatCAMGUI.py:3972 flatcamGUI/FlatCAMGUI.py:5294 #: flatcamGUI/ObjectUI.py:386 msgid "" "Create a Geometry object with\n" "toolpaths to cut all non-copper regions." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3892 flatcamGUI/FlatCAMGUI.py:3918 +#: flatcamGUI/FlatCAMGUI.py:3981 flatcamGUI/FlatCAMGUI.py:4007 #: flatcamGUI/ObjectUI.py:430 flatcamGUI/ObjectUI.py:464 msgid "Boundary Margin:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3894 flatcamGUI/ObjectUI.py:432 +#: flatcamGUI/FlatCAMGUI.py:3983 flatcamGUI/ObjectUI.py:432 msgid "" "Specify the edge of the PCB\n" "by drawing a box around all\n" @@ -5177,27 +5380,27 @@ msgid "" "distance." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3904 flatcamGUI/FlatCAMGUI.py:3927 +#: flatcamGUI/FlatCAMGUI.py:3993 flatcamGUI/FlatCAMGUI.py:4016 msgid "Rounded corners" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3906 +#: flatcamGUI/FlatCAMGUI.py:3995 msgid "" "Creates a Geometry objects with polygons\n" "covering the copper-free areas of the PCB." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3912 flatcamGUI/ObjectUI.py:454 +#: flatcamGUI/FlatCAMGUI.py:4001 flatcamGUI/ObjectUI.py:454 msgid "Bounding Box:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3920 flatcamGUI/ObjectUI.py:466 +#: flatcamGUI/FlatCAMGUI.py:4009 flatcamGUI/ObjectUI.py:466 msgid "" "Distance of the edges of the box\n" "to the nearest polygon." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3929 flatcamGUI/ObjectUI.py:476 +#: flatcamGUI/FlatCAMGUI.py:4018 flatcamGUI/ObjectUI.py:476 msgid "" "If the bounding box is \n" "to have rounded corners\n" @@ -5205,74 +5408,74 @@ msgid "" "the margin." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3943 +#: flatcamGUI/FlatCAMGUI.py:4032 msgid "Gerber Adv. Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3947 +#: flatcamGUI/FlatCAMGUI.py:4036 msgid "Advanced Param.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3949 +#: flatcamGUI/FlatCAMGUI.py:4038 msgid "" "A list of Gerber advanced parameters.\n" "Those parameters are available only for\n" "Advanced App. Level." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3959 flatcamGUI/ObjectUI.py:314 +#: flatcamGUI/FlatCAMGUI.py:4048 flatcamGUI/ObjectUI.py:314 msgid "\"Follow\"" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3961 flatcamGUI/ObjectUI.py:316 +#: flatcamGUI/FlatCAMGUI.py:4050 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:3969 +#: flatcamGUI/FlatCAMGUI.py:4058 msgid "Table Show/Hide" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3971 +#: flatcamGUI/FlatCAMGUI.py:4060 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:3979 +#: flatcamGUI/FlatCAMGUI.py:4068 msgid "Ap. Scale Factor:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3981 +#: flatcamGUI/FlatCAMGUI.py:4070 msgid "" "Change the size of the selected apertures.\n" "Factor by which to multiply\n" "geometric features of this object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3991 +#: flatcamGUI/FlatCAMGUI.py:4080 msgid "Ap. Buffer Factor:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:3993 +#: flatcamGUI/FlatCAMGUI.py:4082 msgid "" "Change the size of the selected apertures.\n" "Factor by which to expand/shrink\n" "geometric features of this object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4011 +#: flatcamGUI/FlatCAMGUI.py:4100 msgid "Excellon General" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4033 +#: flatcamGUI/FlatCAMGUI.py:4122 msgid "Excellon Format:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4035 +#: flatcamGUI/FlatCAMGUI.py:4124 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -5295,41 +5498,41 @@ msgid "" "KiCAD 3:5 INCH TZ" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4060 +#: flatcamGUI/FlatCAMGUI.py:4149 msgid "INCH:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4063 +#: flatcamGUI/FlatCAMGUI.py:4152 msgid "Default values for INCH are 2:4" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4071 flatcamGUI/FlatCAMGUI.py:4104 -#: flatcamGUI/FlatCAMGUI.py:4581 +#: flatcamGUI/FlatCAMGUI.py:4160 flatcamGUI/FlatCAMGUI.py:4193 +#: flatcamGUI/FlatCAMGUI.py:4670 msgid "" "This numbers signify the number of digits in\n" "the whole part of Excellon coordinates." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4085 flatcamGUI/FlatCAMGUI.py:4118 -#: flatcamGUI/FlatCAMGUI.py:4595 +#: flatcamGUI/FlatCAMGUI.py:4174 flatcamGUI/FlatCAMGUI.py:4207 +#: flatcamGUI/FlatCAMGUI.py:4684 msgid "" "This numbers signify the number of digits in\n" "the decimal part of Excellon coordinates." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4093 +#: flatcamGUI/FlatCAMGUI.py:4182 msgid "METRIC:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4096 +#: flatcamGUI/FlatCAMGUI.py:4185 msgid "Default values for METRIC are 3:3" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4127 +#: flatcamGUI/FlatCAMGUI.py:4216 msgid "Default Zeros:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4130 flatcamGUI/FlatCAMGUI.py:4630 +#: flatcamGUI/FlatCAMGUI.py:4219 flatcamGUI/FlatCAMGUI.py:4719 msgid "" "This sets the type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -5338,15 +5541,15 @@ msgid "" "and Leading Zeros are removed." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4138 flatcamGUI/FlatCAMGUI.py:4637 +#: flatcamGUI/FlatCAMGUI.py:4227 flatcamGUI/FlatCAMGUI.py:4726 msgid "LZ" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4139 flatcamGUI/FlatCAMGUI.py:4638 +#: flatcamGUI/FlatCAMGUI.py:4228 flatcamGUI/FlatCAMGUI.py:4727 msgid "TZ" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4141 +#: flatcamGUI/FlatCAMGUI.py:4230 msgid "" "This sets the default type of Excellon zeros.\n" "If it is not detected in the parsed file the value here\n" @@ -5356,11 +5559,11 @@ msgid "" "and Leading Zeros are removed." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4155 +#: flatcamGUI/FlatCAMGUI.py:4244 msgid "Default Units:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4158 +#: flatcamGUI/FlatCAMGUI.py:4247 msgid "" "This sets the default units of Excellon files.\n" "If it is not detected in the parsed file the value here\n" @@ -5368,30 +5571,30 @@ msgid "" "therefore this parameter will be used." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4166 flatcamGUI/FlatCAMGUI.py:4557 +#: flatcamGUI/FlatCAMGUI.py:4255 flatcamGUI/FlatCAMGUI.py:4646 msgid "INCH" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4167 flatcamGUI/FlatCAMGUI.py:4558 +#: flatcamGUI/FlatCAMGUI.py:4256 flatcamGUI/FlatCAMGUI.py:4647 msgid "MM" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4169 +#: flatcamGUI/FlatCAMGUI.py:4258 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:4185 +#: flatcamGUI/FlatCAMGUI.py:4274 msgid "Excellon Optimization:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4192 +#: flatcamGUI/FlatCAMGUI.py:4281 msgid "Algorithm: " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4195 flatcamGUI/FlatCAMGUI.py:4208 +#: flatcamGUI/FlatCAMGUI.py:4284 flatcamGUI/FlatCAMGUI.py:4297 msgid "" "This sets the optimization type for the Excellon drill path.\n" "If MH is checked then Google OR-Tools algorithm with MetaHeuristic\n" @@ -5403,15 +5606,15 @@ msgid "" "Travelling Salesman algorithm for path optimization." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4205 +#: flatcamGUI/FlatCAMGUI.py:4294 msgid "MH" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4220 +#: flatcamGUI/FlatCAMGUI.py:4309 msgid "Optimization Time: " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4223 +#: flatcamGUI/FlatCAMGUI.py:4312 msgid "" "When OR-Tools Metaheuristic (MH) is enabled there is a\n" "maximum threshold for how much time is spent doing the\n" @@ -5419,120 +5622,120 @@ msgid "" "In seconds." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4264 +#: flatcamGUI/FlatCAMGUI.py:4353 msgid "Excellon Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4267 flatcamGUI/ObjectUI.py:584 +#: flatcamGUI/FlatCAMGUI.py:4356 flatcamGUI/ObjectUI.py:584 msgid "Create CNC Job" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4269 +#: flatcamGUI/FlatCAMGUI.py:4358 msgid "" "Parameters used to create a CNC Job object\n" "for this drill object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4277 flatcamGUI/FlatCAMGUI.py:4733 -#: flatcamGUI/FlatCAMGUI.py:5741 flatcamGUI/ObjectUI.py:595 +#: flatcamGUI/FlatCAMGUI.py:4366 flatcamGUI/FlatCAMGUI.py:4822 +#: flatcamGUI/FlatCAMGUI.py:5830 flatcamGUI/ObjectUI.py:595 #: flatcamGUI/ObjectUI.py:1059 flatcamTools/ToolCalculators.py:108 msgid "Cut Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4279 flatcamGUI/ObjectUI.py:597 +#: flatcamGUI/FlatCAMGUI.py:4368 flatcamGUI/ObjectUI.py:597 msgid "" "Drill depth (negative)\n" "below the copper surface." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4286 flatcamGUI/FlatCAMGUI.py:4766 +#: flatcamGUI/FlatCAMGUI.py:4375 flatcamGUI/FlatCAMGUI.py:4855 #: flatcamGUI/ObjectUI.py:605 flatcamGUI/ObjectUI.py:1095 msgid "Travel Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4288 flatcamGUI/ObjectUI.py:607 +#: flatcamGUI/FlatCAMGUI.py:4377 flatcamGUI/ObjectUI.py:607 msgid "" "Tool height when travelling\n" "across the XY plane." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4296 flatcamGUI/FlatCAMGUI.py:4776 +#: flatcamGUI/FlatCAMGUI.py:4385 flatcamGUI/FlatCAMGUI.py:4865 msgid "Tool change:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4298 flatcamGUI/FlatCAMGUI.py:4778 +#: flatcamGUI/FlatCAMGUI.py:4387 flatcamGUI/FlatCAMGUI.py:4867 #: flatcamGUI/ObjectUI.py:617 msgid "" "Include tool-change sequence\n" "in G-Code (Pause for tool change)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4305 flatcamGUI/FlatCAMGUI.py:4786 +#: flatcamGUI/FlatCAMGUI.py:4394 flatcamGUI/FlatCAMGUI.py:4875 msgid "Toolchange Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4307 flatcamGUI/FlatCAMGUI.py:4788 +#: flatcamGUI/FlatCAMGUI.py:4396 flatcamGUI/FlatCAMGUI.py:4877 msgid "Toolchange Z position." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4313 +#: flatcamGUI/FlatCAMGUI.py:4402 msgid "Feedrate:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4315 +#: flatcamGUI/FlatCAMGUI.py:4404 msgid "" "Tool speed while drilling\n" "(in units per minute)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4323 +#: flatcamGUI/FlatCAMGUI.py:4412 msgid "Spindle Speed:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4325 flatcamGUI/FlatCAMGUI.py:4818 +#: flatcamGUI/FlatCAMGUI.py:4414 flatcamGUI/FlatCAMGUI.py:4907 #: flatcamGUI/ObjectUI.py:681 msgid "" "Speed of the spindle\n" "in RPM (optional)" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4333 flatcamGUI/FlatCAMGUI.py:4826 +#: flatcamGUI/FlatCAMGUI.py:4422 flatcamGUI/FlatCAMGUI.py:4915 #: flatcamGUI/ObjectUI.py:689 flatcamGUI/ObjectUI.py:1218 msgid "Dwell:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4335 flatcamGUI/FlatCAMGUI.py:4828 +#: flatcamGUI/FlatCAMGUI.py:4424 flatcamGUI/FlatCAMGUI.py:4917 #: flatcamGUI/ObjectUI.py:691 flatcamGUI/ObjectUI.py:1221 msgid "" "Pause to allow the spindle to reach its\n" "speed before cutting." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4338 flatcamGUI/FlatCAMGUI.py:4831 +#: flatcamGUI/FlatCAMGUI.py:4427 flatcamGUI/FlatCAMGUI.py:4920 msgid "Duration:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4340 flatcamGUI/FlatCAMGUI.py:4833 +#: flatcamGUI/FlatCAMGUI.py:4429 flatcamGUI/FlatCAMGUI.py:4922 #: flatcamGUI/ObjectUI.py:696 flatcamGUI/ObjectUI.py:1228 msgid "Number of milliseconds for spindle to dwell." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4352 flatcamGUI/FlatCAMGUI.py:4843 +#: flatcamGUI/FlatCAMGUI.py:4441 flatcamGUI/FlatCAMGUI.py:4932 #: flatcamGUI/ObjectUI.py:704 msgid "Postprocessor:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4354 +#: flatcamGUI/FlatCAMGUI.py:4443 msgid "" "The postprocessor file that dictates\n" "gcode output." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4364 +#: flatcamGUI/FlatCAMGUI.py:4453 msgid "Gcode: " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4366 +#: flatcamGUI/FlatCAMGUI.py:4455 msgid "" "Choose what to use for GCode generation:\n" "'Drills', 'Slots' or 'Both'.\n" @@ -5540,107 +5743,107 @@ msgid "" "converted to drills." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4371 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4460 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:752 msgid "Drills" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4372 flatcamGUI/ObjectUI.py:556 +#: flatcamGUI/FlatCAMGUI.py:4461 flatcamGUI/ObjectUI.py:556 #: flatcamGUI/ObjectUI.py:753 msgid "Slots" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4373 flatcamGUI/ObjectUI.py:754 +#: flatcamGUI/FlatCAMGUI.py:4462 flatcamGUI/ObjectUI.py:754 msgid "Both" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4382 flatcamGUI/ObjectUI.py:769 +#: flatcamGUI/FlatCAMGUI.py:4471 flatcamGUI/ObjectUI.py:769 msgid "Mill Holes" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4384 flatcamGUI/ObjectUI.py:771 +#: flatcamGUI/FlatCAMGUI.py:4473 flatcamGUI/ObjectUI.py:771 msgid "Create Geometry for milling holes." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4390 +#: flatcamGUI/FlatCAMGUI.py:4479 msgid "Drill Tool dia:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4397 +#: flatcamGUI/FlatCAMGUI.py:4486 msgid "Slot Tool dia:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4399 +#: flatcamGUI/FlatCAMGUI.py:4488 msgid "" "Diameter of the cutting tool\n" "when milling slots." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4411 +#: flatcamGUI/FlatCAMGUI.py:4500 msgid "Defaults" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4424 +#: flatcamGUI/FlatCAMGUI.py:4513 msgid "Excellon Adv. Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4430 flatcamGUI/FlatCAMGUI.py:4866 +#: flatcamGUI/FlatCAMGUI.py:4519 flatcamGUI/FlatCAMGUI.py:4955 msgid "Advanced Options:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4432 +#: flatcamGUI/FlatCAMGUI.py:4521 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:4440 +#: flatcamGUI/FlatCAMGUI.py:4529 msgid "Offset Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4442 flatcamGUI/ObjectUI.py:574 +#: flatcamGUI/FlatCAMGUI.py:4531 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:4449 flatcamGUI/FlatCAMGUI.py:4877 +#: flatcamGUI/FlatCAMGUI.py:4538 flatcamGUI/FlatCAMGUI.py:4966 msgid "Toolchange X,Y:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4451 flatcamGUI/FlatCAMGUI.py:4879 +#: flatcamGUI/FlatCAMGUI.py:4540 flatcamGUI/FlatCAMGUI.py:4968 msgid "Toolchange X,Y position." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4457 flatcamGUI/FlatCAMGUI.py:4886 +#: flatcamGUI/FlatCAMGUI.py:4546 flatcamGUI/FlatCAMGUI.py:4975 #: flatcamGUI/ObjectUI.py:634 msgid "Start move Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4459 +#: flatcamGUI/FlatCAMGUI.py:4548 msgid "" "Height of the tool just after start.\n" "Delete the value if you don't need this feature." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4466 flatcamGUI/FlatCAMGUI.py:4896 +#: flatcamGUI/FlatCAMGUI.py:4555 flatcamGUI/FlatCAMGUI.py:4985 #: flatcamGUI/ObjectUI.py:644 flatcamGUI/ObjectUI.py:1141 msgid "End move Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4468 flatcamGUI/FlatCAMGUI.py:4898 +#: flatcamGUI/FlatCAMGUI.py:4557 flatcamGUI/FlatCAMGUI.py:4987 msgid "" "Height of the tool after\n" "the last move at the end of the job." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4475 flatcamGUI/FlatCAMGUI.py:4906 +#: flatcamGUI/FlatCAMGUI.py:4564 flatcamGUI/FlatCAMGUI.py:4995 #: flatcamGUI/ObjectUI.py:665 msgid "Feedrate Rapids:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4477 flatcamGUI/ObjectUI.py:667 +#: flatcamGUI/FlatCAMGUI.py:4566 flatcamGUI/ObjectUI.py:667 msgid "" "Tool speed while drilling\n" "(in units per minute).\n" @@ -5649,33 +5852,33 @@ msgid "" "ignore for any other cases." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4488 flatcamGUI/FlatCAMGUI.py:4930 +#: flatcamGUI/FlatCAMGUI.py:4577 flatcamGUI/FlatCAMGUI.py:5019 #: flatcamGUI/ObjectUI.py:715 flatcamGUI/ObjectUI.py:1250 msgid "Probe Z depth:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4490 flatcamGUI/FlatCAMGUI.py:4932 +#: flatcamGUI/FlatCAMGUI.py:4579 flatcamGUI/FlatCAMGUI.py:5021 #: flatcamGUI/ObjectUI.py:717 flatcamGUI/ObjectUI.py:1253 msgid "" "The maximum depth that the probe is allowed\n" "to probe. Negative value, in current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4498 flatcamGUI/FlatCAMGUI.py:4940 +#: flatcamGUI/FlatCAMGUI.py:4587 flatcamGUI/FlatCAMGUI.py:5029 #: flatcamGUI/ObjectUI.py:727 flatcamGUI/ObjectUI.py:1264 msgid "Feedrate Probe:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4500 flatcamGUI/FlatCAMGUI.py:4942 +#: flatcamGUI/FlatCAMGUI.py:4589 flatcamGUI/FlatCAMGUI.py:5031 #: flatcamGUI/ObjectUI.py:729 flatcamGUI/ObjectUI.py:1267 msgid "The feedrate used while the probe is probing." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4506 flatcamGUI/FlatCAMGUI.py:4949 +#: flatcamGUI/FlatCAMGUI.py:4595 flatcamGUI/FlatCAMGUI.py:5038 msgid "Fast Plunge:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4508 flatcamGUI/FlatCAMGUI.py:4951 +#: flatcamGUI/FlatCAMGUI.py:4597 flatcamGUI/FlatCAMGUI.py:5040 msgid "" "By checking this, the vertical move from\n" "Z_Toolchange to Z_move is done with G0,\n" @@ -5683,11 +5886,11 @@ msgid "" "WARNING: the move is done at Toolchange X,Y coords." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4517 +#: flatcamGUI/FlatCAMGUI.py:4606 msgid "Fast Retract:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4519 +#: flatcamGUI/FlatCAMGUI.py:4608 msgid "" "Exit hole strategy.\n" " - When uncheked, while exiting the drilled hole the drill bit\n" @@ -5697,33 +5900,33 @@ msgid "" "(travel height) is done as fast as possible (G0) in one move." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4538 +#: flatcamGUI/FlatCAMGUI.py:4627 msgid "Excellon Export" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4541 +#: flatcamGUI/FlatCAMGUI.py:4630 msgid "Export Options:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4543 +#: flatcamGUI/FlatCAMGUI.py:4632 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:4552 +#: flatcamGUI/FlatCAMGUI.py:4641 msgid "Units:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4554 flatcamGUI/FlatCAMGUI.py:4560 +#: flatcamGUI/FlatCAMGUI.py:4643 flatcamGUI/FlatCAMGUI.py:4649 msgid "The units used in the Excellon file." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4566 +#: flatcamGUI/FlatCAMGUI.py:4655 msgid "Int/Decimals:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4568 +#: flatcamGUI/FlatCAMGUI.py:4657 msgid "" "The NC drill files, usually named Excellon files\n" "are files that can be found in different formats.\n" @@ -5731,11 +5934,11 @@ msgid "" "coordinates are not using period." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4604 +#: flatcamGUI/FlatCAMGUI.py:4693 msgid "Format:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4606 flatcamGUI/FlatCAMGUI.py:4616 +#: flatcamGUI/FlatCAMGUI.py:4695 flatcamGUI/FlatCAMGUI.py:4705 msgid "" "Select the kind of coordinates format used.\n" "Coordinates can be saved with decimal point or without.\n" @@ -5745,19 +5948,19 @@ msgid "" "or TZ = trailing zeros are kept." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4613 +#: flatcamGUI/FlatCAMGUI.py:4702 msgid "Decimal" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4614 +#: flatcamGUI/FlatCAMGUI.py:4703 msgid "No-Decimal" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4627 +#: flatcamGUI/FlatCAMGUI.py:4716 msgid "Zeros:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4640 +#: flatcamGUI/FlatCAMGUI.py:4729 msgid "" "This sets the default type of Excellon zeros.\n" "If LZ then Leading Zeros are kept and\n" @@ -5766,64 +5969,64 @@ msgid "" "and Leading Zeros are removed." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4666 +#: flatcamGUI/FlatCAMGUI.py:4755 msgid "Geometry General" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4684 +#: flatcamGUI/FlatCAMGUI.py:4773 msgid "" "The number of circle steps for Geometry \n" "circle and arc shapes linear approximation." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4692 +#: flatcamGUI/FlatCAMGUI.py:4781 msgid "Tools" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4699 +#: flatcamGUI/FlatCAMGUI.py:4788 msgid "Tool dia: " msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4701 +#: flatcamGUI/FlatCAMGUI.py:4790 msgid "" "The diameter of the cutting\n" "tool.." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4716 +#: flatcamGUI/FlatCAMGUI.py:4805 msgid "Geometry Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4721 +#: flatcamGUI/FlatCAMGUI.py:4810 msgid "Create CNC Job:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4723 +#: flatcamGUI/FlatCAMGUI.py:4812 msgid "" "Create a CNC Job object\n" "tracing the contours of this\n" "Geometry object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4735 flatcamGUI/ObjectUI.py:1062 +#: flatcamGUI/FlatCAMGUI.py:4824 flatcamGUI/ObjectUI.py:1062 msgid "" "Cutting depth (negative)\n" "below the copper surface." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4743 +#: flatcamGUI/FlatCAMGUI.py:4832 msgid "Multidepth" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4745 +#: flatcamGUI/FlatCAMGUI.py:4834 msgid "Multidepth usage: True or False." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4750 +#: flatcamGUI/FlatCAMGUI.py:4839 msgid "Depth/Pass:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4752 +#: flatcamGUI/FlatCAMGUI.py:4841 msgid "" "The depth to cut on each pass,\n" "when multidepth is enabled.\n" @@ -5832,61 +6035,61 @@ msgid "" "which has negative value." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4768 flatcamGUI/ObjectUI.py:1098 +#: flatcamGUI/FlatCAMGUI.py:4857 flatcamGUI/ObjectUI.py:1098 msgid "" "Height of the tool when\n" "moving without cutting." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4795 flatcamGUI/ObjectUI.py:1153 +#: flatcamGUI/FlatCAMGUI.py:4884 flatcamGUI/ObjectUI.py:1153 msgid "Feed Rate X-Y:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4797 flatcamGUI/ObjectUI.py:1156 +#: flatcamGUI/FlatCAMGUI.py:4886 flatcamGUI/ObjectUI.py:1156 msgid "" "Cutting speed in the XY\n" "plane in units per minute" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4805 +#: flatcamGUI/FlatCAMGUI.py:4894 msgid "Feed Rate Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4807 +#: flatcamGUI/FlatCAMGUI.py:4896 msgid "" "Cutting speed in the XY\n" "plane in units per minute.\n" "It is called also Plunge." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4816 flatcamGUI/ObjectUI.py:679 +#: flatcamGUI/FlatCAMGUI.py:4905 flatcamGUI/ObjectUI.py:679 #: flatcamGUI/ObjectUI.py:1205 msgid "Spindle speed:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4845 +#: flatcamGUI/FlatCAMGUI.py:4934 msgid "" "The postprocessor file that dictates\n" "Machine Code output." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4861 +#: flatcamGUI/FlatCAMGUI.py:4950 msgid "Geometry Adv. Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4868 +#: flatcamGUI/FlatCAMGUI.py:4957 msgid "" "Parameters to create a CNC Job object\n" "tracing the contours of a Geometry object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4888 +#: flatcamGUI/FlatCAMGUI.py:4977 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:4908 +#: flatcamGUI/FlatCAMGUI.py:4997 msgid "" "Cutting speed in the XY plane\n" "(in units per minute).\n" @@ -5895,11 +6098,11 @@ msgid "" "ignore for any other cases." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4920 +#: flatcamGUI/FlatCAMGUI.py:5009 msgid "Re-cut 1st pt." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4922 flatcamGUI/ObjectUI.py:1196 +#: flatcamGUI/FlatCAMGUI.py:5011 flatcamGUI/ObjectUI.py:1196 msgid "" "In order to remove possible\n" "copper leftovers where first cut\n" @@ -5907,42 +6110,42 @@ msgid "" "extended cut over the first cut section." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4961 +#: flatcamGUI/FlatCAMGUI.py:5050 msgid "Seg. X size:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4963 +#: flatcamGUI/FlatCAMGUI.py:5052 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:4972 +#: flatcamGUI/FlatCAMGUI.py:5061 msgid "Seg. Y size:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:4974 +#: flatcamGUI/FlatCAMGUI.py:5063 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:4990 +#: flatcamGUI/FlatCAMGUI.py:5079 msgid "CNC Job General" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5003 flatcamGUI/ObjectUI.py:544 +#: flatcamGUI/FlatCAMGUI.py:5092 flatcamGUI/ObjectUI.py:544 #: flatcamGUI/ObjectUI.py:874 flatcamGUI/ObjectUI.py:1428 msgid "Plot Object" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5010 +#: flatcamGUI/FlatCAMGUI.py:5099 msgid "Plot kind:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5012 flatcamGUI/ObjectUI.py:1350 +#: flatcamGUI/FlatCAMGUI.py:5101 flatcamGUI/ObjectUI.py:1350 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" @@ -5950,87 +6153,87 @@ msgid "" "which means the moves that cut into the material." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5020 flatcamGUI/ObjectUI.py:1359 +#: flatcamGUI/FlatCAMGUI.py:5109 flatcamGUI/ObjectUI.py:1359 msgid "Travel" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5031 +#: flatcamGUI/FlatCAMGUI.py:5120 msgid "" "The number of circle steps for GCode \n" "circle and arc shapes linear approximation." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5041 +#: flatcamGUI/FlatCAMGUI.py:5130 msgid "" "Diameter of the tool to be\n" "rendered in the plot." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5049 +#: flatcamGUI/FlatCAMGUI.py:5138 msgid "Coords dec.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5051 +#: flatcamGUI/FlatCAMGUI.py:5140 msgid "" "The number of decimals to be used for \n" "the X, Y, Z coordinates in CNC code (GCODE, etc.)" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5059 +#: flatcamGUI/FlatCAMGUI.py:5148 msgid "Feedrate dec.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5061 +#: flatcamGUI/FlatCAMGUI.py:5150 msgid "" "The number of decimals to be used for \n" "the Feedrate parameter in CNC code (GCODE, etc.)" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5076 +#: flatcamGUI/FlatCAMGUI.py:5165 msgid "CNC Job Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5079 flatcamGUI/FlatCAMGUI.py:5120 +#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/FlatCAMGUI.py:5209 msgid "Export G-Code:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5081 flatcamGUI/FlatCAMGUI.py:5122 +#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/FlatCAMGUI.py:5211 #: flatcamGUI/ObjectUI.py:1464 msgid "" "Export and save G-Code to\n" "make this object to a file." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5087 +#: flatcamGUI/FlatCAMGUI.py:5176 msgid "Prepend to G-Code:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5089 +#: flatcamGUI/FlatCAMGUI.py:5178 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:5098 +#: flatcamGUI/FlatCAMGUI.py:5187 msgid "Append to G-Code:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5100 flatcamGUI/ObjectUI.py:1486 +#: flatcamGUI/FlatCAMGUI.py:5189 flatcamGUI/ObjectUI.py:1486 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:5117 +#: flatcamGUI/FlatCAMGUI.py:5206 msgid "CNC Job Adv. Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5128 flatcamGUI/ObjectUI.py:1504 +#: flatcamGUI/FlatCAMGUI.py:5217 flatcamGUI/ObjectUI.py:1504 msgid "Toolchange G-Code:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5130 +#: flatcamGUI/FlatCAMGUI.py:5219 msgid "" "Type here any G-Code commands you would\n" "like to be executed when Toolchange event is encountered.\n" @@ -6038,95 +6241,95 @@ msgid "" "or a Toolchange Macro." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5144 flatcamGUI/ObjectUI.py:1526 +#: flatcamGUI/FlatCAMGUI.py:5233 flatcamGUI/ObjectUI.py:1526 msgid "Use Toolchange Macro" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5146 flatcamGUI/ObjectUI.py:1529 +#: flatcamGUI/FlatCAMGUI.py:5235 flatcamGUI/ObjectUI.py:1529 msgid "" "Check this box if you want to use\n" "a Custom Toolchange GCode (macro)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5158 flatcamGUI/ObjectUI.py:1538 +#: flatcamGUI/FlatCAMGUI.py:5247 flatcamGUI/ObjectUI.py:1538 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:5165 flatcamGUI/ObjectUI.py:1545 +#: flatcamGUI/FlatCAMGUI.py:5254 flatcamGUI/ObjectUI.py:1545 msgid "Parameters" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5168 flatcamGUI/ObjectUI.py:1548 +#: flatcamGUI/FlatCAMGUI.py:5257 flatcamGUI/ObjectUI.py:1548 msgid "FlatCAM CNC parameters" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5169 flatcamGUI/ObjectUI.py:1549 +#: flatcamGUI/FlatCAMGUI.py:5258 flatcamGUI/ObjectUI.py:1549 msgid "tool = tool number" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5170 flatcamGUI/ObjectUI.py:1550 +#: flatcamGUI/FlatCAMGUI.py:5259 flatcamGUI/ObjectUI.py:1550 msgid "tooldia = tool diameter" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5171 flatcamGUI/ObjectUI.py:1551 +#: flatcamGUI/FlatCAMGUI.py:5260 flatcamGUI/ObjectUI.py:1551 msgid "t_drills = for Excellon, total number of drills" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5172 flatcamGUI/ObjectUI.py:1552 +#: flatcamGUI/FlatCAMGUI.py:5261 flatcamGUI/ObjectUI.py:1552 msgid "x_toolchange = X coord for Toolchange" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5173 flatcamGUI/ObjectUI.py:1553 +#: flatcamGUI/FlatCAMGUI.py:5262 flatcamGUI/ObjectUI.py:1553 msgid "y_toolchange = Y coord for Toolchange" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5174 flatcamGUI/ObjectUI.py:1554 +#: flatcamGUI/FlatCAMGUI.py:5263 flatcamGUI/ObjectUI.py:1554 msgid "z_toolchange = Z coord for Toolchange" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5175 +#: flatcamGUI/FlatCAMGUI.py:5264 msgid "z_cut = Z depth for the cut" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5176 +#: flatcamGUI/FlatCAMGUI.py:5265 msgid "z_move = Z height for travel" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5177 flatcamGUI/ObjectUI.py:1557 +#: flatcamGUI/FlatCAMGUI.py:5266 flatcamGUI/ObjectUI.py:1557 msgid "z_depthpercut = the step value for multidepth cut" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5178 flatcamGUI/ObjectUI.py:1558 +#: flatcamGUI/FlatCAMGUI.py:5267 flatcamGUI/ObjectUI.py:1558 msgid "spindlesspeed = the value for the spindle speed" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5179 flatcamGUI/ObjectUI.py:1559 +#: flatcamGUI/FlatCAMGUI.py:5268 flatcamGUI/ObjectUI.py:1559 msgid "dwelltime = time to dwell to allow the spindle to reach it's set RPM" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5200 +#: flatcamGUI/FlatCAMGUI.py:5289 msgid "NCC Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5203 flatcamGUI/FlatCAMGUI.py:5304 -#: flatcamGUI/FlatCAMGUI.py:5383 flatcamGUI/FlatCAMGUI.py:5442 -#: flatcamGUI/FlatCAMGUI.py:5545 flatcamGUI/FlatCAMGUI.py:5606 -#: flatcamGUI/FlatCAMGUI.py:5805 flatcamGUI/FlatCAMGUI.py:5932 +#: flatcamGUI/FlatCAMGUI.py:5292 flatcamGUI/FlatCAMGUI.py:5393 +#: flatcamGUI/FlatCAMGUI.py:5472 flatcamGUI/FlatCAMGUI.py:5531 +#: flatcamGUI/FlatCAMGUI.py:5634 flatcamGUI/FlatCAMGUI.py:5695 +#: flatcamGUI/FlatCAMGUI.py:5894 flatcamGUI/FlatCAMGUI.py:6021 msgid "Parameters:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5213 flatcamGUI/FlatCAMGUI.py:5943 +#: flatcamGUI/FlatCAMGUI.py:5302 flatcamGUI/FlatCAMGUI.py:6032 msgid "Tools dia:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5215 +#: flatcamGUI/FlatCAMGUI.py:5304 msgid "Diameters of the cutting tools, separated by ','" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5223 flatcamTools/ToolNonCopperClear.py:167 +#: flatcamGUI/FlatCAMGUI.py:5312 flatcamTools/ToolNonCopperClear.py:167 #, python-format msgid "" "How much (fraction) of the tool width to overlap each tool pass.\n" @@ -6141,11 +6344,11 @@ msgid "" "due of too many paths." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5239 flatcamTools/ToolNonCopperClear.py:183 +#: flatcamGUI/FlatCAMGUI.py:5328 flatcamTools/ToolNonCopperClear.py:183 msgid "Bounding box margin." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5248 flatcamTools/ToolNonCopperClear.py:192 +#: flatcamGUI/FlatCAMGUI.py:5337 flatcamTools/ToolNonCopperClear.py:192 #: flatcamTools/ToolPaint.py:190 msgid "" "Algorithm for non-copper clearing:
Standard: Fixed step inwards." @@ -6153,12 +6356,12 @@ msgid "" "lines." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5280 flatcamTools/ToolNonCopperClear.py:224 +#: flatcamGUI/FlatCAMGUI.py:5369 flatcamTools/ToolNonCopperClear.py:224 #: flatcamTools/ToolPaint.py:222 msgid "Rest M.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5282 +#: flatcamGUI/FlatCAMGUI.py:5371 msgid "" "If checked, use 'rest machining'.\n" "Basically it will clear copper outside PCB features,\n" @@ -6168,39 +6371,39 @@ msgid "" "If not checked, use the standard algorithm." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5301 +#: flatcamGUI/FlatCAMGUI.py:5390 msgid "Cutout Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5306 flatcamGUI/ObjectUI.py:402 +#: flatcamGUI/FlatCAMGUI.py:5395 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:5325 +#: flatcamGUI/FlatCAMGUI.py:5414 msgid "" "Distance from objects at which\n" "to draw the cutout." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5332 flatcamTools/ToolCutOut.py:96 +#: flatcamGUI/FlatCAMGUI.py:5421 flatcamTools/ToolCutOut.py:96 msgid "Gap size:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5334 +#: flatcamGUI/FlatCAMGUI.py:5423 msgid "" "Size of the gaps in the toolpath\n" "that will remain to hold the\n" "board in place." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5342 flatcamTools/ToolCutOut.py:133 +#: flatcamGUI/FlatCAMGUI.py:5431 flatcamTools/ToolCutOut.py:133 msgid "Gaps:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5344 +#: flatcamGUI/FlatCAMGUI.py:5433 msgid "" "Number of bridge gaps used for the cutout.\n" "There can be maximum 8 bridges/gaps.\n" @@ -6213,73 +6416,73 @@ msgid "" "- 8 - 2*left + 2*right +2*top + 2*bottom" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5365 flatcamTools/ToolCutOut.py:115 +#: flatcamGUI/FlatCAMGUI.py:5454 flatcamTools/ToolCutOut.py:115 msgid "Convex Sh.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5367 flatcamTools/ToolCutOut.py:117 +#: flatcamGUI/FlatCAMGUI.py:5456 flatcamTools/ToolCutOut.py:117 msgid "Create a convex shape surrounding the entire PCB." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5380 +#: flatcamGUI/FlatCAMGUI.py:5469 msgid "2Sided Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5385 +#: flatcamGUI/FlatCAMGUI.py:5474 msgid "" "A tool to help in creating a double sided\n" "PCB using alignment holes." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5395 flatcamTools/ToolDblSided.py:235 +#: flatcamGUI/FlatCAMGUI.py:5484 flatcamTools/ToolDblSided.py:235 msgid "Drill diam.:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5397 flatcamTools/ToolDblSided.py:226 +#: flatcamGUI/FlatCAMGUI.py:5486 flatcamTools/ToolDblSided.py:226 #: flatcamTools/ToolDblSided.py:237 msgid "Diameter of the drill for the alignment holes." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5404 +#: flatcamGUI/FlatCAMGUI.py:5493 msgid "X" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5405 +#: flatcamGUI/FlatCAMGUI.py:5494 msgid "Y" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5406 flatcamTools/ToolDblSided.py:120 +#: flatcamGUI/FlatCAMGUI.py:5495 flatcamTools/ToolDblSided.py:120 msgid "Mirror Axis:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5408 flatcamTools/ToolDblSided.py:122 +#: flatcamGUI/FlatCAMGUI.py:5497 flatcamTools/ToolDblSided.py:122 msgid "Mirror vertically (X) or horizontally (Y)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5417 +#: flatcamGUI/FlatCAMGUI.py:5506 msgid "Point" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5418 +#: flatcamGUI/FlatCAMGUI.py:5507 msgid "Box" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5419 flatcamTools/ToolDblSided.py:133 +#: flatcamGUI/FlatCAMGUI.py:5508 flatcamTools/ToolDblSided.py:133 msgid "Axis Ref:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5421 +#: flatcamGUI/FlatCAMGUI.py:5510 msgid "" "The axis should pass through a point or cut\n" " a specified box (in a Geometry object) in \n" "the middle." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5437 +#: flatcamGUI/FlatCAMGUI.py:5526 msgid "Paint Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5444 flatcamGUI/ObjectUI.py:1299 +#: flatcamGUI/FlatCAMGUI.py:5533 flatcamGUI/ObjectUI.py:1299 msgid "" "Creates tool paths to cover the\n" "whole area of a polygon (remove\n" @@ -6287,48 +6490,48 @@ msgid "" "to click on the desired polygon." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5468 +#: flatcamGUI/FlatCAMGUI.py:5557 msgid "" "How much (fraction) of the tool\n" "width to overlap each tool pass." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5522 flatcamTools/ToolPaint.py:237 +#: flatcamGUI/FlatCAMGUI.py:5611 flatcamTools/ToolPaint.py:237 msgid "Selection:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5524 +#: flatcamGUI/FlatCAMGUI.py:5613 msgid "How to select the polygons to paint." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5528 +#: flatcamGUI/FlatCAMGUI.py:5617 msgid "Single" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5542 +#: flatcamGUI/FlatCAMGUI.py:5631 msgid "Film Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5547 +#: flatcamGUI/FlatCAMGUI.py:5636 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:5556 +#: flatcamGUI/FlatCAMGUI.py:5645 msgid "Pos" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5557 +#: flatcamGUI/FlatCAMGUI.py:5646 msgid "Neg" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5558 flatcamTools/ToolFilm.py:116 +#: flatcamGUI/FlatCAMGUI.py:5647 flatcamTools/ToolFilm.py:116 msgid "Film Type:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5560 flatcamTools/ToolFilm.py:118 +#: flatcamGUI/FlatCAMGUI.py:5649 flatcamTools/ToolFilm.py:118 msgid "" "Generate a Positive black film or a Negative film.\n" "Positive means that it will print the features\n" @@ -6338,11 +6541,11 @@ msgid "" "The Film format is SVG." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5571 flatcamTools/ToolFilm.py:130 +#: flatcamGUI/FlatCAMGUI.py:5660 flatcamTools/ToolFilm.py:130 msgid "Border:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5573 flatcamTools/ToolFilm.py:132 +#: flatcamGUI/FlatCAMGUI.py:5662 flatcamTools/ToolFilm.py:132 msgid "" "Specify a border around the object.\n" "Only for negative film.\n" @@ -6354,11 +6557,11 @@ msgid "" "surroundings if not for this border." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5586 flatcamTools/ToolFilm.py:144 +#: flatcamGUI/FlatCAMGUI.py:5675 flatcamTools/ToolFilm.py:144 msgid "Scale Stroke:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5588 flatcamTools/ToolFilm.py:146 +#: flatcamGUI/FlatCAMGUI.py:5677 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 " @@ -6366,77 +6569,77 @@ msgid "" "therefore the fine features may be more affected by this parameter." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5603 +#: flatcamGUI/FlatCAMGUI.py:5692 msgid "Panelize Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5608 +#: flatcamGUI/FlatCAMGUI.py:5697 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:5619 flatcamTools/ToolPanelize.py:113 +#: flatcamGUI/FlatCAMGUI.py:5708 flatcamTools/ToolPanelize.py:113 msgid "Spacing cols:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5621 flatcamTools/ToolPanelize.py:115 +#: flatcamGUI/FlatCAMGUI.py:5710 flatcamTools/ToolPanelize.py:115 msgid "" "Spacing between columns of the desired panel.\n" "In current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5629 flatcamTools/ToolPanelize.py:122 +#: flatcamGUI/FlatCAMGUI.py:5718 flatcamTools/ToolPanelize.py:122 msgid "Spacing rows:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5631 flatcamTools/ToolPanelize.py:124 +#: flatcamGUI/FlatCAMGUI.py:5720 flatcamTools/ToolPanelize.py:124 msgid "" "Spacing between rows of the desired panel.\n" "In current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5639 flatcamTools/ToolPanelize.py:131 +#: flatcamGUI/FlatCAMGUI.py:5728 flatcamTools/ToolPanelize.py:131 msgid "Columns:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5641 flatcamTools/ToolPanelize.py:133 +#: flatcamGUI/FlatCAMGUI.py:5730 flatcamTools/ToolPanelize.py:133 msgid "Number of columns of the desired panel" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5648 flatcamTools/ToolPanelize.py:139 +#: flatcamGUI/FlatCAMGUI.py:5737 flatcamTools/ToolPanelize.py:139 msgid "Rows:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5650 flatcamTools/ToolPanelize.py:141 +#: flatcamGUI/FlatCAMGUI.py:5739 flatcamTools/ToolPanelize.py:141 msgid "Number of rows of the desired panel" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5656 +#: flatcamGUI/FlatCAMGUI.py:5745 msgid "Gerber" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5657 +#: flatcamGUI/FlatCAMGUI.py:5746 msgid "Geo" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5658 flatcamTools/ToolPanelize.py:148 +#: flatcamGUI/FlatCAMGUI.py:5747 flatcamTools/ToolPanelize.py:148 msgid "Panel Type:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5660 +#: flatcamGUI/FlatCAMGUI.py:5749 msgid "" "Choose the type of object for the panel object:\n" "- Gerber\n" "- Geometry" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5669 +#: flatcamGUI/FlatCAMGUI.py:5758 msgid "Constrain within:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5671 flatcamTools/ToolPanelize.py:160 +#: flatcamGUI/FlatCAMGUI.py:5760 flatcamTools/ToolPanelize.py:160 msgid "" "Area define by DX and DY within to constrain the panel.\n" "DX and DY values are in current units.\n" @@ -6445,171 +6648,171 @@ msgid "" "they fit completely within selected area." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5680 flatcamTools/ToolPanelize.py:169 +#: flatcamGUI/FlatCAMGUI.py:5769 flatcamTools/ToolPanelize.py:169 msgid "Width (DX):" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5682 flatcamTools/ToolPanelize.py:171 +#: flatcamGUI/FlatCAMGUI.py:5771 flatcamTools/ToolPanelize.py:171 msgid "" "The width (DX) within which the panel must fit.\n" "In current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5689 flatcamTools/ToolPanelize.py:177 +#: flatcamGUI/FlatCAMGUI.py:5778 flatcamTools/ToolPanelize.py:177 msgid "Height (DY):" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5691 flatcamTools/ToolPanelize.py:179 +#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolPanelize.py:179 msgid "" "The height (DY)within which the panel must fit.\n" "In current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5705 +#: flatcamGUI/FlatCAMGUI.py:5794 msgid "Calculators Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5708 +#: flatcamGUI/FlatCAMGUI.py:5797 msgid "V-Shape Tool Calculator:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5710 +#: flatcamGUI/FlatCAMGUI.py:5799 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:5721 flatcamTools/ToolCalculators.py:94 +#: flatcamGUI/FlatCAMGUI.py:5810 flatcamTools/ToolCalculators.py:94 msgid "Tip Diameter:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5723 +#: flatcamGUI/FlatCAMGUI.py:5812 msgid "" "This is the tool tip diameter.\n" "It is specified by manufacturer." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5731 +#: flatcamGUI/FlatCAMGUI.py:5820 msgid "Tip angle:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5733 +#: flatcamGUI/FlatCAMGUI.py:5822 msgid "" "This is the angle on the tip of the tool.\n" "It is specified by manufacturer." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5743 +#: flatcamGUI/FlatCAMGUI.py:5832 msgid "" "This is depth to cut into material.\n" "In the CNCJob object it is the CutZ parameter." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5750 +#: flatcamGUI/FlatCAMGUI.py:5839 msgid "ElectroPlating Calculator:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5752 flatcamTools/ToolCalculators.py:152 +#: flatcamGUI/FlatCAMGUI.py:5841 flatcamTools/ToolCalculators.py:152 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:5762 flatcamTools/ToolCalculators.py:161 +#: flatcamGUI/FlatCAMGUI.py:5851 flatcamTools/ToolCalculators.py:161 msgid "Board Length:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5764 flatcamTools/ToolCalculators.py:165 +#: flatcamGUI/FlatCAMGUI.py:5853 flatcamTools/ToolCalculators.py:165 msgid "This is the board length. In centimeters." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5770 flatcamTools/ToolCalculators.py:167 +#: flatcamGUI/FlatCAMGUI.py:5859 flatcamTools/ToolCalculators.py:167 msgid "Board Width:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5772 flatcamTools/ToolCalculators.py:171 +#: flatcamGUI/FlatCAMGUI.py:5861 flatcamTools/ToolCalculators.py:171 msgid "This is the board width.In centimeters." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5777 flatcamTools/ToolCalculators.py:173 +#: flatcamGUI/FlatCAMGUI.py:5866 flatcamTools/ToolCalculators.py:173 msgid "Current Density:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5780 flatcamTools/ToolCalculators.py:177 +#: flatcamGUI/FlatCAMGUI.py:5869 flatcamTools/ToolCalculators.py:177 msgid "" "Current density to pass through the board. \n" "In Amps per Square Feet ASF." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5786 flatcamTools/ToolCalculators.py:181 +#: flatcamGUI/FlatCAMGUI.py:5875 flatcamTools/ToolCalculators.py:181 msgid "Copper Growth:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5789 flatcamTools/ToolCalculators.py:185 +#: flatcamGUI/FlatCAMGUI.py:5878 flatcamTools/ToolCalculators.py:185 msgid "" "How thick the copper growth is intended to be.\n" "In microns." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5802 +#: flatcamGUI/FlatCAMGUI.py:5891 msgid "Transform Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5807 +#: flatcamGUI/FlatCAMGUI.py:5896 msgid "" "Various transformations that can be applied\n" "on a FlatCAM object." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5817 +#: flatcamGUI/FlatCAMGUI.py:5906 msgid "Rotate Angle:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5819 +#: flatcamGUI/FlatCAMGUI.py:5908 msgid "Angle for rotation. In degrees." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5826 +#: flatcamGUI/FlatCAMGUI.py:5915 msgid "Skew_X angle:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5828 +#: flatcamGUI/FlatCAMGUI.py:5917 msgid "Angle for Skew/Shear on X axis. In degrees." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5835 +#: flatcamGUI/FlatCAMGUI.py:5924 msgid "Skew_Y angle:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5837 +#: flatcamGUI/FlatCAMGUI.py:5926 msgid "Angle for Skew/Shear on Y axis. In degrees." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5844 +#: flatcamGUI/FlatCAMGUI.py:5933 msgid "Scale_X factor:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5846 +#: flatcamGUI/FlatCAMGUI.py:5935 msgid "Factor for scaling on X axis." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5853 +#: flatcamGUI/FlatCAMGUI.py:5942 msgid "Scale_Y factor:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5855 +#: flatcamGUI/FlatCAMGUI.py:5944 msgid "Factor for scaling on Y axis." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5863 +#: flatcamGUI/FlatCAMGUI.py:5952 msgid "" "Scale the selected object(s)\n" "using the Scale_X factor for both axis." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5871 flatcamTools/ToolTransform.py:210 +#: flatcamGUI/FlatCAMGUI.py:5960 flatcamTools/ToolTransform.py:210 msgid "" "Scale the selected object(s)\n" "using the origin reference when checked,\n" @@ -6617,27 +6820,27 @@ msgid "" "of the selected objects when unchecked." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5880 +#: flatcamGUI/FlatCAMGUI.py:5969 msgid "Offset_X val:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5882 +#: flatcamGUI/FlatCAMGUI.py:5971 msgid "Distance to offset on X axis. In current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5889 +#: flatcamGUI/FlatCAMGUI.py:5978 msgid "Offset_Y val:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5891 +#: flatcamGUI/FlatCAMGUI.py:5980 msgid "Distance to offset on Y axis. In current units." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5897 +#: flatcamGUI/FlatCAMGUI.py:5986 msgid "Mirror Reference" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5899 flatcamTools/ToolTransform.py:314 +#: flatcamGUI/FlatCAMGUI.py:5988 flatcamTools/ToolTransform.py:314 msgid "" "Flip the selected object(s)\n" "around the point in Point Entry Field.\n" @@ -6650,174 +6853,174 @@ msgid "" "Point Entry field and click Flip on X(Y)" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5910 +#: flatcamGUI/FlatCAMGUI.py:5999 msgid " Mirror Ref. Point:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5912 flatcamTools/ToolTransform.py:327 +#: flatcamGUI/FlatCAMGUI.py:6001 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:5929 +#: flatcamGUI/FlatCAMGUI.py:6018 msgid "SolderPaste Tool Options" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5934 +#: flatcamGUI/FlatCAMGUI.py:6023 msgid "" "A tool to create GCode for dispensing\n" "solder paste onto a PCB." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5945 +#: flatcamGUI/FlatCAMGUI.py:6034 msgid "Diameters of nozzle tools, separated by ','" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5952 +#: flatcamGUI/FlatCAMGUI.py:6041 msgid "New Nozzle Dia:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5954 flatcamTools/ToolSolderPaste.py:103 +#: flatcamGUI/FlatCAMGUI.py:6043 flatcamTools/ToolSolderPaste.py:103 msgid "Diameter for the new Nozzle tool to add in the Tool Table" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5962 flatcamTools/ToolSolderPaste.py:166 +#: flatcamGUI/FlatCAMGUI.py:6051 flatcamTools/ToolSolderPaste.py:166 msgid "Z Dispense Start:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5964 flatcamTools/ToolSolderPaste.py:168 +#: flatcamGUI/FlatCAMGUI.py:6053 flatcamTools/ToolSolderPaste.py:168 msgid "The height (Z) when solder paste dispensing starts." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5971 flatcamTools/ToolSolderPaste.py:174 +#: flatcamGUI/FlatCAMGUI.py:6060 flatcamTools/ToolSolderPaste.py:174 msgid "Z Dispense:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5973 flatcamTools/ToolSolderPaste.py:176 +#: flatcamGUI/FlatCAMGUI.py:6062 flatcamTools/ToolSolderPaste.py:176 msgid "The height (Z) when doing solder paste dispensing." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5980 flatcamTools/ToolSolderPaste.py:183 +#: flatcamGUI/FlatCAMGUI.py:6069 flatcamTools/ToolSolderPaste.py:183 msgid "Z Dispense Stop:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5982 flatcamTools/ToolSolderPaste.py:185 +#: flatcamGUI/FlatCAMGUI.py:6071 flatcamTools/ToolSolderPaste.py:185 msgid "The height (Z) when solder paste dispensing stops." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5989 flatcamTools/ToolSolderPaste.py:191 +#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:191 msgid "Z Travel:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5991 flatcamTools/ToolSolderPaste.py:193 +#: flatcamGUI/FlatCAMGUI.py:6080 flatcamTools/ToolSolderPaste.py:193 msgid "" "The height (Z) for travel between pads\n" "(without dispensing solder paste)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:5999 flatcamTools/ToolSolderPaste.py:200 +#: flatcamGUI/FlatCAMGUI.py:6088 flatcamTools/ToolSolderPaste.py:200 msgid "Z Toolchange:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6001 flatcamTools/ToolSolderPaste.py:202 +#: flatcamGUI/FlatCAMGUI.py:6090 flatcamTools/ToolSolderPaste.py:202 msgid "The height (Z) for tool (nozzle) change." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6008 flatcamTools/ToolSolderPaste.py:208 +#: flatcamGUI/FlatCAMGUI.py:6097 flatcamTools/ToolSolderPaste.py:208 msgid "XY Toolchange:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6010 flatcamTools/ToolSolderPaste.py:210 +#: flatcamGUI/FlatCAMGUI.py:6099 flatcamTools/ToolSolderPaste.py:210 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:6018 flatcamTools/ToolSolderPaste.py:217 +#: flatcamGUI/FlatCAMGUI.py:6107 flatcamTools/ToolSolderPaste.py:217 msgid "Feedrate X-Y:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6020 flatcamTools/ToolSolderPaste.py:219 +#: flatcamGUI/FlatCAMGUI.py:6109 flatcamTools/ToolSolderPaste.py:219 msgid "Feedrate (speed) while moving on the X-Y plane." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6027 flatcamTools/ToolSolderPaste.py:225 +#: flatcamGUI/FlatCAMGUI.py:6116 flatcamTools/ToolSolderPaste.py:225 msgid "Feedrate Z:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6029 flatcamTools/ToolSolderPaste.py:227 +#: flatcamGUI/FlatCAMGUI.py:6118 flatcamTools/ToolSolderPaste.py:227 msgid "" "Feedrate (speed) while moving vertically\n" "(on Z plane)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6037 flatcamTools/ToolSolderPaste.py:234 +#: flatcamGUI/FlatCAMGUI.py:6126 flatcamTools/ToolSolderPaste.py:234 msgid "Feedrate Z Dispense:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6039 flatcamTools/ToolSolderPaste.py:236 +#: flatcamGUI/FlatCAMGUI.py:6128 flatcamTools/ToolSolderPaste.py:236 msgid "" "Feedrate (speed) while moving up vertically\n" " to Dispense position (on Z plane)." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6047 flatcamTools/ToolSolderPaste.py:243 +#: flatcamGUI/FlatCAMGUI.py:6136 flatcamTools/ToolSolderPaste.py:243 msgid "Spindle Speed FWD:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6049 flatcamTools/ToolSolderPaste.py:245 +#: flatcamGUI/FlatCAMGUI.py:6138 flatcamTools/ToolSolderPaste.py:245 msgid "" "The dispenser speed while pushing solder paste\n" "through the dispenser nozzle." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6057 flatcamTools/ToolSolderPaste.py:252 +#: flatcamGUI/FlatCAMGUI.py:6146 flatcamTools/ToolSolderPaste.py:252 msgid "Dwell FWD:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6059 flatcamTools/ToolSolderPaste.py:254 +#: flatcamGUI/FlatCAMGUI.py:6148 flatcamTools/ToolSolderPaste.py:254 msgid "Pause after solder dispensing." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6066 flatcamTools/ToolSolderPaste.py:260 +#: flatcamGUI/FlatCAMGUI.py:6155 flatcamTools/ToolSolderPaste.py:260 msgid "Spindle Speed REV:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6068 flatcamTools/ToolSolderPaste.py:262 +#: flatcamGUI/FlatCAMGUI.py:6157 flatcamTools/ToolSolderPaste.py:262 msgid "" "The dispenser speed while retracting solder paste\n" "through the dispenser nozzle." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6076 flatcamTools/ToolSolderPaste.py:269 +#: flatcamGUI/FlatCAMGUI.py:6165 flatcamTools/ToolSolderPaste.py:269 msgid "Dwell REV:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6078 flatcamTools/ToolSolderPaste.py:271 +#: flatcamGUI/FlatCAMGUI.py:6167 flatcamTools/ToolSolderPaste.py:271 msgid "" "Pause after solder paste dispenser retracted,\n" "to allow pressure equilibrium." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6085 flatcamTools/ToolSolderPaste.py:277 +#: flatcamGUI/FlatCAMGUI.py:6174 flatcamTools/ToolSolderPaste.py:277 msgid "PostProcessors:" msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6087 flatcamTools/ToolSolderPaste.py:279 +#: flatcamGUI/FlatCAMGUI.py:6176 flatcamTools/ToolSolderPaste.py:279 msgid "Files that control the GCode generation." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6117 flatcamGUI/FlatCAMGUI.py:6123 +#: flatcamGUI/FlatCAMGUI.py:6206 flatcamGUI/FlatCAMGUI.py:6212 msgid "Idle." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6147 +#: flatcamGUI/FlatCAMGUI.py:6236 msgid "Application started ..." msgstr "" -#: flatcamGUI/FlatCAMGUI.py:6148 +#: flatcamGUI/FlatCAMGUI.py:6237 msgid "Hello!" msgstr "" @@ -7805,7 +8008,7 @@ msgid "" msgstr "" #: flatcamTools/ToolCutOut.py:338 flatcamTools/ToolCutOut.py:483 -#: flatcamTools/ToolNonCopperClear.py:665 flatcamTools/ToolPaint.py:763 +#: flatcamTools/ToolNonCopperClear.py:666 flatcamTools/ToolPaint.py:764 #: flatcamTools/ToolPanelize.py:293 flatcamTools/ToolPanelize.py:307 #, python-format msgid "[ERROR_NOTCL] Could not retrieve object: %s" @@ -7857,7 +8060,7 @@ msgstr "" msgid "[success] Any form CutOut operation finished." msgstr "" -#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:767 +#: flatcamTools/ToolCutOut.py:487 flatcamTools/ToolPaint.py:768 #: flatcamTools/ToolPanelize.py:299 #, python-format msgid "[ERROR_NOTCL] Object not found: %s" @@ -8343,23 +8546,19 @@ msgstr "" msgid "Measure" msgstr "" -#: flatcamTools/ToolMeasurement.py:126 +#: flatcamTools/ToolMeasurement.py:132 msgid "Meas. Tool" msgstr "" -#: flatcamTools/ToolMeasurement.py:221 +#: flatcamTools/ToolMeasurement.py:177 msgid "MEASURING: Click on the Start point ..." msgstr "" -#: flatcamTools/ToolMeasurement.py:231 -msgid "Measurement Tool exit..." -msgstr "" - -#: flatcamTools/ToolMeasurement.py:258 +#: flatcamTools/ToolMeasurement.py:270 msgid "MEASURING: Click on the Destination point ..." msgstr "" -#: flatcamTools/ToolMeasurement.py:276 +#: flatcamTools/ToolMeasurement.py:278 #, python-brace-format msgid "MEASURING: Result D(x) = {d_x} | D(y) = {d_y} | Distance = {d_z}" msgstr "" @@ -8474,88 +8673,113 @@ msgstr "" msgid "Generate Geometry" msgstr "" -#: flatcamTools/ToolNonCopperClear.py:484 flatcamTools/ToolPaint.py:543 -#: flatcamTools/ToolSolderPaste.py:760 +#: flatcamTools/ToolNonCopperClear.py:485 flatcamTools/ToolPaint.py:544 +#: flatcamTools/ToolSolderPaste.py:761 msgid "[WARNING_NOTCL] Please enter a tool diameter to add, in Float format." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:512 flatcamTools/ToolPaint.py:567 +#: flatcamTools/ToolNonCopperClear.py:513 flatcamTools/ToolPaint.py:568 msgid "[WARNING_NOTCL] Adding tool cancelled. Tool already in Tool Table." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:517 flatcamTools/ToolPaint.py:572 +#: flatcamTools/ToolNonCopperClear.py:518 flatcamTools/ToolPaint.py:573 msgid "[success] New tool added to Tool Table." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:559 flatcamTools/ToolPaint.py:615 +#: flatcamTools/ToolNonCopperClear.py:560 flatcamTools/ToolPaint.py:616 msgid "[success] Tool from Tool Table was edited." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:570 flatcamTools/ToolPaint.py:626 -#: flatcamTools/ToolSolderPaste.py:846 +#: flatcamTools/ToolNonCopperClear.py:571 flatcamTools/ToolPaint.py:627 +#: flatcamTools/ToolSolderPaste.py:847 msgid "" "[WARNING_NOTCL] Edit cancelled. New diameter value is already in the Tool " "Table." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:609 flatcamTools/ToolPaint.py:723 +#: flatcamTools/ToolNonCopperClear.py:610 flatcamTools/ToolPaint.py:724 msgid "[WARNING_NOTCL] Delete failed. Select a tool to delete." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:614 flatcamTools/ToolPaint.py:728 +#: flatcamTools/ToolNonCopperClear.py:615 flatcamTools/ToolPaint.py:729 msgid "[success] Tool(s) deleted from Tool Table." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:632 flatcamTools/ToolPaint.py:747 +#: flatcamTools/ToolNonCopperClear.py:633 flatcamTools/ToolPaint.py:748 msgid "" "[ERROR_NOTCL] Overlap value must be between 0 (inclusive) and 1 (exclusive), " msgstr "" -#: flatcamTools/ToolNonCopperClear.py:672 +#: flatcamTools/ToolNonCopperClear.py:673 msgid "[ERROR_NOTCL] No Gerber file available." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:710 -#: flatcamTools/ToolNonCopperClear.py:832 +#: flatcamTools/ToolNonCopperClear.py:711 +#: flatcamTools/ToolNonCopperClear.py:833 msgid "Clearing Non-Copper areas." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:728 +#: flatcamTools/ToolNonCopperClear.py:729 #, python-format msgid "[success] Non-Copper Clearing with ToolDia = %s started." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:797 +#: flatcamTools/ToolNonCopperClear.py:798 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper() --> %s" msgstr "" -#: flatcamTools/ToolNonCopperClear.py:802 +#: flatcamTools/ToolNonCopperClear.py:803 msgid "[success] NCC Tool finished." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:804 +#: flatcamTools/ToolNonCopperClear.py:805 msgid "" "[WARNING_NOTCL] NCC Tool finished but some PCB features could not be " "cleared. Check the result." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:850 +#: flatcamTools/ToolNonCopperClear.py:851 #, python-format msgid "[success] Non-Copper Rest Clearing with ToolDia = %s started." msgstr "" -#: flatcamTools/ToolNonCopperClear.py:948 +#: flatcamTools/ToolNonCopperClear.py:949 #, python-format msgid "[ERROR_NOTCL] NCCTool.clear_non_copper_rest() --> %s" msgstr "" -#: flatcamTools/ToolNonCopperClear.py:956 +#: flatcamTools/ToolNonCopperClear.py:957 msgid "" "[ERROR_NOTCL] NCC Tool finished but could not clear the object with current " "settings." msgstr "" +#: flatcamTools/ToolPDF.py:37 +msgid "PDF Import Tool" +msgstr "" + +#: flatcamTools/ToolPDF.py:142 flatcamTools/ToolPDF.py:146 +msgid "Open PDF" +msgstr "" + +#: flatcamTools/ToolPDF.py:149 +msgid "[WARNING_NOTCL] Open PDF cancelled." +msgstr "" + +#: flatcamTools/ToolPDF.py:170 +msgid "Parsing PDF file ..." +msgstr "" + +#: flatcamTools/ToolPDF.py:266 +#, python-format +msgid "Rendering PDF layer #%d ..." +msgstr "" + +#: flatcamTools/ToolPDF.py:270 +msgid "[ERROR_NOTCL] Open PDF file failed." +msgstr "" + #: flatcamTools/ToolPaint.py:24 msgid "Paint Area" msgstr "" @@ -8619,35 +8843,35 @@ msgid "" "created." msgstr "" -#: flatcamTools/ToolPaint.py:732 +#: flatcamTools/ToolPaint.py:733 msgid "geometry_on_paint_button" msgstr "" -#: flatcamTools/ToolPaint.py:751 flatcamTools/ToolPaint.py:786 +#: flatcamTools/ToolPaint.py:752 flatcamTools/ToolPaint.py:787 msgid "[WARNING_NOTCL] Click inside the desired polygon." msgstr "" -#: flatcamTools/ToolPaint.py:773 +#: flatcamTools/ToolPaint.py:774 msgid "[ERROR_NOTCL] Can't do Paint on MultiGeo geometries ..." msgstr "" -#: flatcamTools/ToolPaint.py:795 flatcamTools/ToolPaint.py:998 +#: flatcamTools/ToolPaint.py:796 flatcamTools/ToolPaint.py:999 msgid "Painting polygon..." msgstr "" -#: flatcamTools/ToolPaint.py:846 +#: flatcamTools/ToolPaint.py:847 msgid "[WARNING] No polygon found." msgstr "" -#: flatcamTools/ToolPaint.py:849 +#: flatcamTools/ToolPaint.py:850 msgid "Painting polygon." msgstr "" -#: flatcamTools/ToolPaint.py:891 +#: flatcamTools/ToolPaint.py:892 msgid "[ERROR_NOTCL] Geometry could not be painted completely" msgstr "" -#: flatcamTools/ToolPaint.py:917 +#: flatcamTools/ToolPaint.py:918 #, python-format msgid "" "[ERROR] Could not do Paint. Try a different combination of parameters. Or a " @@ -8655,16 +8879,16 @@ msgid "" "%s" msgstr "" -#: flatcamTools/ToolPaint.py:959 +#: flatcamTools/ToolPaint.py:960 #, python-format msgid "[ERROR_NOTCL] PaintTool.paint_poly() --> %s" msgstr "" -#: flatcamTools/ToolPaint.py:965 flatcamTools/ToolPaint.py:1258 +#: flatcamTools/ToolPaint.py:966 flatcamTools/ToolPaint.py:1259 msgid "Polygon Paint started ..." msgstr "" -#: flatcamTools/ToolPaint.py:1114 flatcamTools/ToolPaint.py:1203 +#: flatcamTools/ToolPaint.py:1115 flatcamTools/ToolPaint.py:1204 #, python-format msgid "" "[ERROR] Could not do Paint All. Try a different combination of parameters. " @@ -8672,7 +8896,7 @@ msgid "" "%s" msgstr "" -#: flatcamTools/ToolPaint.py:1138 +#: flatcamTools/ToolPaint.py:1139 msgid "" "[ERROR] There is no Painting Geometry in the file.\n" "Usually it means that the tool diameter is too big for the painted " @@ -8680,11 +8904,11 @@ msgid "" "Change the painting parameters and try again." msgstr "" -#: flatcamTools/ToolPaint.py:1147 +#: flatcamTools/ToolPaint.py:1148 msgid "[success] Paint All Done." msgstr "" -#: flatcamTools/ToolPaint.py:1233 +#: flatcamTools/ToolPaint.py:1234 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 " @@ -8692,7 +8916,7 @@ msgid "" "Change the painting parameters and try again." msgstr "" -#: flatcamTools/ToolPaint.py:1242 +#: flatcamTools/ToolPaint.py:1243 msgid "[success] Paint All with Rest-Machining done." msgstr "" @@ -8780,6 +9004,144 @@ msgstr "" 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:66 +msgid "INF file:" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:68 +msgid "Load the INF file." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:81 +msgid "Tool Number" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:83 +msgid "Tool diameter in file units." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:97 +msgid "Int. digits:" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:99 +msgid "The number of digits for the integral part of the coordinates." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:106 +msgid "Frac. digits:" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:108 +msgid "The number of digits for the fractional part of the coordinates." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:116 +msgid "Zeros supp.:" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:118 +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:129 +msgid "Units" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:131 +msgid "" +"The type of units that the coordinates and tool\n" +"diameters are using. Can be INCH or MM." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:138 +msgid "Import Excellon" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:140 +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:194 +msgid "PCBWizard Tool" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:288 flatcamTools/ToolPcbWizard.py:292 +msgid "Load PcbWizard Excellon file" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:312 flatcamTools/ToolPcbWizard.py:316 +msgid "Load PcbWizard INF file" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:363 +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:383 +msgid "[success] PcbWizard .INF file loaded." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:387 +msgid "[success] Main PcbWizard Excellon file loaded." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:424 +#, python-format +msgid "[ERROR_NOTCL] Cannot parse file: %s" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:447 +msgid "Importing Excellon." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:454 +msgid "[ERROR_NOTCL] Import Excellon file failed." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:461 +#, python-format +msgid "[success] Imported: %s" +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:464 +msgid "[WARNING_NOTCL] Excellon merging is in progress. Please wait..." +msgstr "" + +#: flatcamTools/ToolPcbWizard.py:466 +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 "" @@ -8951,89 +9313,89 @@ msgstr "" msgid "Delete Object" msgstr "" -#: flatcamTools/ToolSolderPaste.py:788 +#: flatcamTools/ToolSolderPaste.py:789 msgid "" "[WARNING_NOTCL] Adding Nozzle tool cancelled. Tool already in Tool Table." msgstr "" -#: flatcamTools/ToolSolderPaste.py:793 +#: flatcamTools/ToolSolderPaste.py:794 msgid "[success] New Nozzle tool added to Tool Table." msgstr "" -#: flatcamTools/ToolSolderPaste.py:835 +#: flatcamTools/ToolSolderPaste.py:836 msgid "[success] Nozzle tool from Tool Table was edited." msgstr "" -#: flatcamTools/ToolSolderPaste.py:891 +#: flatcamTools/ToolSolderPaste.py:892 msgid "[WARNING_NOTCL] Delete failed. Select a Nozzle tool to delete." msgstr "" -#: flatcamTools/ToolSolderPaste.py:896 +#: flatcamTools/ToolSolderPaste.py:897 msgid "[success] Nozzle tool(s) deleted from Tool Table." msgstr "" -#: flatcamTools/ToolSolderPaste.py:951 +#: flatcamTools/ToolSolderPaste.py:952 msgid "[WARNING_NOTCL] No SolderPaste mask Gerber object loaded." msgstr "" -#: flatcamTools/ToolSolderPaste.py:968 +#: flatcamTools/ToolSolderPaste.py:969 msgid "Creating Solder Paste dispensing geometry." msgstr "" -#: flatcamTools/ToolSolderPaste.py:980 +#: flatcamTools/ToolSolderPaste.py:981 msgid "[WARNING_NOTCL] No Nozzle tools in the tool table." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1109 +#: flatcamTools/ToolSolderPaste.py:1110 msgid "[success] Solder Paste geometry generated successfully..." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1115 +#: flatcamTools/ToolSolderPaste.py:1116 msgid "" "[WARNING_NOTCL] Some or all pads have no solder due of inadequate nozzle " "diameters..." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1129 +#: flatcamTools/ToolSolderPaste.py:1130 msgid "Generating Solder Paste dispensing geometry..." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1149 +#: flatcamTools/ToolSolderPaste.py:1150 msgid "[WARNING_NOTCL] There is no Geometry object available." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1153 +#: flatcamTools/ToolSolderPaste.py:1154 msgid "" "[WARNING_NOTCL] This Geometry can't be processed. NOT a solder_paste_tool " "geometry." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1258 +#: flatcamTools/ToolSolderPaste.py:1259 #, python-format msgid "[success] ToolSolderPaste CNCjob created: %s" msgstr "" -#: flatcamTools/ToolSolderPaste.py:1290 flatcamTools/ToolSolderPaste.py:1294 -#: flatcamTools/ToolSolderPaste.py:1345 +#: flatcamTools/ToolSolderPaste.py:1291 flatcamTools/ToolSolderPaste.py:1295 +#: flatcamTools/ToolSolderPaste.py:1346 msgid "" "[WARNING_NOTCL] This CNCJob object can't be processed. NOT a " "solder_paste_tool CNCJob object." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1317 +#: flatcamTools/ToolSolderPaste.py:1318 msgid "[ERROR_NOTCL] No Gcode in the object..." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1326 +#: flatcamTools/ToolSolderPaste.py:1327 #, python-format msgid "[ERROR] ToolSolderPaste.on_view_gcode() -->%s" msgstr "" -#: flatcamTools/ToolSolderPaste.py:1355 +#: flatcamTools/ToolSolderPaste.py:1356 msgid "Export GCode ..." msgstr "" -#: flatcamTools/ToolSolderPaste.py:1393 +#: flatcamTools/ToolSolderPaste.py:1394 #, python-format msgid "[success] Solder paste dispenser GCode file saved to: %s" msgstr "" From 1da424e9fb85dc6ff4dbd202edab411f9b94b88f Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 23 Apr 2019 21:31:17 +0300 Subject: [PATCH 41/42] - added more custom mouse cursors in Geometry and Gerber Editors - RELEASE 8.914 --- README.md | 2 ++ flatcamEditors/FlatCAMGeoEditor.py | 19 +++++++++++++++++-- flatcamEditors/FlatCAMGrbEditor.py | 9 ++++++++- share/aero_arc.png | Bin 0 -> 6915 bytes share/aero_circle_geo.png | Bin 0 -> 6915 bytes share/aero_disc.png | Bin 0 -> 5350 bytes share/aero_semidisc.png | Bin 0 -> 5348 bytes share/aero_text.png | Bin 0 -> 5350 bytes 8 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 share/aero_arc.png create mode 100644 share/aero_circle_geo.png create mode 100644 share/aero_disc.png create mode 100644 share/aero_semidisc.png create mode 100644 share/aero_text.png diff --git a/README.md b/README.md index c63dfebb..f68f9f20 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ CAD program, and create G-Code for Isolation routing. - Gerber and Geometry Editors: fixed some issues with the Add Arc/Add Semidisc; in mode 132, the norm() function was not the one from numpy but from a FlatCAM Class. Also fixed some of the texts and made sure that when changing the mode, the current points are reset to prepare for the newly selected mode. - Fixed Measurement Tool to show the mouse coordinates on the status bar (it was broken at some point) - updated the translation files +- added more custom mouse cursors in Geometry and Gerber Editors +- RELEASE 8.914 22.04.2019 diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index f5973f5e..33cb6312 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -1936,7 +1936,7 @@ class FCCircle(FCShapeTool): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle_geo.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.start_msg = _("Click on Center point ...") @@ -1984,6 +1984,13 @@ class FCArc(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'arc' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_arc.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on Center point ...") self.draw_app.app.inform.emit(_("Click on Center point ...")) @@ -2314,7 +2321,7 @@ class FCPath(FCPolygon): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path.png')) + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) def make(self): @@ -2531,6 +2538,14 @@ class FCText(FCShapeTool): FCShapeTool.__init__(self, draw_app) self.name = 'text' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_text.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + + # self.shape_buffer = self.draw_app.shape_buffer self.draw_app = draw_app self.app = draw_app.app diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 6fe396f7..136b8bdc 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -1070,7 +1070,7 @@ class FCDisc(FCShapeTool): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_disc.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) size_ap = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) @@ -1132,6 +1132,13 @@ class FCSemiDisc(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'semidisc' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_semidisc.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on Center point ...") self.draw_app.app.inform.emit(_("Click on Center point ...")) diff --git a/share/aero_arc.png b/share/aero_arc.png new file mode 100644 index 0000000000000000000000000000000000000000..b953d43d65d19ed50c4398e31341e50e4c7bb9fe GIT binary patch literal 6915 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 TGgH~Pn3JlCrgEv0x&MCvm-NZ~ literal 0 HcmV?d00001 diff --git a/share/aero_disc.png b/share/aero_disc.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee99e23cfd97dc99ede4e03e4d485fafcea5cf7 GIT binary patch literal 5350 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

p0=BA}udYciKrd zCk{`8Cz4Zoy}&2BuzAD2+Ajr1hc2p`HLMDFnrO`vNzCFE+vV= zmgJk@K^U)@z7w=GQf6QrMf438HJf|)#NIDFq|%JNylPMGNF!;nlZIGpg@MPk6mE|< z9*-}QUo@=OScz)jFVu{3UJ=YfD2fQIwn%wv2=o=gRZR&ZQ~~EQ0Wspml4_5mIZbA} z*%VA_11A)fTZUZ;!rXq*3r?{K3aC#(&S|ZOiA32l)#e+=*yhG818Jt7%C8SrAYC&} zUY6uqB;9RC9KuzUHWmBhiUN552+(#%WVikPynl5MGK>L&7A6Mjz*T9$|qh~1->E8s}VsFiQr z*T8-y$%NZKpJYwsO~XH`NLsM$6wHOGN3%^_Eafy!xlWftgt`+pL9M#d0{c zIl+NxD}^3&f2m;;U#`(sf3>dnm-C2H^x94j;a(x?XhE+W+w2RjH!7Z{1wQbKwd0;} zG)IU?$gn5oK9hSPs3$!+a7E!gpNQh6MbSI}07bj#=$K-3bVN;YCPy(?H0!^c5t5{? z->ikA;=5eY(h-6P($kl!*8JN^Dbj+C+AcDc6DP^zNF^72+zAwWPei0hyd@OrY$tqz z{m3k&h58!v3T?24w>cxgT3(ui13~={AyI+XZx?uiO_kg9AKyA9Stq@UA8zL7czLO; z1*@KEgKhQ=9%ydvse^TpHJ9mQ=445T+MYR77f-x@q`y;Fr^=^oP-`<>Y{!KsJhh^8 zVm%)v8%XkpWoMsfCmFYIgI=I&L)(O($DKD&GeY4kF3m?{lef3qX1pe+R?R%a3q5s_ z*;~?uLUS9&ih%_7-}xA?^o70H9e!zdL>05gPfV|j70r}@^`mvl)AB+(iI>Ls8^Bf-4tt$ioP6kHzh=o26 zXqJ<2k)`-)KQr(%13xqHGXp=$0NalQ|LAAq_=oEU4mS8!5jOZ%5f-sUWP{im@+Yw+ z Date: Tue, 23 Apr 2019 22:03:40 +0300 Subject: [PATCH 42/42] - commented the camlib.alpha_shape() as it is not needed but require a huge package (scipy) --- camlib.py | 114 +++++++++++++++++++++++++++--------------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/camlib.py b/camlib.py index 7340501b..13ff1b60 100644 --- a/camlib.py +++ b/camlib.py @@ -46,7 +46,7 @@ import ezdxf # TODO: Commented for FlatCAM packaging with cx_freeze # from scipy.spatial import KDTree, Delaunay -from scipy.spatial import Delaunay +# from scipy.spatial import Delaunay from flatcamParsers.ParseSVG import * from flatcamParsers.ParseDXF import * @@ -7409,62 +7409,62 @@ def parse_gerber_number(strnumber, int_digits, frac_digits, zeros): return ret_val -def alpha_shape(points, alpha): - """ - Compute the alpha shape (concave hull) of a set of points. - - @param points: Iterable container of points. - @param alpha: alpha value to influence the gooeyness of the border. Smaller - numbers don't fall inward as much as larger numbers. Too large, - and you lose everything! - """ - if len(points) < 4: - # When you have a triangle, there is no sense in computing an alpha - # shape. - return MultiPoint(list(points)).convex_hull - - def add_edge(edges, edge_points, coords, i, j): - """Add a line between the i-th and j-th points, if not in the list already""" - if (i, j) in edges or (j, i) in edges: - # already added - return - edges.add( (i, j) ) - edge_points.append(coords[ [i, j] ]) - - coords = np.array([point.coords[0] for point in points]) - - tri = Delaunay(coords) - edges = set() - edge_points = [] - # loop over triangles: - # ia, ib, ic = indices of corner points of the triangle - for ia, ib, ic in tri.vertices: - pa = coords[ia] - pb = coords[ib] - pc = coords[ic] - - # Lengths of sides of triangle - a = math.sqrt((pa[0]-pb[0])**2 + (pa[1]-pb[1])**2) - b = math.sqrt((pb[0]-pc[0])**2 + (pb[1]-pc[1])**2) - c = math.sqrt((pc[0]-pa[0])**2 + (pc[1]-pa[1])**2) - - # Semiperimeter of triangle - s = (a + b + c)/2.0 - - # Area of triangle by Heron's formula - area = math.sqrt(s*(s-a)*(s-b)*(s-c)) - circum_r = a*b*c/(4.0*area) - - # Here's the radius filter. - #print circum_r - if circum_r < 1.0/alpha: - add_edge(edges, edge_points, coords, ia, ib) - add_edge(edges, edge_points, coords, ib, ic) - add_edge(edges, edge_points, coords, ic, ia) - - m = MultiLineString(edge_points) - triangles = list(polygonize(m)) - return cascaded_union(triangles), edge_points +# def alpha_shape(points, alpha): +# """ +# Compute the alpha shape (concave hull) of a set of points. +# +# @param points: Iterable container of points. +# @param alpha: alpha value to influence the gooeyness of the border. Smaller +# numbers don't fall inward as much as larger numbers. Too large, +# and you lose everything! +# """ +# if len(points) < 4: +# # When you have a triangle, there is no sense in computing an alpha +# # shape. +# return MultiPoint(list(points)).convex_hull +# +# def add_edge(edges, edge_points, coords, i, j): +# """Add a line between the i-th and j-th points, if not in the list already""" +# if (i, j) in edges or (j, i) in edges: +# # already added +# return +# edges.add( (i, j) ) +# edge_points.append(coords[ [i, j] ]) +# +# coords = np.array([point.coords[0] for point in points]) +# +# tri = Delaunay(coords) +# edges = set() +# edge_points = [] +# # loop over triangles: +# # ia, ib, ic = indices of corner points of the triangle +# for ia, ib, ic in tri.vertices: +# pa = coords[ia] +# pb = coords[ib] +# pc = coords[ic] +# +# # Lengths of sides of triangle +# a = math.sqrt((pa[0]-pb[0])**2 + (pa[1]-pb[1])**2) +# b = math.sqrt((pb[0]-pc[0])**2 + (pb[1]-pc[1])**2) +# c = math.sqrt((pc[0]-pa[0])**2 + (pc[1]-pa[1])**2) +# +# # Semiperimeter of triangle +# s = (a + b + c)/2.0 +# +# # Area of triangle by Heron's formula +# area = math.sqrt(s*(s-a)*(s-b)*(s-c)) +# circum_r = a*b*c/(4.0*area) +# +# # Here's the radius filter. +# #print circum_r +# if circum_r < 1.0/alpha: +# add_edge(edges, edge_points, coords, ia, ib) +# add_edge(edges, edge_points, coords, ib, ic) +# add_edge(edges, edge_points, coords, ic, ia) +# +# m = MultiLineString(edge_points) +# triangles = list(polygonize(m)) +# return cascaded_union(triangles), edge_points # def voronoi(P): # """

B New Gerber
E Edit Object (if selected)
 Paint Area Tool
ALT+Q PDF Import Tool
ALT+R Transformations Tool
 Copy Geo Item
D Within Add Arc will toogle the ARC " +"direction: CW or CCW
E Polygon Intersection Tool
 Move Geo Item
M Within Add Arc will cycle through the ARC " +"modes
N Draw a Polygon
 Copy
D Add Disc
E Add SemiDisc
J Jump to Location (x, y)
 Add Pad
R Within Track & Region Tools will cycle in " +"REVERSE the bend modes
S Scale
 Add Track
T Within Track & Region Tools will cycle " +"FORWARD the bend modes