From a4b5d117b8c196253971f4d673e91d1cfaad8481 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Fri, 6 Nov 2020 21:37:19 +0200 Subject: [PATCH 1/8] - in Gerber editor added the G key shortcut to toggle the grid snapping --- CHANGELOG.md | 1 + appEditors/AppGerberEditor.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbd53d51..fe2af0f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ CHANGELOG for FlatCAM beta - in Excellon Editor remade the utility geometry generation for Circular Drill/Slot Array to show the array updated in real time and also fixed the adding of array in negative quadrants - Turkish language strings updated (by Mehmet Kaya) - both for Excellon and Gerber editor fixed the direction of slots/pads when adding a circular array +- in Gerber editor added the G key shortcut to toggle the grid snapping 5.11.2020 diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index 1230915c..39dc9bb4 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -1449,6 +1449,10 @@ class TrackEditorGrb(ShapeToolEditorGrb): self.draw_app.draw_utility_geometry(geo_shape=geo) return _("Backtracked one point ...") + # Jump to coords + if key == QtCore.Qt.Key_G or key == 'G': + self.draw_app.app.ui.grid_snap_btn.trigger() + # Jump to coords if key == QtCore.Qt.Key_J or key == 'J': self.draw_app.app.on_jump_to() From d526d16cdf511ed7c92c38db64f5ce703930a639 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 03:45:04 +0200 Subject: [PATCH 2/8] - made some changes in the Region Tool from the Gerber Editor --- CHANGELOG.md | 1 + appEditors/AppGerberEditor.py | 325 ++++++++++++++++++++-------------- 2 files changed, 189 insertions(+), 137 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe2af0f4..a4d0a220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ CHANGELOG for FlatCAM beta - Turkish language strings updated (by Mehmet Kaya) - both for Excellon and Gerber editor fixed the direction of slots/pads when adding a circular array - in Gerber editor added the G key shortcut to toggle the grid snapping +- made some changes in the Region Tool from the Gerber Editor 5.11.2020 diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index 39dc9bb4..909c2260 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -1026,144 +1026,195 @@ class RegionEditorGrb(ShapeToolEditorGrb): return new_geo_el = {} - x = data[0] y = data[1] if len(self.points) == 0: - new_geo_el['solid'] = Point(data).buffer(self.buf_val, resolution=int(self.steps_per_circle / 4)) + new_geo_el['solid'] = Point((x, y)).buffer(self.buf_val, resolution=int(self.steps_per_circle / 4)) return DrawToolUtilityShape(new_geo_el) - if len(self.points) == 1: + elif len(self.points) == 1: self.temp_points = [x for x in self.points] + # previous point coordinates old_x = self.points[0][0] old_y = self.points[0][1] + # how many grid sections between old point and new point mx = abs(round((x - old_x) / self.gridx_size)) my = abs(round((y - old_y) / self.gridy_size)) - if mx and my: - if self.draw_app.app.ui.grid_snap_btn.isChecked(): - 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) - 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.draw_app.bend_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.draw_app.bend_mode == 3: - self.inter_point = (x, old_y) - elif self.draw_app.bend_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.draw_app.app.ui.grid_snap_btn.isChecked() and mx and my: + # calculate intermediary point + if self.draw_app.bend_mode != 5: + if self.draw_app.bend_mode == 1: + # if we move from left to right + if x > old_x: + # if the number of grid sections is greater on the X axis + if mx > my: + self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) + # if the number of grid sections is greater on the Y axis + if mx < my: + # if we move from top to down + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + # if we move from down to top or at the same height + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + # if we move from right to left + elif x < old_x: + # if the number of grid sections is greater on the X axis + if mx > my: + self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) + # if the number of grid sections is greater on the Y axis + if mx < my: + # if we move from top to down + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + # if we move from down to top or at the same height + else: + self.inter_point = (old_x, old_y - self.gridy_size * (mx - my)) + elif self.draw_app.bend_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.draw_app.bend_mode == 3: + self.inter_point = (x, old_y) + elif self.draw_app.bend_mode == 4: + self.inter_point = (old_x, y) + # add the intermediary point to the points storage + if self.inter_point is not None: + self.temp_points.append(self.inter_point) + else: + self.inter_point = (x, y) else: - self.inter_point = data + self.inter_point = None - self.temp_points.append(data) - new_geo_el = {} + else: + self.inter_point = (x, y) + + # add click point to the points storage + self.temp_points.append( + (x, y) + ) if len(self.temp_points) > 1: try: - new_geo_el['solid'] = LineString(self.temp_points).buffer(self.buf_val, - resolution=int(self.steps_per_circle / 4), - join_style=1) + geo_sol = LineString(self.temp_points) + geo_sol = geo_sol.buffer(self.buf_val, int(self.steps_per_circle / 4), join_style=1) + new_geo_el = { + 'solid': geo_sol + } return DrawToolUtilityShape(new_geo_el) except Exception as e: log.debug("AppGerberEditor.RegionEditorGrb.utility_geometry() --> %s" % str(e)) else: - new_geo_el['solid'] = Point(self.temp_points).buffer(self.buf_val, - resolution=int(self.steps_per_circle / 4)) + geo_sol = Point(self.temp_points).buffer(self.buf_val, resolution=int(self.steps_per_circle / 4)) + new_geo_el = { + 'solid': geo_sol + } return DrawToolUtilityShape(new_geo_el) - if len(self.points) > 2: + elif len(self.points) > 1: self.temp_points = [x for x in self.points] + + # previous point coordinates old_x = self.points[-1][0] old_y = self.points[-1][1] + # how many grid sections between old point and new point mx = abs(round((x - old_x) / self.gridx_size)) my = abs(round((y - old_y) / self.gridy_size)) - if mx and my: - if self.draw_app.app.ui.grid_snap_btn.isChecked(): - 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) - 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.draw_app.bend_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.draw_app.bend_mode == 3: - self.inter_point = (x, old_y) - elif self.draw_app.bend_mode == 4: - self.inter_point = (old_x, y) + if self.draw_app.app.ui.grid_snap_btn.isChecked() and mx and my: + # calculate intermediary point + if self.draw_app.bend_mode != 5: + if self.draw_app.bend_mode == 1: + # if we move from left to right + if x > old_x: + # if the number of grid sections is greater on the X axis + if mx > my: + self.inter_point = (old_x + self.gridx_size * (mx - my), old_y) + # if the number of grid sections is greater on the Y axis + elif mx < my: + # if we move from top to down + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + # if we move from down to top or at the same height + else: + self.inter_point = (old_x, old_y + self.gridy_size * (my - mx)) + elif mx == my: + pass + # if we move from right to left + if x < old_x: + # if the number of grid sections is greater on the X axis + if mx > my: + self.inter_point = (old_x - self.gridx_size * (mx - my), old_y) + # if the number of grid sections is greater on the Y axis + elif mx < my: + # if we move from top to down + if y < old_y: + self.inter_point = (old_x, old_y - self.gridy_size * (my - mx)) + # if we move from down to top or at the same height + else: + self.inter_point = (old_x, old_y + self.gridy_size * (my - mx)) + elif mx == my: + pass + elif self.draw_app.bend_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.draw_app.bend_mode == 3: + self.inter_point = (x, old_y) + elif self.draw_app.bend_mode == 4: + self.inter_point = (old_x, y) + # add the intermediary point to the points storage + # self.temp_points.append(self.inter_point) + if self.inter_point is not None: self.temp_points.append(self.inter_point) - self.temp_points.append(data) + else: + self.inter_point = None + else: + self.inter_point = (x, y) + + # add click point to the points storage + self.temp_points.append( + (x, y) + ) + + # create the geometry + geo_line = LinearRing(self.temp_points) + geo_sol = geo_line.buffer(self.buf_val, int(self.steps_per_circle / 4), join_style=1) new_geo_el = { - 'solid': LinearRing(self.temp_points).buffer(self.buf_val, - resolution=int(self.steps_per_circle / 4), - join_style=1), - 'follow': LinearRing(self.temp_points)} + 'solid': geo_sol, + 'follow': geo_line + } return DrawToolUtilityShape(new_geo_el) @@ -1180,9 +1231,8 @@ class RegionEditorGrb(ShapeToolEditorGrb): self.draw_app.last_aperture_selected = '0' new_geo_el = { - 'solid': Polygon(self.points).buffer(self.buf_val, - resolution=int(self.steps_per_circle / 4), - join_style=2), 'follow': Polygon(self.points).exterior + 'solid': Polygon(self.points).buffer(self.buf_val, int(self.steps_per_circle / 4), join_style=2), + 'follow': Polygon(self.points).exterior } self.geometry = DrawToolShape(new_geo_el) @@ -2556,17 +2606,17 @@ class SelectEditorGrb(QtCore.QObject, DrawTool): self.results = [] with editor_obj.app.proc_container.new('%s' % _("Working ...")): - def divide_chunks(l, n): - # looping till length l - for i in range(0, len(l), n): - yield l[i:i + n] + def divide_chunks(lst, n): + # looping till length of lst + for i in range(0, len(lst), n): + yield lst[i:i + n] # divide in chunks of 77 elements - n = 77 + n_chunks = 77 for ap_key, storage_val in editor_obj.storage_dict.items(): # divide in chunks of 77 elements - geo_list = list(divide_chunks(storage_val['geometry'], n)) + geo_list = list(divide_chunks(storage_val['geometry'], n_chunks)) for chunk, list30 in enumerate(geo_list): self.results.append( editor_obj.pool.apply_async( @@ -2581,7 +2631,7 @@ class SelectEditorGrb(QtCore.QObject, DrawTool): if ret_val: k = ret_val[0] part = ret_val[1] - idx = ret_val[2] + (part * n) + idx = ret_val[2] + (part * n_chunks) shape_stored = editor_obj.storage_dict[k]['geometry'][idx] if shape_stored in editor_obj.selected: @@ -3127,31 +3177,32 @@ class AppGerberEditor(QtCore.QObject): if ap_code == '0': if ap_code not in self.tid2apcode: - self.storage_dict[ap_code] = {} - self.storage_dict[ap_code]['type'] = 'REG' - size_val = 0 - self.ui.apsize_entry.set_value(size_val) - self.storage_dict[ap_code]['size'] = size_val - - self.storage_dict[ap_code]['geometry'] = [] + self.storage_dict[ap_code] = { + 'type': 'REG', + 'size': 0.0, + 'geometry': [] + } + self.ui.apsize_entry.set_value(0.0) # self.oldapcode_newapcode dict keeps the evidence on current aperture codes as keys and # gets updated on values each time a aperture code is edited or added self.oldapcode_newapcode[ap_code] = ap_code else: if ap_code not in self.oldapcode_newapcode: - self.storage_dict[ap_code] = {} - type_val = self.ui.aptype_cb.currentText() - self.storage_dict[ap_code]['type'] = type_val - if type_val == 'R' or type_val == 'O': try: dims = self.ui.apdim_entry.get_value() - self.storage_dict[ap_code]['width'] = dims[0] - self.storage_dict[ap_code]['height'] = dims[1] - size_val = np.sqrt((dims[0] ** 2) + (dims[1] ** 2)) + + self.storage_dict[ap_code] = { + 'type': type_val, + 'size': size_val, + 'width': dims[0], + 'height': dims[1], + 'geometry': [] + } + self.ui.apsize_entry.set_value(size_val) except Exception as e: @@ -3173,16 +3224,18 @@ class AppGerberEditor(QtCore.QObject): self.app.inform.emit('[WARNING_NOTCL] %s' % _("Aperture size value is missing or wrong format. Add it and retry.")) return - self.storage_dict[ap_code]['size'] = size_val - self.storage_dict[ap_code]['geometry'] = [] + self.storage_dict[ap_code] = { + 'type': type_val, + 'size': size_val, + 'geometry': [] + } # self.oldapcode_newapcode dict keeps the evidence on current aperture codes as keys and gets updated on # values each time a aperture code is edited or added self.oldapcode_newapcode[ap_code] = ap_code else: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Aperture already in the aperture table.")) + self.app.inform.emit('[WARNING_NOTCL] %s' % _("Aperture already in the aperture table.")) return # since we add a new tool, we update also the initial state of the tool_table through it's dictionary @@ -4791,7 +4844,7 @@ class AppGerberEditor(QtCore.QObject): except KeyError: pass if geo_el in self.selected: - self.selected.remove(geo_el) # TODO: Check performance + self.selected.remove(geo_el) def delete_utility_geometry(self): # for_deletion = [shape for shape in self.shape_buffer if shape.utility] @@ -5034,11 +5087,9 @@ class AppGerberEditor(QtCore.QObject): self.ma_annotation.set(text=text, pos=position, visible=True, font_size=self.app.defaults["cncjob_annotation_fontsize"], color='#000000FF') - self.app.inform.emit('[success] %s' % - _("Polygons marked.")) + self.app.inform.emit('[success] %s' % _("Polygons marked.")) else: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("No polygons were marked. None fit within the limits.")) + self.app.inform.emit('[WARNING_NOTCL] %s' % _("No polygons were marked. None fit within the limits.")) def delete_marked_polygons(self): for shape_sel in self.geo_to_delete: From 0d1fad0a3c5e190f2b6c6499e6fae330f7521d05 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 03:56:34 +0200 Subject: [PATCH 3/8] - fixed a small issue in Excellon Editor that reset the delta coordinates on right mouse button click too, which was incorrect. Only left mouse button click should reset the delta coordinates. --- CHANGELOG.md | 4 + appEditors/AppExcEditor.py | 334 ++++++++++++++++++------------------- 2 files changed, 171 insertions(+), 167 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4d0a220..0243929f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +7.11.2020 + +- fixed a small issue in Excellon Editor that reset the delta coordinates on right mouse button click too, which was incorrect. Only left mouse button click should reset the delta coordinates. + 6.11.2020 - in Gerber Editor made the selection multithreaded in a bid to get more performance but until Shapely will start working on vectorized geometry this don't yield too much improvement diff --git a/appEditors/AppExcEditor.py b/appEditors/AppExcEditor.py index 8d9444c6..5ef96de3 100644 --- a/appEditors/AppExcEditor.py +++ b/appEditors/AppExcEditor.py @@ -3153,14 +3153,14 @@ class AppExcEditor(QtCore.QObject): # event_is_dragging = self.app.plotcanvas.is_dragging # right_button = 3 - self.pos = self.canvas.translate_coords(event_pos) - - if self.app.grid_status(): - self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1]) - else: - self.pos = (self.pos[0], self.pos[1]) - if event.button == 1: + self.pos = self.canvas.translate_coords(event_pos) + + if self.app.grid_status(): + self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1]) + else: + self.pos = (self.pos[0], self.pos[1]) + self.app.ui.rel_position_label.setText("Dx: %.4f   Dy: " "%.4f    " % (0, 0)) @@ -3202,82 +3202,6 @@ class AppExcEditor(QtCore.QObject): else: self.app.log.debug("No active tool to respond to click!") - def on_exc_shape_complete(self, storage): - self.app.log.debug("on_shape_complete()") - - # Add shape - if type(storage) is list: - for item_storage in storage: - self.add_exc_shape(self.active_tool.geometry, item_storage) - else: - self.add_exc_shape(self.active_tool.geometry, storage) - - # Remove any utility shapes - self.delete_utility_geometry() - self.tool_shape.clear(update=True) - - # Replot and reset tool. - self.replot() - # self.active_tool = type(self.active_tool)(self) - - def add_exc_shape(self, shape, storage): - """ - Adds a shape to a specified shape storage. - - :param shape: Shape to be added. - :type shape: DrawToolShape - :param storage: object where to store the shapes - :return: None - """ - # List of DrawToolShape? - if isinstance(shape, list): - for subshape in shape: - self.add_exc_shape(subshape, storage) - return - - assert isinstance(shape, DrawToolShape), \ - "Expected a DrawToolShape, got %s" % str(type(shape)) - - assert shape.geo is not None, \ - "Shape object has empty geometry (None)" - - assert (isinstance(shape.geo, list) and len(shape.geo) > 0) or not isinstance(shape.geo, list), \ - "Shape objects has empty geometry ([])" - - if isinstance(shape, DrawToolUtilityShape): - self.utility.append(shape) - else: - storage.insert(shape) # TODO: Check performance - - def add_shape(self, shape): - """ - Adds a shape to the shape storage. - - :param shape: Shape to be added. - :type shape: DrawToolShape - :return: None - """ - - # List of DrawToolShape? - if isinstance(shape, list): - for subshape in shape: - self.add_shape(subshape) - return - - assert isinstance(shape, DrawToolShape), \ - "Expected a DrawToolShape, got %s" % type(shape) - - assert shape.geo is not None, \ - "Shape object has empty geometry (None)" - - assert (isinstance(shape.geo, list) and len(shape.geo) > 0) or not isinstance(shape.geo, list), \ - "Shape objects has empty geometry ([])" - - if isinstance(shape, DrawToolUtilityShape): - self.utility.append(shape) - # else: - # self.storage.insert(shape) - def on_exc_click_release(self, event): """ Handler of the "mouse_release" event. @@ -3354,90 +3278,6 @@ class AppExcEditor(QtCore.QObject): log.warning("AppExcEditor.on_exc_click_release() LMB click --> Error: %s" % str(e)) raise - def draw_selection_area_handler(self, start, end, sel_type): - """ - This function is called whenever we have a left mouse click release and only we have a left mouse click drag, - be it from left to right or from right to left. The direction of the drag is decided in the "mouse_move" - event handler. - Pressing a modifier key (eg. Ctrl, Shift or Alt) will change the behavior of the selection. - - Depending on which tool belongs the selected shapes, the corresponding rows in the Tools Table are selected or - deselected. - - :param start: mouse position when the selection LMB click was done - :param end: mouse position when the left mouse button is released - :param sel_type: if True it's a left to right selection (enclosure), if False it's a 'touch' selection - :return: - """ - - start_pos = (start[0], start[1]) - end_pos = (end[0], end[1]) - poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])]) - modifiers = None - - # delete the selection shape that was just drawn, we no longer need it - self.app.delete_selection_shape() - - # detect if a modifier key was pressed while the left mouse button was released - self.modifiers = QtWidgets.QApplication.keyboardModifiers() - if self.modifiers == QtCore.Qt.ShiftModifier: - modifiers = 'Shift' - elif self.modifiers == QtCore.Qt.ControlModifier: - modifiers = 'Control' - - if modifiers == self.app.defaults["global_mselect_key"]: - for storage in self.storage_dict: - for obj in self.storage_dict[storage].get_objects(): - if (sel_type is True and poly_selection.contains(obj.geo)) or \ - (sel_type is False and poly_selection.intersects(obj.geo)): - - if obj in self.selected: - # remove the shape object from the selected shapes storage - self.selected.remove(obj) - else: - # add the shape object to the selected shapes storage - self.selected.append(obj) - else: - # clear the selection shapes storage - self.selected = [] - # then add to the selection shapes storage the shapes that are included (touched) by the selection rectangle - for storage in self.storage_dict: - for obj in self.storage_dict[storage].get_objects(): - if (sel_type is True and poly_selection.contains(obj.geo)) or \ - (sel_type is False and poly_selection.intersects(obj.geo)): - self.selected.append(obj) - - try: - self.ui.tools_table_exc.cellPressed.disconnect() - except Exception: - pass - - # first deselect all rows (tools) in the Tools Table - self.ui.tools_table_exc.clearSelection() - # and select the rows (tools) in the tool table according to the diameter(s) of the selected shape(s) - self.ui.tools_table_exc.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) - for storage in self.storage_dict: - for shape_s in self.selected: - if shape_s in self.storage_dict[storage].get_objects(): - for key_tool_nr in self.tool2tooldia: - if self.tool2tooldia[key_tool_nr] == storage: - row_to_sel = key_tool_nr - 1 - # item = self.ui.tools_table_exc.item(row_to_sel, 1) - # self.ui.tools_table_exc.setCurrentItem(item) - # item.setSelected(True) - - # if the row to be selected is not already in the selected rows then select it - # otherwise don't do it as it seems that we have a toggle effect - if row_to_sel not in set( - index.row() for index in self.ui.tools_table_exc.selectedIndexes()): - self.ui.tools_table_exc.selectRow(row_to_sel) - self.last_tool_selected = int(key_tool_nr) - - self.ui.tools_table_exc.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - - self.ui.tools_table_exc.cellPressed.connect(self.on_row_selected) - self.replot() - def on_canvas_move(self, event): """ Called on 'mouse_move' event. @@ -3547,6 +3387,166 @@ class AppExcEditor(QtCore.QObject): edge_width=self.app.defaults["global_cursor_width"], size=self.app.defaults["global_cursor_size"]) + def add_exc_shape(self, shape, storage): + """ + Adds a shape to a specified shape storage. + + :param shape: Shape to be added. + :type shape: DrawToolShape + :param storage: object where to store the shapes + :return: None + """ + # List of DrawToolShape? + if isinstance(shape, list): + for subshape in shape: + self.add_exc_shape(subshape, storage) + return + + assert isinstance(shape, DrawToolShape), \ + "Expected a DrawToolShape, got %s" % str(type(shape)) + + assert shape.geo is not None, \ + "Shape object has empty geometry (None)" + + assert (isinstance(shape.geo, list) and len(shape.geo) > 0) or not isinstance(shape.geo, list), \ + "Shape objects has empty geometry ([])" + + if isinstance(shape, DrawToolUtilityShape): + self.utility.append(shape) + else: + storage.insert(shape) # TODO: Check performance + + def add_shape(self, shape): + """ + Adds a shape to the shape storage. + + :param shape: Shape to be added. + :type shape: DrawToolShape + :return: None + """ + + # List of DrawToolShape? + if isinstance(shape, list): + for subshape in shape: + self.add_shape(subshape) + return + + assert isinstance(shape, DrawToolShape), \ + "Expected a DrawToolShape, got %s" % type(shape) + + assert shape.geo is not None, \ + "Shape object has empty geometry (None)" + + assert (isinstance(shape.geo, list) and len(shape.geo) > 0) or not isinstance(shape.geo, list), \ + "Shape objects has empty geometry ([])" + + if isinstance(shape, DrawToolUtilityShape): + self.utility.append(shape) + # else: + # self.storage.insert(shape) + + def on_exc_shape_complete(self, storage): + self.app.log.debug("on_shape_complete()") + + # Add shape + if type(storage) is list: + for item_storage in storage: + self.add_exc_shape(self.active_tool.geometry, item_storage) + else: + self.add_exc_shape(self.active_tool.geometry, storage) + + # Remove any utility shapes + self.delete_utility_geometry() + self.tool_shape.clear(update=True) + + # Replot and reset tool. + self.replot() + # self.active_tool = type(self.active_tool)(self) + + def draw_selection_area_handler(self, start, end, sel_type): + """ + This function is called whenever we have a left mouse click release and only we have a left mouse click drag, + be it from left to right or from right to left. The direction of the drag is decided in the "mouse_move" + event handler. + Pressing a modifier key (eg. Ctrl, Shift or Alt) will change the behavior of the selection. + + Depending on which tool belongs the selected shapes, the corresponding rows in the Tools Table are selected or + deselected. + + :param start: mouse position when the selection LMB click was done + :param end: mouse position when the left mouse button is released + :param sel_type: if True it's a left to right selection (enclosure), if False it's a 'touch' selection + :return: + """ + + start_pos = (start[0], start[1]) + end_pos = (end[0], end[1]) + poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])]) + modifiers = None + + # delete the selection shape that was just drawn, we no longer need it + self.app.delete_selection_shape() + + # detect if a modifier key was pressed while the left mouse button was released + self.modifiers = QtWidgets.QApplication.keyboardModifiers() + if self.modifiers == QtCore.Qt.ShiftModifier: + modifiers = 'Shift' + elif self.modifiers == QtCore.Qt.ControlModifier: + modifiers = 'Control' + + if modifiers == self.app.defaults["global_mselect_key"]: + for storage in self.storage_dict: + for obj in self.storage_dict[storage].get_objects(): + if (sel_type is True and poly_selection.contains(obj.geo)) or \ + (sel_type is False and poly_selection.intersects(obj.geo)): + + if obj in self.selected: + # remove the shape object from the selected shapes storage + self.selected.remove(obj) + else: + # add the shape object to the selected shapes storage + self.selected.append(obj) + else: + # clear the selection shapes storage + self.selected = [] + # then add to the selection shapes storage the shapes that are included (touched) by the selection rectangle + for storage in self.storage_dict: + for obj in self.storage_dict[storage].get_objects(): + if (sel_type is True and poly_selection.contains(obj.geo)) or \ + (sel_type is False and poly_selection.intersects(obj.geo)): + self.selected.append(obj) + + try: + self.ui.tools_table_exc.cellPressed.disconnect() + except Exception: + pass + + # first deselect all rows (tools) in the Tools Table + self.ui.tools_table_exc.clearSelection() + # and select the rows (tools) in the tool table according to the diameter(s) of the selected shape(s) + self.ui.tools_table_exc.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + for storage in self.storage_dict: + for shape_s in self.selected: + if shape_s in self.storage_dict[storage].get_objects(): + for key_tool_nr in self.tool2tooldia: + if self.tool2tooldia[key_tool_nr] == storage: + row_to_sel = key_tool_nr - 1 + # item = self.ui.tools_table_exc.item(row_to_sel, 1) + # self.ui.tools_table_exc.setCurrentItem(item) + # item.setSelected(True) + + # if the row to be selected is not already in the selected rows then select it + # otherwise don't do it as it seems that we have a toggle effect + if row_to_sel not in set( + index.row() for index in self.ui.tools_table_exc.selectedIndexes()): + self.ui.tools_table_exc.selectRow(row_to_sel) + self.last_tool_selected = int(key_tool_nr) + + self.ui.tools_table_exc.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) + + self.ui.tools_table_exc.cellPressed.connect(self.on_row_selected) + self.replot() + def update_utility_geometry(self, data): # ### Utility geometry (animated) ### geo = self.active_tool.utility_geometry(data=data) From 06f6491472ad13c95e2809d19003f26bbd519085 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 05:39:37 +0200 Subject: [PATCH 4/8] - In Gerber Editor upgraded the UI - in Gerber Editor made sure that trying to add a Circular Pad array with null radius will fail - in Gerber Editor when the radius is zero the utility geometry is deleted - in Excellon Editor made sure that trying to add a Circular Drill/Slot array with null radius will fail - in Excellon Editor when the radius is zero the utility geometry is deleted --- CHANGELOG.md | 5 + appEditors/AppExcEditor.py | 107 ++++++++----- appEditors/AppGerberEditor.py | 277 +++++++++++++++++++++------------- 3 files changed, 248 insertions(+), 141 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0243929f..2dd4b338 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,11 @@ CHANGELOG for FlatCAM beta 7.11.2020 - fixed a small issue in Excellon Editor that reset the delta coordinates on right mouse button click too, which was incorrect. Only left mouse button click should reset the delta coordinates. +- In Gerber Editor upgraded the UI +- in Gerber Editor made sure that trying to add a Circular Pad array with null radius will fail +- in Gerber Editor when the radius is zero the utility geometry is deleted +- in Excellon Editor made sure that trying to add a Circular Drill/Slot array with null radius will fail +- in Excellon Editor when the radius is zero the utility geometry is deleted 6.11.2020 diff --git a/appEditors/AppExcEditor.py b/appEditors/AppExcEditor.py index 5ef96de3..381bc6f5 100644 --- a/appEditors/AppExcEditor.py +++ b/appEditors/AppExcEditor.py @@ -330,7 +330,7 @@ class DrillArray(FCShapeTool): self.selected_dia = None self.drill_axis = 'X' - self.drill_array = 0 # 'linear' + self.drill_array = 'linear' # 'linear' self.drill_array_size = None self.drill_pitch = None self.drill_linear_angle = None @@ -382,7 +382,7 @@ class DrillArray(FCShapeTool): def click(self, point): - if self.drill_array == 0: # 'Linear' + if self.drill_array == 'linear': # 'Linear' self.make() return else: @@ -405,7 +405,7 @@ class DrillArray(FCShapeTool): def utility_geometry(self, data=None, static=None): self.drill_axis = self.draw_app.ui.drill_axis_radio.get_value() self.drill_direction = self.draw_app.ui.drill_array_dir_radio.get_value() - self.drill_array = self.draw_app.ui.array_type_combo.get_value() + self.drill_array = self.draw_app.ui.array_type_radio.get_value() try: self.drill_array_size = int(self.draw_app.ui.drill_array_size_entry.get_value()) try: @@ -421,7 +421,7 @@ class DrillArray(FCShapeTool): (_("The value is mistyped. Check the value"), str(e))) return - if self.drill_array == 0: # 'Linear' + if self.drill_array == 'linear': # 'Linear' if data[0] is None and data[1] is None: dx = self.draw_app.x dy = self.draw_app.y @@ -454,7 +454,7 @@ class DrillArray(FCShapeTool): self.last_dx = dx self.last_dy = dy return DrawToolUtilityShape(geo_list) - elif self.drill_array == 1: # 'Circular' + elif self.drill_array == 'circular': # 'Circular' if data[0] is None and data[1] is None: cdx = self.draw_app.x cdy = self.draw_app.y @@ -469,6 +469,9 @@ class DrillArray(FCShapeTool): except Exception: radius = 0 + if radius == 0: + self.draw_app.delete_utility_geometry() + if len(self.pt) >= 1 and radius > 0: try: if cdx < self.origin[0]: @@ -553,7 +556,7 @@ class DrillArray(FCShapeTool): self.draw_app.current_storage = self.draw_app.storage_dict[self.selected_dia] - if self.drill_array == 0: # 'Linear' + if self.drill_array == 'linear': # 'Linear' for item in range(self.drill_array_size): if self.drill_axis == 'X': geo = self.util_shape(((self.points[0] + (self.drill_pitch * item)), self.points[1])) @@ -575,6 +578,12 @@ class DrillArray(FCShapeTool): return radius = distance(self.destination, self.origin) + if radius == 0: + self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' % _("Failed.")) + self.draw_app.delete_utility_geometry() + self.draw_app.select_tool('drill_select') + return + if self.destination[0] < self.origin[0]: radius = -radius initial_angle = math.asin((self.destination[1] - self.origin[1]) / radius) @@ -879,7 +888,7 @@ class SlotArray(FCShapeTool): self.radius = float(self.selected_dia / 2.0) self.slot_axis = 'X' - self.slot_array = 0 # 'linear' + self.slot_array = 'linear' # 'linear' self.slot_array_size = None self.slot_pitch = None self.slot_linear_angle = None @@ -910,7 +919,7 @@ class SlotArray(FCShapeTool): def click(self, point): - if self.slot_array == 0: # 'Linear' + if self.slot_array == 'linear': # 'Linear' self.make() return else: # 'Circular' @@ -933,7 +942,7 @@ class SlotArray(FCShapeTool): def utility_geometry(self, data=None, static=None): self.slot_axis = self.draw_app.ui.slot_array_axis_radio.get_value() self.slot_direction = self.draw_app.ui.slot_array_direction_radio.get_value() - self.slot_array = self.draw_app.ui.slot_array_type_combo.get_value() + self.slot_array = self.draw_app.ui.slot_array_type_radio.get_value() try: self.slot_array_size = int(self.draw_app.ui.slot_array_size_entry.get_value()) try: @@ -948,7 +957,7 @@ class SlotArray(FCShapeTool): self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' % _("The value is mistyped. Check the value.")) return - if self.slot_array == 0: # 'Linear' + if self.slot_array == 'linear': # 'Linear' if data[0] is None and data[1] is None: dx = self.draw_app.x dy = self.draw_app.y @@ -999,6 +1008,9 @@ class SlotArray(FCShapeTool): except Exception: radius = 0 + if radius == 0: + self.draw_app.delete_utility_geometry() + if len(self.pt) >= 1 and radius > 0: try: if cdx < self.origin[0]: @@ -1166,7 +1178,7 @@ class SlotArray(FCShapeTool): self.draw_app.current_storage = self.draw_app.storage_dict[self.selected_dia] - if self.slot_array == 0: # 'Linear' + if self.slot_array == 'linear': # 'Linear' for item in range(self.slot_array_size): if self.slot_axis == 'X': geo = self.util_shape(((self.points[0] + (self.slot_pitch * item)), self.points[1])) @@ -1207,6 +1219,12 @@ class SlotArray(FCShapeTool): # self.geometry.append(DrawToolShape(geo)) radius = distance(self.destination, self.origin) + if radius == 0: + self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' % _("Failed.")) + self.draw_app.delete_utility_geometry() + self.draw_app.select_tool('drill_select') + return + if self.destination[0] < self.origin[0]: radius = -radius initial_angle = math.asin((self.destination[1] - self.origin[1]) / radius) @@ -1862,8 +1880,8 @@ class AppExcEditor(QtCore.QObject): # self.ui.tools_table_exc.selectionModel().currentChanged.connect(self.on_row_selected) self.ui.tools_table_exc.cellPressed.connect(self.on_row_selected) - self.ui.array_type_combo.currentIndexChanged.connect(self.on_array_type_combo) - self.ui.slot_array_type_combo.currentIndexChanged.connect(self.on_slot_array_type_combo) + self.ui.array_type_radio.activated_custom.connect(self.on_array_type_radio) + self.ui.slot_array_type_radio.activated_custom.connect(self.on_slot_array_type_radio) self.ui.drill_axis_radio.activated_custom.connect(self.on_linear_angle_radio) self.ui.slot_axis_radio.activated_custom.connect(self.on_slot_angle_radio) @@ -1976,8 +1994,10 @@ class AppExcEditor(QtCore.QObject): # according to the set Preferences already loaded self.on_slot_angle_radio() - self.on_array_type_combo() - self.on_slot_array_type_combo() + self.ui.array_type_radio.set_value('linear') + self.on_array_type_radio(val=self.ui.array_type_radio.get_value()) + self.ui.slot_array_type_radio.set_value('linear') + self.on_slot_array_type_radio(val=self.ui.slot_array_type_radio.get_value()) self.on_linear_angle_radio() self.on_slot_array_linear_angle_radio() @@ -3160,7 +3180,7 @@ class AppExcEditor(QtCore.QObject): self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1]) else: self.pos = (self.pos[0], self.pos[1]) - + self.app.ui.rel_position_label.setText("Dx: %.4f   Dy: " "%.4f    " % (0, 0)) @@ -3755,8 +3775,8 @@ class AppExcEditor(QtCore.QObject): if unsel_shape in self.selected: self.selected.remove(unsel_shape) - def on_array_type_combo(self): - if self.ui.array_type_combo.currentIndex() == 0: + def on_array_type_radio(self, val): + if val == 'linear': self.ui.array_circular_frame.hide() self.ui.array_linear_frame.show() else: @@ -3765,8 +3785,8 @@ class AppExcEditor(QtCore.QObject): self.ui.array_linear_frame.hide() self.app.inform.emit(_("Click on the circular array Center position")) - def on_slot_array_type_combo(self): - if self.ui.slot_array_type_combo.currentIndex() == 0: + def on_slot_array_type_radio(self, val): + if val == 'linear': self.ui.slot_array_circular_frame.hide() self.ui.slot_array_linear_frame.show() else: @@ -3897,11 +3917,11 @@ class AppExcEditorUI: self.ui_vertical_lay.setContentsMargins(0, 0, 0, 0) self.drills_frame.setLayout(self.ui_vertical_lay) - # ## Page Title box (spacing between children) + # Page Title box (spacing between children) self.title_box = QtWidgets.QHBoxLayout() self.ui_vertical_lay.addLayout(self.title_box) - # ## Page Title + # Page Title pixmap = QtGui.QPixmap(self.app.resource_location + '/flatcam_icon32.png') self.icon = FCLabel() self.icon.setPixmap(pixmap) @@ -3912,17 +3932,18 @@ class AppExcEditorUI: self.title_box.addWidget(self.icon, stretch=0) self.title_box.addWidget(self.title_label, stretch=1) - # ## Object name + # Object name box self.name_box = QtWidgets.QHBoxLayout() self.ui_vertical_lay.addLayout(self.name_box) + # Object Name name_label = FCLabel(_("Name:")) self.name_entry = FCEntry() self.name_box.addWidget(name_label) self.name_box.addWidget(self.name_entry) - # ### Tools Drills ## ## + # Tools Drills Table Title self.tools_table_label = FCLabel("%s" % _('Tools Table')) self.tools_table_label.setToolTip( _("Tools in this Excellon object\n" @@ -3930,7 +3951,9 @@ class AppExcEditorUI: ) self.ui_vertical_lay.addWidget(self.tools_table_label) - # Drills TABLE + # ############################################################################################################# + # ########################################## Drills TABLE ##################################################### + # ############################################################################################################# self.tools_table_exc = FCTable() self.tools_table_exc.setColumnCount(4) self.tools_table_exc.setHorizontalHeaderLabels(['#', _('Diameter'), 'D', 'S']) @@ -3957,7 +3980,7 @@ class AppExcEditorUI: separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) self.ui_vertical_lay.addWidget(separator_line) - # ### Add a new Tool ## ## + # Add a new Tool self.addtool_label = FCLabel('%s' % _('Add/Delete Tool')) self.addtool_label.setToolTip( _("Add/Delete a tool to the tool list\n" @@ -4089,16 +4112,20 @@ class AppExcEditorUI: _("Add an array of drills (linear or circular array)") ) - # Special Combo - it works by indexes as opposed to the items Text - self.array_type_combo = FCComboBox2() - self.array_type_combo.setToolTip( + self.array_grid.addWidget(self.drill_array_label, 0, 0, 1, 2) + + # Array Type + array_type_lbl = FCLabel('%s:' % _("Type")) + array_type_lbl.setToolTip( _("Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular") ) - self.array_type_combo.addItems([_("Linear"), _("Circular")]) - self.array_grid.addWidget(self.drill_array_label, 0, 0, 1, 2) - self.array_grid.addWidget(self.array_type_combo, 2, 0, 1, 2) + self.array_type_radio = RadioSet([{'label': _('Linear'), 'value': 'linear'}, + {'label': _('Circular'), 'value': 'circular'}]) + + self.array_grid.addWidget(array_type_lbl, 2, 0) + self.array_grid.addWidget(self.array_type_radio, 2, 1) # Set the number of drill holes in the drill array self.drill_array_size_label = FCLabel('%s:' % _('Number')) @@ -4289,9 +4316,6 @@ class AppExcEditorUI: # ############################################################################################################# # ##################################### ADDING SLOT ARRAY #################################################### # ############################################################################################################# - # add a frame and inside add a vertical box layout. Inside this vbox layout I add - # all the add slot widgets - # this way I can hide/show the frame self.slot_array_frame = QtWidgets.QFrame() self.slot_array_frame.setContentsMargins(0, 0, 0, 0) self.ui_vertical_lay.addWidget(self.slot_array_frame) @@ -4310,15 +4334,18 @@ class AppExcEditorUI: self.slot_array_grid.addWidget(self.slot_array_label, 0, 0, 1, 2) - # Special type of Combobox that get_value() by indexes and not by items text - self.slot_array_type_combo = FCComboBox2() - self.slot_array_type_combo.setToolTip( + # Array Type + array_type_lbl = FCLabel('%s:' % _("Type")) + array_type_lbl.setToolTip( _("Select the type of slot array to create.\n" "It can be Linear X(Y) or Circular") ) - self.slot_array_type_combo.addItems([_("Linear"), _("Circular")]) - self.slot_array_grid.addWidget(self.slot_array_type_combo, 2, 0, 1, 2) + self.slot_array_type_radio = RadioSet([{'label': _('Linear'), 'value': 'linear'}, + {'label': _('Circular'), 'value': 'circular'}]) + + self.slot_array_grid.addWidget(array_type_lbl, 2, 0) + self.slot_array_grid.addWidget(self.slot_array_type_radio, 2, 1) # Set the number of slot holes in the slot array self.slot_array_size_label = FCLabel('%s:' % _('Number')) diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index 909c2260..418197cc 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -455,7 +455,7 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): self.selected_size = None self.pad_axis = 'X' - self.pad_array = 0 # 'linear' + self.pad_array = 'linear' # 'linear' self.pad_array_size = None self.pad_pitch = None self.pad_linear_angle = None @@ -487,7 +487,7 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): def click(self, point): - if self.draw_app.ui.array_type_combo.get_value() == 0: # 'Linear' + if self.draw_app.ui.array_type_radio.get_value() == 0: # 'Linear' self.make() return else: @@ -522,7 +522,7 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): self.pad_axis = self.draw_app.ui.pad_axis_radio.get_value() self.pad_direction = self.draw_app.ui.pad_direction_radio.get_value() - self.pad_array = self.draw_app.ui.array_type_combo.get_value() + self.pad_array = self.draw_app.ui.array_type_radio.get_value() try: self.pad_array_size = int(self.draw_app.ui.pad_array_size_entry.get_value()) @@ -538,7 +538,7 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' % _("The value is mistyped. Check the value.")) return - if self.pad_array == 0: # 'Linear' + if self.pad_array == 'linear': # 'Linear' if data[0] is None and data[1] is None: dx = self.draw_app.x dy = self.draw_app.y @@ -582,7 +582,7 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): self.last_dx = dx self.last_dy = dy return DrawToolUtilityShape(geo_el_list) - elif self.pad_array == 1: # 'Circular' + elif self.pad_array == 'circular': # 'Circular' if data[0] is None and data[1] is None: cdx = self.draw_app.x cdy = self.draw_app.y @@ -597,6 +597,9 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): except Exception: radius = 0 + if radius == 0: + self.draw_app.delete_utility_geometry() + if len(self.pt) >= 1 and radius > 0: try: if cdx < self.origin[0]: @@ -773,7 +776,7 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): self.draw_app.current_storage = self.storage_obj - if self.pad_array == 0: # 'Linear' + if self.pad_array == 'linear': # 'Linear' for item in range(self.pad_array_size): if self.pad_axis == 'X': geo = self.util_shape(((self.points[0] + (self.pad_pitch * item)), self.points[1])) @@ -794,6 +797,12 @@ class PadArrayEditorGrb(ShapeToolEditorGrb): return radius = distance(self.destination, self.origin) + if radius == 0: + self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' % _("Failed.")) + self.draw_app.delete_utility_geometry() + self.draw_app.select_tool('select') + return + if self.destination[0] < self.origin[0]: radius = -radius initial_angle = math.asin((self.destination[1] - self.origin[1]) / radius) @@ -2101,7 +2110,7 @@ class MarkEditorGrb(ShapeToolEditorGrb): self.draw_app.ui.ma_tool_frame.show() # clear previous marking - self.draw_app.ui.ma_annotation.clear(update=True) + self.draw_app.ma_annotation.clear(update=True) try: self.draw_app.ui.ma_threshold_button.clicked.disconnect() @@ -2911,7 +2920,7 @@ class AppGerberEditor(QtCore.QObject): self.ui.delaperture_btn.clicked.connect(self.on_aperture_delete) self.ui.apertures_table.cellPressed.connect(self.on_row_selected) - self.ui.array_type_combo.currentIndexChanged.connect(self.on_array_type_combo) + self.ui.array_type_radio.activated_custom.connect(self.on_array_type_radio) self.ui.pad_axis_radio.activated_custom.connect(self.on_linear_angle_radio) self.ui.exit_editor_button.clicked.connect(lambda: self.app.editor2object()) @@ -2993,12 +3002,20 @@ class AppGerberEditor(QtCore.QObject): self.ui.aptype_cb.set_value(self.app.defaults["gerber_editor_newtype"]) self.ui.apdim_entry.set_value(self.app.defaults["gerber_editor_newdim"]) + # PAD Array + self.ui.array_type_radio.set_value('linear') # Linear + self.on_array_type_radio(val=self.ui.array_type_radio.get_value()) self.ui.pad_array_size_entry.set_value(int(self.app.defaults["gerber_editor_array_size"])) + # linear array + self.ui.pad_axis_radio.set_value('X') + self.on_linear_angle_radio(val=self.ui.pad_axis_radio.get_value()) self.ui.pad_axis_radio.set_value(self.app.defaults["gerber_editor_lin_axis"]) self.ui.pad_pitch_entry.set_value(float(self.app.defaults["gerber_editor_lin_pitch"])) self.ui.linear_angle_spinner.set_value(self.app.defaults["gerber_editor_lin_angle"]) + # circular array + self.ui.pad_direction_radio.set_value('CW') self.ui.pad_direction_radio.set_value(self.app.defaults["gerber_editor_circ_dir"]) self.ui.pad_angle_entry.set_value(float(self.app.defaults["gerber_editor_circ_angle"])) @@ -4882,18 +4899,41 @@ class AppGerberEditor(QtCore.QObject): if geo_el in self.selected: self.selected.remove(geo_el) - def on_array_type_combo(self): - if self.ui.array_type_combo.currentIndex() == 0: - self.ui.array_circular_frame.hide() - self.ui.array_linear_frame.show() + def on_array_type_radio(self, val): + if val == 'linear': + self.ui.pad_axis_label.show() + self.ui.pad_axis_radio.show() + self.ui.pad_pitch_label.show() + self.ui.pad_pitch_entry.show() + self.ui.linear_angle_label.show() + self.ui.linear_angle_spinner.show() + self.ui.lin_separator_line.show() + + self.ui.pad_direction_label.hide() + self.ui.pad_direction_radio.hide() + self.ui.pad_angle_label.hide() + self.ui.pad_angle_entry.hide() + self.ui.circ_separator_line.hide() else: self.delete_utility_geometry() - self.ui.array_circular_frame.show() - self.ui.array_linear_frame.hide() + + self.ui.pad_axis_label.hide() + self.ui.pad_axis_radio.hide() + self.ui.pad_pitch_label.hide() + self.ui.pad_pitch_entry.hide() + self.ui.linear_angle_label.hide() + self.ui.linear_angle_spinner.hide() + self.ui.lin_separator_line.hide() + + self.ui.pad_direction_label.show() + self.ui.pad_direction_radio.show() + self.ui.pad_angle_label.show() + self.ui.pad_angle_entry.show() + self.ui.circ_separator_line.show() + self.app.inform.emit(_("Click on the circular array Center position")) - def on_linear_angle_radio(self): - val = self.ui.pad_axis_radio.get_value() + def on_linear_angle_radio(self, val): if val == 'A': self.ui.linear_angle_spinner.show() self.ui.linear_angle_label.show() @@ -5169,9 +5209,9 @@ class AppGerberEditorUI: self.custom_box = QtWidgets.QVBoxLayout() layout.addLayout(self.custom_box) - # ######################### - # ### Gerber Apertures #### - # ######################### + # ############################################################################################################# + # #################################### Gerber Apertures Table ################################################# + # ############################################################################################################# self.apertures_table_label = FCLabel('%s:' % _('Apertures')) self.apertures_table_label.setToolTip( _("Apertures Table for the Gerber Object.") @@ -5202,8 +5242,10 @@ class AppGerberEditorUI: " - (width, height) for R, O type.\n" " - (dia, nVertices) for P type")) - self.empty_label = FCLabel('') - self.custom_box.addWidget(self.empty_label) + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.custom_box.addWidget(separator_line) # add a frame and inside add a vertical box layout. Inside this vbox layout I add all the Apertures widgets # this way I can hide/show the frame @@ -5214,23 +5256,33 @@ class AppGerberEditorUI: self.apertures_box.setContentsMargins(0, 0, 0, 0) self.apertures_frame.setLayout(self.apertures_box) - # # ## Add/Delete an new Aperture ## ## - + # ############################################################################################################# + # ############################ Add/Delete an new Aperture ##################################################### + # ############################################################################################################# grid1 = QtWidgets.QGridLayout() self.apertures_box.addLayout(grid1) grid1.setColumnStretch(0, 0) grid1.setColumnStretch(1, 1) + # Title + apadd_del_lbl = FCLabel('%s:' % _('Add/Delete Aperture')) + apadd_del_lbl.setToolTip( + _("Add/Delete an aperture in the aperture table") + ) + grid1.addWidget(apadd_del_lbl, 0, 0, 1, 2) + + # Aperture Code apcode_lbl = FCLabel('%s:' % _('Aperture Code')) apcode_lbl.setToolTip(_("Code for the new aperture")) - grid1.addWidget(apcode_lbl, 1, 0) self.apcode_entry = FCSpinner() - self.apcode_entry.set_range(0, 999) + self.apcode_entry.set_range(0, 1000) self.apcode_entry.setWrapping(True) + grid1.addWidget(apcode_lbl, 1, 0) grid1.addWidget(self.apcode_entry, 1, 1) + # Aperture Size apsize_lbl = FCLabel('%s' % _('Aperture Size:')) apsize_lbl.setToolTip( _("Size for the new aperture.\n" @@ -5239,14 +5291,15 @@ class AppGerberEditorUI: "calculated as:\n" "sqrt(width**2 + height**2)") ) - grid1.addWidget(apsize_lbl, 2, 0) self.apsize_entry = FCDoubleSpinner() self.apsize_entry.set_precision(self.decimals) - self.apsize_entry.set_range(0.0, 9999) + self.apsize_entry.set_range(0.0, 10000.0000) + grid1.addWidget(apsize_lbl, 2, 0) grid1.addWidget(self.apsize_entry, 2, 1) + # Aperture Type aptype_lbl = FCLabel('%s:' % _('Aperture Type')) aptype_lbl.setToolTip( _("Select the type of new aperture. Can be:\n" @@ -5254,31 +5307,34 @@ class AppGerberEditorUI: "R = rectangular\n" "O = oblong") ) - grid1.addWidget(aptype_lbl, 3, 0) self.aptype_cb = FCComboBox() self.aptype_cb.addItems(['C', 'R', 'O']) + + grid1.addWidget(aptype_lbl, 3, 0) grid1.addWidget(self.aptype_cb, 3, 1) + # Aperture Dimensions self.apdim_lbl = FCLabel('%s:' % _('Aperture Dim')) self.apdim_lbl.setToolTip( _("Dimensions for the new aperture.\n" "Active only for rectangular apertures (type R).\n" "The format is (width, height)") ) - grid1.addWidget(self.apdim_lbl, 4, 0) self.apdim_entry = EvalEntry2() + + grid1.addWidget(self.apdim_lbl, 4, 0) grid1.addWidget(self.apdim_entry, 4, 1) - apadd_del_lbl = FCLabel('%s:' % _('Add/Delete Aperture')) - apadd_del_lbl.setToolTip( - _("Add/Delete an aperture in the aperture table") - ) - self.apertures_box.addWidget(apadd_del_lbl) + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid1.addWidget(separator_line, 6, 0, 1, 2) + # Aperture Buttons hlay_ad = QtWidgets.QHBoxLayout() - self.apertures_box.addLayout(hlay_ad) + grid1.addLayout(hlay_ad, 8, 0, 1, 2) self.addaperture_btn = FCButton(_('Add')) self.addaperture_btn.setIcon(QtGui.QIcon(self.app.resource_location + '/plus16.png')) @@ -5294,9 +5350,9 @@ class AppGerberEditorUI: hlay_ad.addWidget(self.addaperture_btn) hlay_ad.addWidget(self.delaperture_btn) - # ################### - # ### BUFFER TOOL ### - # ################### + # ############################################################################################################# + # ############################################ BUFFER TOOL #################################################### + # ############################################################################################################# self.buffer_tool_frame = QtWidgets.QFrame() self.buffer_tool_frame.setContentsMargins(0, 0, 0, 0) self.custom_box.addWidget(self.buffer_tool_frame) @@ -5322,6 +5378,8 @@ class AppGerberEditorUI: self.buffer_distance_entry.set_range(-10000.0000, 10000.0000) buf_form_layout.addRow('%s:' % _("Buffer distance"), self.buffer_distance_entry) + + # Buffer Corner self.buffer_corner_lbl = FCLabel('%s:' % _("Buffer corner")) self.buffer_corner_lbl.setToolTip( _("There are 3 types of corners:\n" @@ -5335,6 +5393,11 @@ class AppGerberEditorUI: self.buffer_corner_cb.addItem(_("Beveled")) buf_form_layout.addRow(self.buffer_corner_lbl, self.buffer_corner_cb) + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + buf_form_layout.addRow(separator_line) + # Buttons hlay_buf = QtWidgets.QHBoxLayout() self.buffer_tools_box.addLayout(hlay_buf) @@ -5343,9 +5406,9 @@ class AppGerberEditorUI: self.buffer_button.setIcon(QtGui.QIcon(self.app.resource_location + '/buffer16-2.png')) hlay_buf.addWidget(self.buffer_button) - # ################## - # ### SCALE TOOL ### - # ################## + # ############################################################################################################# + # ########################################### SCALE TOOL ###################################################### + # ############################################################################################################# self.scale_tool_frame = QtWidgets.QFrame() self.scale_tool_frame.setContentsMargins(0, 0, 0, 0) self.custom_box.addWidget(self.scale_tool_frame) @@ -5376,6 +5439,11 @@ class AppGerberEditorUI: scale_form_layout.addRow(self.scale_factor_lbl, self.scale_factor_entry) + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + scale_form_layout.addRow(separator_line) + # Buttons hlay_scale = QtWidgets.QHBoxLayout() self.scale_tools_box.addLayout(hlay_scale) @@ -5384,9 +5452,9 @@ class AppGerberEditorUI: self.scale_button.setIcon(QtGui.QIcon(self.app.resource_location + '/clean32.png')) hlay_scale.addWidget(self.scale_button) - # ###################### - # ### Mark Area TOOL ### - # ###################### + # ############################################################################################################# + # ######################################### Mark Area TOOL #################################################### + # ############################################################################################################# self.ma_tool_frame = QtWidgets.QFrame() self.ma_tool_frame.setContentsMargins(0, 0, 0, 0) self.custom_box.addWidget(self.ma_tool_frame) @@ -5395,6 +5463,11 @@ class AppGerberEditorUI: self.ma_tool_frame.setLayout(self.ma_tools_box) self.ma_tool_frame.hide() + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.ma_tools_box.addWidget(separator_line) + # Title ma_title_lbl = FCLabel('%s:' % _('Mark polygons')) ma_title_lbl.setToolTip( @@ -5452,12 +5525,9 @@ class AppGerberEditorUI: ) hlay_ma.addWidget(self.ma_clear_button) - # ###################### - # ### Add Pad Array #### - # ###################### - # add a frame and inside add a vertical box layout. Inside this vbox layout I add - # all the add Pad array widgets - # this way I can hide/show the frame + # ############################################################################################################# + # ######################################### Add Pad Array ##################################################### + # ############################################################################################################# self.array_frame = QtWidgets.QFrame() self.array_frame.setContentsMargins(0, 0, 0, 0) self.custom_box.addWidget(self.array_frame) @@ -5465,48 +5535,57 @@ class AppGerberEditorUI: self.array_box.setContentsMargins(0, 0, 0, 0) self.array_frame.setLayout(self.array_box) - self.emptyarray_label = FCLabel('') - self.array_box.addWidget(self.emptyarray_label) + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.array_box.addWidget(separator_line) + array_grid = QtWidgets.QGridLayout() + array_grid.setColumnStretch(0, 0) + array_grid.setColumnStretch(1, 1) + self.array_box.addLayout(array_grid) + + # Title self.padarray_label = FCLabel('%s' % _("Add Pad Array")) self.padarray_label.setToolTip( _("Add an array of pads (linear or circular array)") ) - self.array_box.addWidget(self.padarray_label) + array_grid.addWidget(self.padarray_label, 0, 0, 1, 2) - self.array_type_combo = FCComboBox2() - self.array_type_combo.setToolTip( + # Array Type + array_type_lbl = FCLabel('%s:' % _("Type")) + array_type_lbl.setToolTip( _("Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular") ) - self.array_type_combo.addItems([_("Linear"), _("Circular")]) - self.array_box.addWidget(self.array_type_combo) + self.array_type_radio = RadioSet([{'label': _('Linear'), 'value': 'linear'}, + {'label': _('Circular'), 'value': 'circular'}]) - self.array_form = QtWidgets.QFormLayout() - self.array_box.addLayout(self.array_form) + array_grid.addWidget(array_type_lbl, 2, 0) + array_grid.addWidget(self.array_type_radio, 2, 1) - self.pad_array_size_label = FCLabel('%s:' % _('Nr of pads')) - self.pad_array_size_label.setToolTip( + # Number of Pads in Array + pad_array_size_label = FCLabel('%s:' % _('Nr of pads')) + pad_array_size_label.setToolTip( _("Specify how many pads to be in the array.") ) - self.pad_array_size_label.setMinimumWidth(100) self.pad_array_size_entry = FCSpinner() - self.pad_array_size_entry.set_range(1, 9999) + self.pad_array_size_entry.set_range(1, 10000) - self.array_form.addRow(self.pad_array_size_label, self.pad_array_size_entry) + array_grid.addWidget(pad_array_size_label, 4, 0) + array_grid.addWidget(self.pad_array_size_entry, 4, 1) - self.array_linear_frame = QtWidgets.QFrame() - self.array_linear_frame.setContentsMargins(0, 0, 0, 0) - self.array_box.addWidget(self.array_linear_frame) - self.linear_box = QtWidgets.QVBoxLayout() - self.linear_box.setContentsMargins(0, 0, 0, 0) - self.array_linear_frame.setLayout(self.linear_box) - - self.linear_form = QtWidgets.QFormLayout() - self.linear_box.addLayout(self.linear_form) + # ############################################################################################################# + # ############################ Linear Pad Array ############################################################### + # ############################################################################################################# + self.lin_separator_line = QtWidgets.QFrame() + self.lin_separator_line.setFrameShape(QtWidgets.QFrame.HLine) + self.lin_separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + array_grid.addWidget(self.lin_separator_line, 6, 0, 1, 2) + # Linear Direction self.pad_axis_label = FCLabel('%s:' % _('Direction')) self.pad_axis_label.setToolTip( _("Direction on which the linear array is oriented:\n" @@ -5514,27 +5593,29 @@ class AppGerberEditorUI: "- 'Y' - vertical axis or \n" "- 'Angle' - a custom angle for the array inclination") ) - self.pad_axis_label.setMinimumWidth(100) self.pad_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'}, {'label': _('Y'), 'value': 'Y'}, {'label': _('Angle'), 'value': 'A'}]) - self.pad_axis_radio.set_value('X') - self.linear_form.addRow(self.pad_axis_label, self.pad_axis_radio) + array_grid.addWidget(self.pad_axis_label, 8, 0) + array_grid.addWidget(self.pad_axis_radio, 8, 1) + + # Linear Pitch self.pad_pitch_label = FCLabel('%s:' % _('Pitch')) self.pad_pitch_label.setToolTip( _("Pitch = Distance between elements of the array.") ) - self.pad_pitch_label.setMinimumWidth(100) self.pad_pitch_entry = FCDoubleSpinner() self.pad_pitch_entry.set_precision(self.decimals) self.pad_pitch_entry.set_range(0.0000, 10000.0000) self.pad_pitch_entry.setSingleStep(0.1) - self.linear_form.addRow(self.pad_pitch_label, self.pad_pitch_entry) + array_grid.addWidget(self.pad_pitch_label, 10, 0) + array_grid.addWidget(self.pad_pitch_entry, 10, 1) + # Linear Angle self.linear_angle_label = FCLabel('%s:' % _('Angle')) self.linear_angle_label.setToolTip( _("Angle at which the linear array is placed.\n" @@ -5542,56 +5623,50 @@ class AppGerberEditorUI: "Min value is: -360.00 degrees.\n" "Max value is: 360.00 degrees.") ) - self.linear_angle_label.setMinimumWidth(100) self.linear_angle_spinner = FCDoubleSpinner() self.linear_angle_spinner.set_precision(self.decimals) self.linear_angle_spinner.setRange(-360.00, 360.00) - self.linear_form.addRow(self.linear_angle_label, self.linear_angle_spinner) - self.array_circular_frame = QtWidgets.QFrame() - self.array_circular_frame.setContentsMargins(0, 0, 0, 0) - self.array_box.addWidget(self.array_circular_frame) - self.circular_box = QtWidgets.QVBoxLayout() - self.circular_box.setContentsMargins(0, 0, 0, 0) - self.array_circular_frame.setLayout(self.circular_box) + array_grid.addWidget(self.linear_angle_label, 12, 0) + array_grid.addWidget(self.linear_angle_spinner, 12, 1) + # ############################################################################################################# + # ################################### Circular Pad Array ###################################################### + # ############################################################################################################# + self.circ_separator_line = QtWidgets.QFrame() + self.circ_separator_line.setFrameShape(QtWidgets.QFrame.HLine) + self.circ_separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + array_grid.addWidget(self.circ_separator_line, 14, 0, 1, 2) + + # Circular Direction self.pad_direction_label = FCLabel('%s:' % _('Direction')) self.pad_direction_label.setToolTip( _("Direction for circular array.\n" "Can be CW = clockwise or CCW = counter clockwise.") ) - self.pad_direction_label.setMinimumWidth(100) - - self.circular_form = QtWidgets.QFormLayout() - self.circular_box.addLayout(self.circular_form) self.pad_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'}, {'label': _('CCW'), 'value': 'CCW'}]) - self.pad_direction_radio.set_value('CW') - self.circular_form.addRow(self.pad_direction_label, self.pad_direction_radio) + array_grid.addWidget(self.pad_direction_label, 16, 0) + array_grid.addWidget(self.pad_direction_radio, 16, 1) + + # Circular Angle self.pad_angle_label = FCLabel('%s:' % _('Angle')) self.pad_angle_label.setToolTip( _("Angle at which each element in circular array is placed.") ) - self.pad_angle_label.setMinimumWidth(100) self.pad_angle_entry = FCDoubleSpinner() self.pad_angle_entry.set_precision(self.decimals) self.pad_angle_entry.set_range(-360.00, 360.00) self.pad_angle_entry.setSingleStep(0.1) - self.circular_form.addRow(self.pad_angle_label, self.pad_angle_entry) + array_grid.addWidget(self.pad_angle_label, 18, 0) + array_grid.addWidget(self.pad_angle_entry, 18, 1) - self.array_circular_frame.hide() - - self.linear_angle_spinner.hide() - self.linear_angle_label.hide() - - self.array_frame.hide() self.custom_box.addStretch() - layout.addStretch() # Editor From 073fe3d50da9575f3aaab54cc606fef51c2012b4 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 06:26:43 +0200 Subject: [PATCH 5/8] - in Gerber Editor fixed an error in the Eraser tool trying to disconnect the Jump signal --- CHANGELOG.md | 1 + appEditors/AppGerberEditor.py | 64 ++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dd4b338..21301aa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ CHANGELOG for FlatCAM beta - in Gerber Editor when the radius is zero the utility geometry is deleted - in Excellon Editor made sure that trying to add a Circular Drill/Slot array with null radius will fail - in Excellon Editor when the radius is zero the utility geometry is deleted +- in Gerber Editor fixed an error in the Eraser tool trying to disconnect the Jump signal 6.11.2020 diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index 418197cc..331004ea 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -1361,6 +1361,8 @@ class TrackEditorGrb(ShapeToolEditorGrb): self.temp_points = [] + self.current_point = None + self.final_click = False try: QtGui.QGuiApplication.restoreOverrideCursor() @@ -1378,21 +1380,25 @@ class TrackEditorGrb(ShapeToolEditorGrb): def click(self, point): self.draw_app.in_action = True - if not self.points: - self.points.append(point) - elif point != self.points[-1]: + self.current_point = point + + if not self.points or point != self.points[-1]: self.points.append(point) else: return - new_geo_el = {} - if len(self.temp_points) == 1: - new_geo_el['solid'] = Point(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) - new_geo_el['follow'] = Point(self.temp_points) + point_geo = Point(self.temp_points[0]) + new_geo_el = { + 'solid': point_geo.buffer(self.buf_val, int(self.steps_per_circle)), + 'follow': point_geo + } else: - new_geo_el['solid'] = LineString(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) - new_geo_el['follow'] = LineString(self.temp_points) + line_geo = LineString(self.temp_points) + new_geo_el = { + 'solid': line_geo.buffer(self.buf_val, int(self.steps_per_circle)), + 'follow': line_geo + } self.draw_app.add_gerber_shape(DrawToolShape(new_geo_el), self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['geometry']) @@ -1414,10 +1420,11 @@ class TrackEditorGrb(ShapeToolEditorGrb): return self.update_grid_info() - new_geo_el = {} if not self.points: - new_geo_el['solid'] = Point(data).buffer(self.buf_val, int(self.steps_per_circle)) + new_geo_el = { + 'solid': Point(data).buffer(self.buf_val, int(self.steps_per_circle)) + } return DrawToolUtilityShape(new_geo_el) else: old_x = self.points[-1][0] @@ -1473,28 +1480,35 @@ class TrackEditorGrb(ShapeToolEditorGrb): pass self.temp_points.append(data) - if len(self.temp_points) == 1: - new_geo_el['solid'] = Point(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) - return DrawToolUtilityShape(new_geo_el) - new_geo_el['solid'] = LineString(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) + if len(self.temp_points) == 1: + new_geo_el = { + 'solid': Point(self.temp_points[0]).buffer(self.buf_val, int(self.steps_per_circle)) + } + else: + new_geo_el = { + 'solid': LineString(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) + } + return DrawToolUtilityShape(new_geo_el) def make(self): - new_geo_el = {} if len(self.temp_points) == 1: - new_geo_el['solid'] = Point(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) - new_geo_el['follow'] = Point(self.temp_points) + follow_geo = Point(self.temp_points[0]) + solid_geo = follow_geo.buffer(self.buf_val, int(self.steps_per_circle)) else: - new_geo_el['solid'] = LineString(self.temp_points).buffer(self.buf_val, int(self.steps_per_circle)) - new_geo_el['solid'] = new_geo_el['solid'].buffer(0) # try to clean the geometry - new_geo_el['follow'] = LineString(self.temp_points) + follow_geo = LineString(self.temp_points) + solid_geo = follow_geo.buffer(self.buf_val, int(self.steps_per_circle)) + solid_geo = solid_geo.buffer(0) # try to clean the geometry + new_geo_el = { + 'solid': solid_geo, + 'follow': follow_geo + } self.geometry = DrawToolShape(new_geo_el) self.draw_app.in_action = False self.complete = True - self.draw_app.app.jump_signal.disconnect() self.draw_app.app.inform.emit('[success] %s' % _("Done.")) @@ -2482,7 +2496,10 @@ class EraserEditorGrb(ShapeToolEditorGrb): self.draw_app.delete_utility_geometry() self.draw_app.plot_all() self.draw_app.app.inform.emit('[success] %s' % _("Done.")) - self.draw_app.app.jump_signal.disconnect() + try: + self.draw_app.app.jump_signal.disconnect() + except TypeError: + pass def clean_up(self): self.draw_app.selected = [] @@ -4468,6 +4485,7 @@ class AppGerberEditor(QtCore.QObject): else: self.active_tool.click(self.app.geo_editor.snap(self.x, self.y)) self.active_tool.make() + if self.active_tool.complete: self.on_grb_shape_complete() self.app.inform.emit('[success] %s' % _("Done.")) From 1ba18bdd7e02a8aee8726fd27ed6a1c69656f2b1 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 06:44:47 +0200 Subject: [PATCH 6/8] - small UI change in the Isolation Tool for the Reference Object selection RELEASE 8.994 --- CHANGELOG.md | 2 ++ appTools/ToolIsolation.py | 20 ++++---------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21301aa8..bbcfe01d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ CHANGELOG for FlatCAM beta - in Excellon Editor made sure that trying to add a Circular Drill/Slot array with null radius will fail - in Excellon Editor when the radius is zero the utility geometry is deleted - in Gerber Editor fixed an error in the Eraser tool trying to disconnect the Jump signal +- small UI change in the Isolation Tool for the Reference Object selection +RELEASE 8.994 6.11.2020 diff --git a/appTools/ToolIsolation.py b/appTools/ToolIsolation.py index 85976388..907884c1 100644 --- a/appTools/ToolIsolation.py +++ b/appTools/ToolIsolation.py @@ -821,7 +821,6 @@ class ToolIsolation(AppTool, Gerber): if val == 0: # ALl self.ui.reference_combo.hide() - self.ui.reference_combo_label.hide() self.ui.reference_combo_type.hide() self.ui.reference_combo_type_label.hide() self.ui.area_shape_label.hide() @@ -832,7 +831,6 @@ class ToolIsolation(AppTool, Gerber): self.ui.rest_cb.setDisabled(False) elif val == 1: # Area Selection self.ui.reference_combo.hide() - self.ui.reference_combo_label.hide() self.ui.reference_combo_type.hide() self.ui.reference_combo_type_label.hide() self.ui.area_shape_label.show() @@ -844,7 +842,6 @@ class ToolIsolation(AppTool, Gerber): self.ui.rest_cb.setDisabled(True) elif val == 2: # Polygon Selection self.ui.reference_combo.hide() - self.ui.reference_combo_label.hide() self.ui.reference_combo_type.hide() self.ui.reference_combo_type_label.hide() self.ui.area_shape_label.hide() @@ -852,7 +849,6 @@ class ToolIsolation(AppTool, Gerber): self.ui.poly_int_cb.show() else: # Reference Object self.ui.reference_combo.show() - self.ui.reference_combo_label.show() self.ui.reference_combo_type.show() self.ui.reference_combo_type_label.show() self.ui.area_shape_label.hide() @@ -3487,31 +3483,23 @@ class IsoUI: self.grid3.addWidget(self.select_label, 34, 0) self.grid3.addWidget(self.select_combo, 34, 1) - self.reference_combo_type_label = FCLabel('%s:' % _("Ref. Type")) - self.reference_combo_type_label.setToolTip( - _("The type of FlatCAM object to be used as non copper clearing reference.\n" - "It can be Gerber, Excellon or Geometry.") - ) + # Reference Type + self.reference_combo_type_label = FCLabel('%s:' % _("Type")) + self.reference_combo_type = FCComboBox2() self.reference_combo_type.addItems([_("Gerber"), _("Excellon"), _("Geometry")]) self.grid3.addWidget(self.reference_combo_type_label, 36, 0) self.grid3.addWidget(self.reference_combo_type, 36, 1) - self.reference_combo_label = FCLabel('%s:' % _("Ref. Object")) - self.reference_combo_label.setToolTip( - _("The FlatCAM object to be used as non copper clearing reference.") - ) self.reference_combo = FCComboBox() self.reference_combo.setModel(self.app.collection) self.reference_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.reference_combo.is_last = True - self.grid3.addWidget(self.reference_combo_label, 38, 0) - self.grid3.addWidget(self.reference_combo, 38, 1) + self.grid3.addWidget(self.reference_combo, 38, 0, 1, 2) self.reference_combo.hide() - self.reference_combo_label.hide() self.reference_combo_type.hide() self.reference_combo_type_label.hide() From 4277692b0745f16ca9bed97e2992f3a7bf5cb2e3 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 06:55:34 +0200 Subject: [PATCH 7/8] - small UI changes in NCC Tool and in Paint Tool for the Reference Object selection RELEASE 8.994 --- CHANGELOG.md | 1 + appTools/ToolNCC.py | 27 +++++++++------------------ appTools/ToolPaint.py | 24 +++++++++--------------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbcfe01d..62550ed1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ CHANGELOG for FlatCAM beta - in Excellon Editor when the radius is zero the utility geometry is deleted - in Gerber Editor fixed an error in the Eraser tool trying to disconnect the Jump signal - small UI change in the Isolation Tool for the Reference Object selection +- small UI changes in NCC Tool and in Paint Tool for the Reference Object selection RELEASE 8.994 6.11.2020 diff --git a/appTools/ToolNCC.py b/appTools/ToolNCC.py index 09575e3c..7da7938e 100644 --- a/appTools/ToolNCC.py +++ b/appTools/ToolNCC.py @@ -4417,10 +4417,7 @@ class NccUI: self.grid3.addWidget(self.select_label, 29, 0, ) self.grid3.addWidget(self.select_combo, 29, 1) - form1 = QtWidgets.QFormLayout() - self.grid3.addLayout(form1, 30, 0, 1, 2) - - self.reference_combo_type_label = FCLabel('%s:' % _("Ref. Type")) + self.reference_combo_type_label = FCLabel('%s:' % _("Type")) self.reference_combo_type_label.setToolTip( _("The type of FlatCAM object to be used as non copper clearing reference.\n" "It can be Gerber, Excellon or Geometry.") @@ -4428,20 +4425,17 @@ class NccUI: self.reference_combo_type = FCComboBox2() self.reference_combo_type.addItems([_("Gerber"), _("Excellon"), _("Geometry")]) - form1.addRow(self.reference_combo_type_label, self.reference_combo_type) + self.grid3.addWidget(self.reference_combo_type_label, 31, 0, ) + self.grid3.addWidget(self.reference_combo_type, 31, 1) - self.reference_combo_label = FCLabel('%s:' % _("Ref. Object")) - self.reference_combo_label.setToolTip( - _("The FlatCAM object to be used as non copper clearing reference.") - ) self.reference_combo = FCComboBox() self.reference_combo.setModel(self.app.collection) self.reference_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.reference_combo.is_last = True - form1.addRow(self.reference_combo_label, self.reference_combo) + + self.grid3.addWidget(self.reference_combo, 33, 0, 1, 2) self.reference_combo.hide() - self.reference_combo_label.hide() self.reference_combo_type.hide() self.reference_combo_type_label.hide() @@ -4454,8 +4448,8 @@ class NccUI: self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'}, {'label': _("Polygon"), 'value': 'polygon'}]) - self.grid3.addWidget(self.area_shape_label, 31, 0) - self.grid3.addWidget(self.area_shape_radio, 31, 1) + self.grid3.addWidget(self.area_shape_label, 35, 0) + self.grid3.addWidget(self.area_shape_radio, 35, 1) self.area_shape_label.hide() self.area_shape_radio.hide() @@ -4468,12 +4462,12 @@ class NccUI: ) self.valid_cb.setObjectName("n_check") - self.grid3.addWidget(self.valid_cb, 33, 0, 1, 2) + self.grid3.addWidget(self.valid_cb, 37, 0, 1, 2) separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.HLine) separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - self.grid3.addWidget(separator_line, 35, 0, 1, 2) + self.grid3.addWidget(separator_line, 39, 0, 1, 2) self.generate_ncc_button = FCButton(_('Generate Geometry')) self.generate_ncc_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png')) @@ -4541,7 +4535,6 @@ class NccUI: if sel_combo == 0: # itself self.reference_combo.hide() - self.reference_combo_label.hide() self.reference_combo_type.hide() self.reference_combo_type_label.hide() self.area_shape_label.hide() @@ -4551,7 +4544,6 @@ class NccUI: self.ncc_rest_cb.setDisabled(False) elif sel_combo == 1: # area selection self.reference_combo.hide() - self.reference_combo_label.hide() self.reference_combo_type.hide() self.reference_combo_type_label.hide() self.area_shape_label.show() @@ -4562,7 +4554,6 @@ class NccUI: # self.ncc_rest_cb.setDisabled(True) else: self.reference_combo.show() - self.reference_combo_label.show() self.reference_combo_type.show() self.reference_combo_type_label.show() self.area_shape_label.hide() diff --git a/appTools/ToolPaint.py b/appTools/ToolPaint.py index 4f42a460..0e6ac5b3 100644 --- a/appTools/ToolPaint.py +++ b/appTools/ToolPaint.py @@ -3120,10 +3120,8 @@ class PaintUI: grid4.addWidget(selectlabel, 18, 0) grid4.addWidget(self.selectmethod_combo, 18, 1) - form1 = QtWidgets.QFormLayout() - grid4.addLayout(form1, 20, 0, 1, 2) - - self.reference_type_label = FCLabel('%s:' % _("Ref. Type")) + # Type of Reference Object + self.reference_type_label = FCLabel('%s:' % _("Type")) self.reference_type_label.setToolTip( _("The type of FlatCAM object to be used as paint reference.\n" "It can be Gerber, Excellon or Geometry.") @@ -3131,20 +3129,18 @@ class PaintUI: self.reference_type_combo = FCComboBox2() self.reference_type_combo.addItems([_("Gerber"), _("Excellon"), _("Geometry")]) - form1.addRow(self.reference_type_label, self.reference_type_combo) + grid4.addWidget(self.reference_type_label, 20, 0) + grid4.addWidget(self.reference_type_combo, 20, 1) - self.reference_combo_label = FCLabel('%s:' % _("Ref. Object")) - self.reference_combo_label.setToolTip( - _("The FlatCAM object to be used as non copper clearing reference.") - ) + # Reference Object self.reference_combo = FCComboBox() self.reference_combo.setModel(self.app.collection) self.reference_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.reference_combo.is_last = True - form1.addRow(self.reference_combo_label, self.reference_combo) + + grid4.addWidget(self.reference_combo, 22, 0, 1, 2) self.reference_combo.hide() - self.reference_combo_label.hide() self.reference_type_combo.hide() self.reference_type_label.hide() @@ -3157,8 +3153,8 @@ class PaintUI: self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'}, {'label': _("Polygon"), 'value': 'polygon'}]) - grid4.addWidget(self.area_shape_label, 21, 0) - grid4.addWidget(self.area_shape_radio, 21, 1) + grid4.addWidget(self.area_shape_label, 24, 0) + grid4.addWidget(self.area_shape_radio, 24, 1) self.area_shape_label.hide() self.area_shape_radio.hide() @@ -3220,12 +3216,10 @@ class PaintUI: if sel_combo == 3: # _("Reference Object") self.reference_combo.show() - self.reference_combo_label.show() self.reference_type_combo.show() self.reference_type_label.show() else: self.reference_combo.hide() - self.reference_combo_label.hide() self.reference_type_combo.hide() self.reference_type_label.hide() From e061e4e525be8ff5f8a6b59858f9462d4735b9fd Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 7 Nov 2020 06:59:04 +0200 Subject: [PATCH 8/8] - language strings recompiled to make sure that the .MO files are well optimized RELEASE 8.994 --- CHANGELOG.md | 1 + locale/de/LC_MESSAGES/strings.mo | Bin 379710 -> 379710 bytes locale/de/LC_MESSAGES/strings.po | 1232 ++++++++++++++------------- locale/en/LC_MESSAGES/strings.mo | Bin 349616 -> 349616 bytes locale/en/LC_MESSAGES/strings.po | 1231 +++++++++++++------------- locale/es/LC_MESSAGES/strings.mo | Bin 381585 -> 381585 bytes locale/es/LC_MESSAGES/strings.po | 1232 ++++++++++++++------------- locale/fr/LC_MESSAGES/strings.mo | Bin 382314 -> 382314 bytes locale/fr/LC_MESSAGES/strings.po | 1230 +++++++++++++------------- locale/it/LC_MESSAGES/strings.mo | Bin 367801 -> 367801 bytes locale/it/LC_MESSAGES/strings.po | 1232 ++++++++++++++------------- locale/pt_BR/LC_MESSAGES/strings.mo | Bin 369613 -> 369613 bytes locale/pt_BR/LC_MESSAGES/strings.po | 1232 ++++++++++++++------------- locale/ro/LC_MESSAGES/strings.mo | Bin 377026 -> 377026 bytes locale/ro/LC_MESSAGES/strings.po | 1232 ++++++++++++++------------- locale/ru/LC_MESSAGES/strings.po | 1230 +++++++++++++------------- locale/tr/LC_MESSAGES/strings.mo | Bin 373057 -> 373057 bytes locale/tr/LC_MESSAGES/strings.po | 1132 ++++++++++++------------ locale_template/strings.pot | 1217 +++++++++++++------------- 19 files changed, 6110 insertions(+), 6091 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62550ed1..b2a639f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ CHANGELOG for FlatCAM beta - in Gerber Editor fixed an error in the Eraser tool trying to disconnect the Jump signal - small UI change in the Isolation Tool for the Reference Object selection - small UI changes in NCC Tool and in Paint Tool for the Reference Object selection +- language strings recompiled to make sure that the .MO files are well optimized RELEASE 8.994 6.11.2020 diff --git a/locale/de/LC_MESSAGES/strings.mo b/locale/de/LC_MESSAGES/strings.mo index bfa05ae1e269b0914102383ca29550309e7a6cbd..6d0e432d13cfb5ce6ce3a845e22c18edfe1d91f6 100644 GIT binary patch delta 37 rcmdltO?=-p@rD-07N#xCb^7e)3I=9Yre^J}`piJgvb|NGb?0mV@~8}O delta 37 rcmdltO?=-p@rD-07N#xCb^7dP3Wg?D2FC5J`piJgvb|NGb?0mV@&ycL diff --git a/locale/de/LC_MESSAGES/strings.po b/locale/de/LC_MESSAGES/strings.po index ca6a32fd..a6e3bbf3 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: 2020-11-06 14:03+0200\n" -"PO-Revision-Date: 2020-11-06 14:03+0200\n" +"POT-Creation-Date: 2020-11-07 06:56+0200\n" +"PO-Revision-Date: 2020-11-07 06:56+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -105,11 +105,11 @@ msgid "Bookmarks" msgstr "Lesezeichen" #: Bookmark.py:300 Bookmark.py:342 appDatabase.py:2110 appDatabase.py:2156 -#: appEditors/AppExcEditor.py:1277 appEditors/AppExcEditor.py:1345 +#: appEditors/AppExcEditor.py:1411 appEditors/AppExcEditor.py:1479 #: appEditors/AppGeoEditor.py:585 appEditors/AppGeoEditor.py:1074 #: appEditors/AppGeoEditor.py:2975 appEditors/AppGeoEditor.py:3003 #: appEditors/AppGeoEditor.py:3031 appEditors/AppGeoEditor.py:4412 -#: appEditors/AppGerberEditor.py:5962 appEditors/AppTextEditor.py:259 +#: appEditors/AppGerberEditor.py:6175 appEditors/AppTextEditor.py:259 #: appGUI/MainGUI.py:3015 appGUI/MainGUI.py:3237 appGUI/MainGUI.py:3463 #: appObjects/FlatCAMCNCJob.py:1754 appObjects/ObjectCollection.py:126 #: appTools/ToolCorners.py:332 appTools/ToolFilm.py:242 @@ -168,7 +168,7 @@ msgstr "" "angefordert." #: appCommon/Common.py:293 appTools/ToolCopperThieving.py:347 -#: appTools/ToolIsolation.py:1532 appTools/ToolNCC.py:1469 +#: appTools/ToolIsolation.py:1528 appTools/ToolNCC.py:1469 #: appTools/ToolPaint.py:1071 msgid "Click the start point of the area." msgstr "Klicken Sie auf den Startpunkt des Bereichs." @@ -178,8 +178,8 @@ msgid "Click the end point of the area." msgstr "Klicken Sie auf den Endpunkt des Bereichs." #: appCommon/Common.py:358 appCommon/Common.py:460 -#: appTools/ToolCopperThieving.py:391 appTools/ToolIsolation.py:2446 -#: appTools/ToolIsolation.py:2498 appTools/ToolNCC.py:1534 +#: appTools/ToolCopperThieving.py:391 appTools/ToolIsolation.py:2442 +#: appTools/ToolIsolation.py:2494 appTools/ToolNCC.py:1534 #: appTools/ToolNCC.py:1586 appTools/ToolPaint.py:1225 #: appTools/ToolPaint.py:1276 msgid "Zone added. Click to start adding next zone or right click to finish." @@ -188,8 +188,8 @@ msgstr "" "klicken Sie mit der rechten Maustaste, um den Vorgang abzuschließen." #: appCommon/Common.py:405 appEditors/AppGeoEditor.py:2362 -#: appEditors/AppGerberEditor.py:951 appEditors/AppGerberEditor.py:1280 -#: appTools/ToolIsolation.py:2469 appTools/ToolNCC.py:1557 +#: appEditors/AppGerberEditor.py:1023 appEditors/AppGerberEditor.py:1408 +#: appTools/ToolIsolation.py:2465 appTools/ToolNCC.py:1557 #: appTools/ToolPaint.py:1247 msgid "Click on next Point or click right mouse button to complete ..." msgstr "" @@ -284,12 +284,12 @@ msgstr "" "Wird in der App nicht verwendet,\n" "sondern dient als Kommentar für den Nutzer." -#: appDatabase.py:223 appEditors/AppExcEditor.py:2653 -#: appEditors/AppExcEditor.py:3820 appGUI/ObjectUI.py:666 +#: appDatabase.py:223 appEditors/AppExcEditor.py:2789 +#: appEditors/AppExcEditor.py:3959 appGUI/ObjectUI.py:666 #: appObjects/FlatCAMExcellon.py:905 appObjects/FlatCAMExcellon.py:1005 #: appObjects/FlatCAMObj.py:719 appObjects/FlatCAMObj.py:782 #: appTools/ToolDrilling.py:1762 appTools/ToolDrilling.py:1827 -#: appTools/ToolDrilling.py:2065 appTools/ToolIsolation.py:3127 +#: appTools/ToolDrilling.py:2065 appTools/ToolIsolation.py:3123 #: appTools/ToolMilling.py:1071 appTools/ToolMilling.py:1175 #: appTools/ToolMilling.py:1360 appTools/ToolMilling.py:1670 #: appTools/ToolNCC.py:3998 appTools/ToolPaint.py:2831 @@ -386,8 +386,8 @@ msgstr "Ausschnitt" #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:303 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:320 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:284 -#: appTools/ToolIsolation.py:3530 appTools/ToolNCC.py:4449 -#: appTools/ToolPaint.py:3152 +#: appTools/ToolIsolation.py:3518 appTools/ToolNCC.py:4443 +#: appTools/ToolPaint.py:3148 msgid "Shape" msgstr "Form" @@ -698,7 +698,7 @@ msgstr "" "Wenn dies nicht erfolgreich ist, schlägt auch das Löschen ohne Kupfer fehl.\n" "- Klären-> das reguläre Nicht-Kupfer-löschen." -#: appDatabase.py:599 appEditors/AppGerberEditor.py:5327 +#: appDatabase.py:599 appEditors/AppGerberEditor.py:5539 #: appTools/ToolNCC.py:4172 msgid "Clear" msgstr "Klären" @@ -708,7 +708,7 @@ msgstr "Klären" #: appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py:56 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:182 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:137 -#: appTools/ToolIsolation.py:3309 appTools/ToolMilling.py:1760 +#: appTools/ToolIsolation.py:3305 appTools/ToolMilling.py:1760 #: appTools/ToolNCC.py:4181 msgid "Milling Type" msgstr "Fräsart" @@ -719,7 +719,7 @@ msgstr "Fräsart" #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:192 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:139 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:147 -#: appTools/ToolIsolation.py:3311 appTools/ToolIsolation.py:3319 +#: appTools/ToolIsolation.py:3307 appTools/ToolIsolation.py:3315 #: appTools/ToolNCC.py:4183 appTools/ToolNCC.py:4191 msgid "" "Milling type:\n" @@ -735,7 +735,7 @@ msgstr "" #: appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py:62 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:189 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:144 -#: appTools/ToolIsolation.py:3316 appTools/ToolNCC.py:4188 +#: appTools/ToolIsolation.py:3312 appTools/ToolNCC.py:4188 msgid "Climb" msgstr "Steigen" @@ -744,7 +744,7 @@ msgstr "Steigen" #: appGUI/preferences/geometry/GeometryEditorPrefGroupUI.py:63 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:190 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:145 -#: appTools/ToolIsolation.py:3317 appTools/ToolNCC.py:4189 +#: appTools/ToolIsolation.py:3313 appTools/ToolNCC.py:4189 msgid "Conventional" msgstr "Konventionell" @@ -755,7 +755,7 @@ msgstr "Konventionell" #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:167 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:182 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:161 -#: appTools/ToolDrilling.py:2312 appTools/ToolIsolation.py:3294 +#: appTools/ToolDrilling.py:2312 appTools/ToolIsolation.py:3290 #: appTools/ToolNCC.py:4204 appTools/ToolPaint.py:2973 msgid "Overlap" msgstr "Überlappung" @@ -922,7 +922,7 @@ msgstr "" "Ecken und Kanten schneiden." #: appDatabase.py:700 appDatabase.py:757 appEditors/AppGeoEditor.py:614 -#: appEditors/AppGerberEditor.py:5502 appEditors/appGCodeEditor.py:687 +#: appEditors/AppGerberEditor.py:5715 appEditors/appGCodeEditor.py:687 #: appGUI/ObjectUI.py:143 appGUI/ObjectUI.py:999 appGUI/ObjectUI.py:2032 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:255 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:183 @@ -987,12 +987,12 @@ msgid "Laser_lines" msgstr "LaserlinienLinien" #: appDatabase.py:825 appGUI/preferences/tools/ToolsISOPrefGroupUI.py:154 -#: appTools/ToolIsolation.py:3281 +#: appTools/ToolIsolation.py:3277 msgid "Passes" msgstr "Geht herum" #: appDatabase.py:827 appGUI/preferences/tools/ToolsISOPrefGroupUI.py:156 -#: appTools/ToolIsolation.py:3283 +#: appTools/ToolIsolation.py:3279 msgid "" "Width of the isolation gap in\n" "number (integer) of tool widths." @@ -1003,7 +1003,7 @@ msgstr "" #: appDatabase.py:840 appGUI/ObjectUI.py:1694 #: appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py:321 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:169 -#: appTools/ToolIsolation.py:3296 +#: appTools/ToolIsolation.py:3292 msgid "How much (percentage) of the tool width to overlap each tool pass." msgstr "" "Wie viel (Prozent) der Werkzeugbreite, um jeden Werkzeugdurchlauf zu " @@ -1011,7 +1011,7 @@ msgstr "" #: appDatabase.py:873 appGUI/ObjectUI.py:234 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:201 -#: appTools/ToolIsolation.py:3329 +#: appTools/ToolIsolation.py:3325 msgid "Follow" msgstr "Folgen" @@ -1019,7 +1019,7 @@ msgstr "Folgen" #: appGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py:45 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:203 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:209 -#: appTools/ToolIsolation.py:3331 appTools/ToolIsolation.py:3337 +#: appTools/ToolIsolation.py:3327 appTools/ToolIsolation.py:3333 msgid "" "Generate a 'Follow' geometry.\n" "This means that it will cut through\n" @@ -1030,12 +1030,12 @@ msgstr "" "die Mitte der Spur." #: appDatabase.py:890 appGUI/preferences/tools/ToolsISOPrefGroupUI.py:218 -#: appTools/ToolIsolation.py:3346 +#: appTools/ToolIsolation.py:3342 msgid "Isolation Type" msgstr "Isolierungsart" #: appDatabase.py:892 appGUI/preferences/tools/ToolsISOPrefGroupUI.py:220 -#: appTools/ToolIsolation.py:3348 +#: appTools/ToolIsolation.py:3344 msgid "" "Choose how the isolation will be executed:\n" "- 'Full' -> complete isolation of polygons\n" @@ -1056,17 +1056,17 @@ msgstr "" #: appDatabase.py:901 appGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py:72 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:229 -#: appTools/ToolIsolation.py:3357 +#: appTools/ToolIsolation.py:3353 msgid "Full" msgstr "Voll" #: appDatabase.py:902 appGUI/preferences/tools/ToolsISOPrefGroupUI.py:230 -#: appTools/ToolIsolation.py:3358 +#: appTools/ToolIsolation.py:3354 msgid "Ext" msgstr "Ausserhalb" #: appDatabase.py:903 appGUI/preferences/tools/ToolsISOPrefGroupUI.py:231 -#: appTools/ToolIsolation.py:3359 +#: appTools/ToolIsolation.py:3355 msgid "Int" msgstr "Innerhalb" @@ -1410,16 +1410,16 @@ msgstr "" "Objekt / Anwendungswerkzeug nach Auswahl eines Werkzeugs\n" "in der Werkzeugdatenbank." -#: appDatabase.py:1366 appGUI/GUIElements.py:2267 appGUI/GUIElements.py:2336 -#: appGUI/GUIElements.py:2397 appGUI/GUIElements.py:2461 -#: appGUI/GUIElements.py:3803 appGUI/MainGUI.py:1553 +#: appDatabase.py:1366 appGUI/GUIElements.py:2270 appGUI/GUIElements.py:2339 +#: appGUI/GUIElements.py:2400 appGUI/GUIElements.py:2464 +#: appGUI/GUIElements.py:3806 appGUI/MainGUI.py:1553 #: appGUI/preferences/PreferencesUIManager.py:949 app_Main.py:2500 #: app_Main.py:3527 app_Main.py:4471 app_Main.py:4724 app_Main.py:9001 msgid "Cancel" msgstr "Abbrechen" -#: appDatabase.py:1379 appDatabase.py:1390 appEditors/AppExcEditor.py:4349 -#: appEditors/AppExcEditor.py:4360 appEditors/appGCodeEditor.py:770 +#: appDatabase.py:1379 appDatabase.py:1390 appEditors/AppExcEditor.py:4492 +#: appEditors/AppExcEditor.py:4503 appEditors/appGCodeEditor.py:770 #: appEditors/appGCodeEditor.py:781 appGUI/ObjectUI.py:163 #: appGUI/ObjectUI.py:174 appTool.py:280 appTool.py:291 #: appTools/ToolAlignObjects.py:517 appTools/ToolAlignObjects.py:528 @@ -1438,11 +1438,11 @@ msgstr "Abbrechen" #: appTools/ToolFilm.py:1458 appTools/ToolFilm.py:1469 #: appTools/ToolImage.py:321 appTools/ToolImage.py:332 #: appTools/ToolInvertGerber.py:302 appTools/ToolInvertGerber.py:313 -#: appTools/ToolIsolation.py:3599 appTools/ToolIsolation.py:3610 +#: appTools/ToolIsolation.py:3587 appTools/ToolIsolation.py:3598 #: appTools/ToolMilling.py:2341 appTools/ToolMilling.py:2352 -#: appTools/ToolNCC.py:4614 appTools/ToolNCC.py:4625 +#: appTools/ToolNCC.py:4605 appTools/ToolNCC.py:4616 #: appTools/ToolOptimal.py:615 appTools/ToolOptimal.py:626 -#: appTools/ToolPaint.py:3256 appTools/ToolPaint.py:3267 +#: appTools/ToolPaint.py:3250 appTools/ToolPaint.py:3261 #: appTools/ToolPanelize.py:913 appTools/ToolPanelize.py:924 #: appTools/ToolPcbWizard.py:488 appTools/ToolPcbWizard.py:499 #: appTools/ToolPunchGerber.py:1337 appTools/ToolPunchGerber.py:1348 @@ -1454,8 +1454,8 @@ msgstr "Abbrechen" msgid "Edited value is out of range" msgstr "Der bearbeitete Wert liegt außerhalb des Bereichs" -#: appDatabase.py:1385 appDatabase.py:1392 appEditors/AppExcEditor.py:4355 -#: appEditors/AppExcEditor.py:4362 appEditors/appGCodeEditor.py:776 +#: appDatabase.py:1385 appDatabase.py:1392 appEditors/AppExcEditor.py:4498 +#: appEditors/AppExcEditor.py:4505 appEditors/appGCodeEditor.py:776 #: appEditors/appGCodeEditor.py:783 appGUI/ObjectUI.py:169 #: appGUI/ObjectUI.py:176 appTool.py:286 appTool.py:293 #: appTools/ToolAlignObjects.py:523 appTools/ToolAlignObjects.py:530 @@ -1474,11 +1474,11 @@ msgstr "Der bearbeitete Wert liegt außerhalb des Bereichs" #: appTools/ToolFilm.py:1464 appTools/ToolFilm.py:1471 #: appTools/ToolImage.py:327 appTools/ToolImage.py:334 #: appTools/ToolInvertGerber.py:308 appTools/ToolInvertGerber.py:315 -#: appTools/ToolIsolation.py:3605 appTools/ToolIsolation.py:3612 +#: appTools/ToolIsolation.py:3593 appTools/ToolIsolation.py:3600 #: appTools/ToolMilling.py:2347 appTools/ToolMilling.py:2354 -#: appTools/ToolNCC.py:4620 appTools/ToolNCC.py:4627 +#: appTools/ToolNCC.py:4611 appTools/ToolNCC.py:4618 #: appTools/ToolOptimal.py:621 appTools/ToolOptimal.py:628 -#: appTools/ToolPaint.py:3262 appTools/ToolPaint.py:3269 +#: appTools/ToolPaint.py:3256 appTools/ToolPaint.py:3263 #: appTools/ToolPanelize.py:919 appTools/ToolPanelize.py:926 #: appTools/ToolPcbWizard.py:494 appTools/ToolPcbWizard.py:501 #: appTools/ToolPunchGerber.py:1343 appTools/ToolPunchGerber.py:1350 @@ -1509,8 +1509,8 @@ msgstr "Änderungen speichern" #: appDatabase.py:1726 appDatabase.py:2185 appDatabase.py:2604 #: appDatabase.py:2616 appGUI/MainGUI.py:490 appObjects/FlatCAMGeometry.py:1239 #: appTools/ToolCutOut.py:467 appTools/ToolCutOut.py:489 -#: appTools/ToolCutOut.py:530 appTools/ToolIsolation.py:2676 -#: appTools/ToolIsolation.py:2686 appTools/ToolIsolation.py:2770 +#: appTools/ToolCutOut.py:530 appTools/ToolIsolation.py:2672 +#: appTools/ToolIsolation.py:2682 appTools/ToolIsolation.py:2766 #: appTools/ToolNCC.py:3816 appTools/ToolNCC.py:3826 appTools/ToolNCC.py:3906 #: appTools/ToolPaint.py:2632 appTools/ToolPaint.py:2642 #: appTools/ToolPaint.py:2731 app_Main.py:5851 app_Main.py:5888 @@ -1520,7 +1520,7 @@ msgstr "Werkzeugdatenbank" #: appDatabase.py:1745 appDatabase.py:2171 appObjects/FlatCAMGeometry.py:1063 #: appTools/ToolCutOut.py:305 appTools/ToolDrilling.py:903 -#: appTools/ToolIsolation.py:1178 appTools/ToolNCC.py:1124 +#: appTools/ToolIsolation.py:1174 appTools/ToolNCC.py:1124 #: appTools/ToolPaint.py:724 msgid "Failed to parse Tools DB file." msgstr "Formatfehler beim Einlesen der Werkzeugdatenbank." @@ -1590,8 +1590,8 @@ msgid "Cancelled adding tool from DB." msgstr "Hinzufügen aus der Datenbank wurde abgebrochen." #: appEditors/AppExcEditor.py:234 appEditors/AppExcEditor.py:258 -#: appEditors/AppExcEditor.py:352 appEditors/AppExcEditor.py:594 -#: appEditors/AppExcEditor.py:809 appEditors/AppGerberEditor.py:248 +#: appEditors/AppExcEditor.py:352 appEditors/AppExcEditor.py:651 +#: appEditors/AppExcEditor.py:866 appEditors/AppGerberEditor.py:248 #: appEditors/AppGerberEditor.py:255 msgid "Click to place ..." msgstr "Klicken um zu platzieren ..." @@ -1600,12 +1600,12 @@ msgstr "Klicken um zu platzieren ..." msgid "To add a drill first select a tool" msgstr "Um einen Bohrer hinzuzufügen, wählen Sie zuerst ein Werkzeug aus" -#: appEditors/AppExcEditor.py:306 appEditors/AppExcEditor.py:538 -#: appEditors/AppExcEditor.py:767 appEditors/AppExcEditor.py:1102 -#: appEditors/AppExcEditor.py:1365 appEditors/AppExcEditor.py:1468 -#: appEditors/AppExcEditor.py:1579 appEditors/AppExcEditor.py:2324 -#: appEditors/AppExcEditor.py:3205 appEditors/AppExcEditor.py:3212 -#: appEditors/AppExcEditor.py:3577 appEditors/AppGeoEditor.py:1287 +#: appEditors/AppExcEditor.py:306 appEditors/AppExcEditor.py:595 +#: appEditors/AppExcEditor.py:824 appEditors/AppExcEditor.py:1236 +#: appEditors/AppExcEditor.py:1499 appEditors/AppExcEditor.py:1602 +#: appEditors/AppExcEditor.py:1713 appEditors/AppExcEditor.py:2460 +#: appEditors/AppExcEditor.py:3265 appEditors/AppExcEditor.py:3272 +#: appEditors/AppExcEditor.py:3713 appEditors/AppGeoEditor.py:1287 #: appEditors/AppGeoEditor.py:2005 appEditors/AppGeoEditor.py:2245 #: appEditors/AppGeoEditor.py:2318 appEditors/AppGeoEditor.py:2393 #: appEditors/AppGeoEditor.py:2450 appEditors/AppGeoEditor.py:2642 @@ -1614,15 +1614,15 @@ msgstr "Um einen Bohrer hinzuzufügen, wählen Sie zuerst ein Werkzeug aus" #: appEditors/AppGeoEditor.py:3027 appEditors/AppGeoEditor.py:3055 #: appEditors/AppGeoEditor.py:3171 appEditors/AppGeoEditor.py:4255 #: appEditors/AppGeoEditor.py:4269 appEditors/AppGeoEditor.py:5160 -#: appEditors/AppGerberEditor.py:390 appEditors/AppGerberEditor.py:742 -#: appEditors/AppGerberEditor.py:869 appEditors/AppGerberEditor.py:1131 -#: appEditors/AppGerberEditor.py:1377 appEditors/AppGerberEditor.py:1582 -#: appEditors/AppGerberEditor.py:1871 appEditors/AppGerberEditor.py:2167 -#: appEditors/AppGerberEditor.py:2248 appEditors/AppGerberEditor.py:2358 -#: appEditors/AppGerberEditor.py:4078 appEditors/AppGerberEditor.py:4319 -#: appEditors/AppGerberEditor.py:4336 appEditors/AppGerberEditor.py:4708 -#: appEditors/AppGerberEditor.py:4868 appEditors/AppGerberEditor.py:4930 -#: appEditors/AppGerberEditor.py:4979 appEditors/AppGerberEditor.py:6181 +#: appEditors/AppGerberEditor.py:390 appEditors/AppGerberEditor.py:814 +#: appEditors/AppGerberEditor.py:941 appEditors/AppGerberEditor.py:1253 +#: appEditors/AppGerberEditor.py:1513 appEditors/AppGerberEditor.py:1722 +#: appEditors/AppGerberEditor.py:2011 appEditors/AppGerberEditor.py:2307 +#: appEditors/AppGerberEditor.py:2388 appEditors/AppGerberEditor.py:2498 +#: appEditors/AppGerberEditor.py:4232 appEditors/AppGerberEditor.py:4473 +#: appEditors/AppGerberEditor.py:4491 appEditors/AppGerberEditor.py:4866 +#: appEditors/AppGerberEditor.py:5049 appEditors/AppGerberEditor.py:5111 +#: appEditors/AppGerberEditor.py:5158 appEditors/AppGerberEditor.py:6394 #: appGUI/MainGUI.py:2996 appGUI/MainGUI.py:3008 #: appObjects/FlatCAMGeometry.py:2745 appObjects/FlatCAMGeometry.py:2818 #: appObjects/FlatCAMGerber.py:372 appParsers/ParseGerber.py:2045 @@ -1630,7 +1630,7 @@ msgstr "Um einen Bohrer hinzuzufügen, wählen Sie zuerst ein Werkzeug aus" #: appParsers/ParseGerber.py:2285 appParsers/ParseGerber.py:2347 #: appTools/ToolAlignObjects.py:253 appTools/ToolAlignObjects.py:275 #: appTools/ToolCalibration.py:294 appTools/ToolFiducials.py:532 -#: appTools/ToolFiducials.py:546 appTools/ToolIsolation.py:1455 +#: appTools/ToolFiducials.py:546 appTools/ToolIsolation.py:1451 #: appTools/ToolPaint.py:2191 appTools/ToolPanelize.py:606 app_Main.py:5092 #: app_Main.py:5246 tclCommands/TclCommandPanelize.py:296 #: tclCommands/TclCommandPanelize.py:305 @@ -1643,10 +1643,10 @@ msgstr "" "Um ein Bohr-Array hinzuzufügen, wählen Sie zunächst ein Werkzeug in der " "Werkzeugtabelle aus" -#: appEditors/AppExcEditor.py:376 appEditors/AppExcEditor.py:623 -#: appEditors/AppExcEditor.py:856 appEditors/AppExcEditor.py:1436 -#: appEditors/AppGerberEditor.py:481 appEditors/AppGerberEditor.py:2049 -#: appEditors/AppGerberEditor.py:2079 appGUI/MainGUI.py:3617 +#: appEditors/AppExcEditor.py:376 appEditors/AppExcEditor.py:680 +#: appEditors/AppExcEditor.py:913 appEditors/AppExcEditor.py:1570 +#: appEditors/AppGerberEditor.py:481 appEditors/AppGerberEditor.py:2189 +#: appEditors/AppGerberEditor.py:2219 appGUI/MainGUI.py:3617 msgid "Click on target location ..." msgstr "Klicken Sie auf den Zielort ..." @@ -1654,8 +1654,8 @@ msgstr "Klicken Sie auf den Zielort ..." msgid "Click on the Drill Circular Array Start position" msgstr "Klicken Sie auf die Startposition des Bohrkreis-Arrays" -#: appEditors/AppExcEditor.py:417 appEditors/AppExcEditor.py:897 -#: appEditors/AppGerberEditor.py:526 +#: appEditors/AppExcEditor.py:417 appEditors/AppExcEditor.py:954 +#: appEditors/AppGerberEditor.py:535 msgid "The value is not Float. Check for comma instead of dot separator." msgstr "" "Der Wert ist nicht Real. Überprüfen Sie das Komma anstelle des Trennzeichens." @@ -1664,79 +1664,94 @@ msgstr "" msgid "The value is mistyped. Check the value" msgstr "Der Wert ist falsch geschrieben. Überprüfen Sie den Wert" -#: appEditors/AppExcEditor.py:520 appEditors/AppExcEditor.py:1079 -#: appEditors/AppGerberEditor.py:720 +#: appEditors/AppExcEditor.py:576 appEditors/AppExcEditor.py:1198 +#: appEditors/AppGerberEditor.py:796 msgid "Too many items for the selected spacing angle." msgstr "Zu viele Elemente für den ausgewählten Abstandswinkel." -#: appEditors/AppExcEditor.py:602 +#: appEditors/AppExcEditor.py:582 appEditors/AppExcEditor.py:1223 +#: appEditors/AppGerberEditor.py:801 appEditors/AppGerberEditor.py:5045 +#: appTools/ToolCopperThieving.py:306 appTools/ToolCopperThieving.py:907 +#: appTools/ToolCopperThieving.py:1104 appTools/ToolCorners.py:146 +#: appTools/ToolCorners.py:413 appTools/ToolCutOut.py:779 +#: appTools/ToolCutOut.py:905 appTools/ToolCutOut.py:1128 +#: appTools/ToolCutOut.py:1278 appTools/ToolDblSided.py:406 +#: appTools/ToolFiducials.py:240 appTools/ToolFiducials.py:492 +#: appTools/ToolFiducials.py:540 appTools/ToolFiducials.py:554 +#: appTools/ToolMove.py:166 appTools/ToolPaint.py:2185 app_Main.py:4766 +#: camlib.py:2403 camlib.py:2471 camlib.py:2539 camlib.py:2617 camlib.py:5287 +#: camlib.py:5683 +msgid "Failed." +msgstr "Gescheitert." + +#: appEditors/AppExcEditor.py:659 msgid "To add a slot first select a tool" msgstr "Um einen Steckplatz hinzuzufügen, wählen Sie zunächst ein Werkzeug aus" -#: appEditors/AppExcEditor.py:662 appEditors/AppExcEditor.py:669 -#: appEditors/AppExcEditor.py:962 appEditors/AppExcEditor.py:969 +#: appEditors/AppExcEditor.py:719 appEditors/AppExcEditor.py:726 +#: appEditors/AppExcEditor.py:1081 appEditors/AppExcEditor.py:1088 msgid "Value is missing or wrong format. Add it and retry." msgstr "" "Wert fehlt oder falsches Format. Fügen Sie es hinzu und versuchen Sie es " "erneut." -#: appEditors/AppExcEditor.py:817 +#: appEditors/AppExcEditor.py:874 msgid "To add an Slot Array first select a tool in Tool Table" msgstr "" "Um ein Schlitze-Array hinzuzufügen, wählen Sie zunächst ein Werkzeug in der " "Werkzeugtabelle aus" -#: appEditors/AppExcEditor.py:875 +#: appEditors/AppExcEditor.py:932 msgid "Click on the Slot Circular Array Start position" msgstr "Klicken Sie auf die kreisförmige Startposition des Arrays" -#: appEditors/AppExcEditor.py:900 appEditors/AppGerberEditor.py:529 +#: appEditors/AppExcEditor.py:957 appEditors/AppGerberEditor.py:538 msgid "The value is mistyped. Check the value." msgstr "Der Wert ist falsch geschrieben. Überprüfen Sie den Wert." -#: appEditors/AppExcEditor.py:1158 +#: appEditors/AppExcEditor.py:1292 msgid "Click on the Drill(s) to resize ..." msgstr "Klicken Sie auf die Bohrer, um die Größe zu ändern ..." -#: appEditors/AppExcEditor.py:1188 +#: appEditors/AppExcEditor.py:1322 msgid "Resize drill(s) failed. Please enter a diameter for resize." msgstr "" "Die Größe der Bohrer ist fehlgeschlagen. Bitte geben Sie einen Durchmesser " "für die Größenänderung ein." -#: appEditors/AppExcEditor.py:1367 appEditors/AppExcEditor.py:1420 -#: appEditors/AppExcEditor.py:1431 appGUI/MainGUI.py:3253 +#: appEditors/AppExcEditor.py:1501 appEditors/AppExcEditor.py:1554 +#: appEditors/AppExcEditor.py:1565 appGUI/MainGUI.py:3253 #: appGUI/MainGUI.py:3338 appGUI/MainGUI.py:3384 appGUI/MainGUI.py:3479 #: appGUI/MainGUI.py:3594 appGUI/MainGUI.py:3623 msgid "Cancelled. Nothing selected." msgstr "Abgesagt. Nichts ausgewählt." -#: appEditors/AppExcEditor.py:1424 appEditors/AppGeoEditor.py:2676 -#: appEditors/AppGeoEditor.py:2696 appEditors/AppGerberEditor.py:2051 +#: appEditors/AppExcEditor.py:1558 appEditors/AppGeoEditor.py:2676 +#: appEditors/AppGeoEditor.py:2696 appEditors/AppGerberEditor.py:2191 msgid "Click on reference location ..." msgstr "Klicken Sie auf die Referenzposition ..." -#: appEditors/AppExcEditor.py:1988 appObjects/FlatCAMExcellon.py:330 +#: appEditors/AppExcEditor.py:2124 appObjects/FlatCAMExcellon.py:330 #: appTools/ToolDrilling.py:571 appTools/ToolMilling.py:494 msgid "Total Drills" msgstr "Bohrungen insgesamt" -#: appEditors/AppExcEditor.py:2020 appObjects/FlatCAMExcellon.py:364 +#: appEditors/AppExcEditor.py:2156 appObjects/FlatCAMExcellon.py:364 #: appTools/ToolDrilling.py:598 appTools/ToolMilling.py:521 msgid "Total Slots" msgstr "Schlitz insgesamt" -#: appEditors/AppExcEditor.py:2094 appObjects/FlatCAMGeometry.py:725 +#: appEditors/AppExcEditor.py:2230 appObjects/FlatCAMGeometry.py:725 #: appObjects/FlatCAMGeometry.py:1384 appObjects/FlatCAMGeometry.py:2136 -#: appObjects/FlatCAMGeometry.py:2888 appTools/ToolIsolation.py:1348 -#: appTools/ToolIsolation.py:1800 appTools/ToolNCC.py:1299 +#: appObjects/FlatCAMGeometry.py:2888 appTools/ToolIsolation.py:1344 +#: appTools/ToolIsolation.py:1796 appTools/ToolNCC.py:1299 #: appTools/ToolNCC.py:1437 appTools/ToolPaint.py:898 #: appTools/ToolPaint.py:1036 appTools/ToolPaint.py:1749 #: appTools/ToolSolderPaste.py:455 appTools/ToolSolderPaste.py:527 msgid "Wrong value format entered, use a number." msgstr "Falsches Wertformat eingegeben, eine Zahl verwenden." -#: appEditors/AppExcEditor.py:2105 +#: appEditors/AppExcEditor.py:2241 msgid "" "Tool already in the original or actual tool list.\n" "Save and reedit Excellon if you need to add this tool. " @@ -1745,25 +1760,25 @@ msgstr "" "Speichern Sie Excellon und bearbeiten Sie es erneut, wenn Sie dieses Tool " "hinzufügen müssen. " -#: appEditors/AppExcEditor.py:2113 appGUI/MainGUI.py:3659 +#: appEditors/AppExcEditor.py:2249 appGUI/MainGUI.py:3659 msgid "Added new tool with dia" msgstr "Neues Werkzeug mit Durchmesser hinzugefügt" -#: appEditors/AppExcEditor.py:2147 +#: appEditors/AppExcEditor.py:2283 msgid "Select a tool in Tool Table" msgstr "Wählen Sie ein Werkzeug in der Werkzeugtabelle aus" -#: appEditors/AppExcEditor.py:2177 +#: appEditors/AppExcEditor.py:2313 msgid "Deleted tool with diameter" msgstr "Gelöschtes Werkzeug mit Durchmesser" -#: appEditors/AppExcEditor.py:2940 +#: appEditors/AppExcEditor.py:3076 msgid "There are no Tools definitions in the file. Aborting Excellon creation." msgstr "" "Die Datei enthält keine Werkzeugdefinitionen. Abbruch der Excellon-" "Erstellung." -#: appEditors/AppExcEditor.py:2944 appEditors/AppGerberEditor.py:4058 +#: appEditors/AppExcEditor.py:3080 appEditors/AppGerberEditor.py:4212 #: appObjects/AppObject.py:164 appObjects/FlatCAMGeometry.py:2078 #: appParsers/ParseExcellon.py:972 appTools/ToolPcbWizard.py:318 #: appTools/ToolSolderPaste.py:894 app_Main.py:7712 app_Main.py:10176 @@ -1771,41 +1786,41 @@ msgstr "" msgid "An internal error has occurred. See shell.\n" msgstr "Ein interner Fehler ist aufgetreten. Siehe Shell.\n" -#: appEditors/AppExcEditor.py:2949 +#: appEditors/AppExcEditor.py:3085 msgid "Creating Excellon." msgstr "Excellon erstellen." -#: appEditors/AppExcEditor.py:2963 +#: appEditors/AppExcEditor.py:3099 msgid "Excellon editing finished." msgstr "Excellon-Bearbeitung abgeschlossen." -#: appEditors/AppExcEditor.py:2979 +#: appEditors/AppExcEditor.py:3115 msgid "Cancelled. There is no Tool/Drill selected" msgstr "Abgebrochen. Es ist kein Werkzeug / Bohrer ausgewählt" -#: appEditors/AppExcEditor.py:3650 appEditors/AppExcEditor.py:3660 -#: appEditors/AppGerberEditor.py:4770 +#: appEditors/AppExcEditor.py:3786 appEditors/AppExcEditor.py:3796 +#: appEditors/AppGerberEditor.py:4952 msgid "Click on the circular array Center position" msgstr "Klicken Sie auf die kreisförmige Anordnung in der Mitte" -#: appEditors/AppExcEditor.py:3793 appGUI/MainGUI.py:706 appGUI/ObjectUI.py:579 +#: appEditors/AppExcEditor.py:3929 appGUI/MainGUI.py:706 appGUI/ObjectUI.py:579 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:26 msgid "Excellon Editor" msgstr "Excellon Editor" -#: appEditors/AppExcEditor.py:3803 appEditors/AppGerberEditor.py:5041 +#: appEditors/AppExcEditor.py:3940 appEditors/AppGerberEditor.py:5220 #: appEditors/appGCodeEditor.py:669 msgid "Name:" msgstr "Name:" -#: appEditors/AppExcEditor.py:3810 appGUI/ObjectUI.py:620 -#: appGUI/ObjectUI.py:967 appTools/ToolIsolation.py:3115 +#: appEditors/AppExcEditor.py:3947 appGUI/ObjectUI.py:620 +#: appGUI/ObjectUI.py:967 appTools/ToolIsolation.py:3111 #: appTools/ToolNCC.py:3986 appTools/ToolPaint.py:2818 #: appTools/ToolSolderPaste.py:1157 msgid "Tools Table" msgstr "Werkzeugtabelle" -#: appEditors/AppExcEditor.py:3812 appGUI/ObjectUI.py:622 +#: appEditors/AppExcEditor.py:3949 appGUI/ObjectUI.py:622 msgid "" "Tools in this Excellon object\n" "when are used for drilling." @@ -1813,20 +1828,20 @@ msgstr "" "Werkzeuge in diesem Excellon-Objekt\n" "Wann werden zum Bohren verwendet." -#: appEditors/AppExcEditor.py:3831 +#: appEditors/AppExcEditor.py:3970 msgid "Convert Slots" msgstr "Schlitze konvertieren" -#: appEditors/AppExcEditor.py:3835 +#: appEditors/AppExcEditor.py:3974 msgid "Convert the slots in the selected tools to drills." msgstr "" "Konvertieren Sie die Schlitze in den ausgewählten Werkzeugen in Bohrer." -#: appEditors/AppExcEditor.py:3845 +#: appEditors/AppExcEditor.py:3984 msgid "Add/Delete Tool" msgstr "Werkzeug hinzufügen / löschen" -#: appEditors/AppExcEditor.py:3847 +#: appEditors/AppExcEditor.py:3986 msgid "" "Add/Delete a tool to the tool list\n" "for this Excellon object." @@ -1834,23 +1849,23 @@ msgstr "" "Werkzeug zur Werkzeugliste hinzufügen / löschen\n" "für dieses Excellon-Objekt." -#: appEditors/AppExcEditor.py:3861 appEditors/AppGeoEditor.py:441 +#: appEditors/AppExcEditor.py:4000 appEditors/AppGeoEditor.py:441 #: appGUI/ObjectUI.py:1080 appGUI/ObjectUI.py:1637 #: appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py:268 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:130 -#: appTools/ToolCutOut.py:2077 appTools/ToolIsolation.py:3196 +#: appTools/ToolCutOut.py:2077 appTools/ToolIsolation.py:3192 #: appTools/ToolNCC.py:4079 appTools/ToolNCC.py:4090 appTools/ToolPaint.py:2900 msgid "Tool Dia" msgstr "Werkzeugdurchm" -#: appEditors/AppExcEditor.py:3863 appGUI/ObjectUI.py:1082 +#: appEditors/AppExcEditor.py:4002 appGUI/ObjectUI.py:1082 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:57 -#: appTools/ToolIsolation.py:3198 appTools/ToolNCC.py:4081 +#: appTools/ToolIsolation.py:3194 appTools/ToolNCC.py:4081 msgid "Diameter for the new tool" msgstr "Durchmesser für das neue Werkzeug" -#: appEditors/AppExcEditor.py:3875 appEditors/AppGeoEditor.py:671 -#: appEditors/AppGerberEditor.py:5162 appEditors/AppGerberEditor.py:5559 +#: appEditors/AppExcEditor.py:4014 appEditors/AppGeoEditor.py:671 +#: appEditors/AppGerberEditor.py:5357 appEditors/AppGerberEditor.py:5772 #: appGUI/ObjectUI.py:2373 #: appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py:288 #: appTools/ToolCopperThieving.py:1666 appTools/ToolDblSided.py:709 @@ -1861,7 +1876,7 @@ msgstr "Durchmesser für das neue Werkzeug" msgid "Add" msgstr "Hinzufügen" -#: appEditors/AppExcEditor.py:3878 +#: appEditors/AppExcEditor.py:4017 msgid "" "Add a new tool to the tool list\n" "with the diameter specified above." @@ -1869,11 +1884,11 @@ msgstr "" "Fügen Sie der Werkzeugliste ein neues Werkzeug hinzu\n" "mit dem oben angegebenen Durchmesser." -#: appEditors/AppExcEditor.py:3887 +#: appEditors/AppExcEditor.py:4026 msgid "Delete Tool" msgstr "Werkzeug löschen" -#: appEditors/AppExcEditor.py:3890 +#: appEditors/AppExcEditor.py:4029 msgid "" "Delete a tool in the tool list\n" "by selecting a row in the tool table." @@ -1881,41 +1896,54 @@ msgstr "" "Löschen Sie ein Werkzeug in der Werkzeugliste\n" "indem Sie eine Zeile in der Werkzeugtabelle auswählen." -#: appEditors/AppExcEditor.py:3915 +#: appEditors/AppExcEditor.py:4054 msgid "Resize Tool" msgstr "Werkzeug zur Größenänderung" -#: appEditors/AppExcEditor.py:3917 +#: appEditors/AppExcEditor.py:4056 msgid "Resize a drill or a selection of drills." msgstr "Ändern Sie die Größe eines Bohrers oder einer Auswahl von Bohrern." -#: appEditors/AppExcEditor.py:3922 +#: appEditors/AppExcEditor.py:4061 msgid "Resize Dia" msgstr "Durchmesser ändern" -#: appEditors/AppExcEditor.py:3924 +#: appEditors/AppExcEditor.py:4063 msgid "Diameter to resize to." msgstr "Durchmesser zur Größenänderung." -#: appEditors/AppExcEditor.py:3937 +#: appEditors/AppExcEditor.py:4076 msgid "Resize" msgstr "Größe ändern" -#: appEditors/AppExcEditor.py:3940 +#: appEditors/AppExcEditor.py:4079 msgid "Resize drill(s)" msgstr "Bohrer verkleinern" -#: appEditors/AppExcEditor.py:3971 appGUI/MainGUI.py:711 appGUI/MainGUI.py:1102 +#: appEditors/AppExcEditor.py:4110 appGUI/MainGUI.py:711 appGUI/MainGUI.py:1102 #: appGUI/MainGUI.py:1679 appGUI/MainGUI.py:2271 appGUI/MainGUI.py:4812 msgid "Add Drill Array" msgstr "Bohrer-Array hinzufügen" -#: appEditors/AppExcEditor.py:3973 +#: appEditors/AppExcEditor.py:4112 msgid "Add an array of drills (linear or circular array)" msgstr "" "Hinzufügen eines Arrays von Bohrern (lineares oder kreisförmiges Array)" -#: appEditors/AppExcEditor.py:3979 +#: appEditors/AppExcEditor.py:4118 appEditors/AppExcEditor.py:4338 +#: appEditors/AppGeoEditor.py:3296 appEditors/AppGerberEditor.py:3818 +#: appEditors/AppGerberEditor.py:5246 appEditors/AppGerberEditor.py:5574 +#: appEditors/appGCodeEditor.py:687 appGUI/ObjectUI.py:316 +#: appGUI/ObjectUI.py:999 appGUI/ObjectUI.py:2032 +#: appGUI/preferences/tools/ToolsCornersPrefGroupUI.py:42 +#: appTools/ToolCorners.py:546 appTools/ToolCutOut.py:2030 +#: appTools/ToolDblSided.py:522 appTools/ToolIsolation.py:3487 +#: appTools/ToolNCC.py:4420 appTools/ToolPaint.py:3124 +#: appTools/ToolPunchGerber.py:1088 appTools/ToolTransform.py:574 +msgid "Type" +msgstr "Typ" + +#: appEditors/AppExcEditor.py:4120 msgid "" "Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular" @@ -1923,13 +1951,13 @@ msgstr "" "Wählen Sie den Typ des zu erstellenden Bohrfelds aus.\n" "Es kann lineares X (Y) oder rund sein" -#: appEditors/AppExcEditor.py:3982 appEditors/AppExcEditor.py:4203 -#: appEditors/AppGerberEditor.py:5361 +#: appEditors/AppExcEditor.py:4124 appEditors/AppExcEditor.py:4344 +#: appEditors/AppGerberEditor.py:5580 msgid "Linear" msgstr "Linear" -#: appEditors/AppExcEditor.py:3982 appEditors/AppExcEditor.py:4203 -#: appEditors/AppGerberEditor.py:5362 +#: appEditors/AppExcEditor.py:4125 appEditors/AppExcEditor.py:4345 +#: appEditors/AppGerberEditor.py:5581 #: appGUI/preferences/tools/Tools2EDrillsPrefGroupUI.py:52 #: appGUI/preferences/tools/Tools2EDrillsPrefGroupUI.py:149 #: appGUI/preferences/tools/Tools2FiducialsPrefGroupUI.py:107 @@ -1944,26 +1972,26 @@ msgstr "Linear" msgid "Circular" msgstr "Kreisförmig" -#: appEditors/AppExcEditor.py:3988 appEditors/AppExcEditor.py:4208 +#: appEditors/AppExcEditor.py:4131 appEditors/AppExcEditor.py:4351 msgid "Number" msgstr "Nummer" -#: appEditors/AppExcEditor.py:3989 +#: appEditors/AppExcEditor.py:4132 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:70 msgid "Specify how many drills to be in the array." msgstr "Geben Sie an, wie viele Drills im Array enthalten sein sollen." -#: appEditors/AppExcEditor.py:4010 appEditors/AppExcEditor.py:4069 -#: appEditors/AppExcEditor.py:4135 appEditors/AppExcEditor.py:4231 -#: appEditors/AppExcEditor.py:4291 appEditors/AppGeoEditor.py:2084 -#: appEditors/AppGerberEditor.py:1681 appEditors/AppGerberEditor.py:5390 -#: appEditors/AppGerberEditor.py:5439 +#: appEditors/AppExcEditor.py:4153 appEditors/AppExcEditor.py:4212 +#: appEditors/AppExcEditor.py:4278 appEditors/AppExcEditor.py:4374 +#: appEditors/AppExcEditor.py:4434 appEditors/AppGeoEditor.py:2084 +#: appEditors/AppGerberEditor.py:1821 appEditors/AppGerberEditor.py:5607 +#: appEditors/AppGerberEditor.py:5661 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:178 msgid "Direction" msgstr "Richtung" -#: appEditors/AppExcEditor.py:4012 appEditors/AppExcEditor.py:4233 -#: appEditors/AppGerberEditor.py:5392 +#: appEditors/AppExcEditor.py:4155 appEditors/AppExcEditor.py:4376 +#: appEditors/AppGerberEditor.py:5609 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:86 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:234 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:123 @@ -1978,9 +2006,9 @@ msgstr "" "- 'Y' - vertikale Achse oder\n" "- 'Winkel' - ein benutzerdefinierter Winkel für die Neigung des Arrays" -#: appEditors/AppExcEditor.py:4018 appEditors/AppExcEditor.py:4143 -#: appEditors/AppExcEditor.py:4239 appEditors/AppGerberEditor.py:5399 -#: appGUI/GUIElements.py:4341 appGUI/MainGUI.py:478 appGUI/MainGUI.py:671 +#: appEditors/AppExcEditor.py:4161 appEditors/AppExcEditor.py:4286 +#: appEditors/AppExcEditor.py:4382 appEditors/AppGerberEditor.py:5615 +#: appGUI/GUIElements.py:4344 appGUI/MainGUI.py:478 appGUI/MainGUI.py:671 #: appGUI/MainGUI.py:4442 appGUI/MainGUI.py:4708 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:92 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:187 @@ -1991,9 +2019,9 @@ msgstr "" msgid "X" msgstr "X" -#: appEditors/AppExcEditor.py:4019 appEditors/AppExcEditor.py:4144 -#: appEditors/AppExcEditor.py:4240 appEditors/AppGerberEditor.py:5400 -#: appGUI/GUIElements.py:4348 appGUI/MainGUI.py:481 appGUI/MainGUI.py:4443 +#: appEditors/AppExcEditor.py:4162 appEditors/AppExcEditor.py:4287 +#: appEditors/AppExcEditor.py:4383 appEditors/AppGerberEditor.py:5616 +#: appGUI/GUIElements.py:4351 appGUI/MainGUI.py:481 appGUI/MainGUI.py:4443 #: appGUI/MainGUI.py:4709 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:93 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:188 @@ -2004,13 +2032,13 @@ msgstr "X" msgid "Y" msgstr "Y" -#: appEditors/AppExcEditor.py:4020 appEditors/AppExcEditor.py:4039 -#: appEditors/AppExcEditor.py:4080 appEditors/AppExcEditor.py:4145 -#: appEditors/AppExcEditor.py:4151 appEditors/AppExcEditor.py:4241 -#: appEditors/AppExcEditor.py:4261 appEditors/AppExcEditor.py:4302 -#: appEditors/AppGeoEditor.py:686 appEditors/AppGerberEditor.py:5401 -#: appEditors/AppGerberEditor.py:5418 appEditors/AppGerberEditor.py:5454 -#: appEditors/AppGerberEditor.py:5574 +#: appEditors/AppExcEditor.py:4163 appEditors/AppExcEditor.py:4182 +#: appEditors/AppExcEditor.py:4223 appEditors/AppExcEditor.py:4288 +#: appEditors/AppExcEditor.py:4294 appEditors/AppExcEditor.py:4384 +#: appEditors/AppExcEditor.py:4404 appEditors/AppExcEditor.py:4445 +#: appEditors/AppGeoEditor.py:686 appEditors/AppGerberEditor.py:5617 +#: appEditors/AppGerberEditor.py:5637 appEditors/AppGerberEditor.py:5674 +#: appEditors/AppGerberEditor.py:5787 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:94 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:113 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:189 @@ -2025,24 +2053,24 @@ msgstr "Y" msgid "Angle" msgstr "Winkel" -#: appEditors/AppExcEditor.py:4026 appEditors/AppExcEditor.py:4247 -#: appEditors/AppGerberEditor.py:5405 +#: appEditors/AppExcEditor.py:4169 appEditors/AppExcEditor.py:4390 +#: appEditors/AppGerberEditor.py:5623 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:100 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:248 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:137 msgid "Pitch" msgstr "Abstand" -#: appEditors/AppExcEditor.py:4028 appEditors/AppExcEditor.py:4249 -#: appEditors/AppGerberEditor.py:5407 +#: appEditors/AppExcEditor.py:4171 appEditors/AppExcEditor.py:4392 +#: appEditors/AppGerberEditor.py:5625 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:102 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:250 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:139 msgid "Pitch = Distance between elements of the array." msgstr "Abstand = Abstand zwischen Elementen des Arrays." -#: appEditors/AppExcEditor.py:4041 appEditors/AppExcEditor.py:4263 -#: appEditors/AppGerberEditor.py:5420 +#: appEditors/AppExcEditor.py:4184 appEditors/AppExcEditor.py:4406 +#: appEditors/AppGerberEditor.py:5639 msgid "" "Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" @@ -2054,8 +2082,8 @@ msgstr "" "Der Mindestwert beträgt: -360,00 Grad.\n" "Maximaler Wert ist: 360,00 Grad." -#: appEditors/AppExcEditor.py:4070 appEditors/AppExcEditor.py:4292 -#: appEditors/AppGerberEditor.py:5441 +#: appEditors/AppExcEditor.py:4213 appEditors/AppExcEditor.py:4435 +#: appEditors/AppGerberEditor.py:5663 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:132 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:282 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:167 @@ -2066,8 +2094,8 @@ msgstr "" "Richtung für kreisförmige Anordnung. \n" "Kann CW = Uhrzeigersinn oder CCW = Gegenuhrzeigersinn sein." -#: appEditors/AppExcEditor.py:4073 appEditors/AppExcEditor.py:4295 -#: appEditors/AppGerberEditor.py:5449 +#: appEditors/AppExcEditor.py:4216 appEditors/AppExcEditor.py:4438 +#: appEditors/AppGerberEditor.py:5667 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:136 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:286 #: appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py:145 @@ -2076,8 +2104,8 @@ msgstr "" msgid "CW" msgstr "CW" -#: appEditors/AppExcEditor.py:4074 appEditors/AppExcEditor.py:4296 -#: appEditors/AppGerberEditor.py:5450 +#: appEditors/AppExcEditor.py:4217 appEditors/AppExcEditor.py:4439 +#: appEditors/AppGerberEditor.py:5668 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:137 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:287 #: appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py:146 @@ -2086,8 +2114,8 @@ msgstr "CW" msgid "CCW" msgstr "CCW" -#: appEditors/AppExcEditor.py:4081 appEditors/AppExcEditor.py:4303 -#: appEditors/AppGerberEditor.py:5456 +#: appEditors/AppExcEditor.py:4224 appEditors/AppExcEditor.py:4446 +#: appEditors/AppGerberEditor.py:5676 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:115 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:145 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:265 @@ -2098,11 +2126,11 @@ msgid "Angle at which each element in circular array is placed." msgstr "" "Winkel, um den jedes Element in einer kreisförmigen Anordnung platziert wird." -#: appEditors/AppExcEditor.py:4113 +#: appEditors/AppExcEditor.py:4256 msgid "Slot Parameters" msgstr "Schlitze-Parameter" -#: appEditors/AppExcEditor.py:4115 +#: appEditors/AppExcEditor.py:4258 msgid "" "Parameters for adding a slot (hole with oval shape)\n" "either single or as an part of an array." @@ -2110,7 +2138,7 @@ msgstr "" "Parameter zum Hinzufügen eines Schlitzes (Loch mit ovaler Form)\n" "entweder einzeln oder als Teil eines Arrays." -#: appEditors/AppExcEditor.py:4121 +#: appEditors/AppExcEditor.py:4264 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:162 #: appGUI/preferences/tools/ToolsCornersPrefGroupUI.py:83 #: appObjects/FlatCAMObj.py:877 appTools/ToolCorners.py:574 @@ -2118,12 +2146,12 @@ msgstr "" msgid "Length" msgstr "Länge" -#: appEditors/AppExcEditor.py:4123 +#: appEditors/AppExcEditor.py:4266 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:164 msgid "Length. The length of the slot." msgstr "Länge. Die Länge des Schlitzes." -#: appEditors/AppExcEditor.py:4137 +#: appEditors/AppExcEditor.py:4280 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:180 msgid "" "Direction on which the slot is oriented:\n" @@ -2136,7 +2164,7 @@ msgstr "" "- 'Y' - vertikale Achse oder\n" "- 'Winkel' - Ein benutzerdefinierter Winkel für die Schlitzneigung" -#: appEditors/AppExcEditor.py:4153 +#: appEditors/AppExcEditor.py:4296 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:196 msgid "" "Angle at which the slot is placed.\n" @@ -2149,16 +2177,16 @@ msgstr "" "Der Mindestwert beträgt: -360,00 Grad.\n" "Maximaler Wert ist: 360,00 Grad." -#: appEditors/AppExcEditor.py:4190 +#: appEditors/AppExcEditor.py:4330 msgid "Slot Array Parameters" msgstr "Schlitzes Array-Parameter" -#: appEditors/AppExcEditor.py:4192 +#: appEditors/AppExcEditor.py:4332 msgid "Parameters for the array of slots (linear or circular array)" msgstr "" "Parameter für das Array von Schlitzes (lineares oder kreisförmiges Array)" -#: appEditors/AppExcEditor.py:4200 +#: appEditors/AppExcEditor.py:4340 msgid "" "Select the type of slot array to create.\n" "It can be Linear X(Y) or Circular" @@ -2166,19 +2194,19 @@ msgstr "" "Wählen Sie den Typ des zu erstellenden Slot-Arrays.\n" "Es kann ein lineares X (Y) oder ein kreisförmiges sein" -#: appEditors/AppExcEditor.py:4209 +#: appEditors/AppExcEditor.py:4352 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:221 msgid "Specify how many slots to be in the array." msgstr "Geben Sie an, wie viele Steckplätze sich im Array befinden sollen." -#: appEditors/AppExcEditor.py:4317 appEditors/AppGeoEditor.py:3310 -#: appEditors/AppGerberEditor.py:5478 appEditors/appGCodeEditor.py:753 +#: appEditors/AppExcEditor.py:4460 appEditors/AppGeoEditor.py:3310 +#: appEditors/AppGerberEditor.py:5691 appEditors/appGCodeEditor.py:753 #: appGUI/MainGUI.py:346 appGUI/MainGUI.py:1696 app_Main.py:2494 msgid "Exit Editor" msgstr "Beenden Sie den Editor" -#: appEditors/AppExcEditor.py:4320 appEditors/AppGeoEditor.py:3313 -#: appEditors/AppGerberEditor.py:5481 appEditors/appGCodeEditor.py:756 +#: appEditors/AppExcEditor.py:4463 appEditors/AppGeoEditor.py:3313 +#: appEditors/AppGerberEditor.py:5694 appEditors/appGCodeEditor.py:756 msgid "Exit from Editor." msgstr "Beenden Sie den Editor." @@ -2186,12 +2214,12 @@ msgstr "Beenden Sie den Editor." msgid "Buffer Selection" msgstr "Pufferauswahl" -#: appEditors/AppGeoEditor.py:87 appEditors/AppGerberEditor.py:5203 +#: appEditors/AppGeoEditor.py:87 appEditors/AppGerberEditor.py:5398 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:195 msgid "Buffer distance" msgstr "Pufferabstand" -#: appEditors/AppGeoEditor.py:88 appEditors/AppGerberEditor.py:5204 +#: appEditors/AppGeoEditor.py:88 appEditors/AppGerberEditor.py:5401 msgid "Buffer corner" msgstr "Pufferecke" @@ -2210,11 +2238,11 @@ msgstr "" "- 'Abgeschrägt:' Die Ecke ist eine Linie, die die Features, die sich in der " "Ecke treffen, direkt verbindet" -#: appEditors/AppGeoEditor.py:96 appEditors/AppGerberEditor.py:5212 +#: appEditors/AppGeoEditor.py:96 appEditors/AppGerberEditor.py:5409 msgid "Round" msgstr "Runden" -#: appEditors/AppGeoEditor.py:97 appEditors/AppGerberEditor.py:5213 +#: appEditors/AppGeoEditor.py:97 appEditors/AppGerberEditor.py:5410 #: appGUI/ObjectUI.py:1601 #: appGUI/preferences/geometry/GeometryAdvOptPrefGroupUI.py:223 #: appGUI/preferences/tools/Tools2EDrillsPrefGroupUI.py:68 @@ -2229,14 +2257,14 @@ msgstr "Runden" #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:289 #: appTools/ToolDrilling.py:2588 appTools/ToolExtractDrills.py:487 #: appTools/ToolExtractDrills.py:615 appTools/ToolInvertGerber.py:254 -#: appTools/ToolIsolation.py:3535 appTools/ToolMilling.py:2264 -#: appTools/ToolNCC.py:4454 appTools/ToolPaint.py:3157 +#: appTools/ToolIsolation.py:3523 appTools/ToolMilling.py:2264 +#: appTools/ToolNCC.py:4448 appTools/ToolPaint.py:3153 #: appTools/ToolPunchGerber.py:1060 appTools/ToolPunchGerber.py:1227 #: appTools/ToolQRCode.py:795 msgid "Square" msgstr "Quadrat" -#: appEditors/AppGeoEditor.py:98 appEditors/AppGerberEditor.py:5214 +#: appEditors/AppGeoEditor.py:98 appEditors/AppGerberEditor.py:5411 msgid "Beveled" msgstr "Abgeschrägt" @@ -2261,7 +2289,7 @@ msgstr "Pufferwerkzeug" #: appEditors/AppGeoEditor.py:146 appEditors/AppGeoEditor.py:163 #: appEditors/AppGeoEditor.py:180 appEditors/AppGeoEditor.py:2987 #: appEditors/AppGeoEditor.py:3015 appEditors/AppGeoEditor.py:3043 -#: appEditors/AppGerberEditor.py:4823 +#: appEditors/AppGerberEditor.py:5004 msgid "Buffer distance value is missing or wrong format. Add it and retry." msgstr "" "Pufferabstandswert fehlt oder falsches Format. Fügen Sie es hinzu und " @@ -2275,8 +2303,8 @@ msgstr "Textwerkzeug" msgid "Font" msgstr "Schrift" -#: appEditors/AppGeoEditor.py:316 appEditors/AppGerberEditor.py:3664 -#: appEditors/AppGerberEditor.py:5067 appGUI/ObjectUI.py:316 +#: appEditors/AppGeoEditor.py:316 appEditors/AppGerberEditor.py:3818 +#: appEditors/AppGerberEditor.py:5246 appGUI/ObjectUI.py:316 #: appGUI/preferences/general/GeneralAPPSetGroupUI.py:103 #: appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py:180 #: appGUI/preferences/tools/Tools2CThievingPrefGroupUI.py:209 @@ -2302,7 +2330,7 @@ msgstr "Textwerkzeug" #: appGUI/ObjectUI.py:1159 appObjects/FlatCAMExcellon.py:883 #: appObjects/FlatCAMGeometry.py:962 appTools/ToolDrilling.py:711 #: appTools/ToolDrilling.py:1033 appTools/ToolDrilling.py:2116 -#: appTools/ToolIsolation.py:698 appTools/ToolIsolation.py:3271 +#: appTools/ToolIsolation.py:698 appTools/ToolIsolation.py:3267 #: appTools/ToolMilling.py:790 appTools/ToolMilling.py:1046 #: appTools/ToolMilling.py:1711 appTools/ToolNCC.py:329 #: appTools/ToolNCC.py:2383 appTools/ToolNCC.py:4153 appTools/ToolPaint.py:302 @@ -2341,11 +2369,11 @@ msgstr "" #: appEditors/AppGeoEditor.py:2609 appEditors/AppGeoEditor.py:2673 #: appEditors/AppGeoEditor.py:2975 appEditors/AppGeoEditor.py:3003 #: appEditors/AppGeoEditor.py:3031 appEditors/AppGeoEditor.py:4412 -#: appEditors/AppGerberEditor.py:5962 appEditors/AppGerberEditor.py:5998 -#: appEditors/AppGerberEditor.py:6021 appEditors/AppGerberEditor.py:6166 -#: appEditors/AppGerberEditor.py:6199 appEditors/AppGerberEditor.py:6242 -#: appEditors/AppGerberEditor.py:6283 appEditors/AppGerberEditor.py:6319 -#: appEditors/AppGerberEditor.py:6355 +#: appEditors/AppGerberEditor.py:6175 appEditors/AppGerberEditor.py:6211 +#: appEditors/AppGerberEditor.py:6234 appEditors/AppGerberEditor.py:6379 +#: appEditors/AppGerberEditor.py:6412 appEditors/AppGerberEditor.py:6455 +#: appEditors/AppGerberEditor.py:6496 appEditors/AppGerberEditor.py:6532 +#: appEditors/AppGerberEditor.py:6568 msgid "No shape selected." msgstr "Keine Form ausgewählt." @@ -2358,26 +2386,26 @@ msgid "Tools" msgstr "Werkzeuge" #: appEditors/AppGeoEditor.py:609 appEditors/AppGeoEditor.py:1038 -#: appEditors/AppGerberEditor.py:5497 appEditors/AppGerberEditor.py:5926 +#: appEditors/AppGerberEditor.py:5710 appEditors/AppGerberEditor.py:6139 #: appGUI/MainGUI.py:695 appGUI/MainGUI.py:1075 appGUI/MainGUI.py:2244 #: appTools/ToolTransform.py:85 msgid "Transform Tool" msgstr "Werkzeug Umwandeln" #: appEditors/AppGeoEditor.py:610 appEditors/AppGeoEditor.py:702 -#: appEditors/AppGerberEditor.py:5498 appEditors/AppGerberEditor.py:5590 +#: appEditors/AppGerberEditor.py:5711 appEditors/AppGerberEditor.py:5803 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:88 #: appTools/ToolTransform.py:508 appTools/ToolTransform.py:628 msgid "Rotate" msgstr "Drehen" -#: appEditors/AppGeoEditor.py:611 appEditors/AppGerberEditor.py:5499 +#: appEditors/AppGeoEditor.py:611 appEditors/AppGerberEditor.py:5712 #: appTools/ToolTransform.py:509 msgid "Skew/Shear" msgstr "Neigung/Schere" -#: appEditors/AppGeoEditor.py:612 appEditors/AppGerberEditor.py:5262 -#: appEditors/AppGerberEditor.py:5500 appGUI/MainGUI.py:776 +#: appEditors/AppGeoEditor.py:612 appEditors/AppGerberEditor.py:5469 +#: appEditors/AppGerberEditor.py:5713 appGUI/MainGUI.py:776 #: appGUI/MainGUI.py:1197 appGUI/MainGUI.py:1664 appGUI/MainGUI.py:2366 #: appGUI/MainGUI.py:4960 appGUI/ObjectUI.py:125 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:147 @@ -2385,13 +2413,13 @@ msgstr "Neigung/Schere" msgid "Scale" msgstr "Skalieren" -#: appEditors/AppGeoEditor.py:613 appEditors/AppGerberEditor.py:5501 +#: appEditors/AppGeoEditor.py:613 appEditors/AppGerberEditor.py:5714 #: appTools/ToolTransform.py:511 msgid "Mirror (Flip)" msgstr "Spiegeln (Flip)" -#: appEditors/AppGeoEditor.py:615 appEditors/AppGerberEditor.py:5221 -#: appEditors/AppGerberEditor.py:5503 appGUI/MainGUI.py:773 +#: appEditors/AppGeoEditor.py:615 appEditors/AppGerberEditor.py:5423 +#: appEditors/AppGerberEditor.py:5716 appGUI/MainGUI.py:773 #: appGUI/MainGUI.py:1195 appGUI/MainGUI.py:1619 appGUI/MainGUI.py:1662 #: appGUI/MainGUI.py:2364 appGUI/MainGUI.py:4951 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:212 @@ -2399,8 +2427,8 @@ msgstr "Spiegeln (Flip)" msgid "Buffer" msgstr "Puffer" -#: appEditors/AppGeoEditor.py:646 appEditors/AppGerberEditor.py:5534 -#: appGUI/GUIElements.py:3767 +#: appEditors/AppGeoEditor.py:646 appEditors/AppGerberEditor.py:5747 +#: appGUI/GUIElements.py:3770 #: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:169 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:44 #: appTools/ToolDblSided.py:684 appTools/ToolDblSided.py:860 @@ -2408,7 +2436,7 @@ msgstr "Puffer" msgid "Reference" msgstr "Referenz" -#: appEditors/AppGeoEditor.py:648 appEditors/AppGerberEditor.py:5536 +#: appEditors/AppGeoEditor.py:648 appEditors/AppGerberEditor.py:5749 msgid "" "The reference point for Rotate, Skew, Scale, Mirror.\n" "Can be:\n" @@ -2426,7 +2454,7 @@ msgstr "" "definiert ist\n" "- Min. Auswahl -> der Punkt (minx, miny) des Begrenzungsrahmens der Auswahl" -#: appEditors/AppGeoEditor.py:656 appEditors/AppGerberEditor.py:5544 +#: appEditors/AppGeoEditor.py:656 appEditors/AppGerberEditor.py:5757 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:54 #: appTools/ToolCalibration.py:126 appTools/ToolCalibration.py:127 #: appTools/ToolTransform.py:552 @@ -2434,18 +2462,18 @@ msgid "Origin" msgstr "Ursprung" #: appEditors/AppGeoEditor.py:656 appEditors/AppGeoEditor.py:1047 -#: appEditors/AppGerberEditor.py:5544 appEditors/AppGerberEditor.py:5935 +#: appEditors/AppGerberEditor.py:5757 appEditors/AppGerberEditor.py:6148 #: appGUI/preferences/general/GeneralGUIPrefGroupUI.py:250 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:285 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:309 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:256 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:54 -#: appTools/ToolIsolation.py:3473 appTools/ToolNCC.py:4410 +#: appTools/ToolIsolation.py:3469 appTools/ToolNCC.py:4410 #: appTools/ToolPaint.py:3104 appTools/ToolTransform.py:552 defaults.py:572 msgid "Selection" msgstr "Auswahl" -#: appEditors/AppGeoEditor.py:656 appEditors/AppGerberEditor.py:5544 +#: appEditors/AppGeoEditor.py:656 appEditors/AppGerberEditor.py:5757 #: appGUI/preferences/tools/Tools2sidedPrefGroupUI.py:85 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:54 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:60 @@ -2453,12 +2481,12 @@ msgstr "Auswahl" msgid "Point" msgstr "Punkt" -#: appEditors/AppGeoEditor.py:656 appEditors/AppGerberEditor.py:5544 +#: appEditors/AppGeoEditor.py:656 appEditors/AppGerberEditor.py:5757 msgid "Minimum" msgstr "Minimum" #: appEditors/AppGeoEditor.py:662 appEditors/AppGeoEditor.py:958 -#: appEditors/AppGerberEditor.py:5550 appEditors/AppGerberEditor.py:5846 +#: appEditors/AppGerberEditor.py:5763 appEditors/AppGerberEditor.py:6059 #: appGUI/preferences/tools/Tools2EDrillsPrefGroupUI.py:131 #: appGUI/preferences/tools/Tools2PunchGerberPrefGroupUI.py:133 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:243 @@ -2468,18 +2496,18 @@ msgstr "Minimum" msgid "Value" msgstr "Wert" -#: appEditors/AppGeoEditor.py:664 appEditors/AppGerberEditor.py:5552 +#: appEditors/AppGeoEditor.py:664 appEditors/AppGerberEditor.py:5765 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:62 #: appTools/ToolTransform.py:560 msgid "A point of reference in format X,Y." msgstr "Ein Bezugspunkt im Format X, Y." -#: appEditors/AppGeoEditor.py:673 appEditors/AppGerberEditor.py:5561 +#: appEditors/AppGeoEditor.py:673 appEditors/AppGerberEditor.py:5774 #: appTools/ToolTransform.py:569 msgid "Add point coordinates from clipboard." msgstr "Punktkoordinaten aus der Zwischenablage hinzufügen." -#: appEditors/AppGeoEditor.py:688 appEditors/AppGerberEditor.py:5576 +#: appEditors/AppGeoEditor.py:688 appEditors/AppGerberEditor.py:5789 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:98 #: appTools/ToolTransform.py:614 msgid "" @@ -2493,7 +2521,7 @@ msgstr "" "Positive Zahlen für CW-Bewegung.\n" "Negative Zahlen für CCW-Bewegung." -#: appEditors/AppGeoEditor.py:704 appEditors/AppGerberEditor.py:5592 +#: appEditors/AppGeoEditor.py:704 appEditors/AppGerberEditor.py:5805 #: appTools/ToolTransform.py:630 msgid "" "Rotate the selected object(s).\n" @@ -2505,7 +2533,7 @@ msgstr "" "der Begrenzungsrahmen für alle ausgewählten Objekte." #: appEditors/AppGeoEditor.py:724 appEditors/AppGeoEditor.py:786 -#: appEditors/AppGerberEditor.py:5612 appEditors/AppGerberEditor.py:5674 +#: appEditors/AppGerberEditor.py:5825 appEditors/AppGerberEditor.py:5887 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:112 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:151 #: appTools/ToolTransform.py:650 appTools/ToolTransform.py:712 @@ -2513,7 +2541,7 @@ msgid "Link" msgstr "Verknüpfung" #: appEditors/AppGeoEditor.py:726 appEditors/AppGeoEditor.py:788 -#: appEditors/AppGerberEditor.py:5614 appEditors/AppGerberEditor.py:5676 +#: appEditors/AppGerberEditor.py:5827 appEditors/AppGerberEditor.py:5889 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:114 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:153 #: appTools/ToolTransform.py:652 appTools/ToolTransform.py:714 @@ -2522,7 +2550,7 @@ msgstr "" "Verknüpfen Sie den Y-Eintrag mit dem X-Eintrag und kopieren Sie dessen " "Inhalt." -#: appEditors/AppGeoEditor.py:731 appEditors/AppGerberEditor.py:5619 +#: appEditors/AppGeoEditor.py:731 appEditors/AppGerberEditor.py:5832 #: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:151 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:124 #: appTools/ToolFilm.py:1046 appTools/ToolTransform.py:657 @@ -2530,7 +2558,7 @@ msgid "X angle" msgstr "X Winkel" #: appEditors/AppGeoEditor.py:733 appEditors/AppGeoEditor.py:754 -#: appEditors/AppGerberEditor.py:5621 appEditors/AppGerberEditor.py:5642 +#: appEditors/AppGerberEditor.py:5834 appEditors/AppGerberEditor.py:5855 #: appTools/ToolTransform.py:659 appTools/ToolTransform.py:680 msgid "" "Angle for Skew action, in degrees.\n" @@ -2539,13 +2567,13 @@ msgstr "" "Winkel für Schrägstellung in Grad.\n" "Gleitkommazahl zwischen -360 und 360." -#: appEditors/AppGeoEditor.py:741 appEditors/AppGerberEditor.py:5629 +#: appEditors/AppGeoEditor.py:741 appEditors/AppGerberEditor.py:5842 #: appTools/ToolTransform.py:667 msgid "Skew X" msgstr "Neigung X" #: appEditors/AppGeoEditor.py:743 appEditors/AppGeoEditor.py:764 -#: appEditors/AppGerberEditor.py:5631 appEditors/AppGerberEditor.py:5652 +#: appEditors/AppGerberEditor.py:5844 appEditors/AppGerberEditor.py:5865 #: appTools/ToolTransform.py:669 appTools/ToolTransform.py:690 msgid "" "Skew/shear the selected object(s).\n" @@ -2556,38 +2584,38 @@ msgstr "" "Der Bezugspunkt ist die Mitte von\n" "der Begrenzungsrahmen für alle ausgewählten Objekte." -#: appEditors/AppGeoEditor.py:752 appEditors/AppGerberEditor.py:5640 +#: appEditors/AppGeoEditor.py:752 appEditors/AppGerberEditor.py:5853 #: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:160 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:138 #: appTools/ToolFilm.py:1055 appTools/ToolTransform.py:678 msgid "Y angle" msgstr "Y Winkel" -#: appEditors/AppGeoEditor.py:762 appEditors/AppGerberEditor.py:5650 +#: appEditors/AppGeoEditor.py:762 appEditors/AppGerberEditor.py:5863 #: appTools/ToolTransform.py:688 msgid "Skew Y" msgstr "Neigung Y" -#: appEditors/AppGeoEditor.py:793 appEditors/AppGerberEditor.py:5681 +#: appEditors/AppGeoEditor.py:793 appEditors/AppGerberEditor.py:5894 #: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:120 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:162 #: appTools/ToolFilm.py:1002 appTools/ToolTransform.py:719 msgid "X factor" msgstr "X Faktor" -#: appEditors/AppGeoEditor.py:795 appEditors/AppGerberEditor.py:5683 +#: appEditors/AppGeoEditor.py:795 appEditors/AppGerberEditor.py:5896 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:164 #: appTools/ToolTransform.py:721 msgid "Factor for scaling on X axis." msgstr "Faktor für die Skalierung auf der X-Achse." -#: appEditors/AppGeoEditor.py:802 appEditors/AppGerberEditor.py:5690 +#: appEditors/AppGeoEditor.py:802 appEditors/AppGerberEditor.py:5903 #: appTools/ToolTransform.py:728 msgid "Scale X" msgstr "Maßstab X" #: appEditors/AppGeoEditor.py:804 appEditors/AppGeoEditor.py:824 -#: appEditors/AppGerberEditor.py:5692 appEditors/AppGerberEditor.py:5712 +#: appEditors/AppGerberEditor.py:5905 appEditors/AppGerberEditor.py:5925 #: appTools/ToolTransform.py:730 appTools/ToolTransform.py:750 msgid "" "Scale the selected object(s).\n" @@ -2598,59 +2626,59 @@ msgstr "" "Der Bezugspunkt hängt von ab\n" "das Kontrollkästchen Skalenreferenz." -#: appEditors/AppGeoEditor.py:813 appEditors/AppGerberEditor.py:5701 +#: appEditors/AppGeoEditor.py:813 appEditors/AppGerberEditor.py:5914 #: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:129 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:175 #: appTools/ToolFilm.py:1011 appTools/ToolTransform.py:739 msgid "Y factor" msgstr "Y Faktor" -#: appEditors/AppGeoEditor.py:815 appEditors/AppGerberEditor.py:5703 +#: appEditors/AppGeoEditor.py:815 appEditors/AppGerberEditor.py:5916 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:177 #: appTools/ToolTransform.py:741 msgid "Factor for scaling on Y axis." msgstr "Faktor für die Skalierung auf der Y-Achse." -#: appEditors/AppGeoEditor.py:822 appEditors/AppGerberEditor.py:5710 +#: appEditors/AppGeoEditor.py:822 appEditors/AppGerberEditor.py:5923 #: appTools/ToolTransform.py:748 msgid "Scale Y" msgstr "Maßstab Y" -#: appEditors/AppGeoEditor.py:849 appEditors/AppGerberEditor.py:5737 +#: appEditors/AppGeoEditor.py:849 appEditors/AppGerberEditor.py:5950 #: appTools/ToolTransform.py:775 msgid "Flip on X" msgstr "Flip auf X" #: appEditors/AppGeoEditor.py:851 appEditors/AppGeoEditor.py:856 -#: appEditors/AppGerberEditor.py:5739 appEditors/AppGerberEditor.py:5744 +#: appEditors/AppGerberEditor.py:5952 appEditors/AppGerberEditor.py:5957 #: appTools/ToolTransform.py:777 appTools/ToolTransform.py:782 msgid "Flip the selected object(s) over the X axis." msgstr "Drehen Sie die ausgewählten Objekte über die X-Achse." -#: appEditors/AppGeoEditor.py:854 appEditors/AppGerberEditor.py:5742 +#: appEditors/AppGeoEditor.py:854 appEditors/AppGerberEditor.py:5955 #: appTools/ToolTransform.py:780 msgid "Flip on Y" msgstr "Flip auf Y" -#: appEditors/AppGeoEditor.py:874 appEditors/AppGerberEditor.py:5762 +#: appEditors/AppGeoEditor.py:874 appEditors/AppGerberEditor.py:5975 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:191 #: appTools/ToolTransform.py:800 msgid "X val" msgstr "X-Wert" -#: appEditors/AppGeoEditor.py:876 appEditors/AppGerberEditor.py:5764 +#: appEditors/AppGeoEditor.py:876 appEditors/AppGerberEditor.py:5977 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:193 #: appTools/ToolTransform.py:802 msgid "Distance to offset on X axis. In current units." msgstr "Abstand zum Offset auf der X-Achse. In aktuellen Einheiten." -#: appEditors/AppGeoEditor.py:883 appEditors/AppGerberEditor.py:5771 +#: appEditors/AppGeoEditor.py:883 appEditors/AppGerberEditor.py:5984 #: appTools/ToolTransform.py:809 msgid "Offset X" msgstr "Versatz X" #: appEditors/AppGeoEditor.py:885 appEditors/AppGeoEditor.py:905 -#: appEditors/AppGerberEditor.py:5773 appEditors/AppGerberEditor.py:5793 +#: appEditors/AppGerberEditor.py:5986 appEditors/AppGerberEditor.py:6006 #: appTools/ToolTransform.py:811 appTools/ToolTransform.py:831 msgid "" "Offset the selected object(s).\n" @@ -2661,24 +2689,24 @@ msgstr "" "Der Bezugspunkt ist die Mitte von\n" "der Begrenzungsrahmen für alle ausgewählten Objekte.\n" -#: appEditors/AppGeoEditor.py:894 appEditors/AppGerberEditor.py:5782 +#: appEditors/AppGeoEditor.py:894 appEditors/AppGerberEditor.py:5995 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:204 #: appTools/ToolTransform.py:820 msgid "Y val" msgstr "Y-Wert" -#: appEditors/AppGeoEditor.py:896 appEditors/AppGerberEditor.py:5784 +#: appEditors/AppGeoEditor.py:896 appEditors/AppGerberEditor.py:5997 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:206 #: appTools/ToolTransform.py:822 msgid "Distance to offset on Y axis. In current units." msgstr "Abstand zum Offset auf der Y-Achse. In aktuellen Einheiten." -#: appEditors/AppGeoEditor.py:903 appEditors/AppGerberEditor.py:5791 +#: appEditors/AppGeoEditor.py:903 appEditors/AppGerberEditor.py:6004 #: appTools/ToolTransform.py:829 msgid "Offset Y" msgstr "Versatz Y" -#: appEditors/AppGeoEditor.py:923 appEditors/AppGerberEditor.py:5811 +#: appEditors/AppGeoEditor.py:923 appEditors/AppGerberEditor.py:6024 #: appGUI/ObjectUI.py:462 appGUI/ObjectUI.py:499 #: appGUI/preferences/tools/Tools2InvertPrefGroupUI.py:67 #: appGUI/preferences/tools/Tools2QRCodePrefGroupUI.py:142 @@ -2688,7 +2716,7 @@ msgstr "Versatz Y" msgid "Rounded" msgstr "Agberundet" -#: appEditors/AppGeoEditor.py:925 appEditors/AppGerberEditor.py:5813 +#: appEditors/AppGeoEditor.py:925 appEditors/AppGerberEditor.py:6026 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:218 #: appTools/ToolTransform.py:851 msgid "" @@ -2702,14 +2730,14 @@ msgstr "" "Wenn nicht markiert, folgt der Puffer der exakten Geometrie\n" "der gepufferten Form." -#: appEditors/AppGeoEditor.py:933 appEditors/AppGerberEditor.py:5821 +#: appEditors/AppGeoEditor.py:933 appEditors/AppGerberEditor.py:6034 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:226 #: appTools/ToolDistance.py:409 appTools/ToolDistanceMin.py:199 #: appTools/ToolTransform.py:859 msgid "Distance" msgstr "Entfernung" -#: appEditors/AppGeoEditor.py:935 appEditors/AppGerberEditor.py:5823 +#: appEditors/AppGeoEditor.py:935 appEditors/AppGerberEditor.py:6036 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:228 #: appTools/ToolTransform.py:861 msgid "" @@ -2723,12 +2751,12 @@ msgstr "" "Jedes Geometrieelement des Objekts wird vergrößert\n" "oder mit der \"Entfernung\" verringert." -#: appEditors/AppGeoEditor.py:947 appEditors/AppGerberEditor.py:5835 +#: appEditors/AppGeoEditor.py:947 appEditors/AppGerberEditor.py:6048 #: appTools/ToolTransform.py:873 msgid "Buffer D" msgstr "Puffer E" -#: appEditors/AppGeoEditor.py:949 appEditors/AppGerberEditor.py:5837 +#: appEditors/AppGeoEditor.py:949 appEditors/AppGerberEditor.py:6050 #: appTools/ToolTransform.py:875 msgid "" "Create the buffer effect on each geometry,\n" @@ -2737,7 +2765,7 @@ msgstr "" "Erstellen Sie den Puffereffekt für jede Geometrie.\n" "Element aus dem ausgewählten Objekt unter Verwendung des Abstands." -#: appEditors/AppGeoEditor.py:960 appEditors/AppGerberEditor.py:5848 +#: appEditors/AppGeoEditor.py:960 appEditors/AppGerberEditor.py:6061 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:245 #: appTools/ToolTransform.py:886 msgid "" @@ -2753,12 +2781,12 @@ msgstr "" "oder verringert, um dem 'Wert' zu entsprechen. Wert ist ein Prozentsatz\n" "der ursprünglichen Dimension." -#: appEditors/AppGeoEditor.py:973 appEditors/AppGerberEditor.py:5861 +#: appEditors/AppGeoEditor.py:973 appEditors/AppGerberEditor.py:6074 #: appTools/ToolTransform.py:899 msgid "Buffer F" msgstr "Puffer F" -#: appEditors/AppGeoEditor.py:975 appEditors/AppGerberEditor.py:5863 +#: appEditors/AppGeoEditor.py:975 appEditors/AppGerberEditor.py:6076 #: appTools/ToolTransform.py:901 msgid "" "Create the buffer effect on each geometry,\n" @@ -2767,7 +2795,7 @@ msgstr "" "Erstellen Sie den Puffereffekt für jede Geometrie.\n" "Element aus dem ausgewählten Objekt unter Verwendung des Faktors." -#: appEditors/AppGeoEditor.py:1046 appEditors/AppGerberEditor.py:5934 +#: appEditors/AppGeoEditor.py:1046 appEditors/AppGerberEditor.py:6147 #: appGUI/ObjectUI.py:1555 appGUI/preferences/tools/Tools2CalPrefGroupUI.py:48 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:54 #: appGUI/preferences/tools/ToolsTransformPrefGroupUI.py:70 @@ -2778,19 +2806,19 @@ msgstr "" msgid "Object" msgstr "Objekt" -#: appEditors/AppGeoEditor.py:1118 appEditors/AppGerberEditor.py:6006 +#: appEditors/AppGeoEditor.py:1118 appEditors/AppGerberEditor.py:6219 #: appTools/ToolTransform.py:150 msgid "Incorrect format for Point value. Needs format X,Y" msgstr "Falsches Format für Punktwert. Benötigt Format X, Y" -#: appEditors/AppGeoEditor.py:1143 appEditors/AppGerberEditor.py:6031 +#: appEditors/AppGeoEditor.py:1143 appEditors/AppGerberEditor.py:6244 #: appTools/ToolTransform.py:167 msgid "Rotate transformation can not be done for a value of 0." msgstr "" "Bei einem Wert von 0 kann keine Rotationstransformation durchgeführt werden." #: appEditors/AppGeoEditor.py:1201 appEditors/AppGeoEditor.py:1222 -#: appEditors/AppGerberEditor.py:6089 appEditors/AppGerberEditor.py:6110 +#: appEditors/AppGerberEditor.py:6302 appEditors/AppGerberEditor.py:6323 #: appTools/ToolTransform.py:225 appTools/ToolTransform.py:246 msgid "Scale transformation can not be done for a factor of 0 or 1." msgstr "" @@ -2798,13 +2826,13 @@ msgstr "" "durchgeführt werden." #: appEditors/AppGeoEditor.py:1235 appEditors/AppGeoEditor.py:1244 -#: appEditors/AppGerberEditor.py:6123 appEditors/AppGerberEditor.py:6132 +#: appEditors/AppGerberEditor.py:6336 appEditors/AppGerberEditor.py:6345 #: appTools/ToolTransform.py:259 appTools/ToolTransform.py:268 msgid "Offset transformation can not be done for a value of 0." msgstr "" "Bei einem Wert von 0 kann keine Offset-Transformation durchgeführt werden." -#: appEditors/AppGeoEditor.py:1274 appEditors/AppGerberEditor.py:6169 +#: appEditors/AppGeoEditor.py:1274 appEditors/AppGerberEditor.py:6382 #: appTools/ToolTransform.py:296 msgid "Appying Rotate" msgstr "Anwenden Drehen" @@ -2812,9 +2840,9 @@ msgstr "Anwenden Drehen" #: appEditors/AppGeoEditor.py:1289 appEditors/AppGeoEditor.py:1322 #: appEditors/AppGeoEditor.py:1356 appEditors/AppGeoEditor.py:1390 #: appEditors/AppGeoEditor.py:1423 appEditors/AppGeoEditor.py:1444 -#: appEditors/AppGerberEditor.py:6183 appEditors/AppGerberEditor.py:6225 -#: appEditors/AppGerberEditor.py:6265 appEditors/AppGerberEditor.py:6304 -#: appEditors/AppGerberEditor.py:6348 appEditors/AppGerberEditor.py:6384 +#: appEditors/AppGerberEditor.py:6396 appEditors/AppGerberEditor.py:6438 +#: appEditors/AppGerberEditor.py:6478 appEditors/AppGerberEditor.py:6517 +#: appEditors/AppGerberEditor.py:6561 appEditors/AppGerberEditor.py:6597 #: appTools/ToolTransform.py:311 appTools/ToolTransform.py:351 #: appTools/ToolTransform.py:382 appTools/ToolTransform.py:409 #: appTools/ToolTransform.py:438 appTools/ToolTransform.py:473 app_Main.py:6049 @@ -2822,108 +2850,108 @@ msgstr "Anwenden Drehen" msgid "Action was not executed" msgstr "Aktion wurde nicht ausgeführt" -#: appEditors/AppGeoEditor.py:1307 appEditors/AppGerberEditor.py:6202 +#: appEditors/AppGeoEditor.py:1307 appEditors/AppGerberEditor.py:6415 #: appTools/ToolTransform.py:321 msgid "Applying Flip" msgstr "Flip anwenden" -#: appEditors/AppGeoEditor.py:1315 appEditors/AppGerberEditor.py:6214 +#: appEditors/AppGeoEditor.py:1315 appEditors/AppGerberEditor.py:6427 #: appTools/ToolTransform.py:338 app_Main.py:6047 msgid "Flip on Y axis done" msgstr "Flip auf Y-Achse fertig" -#: appEditors/AppGeoEditor.py:1318 appEditors/AppGerberEditor.py:6222 +#: appEditors/AppGeoEditor.py:1318 appEditors/AppGerberEditor.py:6435 #: appTools/ToolTransform.py:347 app_Main.py:6093 msgid "Flip on X axis done" msgstr "Flip auf X-Achse fertig" -#: appEditors/AppGeoEditor.py:1342 appEditors/AppGerberEditor.py:6245 +#: appEditors/AppGeoEditor.py:1342 appEditors/AppGerberEditor.py:6458 #: appTools/ToolTransform.py:366 msgid "Applying Skew" msgstr "Schräglauf anwenden" -#: appEditors/AppGeoEditor.py:1351 appEditors/AppGerberEditor.py:6261 +#: appEditors/AppGeoEditor.py:1351 appEditors/AppGerberEditor.py:6474 msgid "Skew on the X axis done" msgstr "Schrägstellung auf der X-Achse erfolgt" -#: appEditors/AppGeoEditor.py:1353 appEditors/AppGerberEditor.py:6263 +#: appEditors/AppGeoEditor.py:1353 appEditors/AppGerberEditor.py:6476 msgid "Skew on the Y axis done" msgstr "Schrägstellung auf der Y-Achse erfolgt" -#: appEditors/AppGeoEditor.py:1377 appEditors/AppGerberEditor.py:6286 +#: appEditors/AppGeoEditor.py:1377 appEditors/AppGerberEditor.py:6499 #: appTools/ToolTransform.py:392 msgid "Applying Scale" msgstr "Maßstab anwenden" -#: appEditors/AppGeoEditor.py:1386 appEditors/AppGerberEditor.py:6299 +#: appEditors/AppGeoEditor.py:1386 appEditors/AppGerberEditor.py:6512 msgid "Scale on the X axis done" msgstr "Skalieren auf der X-Achse erledigt" -#: appEditors/AppGeoEditor.py:1388 appEditors/AppGerberEditor.py:6301 +#: appEditors/AppGeoEditor.py:1388 appEditors/AppGerberEditor.py:6514 msgid "Scale on the Y axis done" msgstr "Skalieren auf der Y-Achse erledigt" -#: appEditors/AppGeoEditor.py:1408 appEditors/AppGerberEditor.py:6322 +#: appEditors/AppGeoEditor.py:1408 appEditors/AppGerberEditor.py:6535 #: appTools/ToolTransform.py:419 msgid "Applying Offset" msgstr "Offsetdruck anwenden" #: appEditors/AppGeoEditor.py:1418 appEditors/AppGeoEditor.py:1476 -#: appEditors/AppGerberEditor.py:6343 appEditors/AppGerberEditor.py:6416 +#: appEditors/AppGerberEditor.py:6556 appEditors/AppGerberEditor.py:6629 msgid "Offset on the X axis done" msgstr "Versatz auf der X-Achse erfolgt" -#: appEditors/AppGeoEditor.py:1420 appEditors/AppGerberEditor.py:6345 +#: appEditors/AppGeoEditor.py:1420 appEditors/AppGerberEditor.py:6558 msgid "Offset on the Y axis done" msgstr "Versatz auf der Y-Achse erfolgt" -#: appEditors/AppGeoEditor.py:1433 appEditors/AppGerberEditor.py:6358 +#: appEditors/AppGeoEditor.py:1433 appEditors/AppGerberEditor.py:6571 #: appTools/ToolTransform.py:448 msgid "Applying Buffer" msgstr "Anwenden von Puffer" -#: appEditors/AppGeoEditor.py:1440 appEditors/AppGerberEditor.py:6380 +#: appEditors/AppGeoEditor.py:1440 appEditors/AppGerberEditor.py:6593 #: appTools/ToolTransform.py:469 msgid "Buffer done" msgstr "Puffer fertig" -#: appEditors/AppGeoEditor.py:1448 appEditors/AppGerberEditor.py:6388 +#: appEditors/AppGeoEditor.py:1448 appEditors/AppGerberEditor.py:6601 msgid "Rotate ..." msgstr "Drehen ..." #: appEditors/AppGeoEditor.py:1449 appEditors/AppGeoEditor.py:1501 -#: appEditors/AppGeoEditor.py:1517 appEditors/AppGerberEditor.py:6389 -#: appEditors/AppGerberEditor.py:6441 appEditors/AppGerberEditor.py:6457 +#: appEditors/AppGeoEditor.py:1517 appEditors/AppGerberEditor.py:6602 +#: appEditors/AppGerberEditor.py:6654 appEditors/AppGerberEditor.py:6670 msgid "Enter an Angle Value (degrees)" msgstr "Geben Sie einen Winkelwert (Grad) ein" -#: appEditors/AppGeoEditor.py:1458 appEditors/AppGerberEditor.py:6398 +#: appEditors/AppGeoEditor.py:1458 appEditors/AppGerberEditor.py:6611 #: appTools/ToolTransform.py:309 msgid "Rotate done" msgstr "Fertig drehen" -#: appEditors/AppGeoEditor.py:1461 appEditors/AppGerberEditor.py:6401 +#: appEditors/AppGeoEditor.py:1461 appEditors/AppGerberEditor.py:6614 msgid "Rotate cancelled" msgstr "Abbrechen abgebrochen" -#: appEditors/AppGeoEditor.py:1466 appEditors/AppGerberEditor.py:6406 +#: appEditors/AppGeoEditor.py:1466 appEditors/AppGerberEditor.py:6619 msgid "Offset on X axis ..." msgstr "Versatz auf der X-Achse ..." #: appEditors/AppGeoEditor.py:1467 appEditors/AppGeoEditor.py:1485 -#: appEditors/AppGerberEditor.py:6407 appEditors/AppGerberEditor.py:6425 +#: appEditors/AppGerberEditor.py:6620 appEditors/AppGerberEditor.py:6638 msgid "Enter a distance Value" msgstr "Geben Sie einen Abstandswert ein" -#: appEditors/AppGeoEditor.py:1479 appEditors/AppGerberEditor.py:6419 +#: appEditors/AppGeoEditor.py:1479 appEditors/AppGerberEditor.py:6632 msgid "Offset X cancelled" msgstr "Offset X abgebrochen" -#: appEditors/AppGeoEditor.py:1484 appEditors/AppGerberEditor.py:6424 +#: appEditors/AppGeoEditor.py:1484 appEditors/AppGerberEditor.py:6637 msgid "Offset on Y axis ..." msgstr "Versatz auf der Y-Achse ..." -#: appEditors/AppGeoEditor.py:1494 appEditors/AppGerberEditor.py:6434 +#: appEditors/AppGeoEditor.py:1494 appEditors/AppGerberEditor.py:6647 msgid "Offset on Y axis done" msgstr "Versatz auf Y-Achse erledigt" @@ -2931,11 +2959,11 @@ msgstr "Versatz auf Y-Achse erledigt" msgid "Offset on the Y axis canceled" msgstr "Versatz auf der Y-Achse aufgehoben" -#: appEditors/AppGeoEditor.py:1500 appEditors/AppGerberEditor.py:6440 +#: appEditors/AppGeoEditor.py:1500 appEditors/AppGerberEditor.py:6653 msgid "Skew on X axis ..." msgstr "Neigung auf der X-Achse ..." -#: appEditors/AppGeoEditor.py:1510 appEditors/AppGerberEditor.py:6450 +#: appEditors/AppGeoEditor.py:1510 appEditors/AppGerberEditor.py:6663 msgid "Skew on X axis done" msgstr "Neigung auf X-Achse erledigt" @@ -2943,11 +2971,11 @@ msgstr "Neigung auf X-Achse erledigt" msgid "Skew on X axis canceled" msgstr "Neigung auf X-Achse abgebrochen" -#: appEditors/AppGeoEditor.py:1516 appEditors/AppGerberEditor.py:6456 +#: appEditors/AppGeoEditor.py:1516 appEditors/AppGerberEditor.py:6669 msgid "Skew on Y axis ..." msgstr "Neigung auf der Y-Achse ..." -#: appEditors/AppGeoEditor.py:1526 appEditors/AppGerberEditor.py:6466 +#: appEditors/AppGeoEditor.py:1526 appEditors/AppGerberEditor.py:6679 msgid "Skew on Y axis done" msgstr "Neigung auf Y-Achse erledigt" @@ -2956,47 +2984,47 @@ msgid "Skew on Y axis canceled" msgstr "Neigung auf Y-Achse aufgehoben" #: appEditors/AppGeoEditor.py:1960 appEditors/AppGeoEditor.py:2031 -#: appEditors/AppGerberEditor.py:1525 appEditors/AppGerberEditor.py:1608 +#: appEditors/AppGerberEditor.py:1665 appEditors/AppGerberEditor.py:1748 msgid "Click on Center point ..." msgstr "Klicken Sie auf Mittelpunkt." -#: appEditors/AppGeoEditor.py:1973 appEditors/AppGerberEditor.py:1535 +#: appEditors/AppGeoEditor.py:1973 appEditors/AppGerberEditor.py:1675 msgid "Click on Perimeter point to complete ..." msgstr "Klicken Sie auf Umfangspunkt, um den Vorgang abzuschließen." -#: appEditors/AppGeoEditor.py:2059 appEditors/AppGerberEditor.py:1656 +#: appEditors/AppGeoEditor.py:2059 appEditors/AppGerberEditor.py:1796 msgid "Click on Start point ..." msgstr "Klicken Sie auf Startpunkt ..." -#: appEditors/AppGeoEditor.py:2061 appEditors/AppGerberEditor.py:1658 +#: appEditors/AppGeoEditor.py:2061 appEditors/AppGerberEditor.py:1798 msgid "Click on Point3 ..." msgstr "Klicken Sie auf Punkt3 ..." -#: appEditors/AppGeoEditor.py:2063 appEditors/AppGerberEditor.py:1660 +#: appEditors/AppGeoEditor.py:2063 appEditors/AppGerberEditor.py:1800 msgid "Click on Stop point ..." msgstr "Klicken Sie auf Haltepunkt ..." -#: appEditors/AppGeoEditor.py:2068 appEditors/AppGerberEditor.py:1665 +#: appEditors/AppGeoEditor.py:2068 appEditors/AppGerberEditor.py:1805 msgid "Click on Stop point to complete ..." msgstr "Klicken Sie auf Stopp, um den Vorgang abzuschließen." -#: appEditors/AppGeoEditor.py:2070 appEditors/AppGerberEditor.py:1667 +#: appEditors/AppGeoEditor.py:2070 appEditors/AppGerberEditor.py:1807 msgid "Click on Point2 to complete ..." msgstr "Klicken Sie auf Punkt2, um den Vorgang abzuschließen." -#: appEditors/AppGeoEditor.py:2072 appEditors/AppGerberEditor.py:1669 +#: appEditors/AppGeoEditor.py:2072 appEditors/AppGerberEditor.py:1809 msgid "Click on Center point to complete ..." msgstr "Klicken Sie auf Mittelpunkt, um den Vorgang abzuschließen." -#: appEditors/AppGeoEditor.py:2098 appEditors/AppGerberEditor.py:1695 +#: appEditors/AppGeoEditor.py:2098 appEditors/AppGerberEditor.py:1835 msgid "Mode: Start -> Stop -> Center. Click on Start point ..." msgstr "Modus: Start -> Stopp -> Zentrieren. Klicken Sie auf Startpunkt ..." -#: appEditors/AppGeoEditor.py:2101 appEditors/AppGerberEditor.py:1698 +#: appEditors/AppGeoEditor.py:2101 appEditors/AppGerberEditor.py:1838 msgid "Mode: Point1 -> Point3 -> Point2. Click on Point1 ..." msgstr "Modus: Punkt 1 -> Punkt 3 -> Punkt 2. Klicken Sie auf Punkt1 ..." -#: appEditors/AppGeoEditor.py:2104 appEditors/AppGerberEditor.py:1701 +#: appEditors/AppGeoEditor.py:2104 appEditors/AppGerberEditor.py:1841 msgid "Mode: Center -> Start -> Stop. Click on Center point ..." msgstr "Modus: Mitte -> Start -> Stopp. Klicken Sie auf Mittelpunkt." @@ -3010,7 +3038,7 @@ msgstr "" "Klicken Sie auf die gegenüberliegende Ecke, um den Vorgang abzuschließen." #: appEditors/AppGeoEditor.py:2407 appEditors/AppGeoEditor.py:2472 -#: appEditors/AppGerberEditor.py:1148 appEditors/AppGerberEditor.py:1387 +#: appEditors/AppGerberEditor.py:1270 appEditors/AppGerberEditor.py:1523 msgid "Backtracked one point ..." msgstr "Einen Punkt zurückverfolgt ..." @@ -3022,7 +3050,7 @@ msgstr "Klicken Sie auf den Zielpunkt ..." msgid "Moving ..." msgstr "Ziehen um ..." -#: appEditors/AppGeoEditor.py:2885 appEditors/AppGerberEditor.py:941 +#: appEditors/AppGeoEditor.py:2885 appEditors/AppGerberEditor.py:1013 msgid "Click on 1st point ..." msgstr "Klicken Sie auf den 1. Punkt ..." @@ -3042,16 +3070,16 @@ msgstr "Kein Text zum Hinzufügen." msgid "Create buffer geometry ..." msgstr "Puffergeometrie erstellen ..." -#: appEditors/AppGeoEditor.py:3104 appEditors/AppGerberEditor.py:2264 +#: appEditors/AppGeoEditor.py:3104 appEditors/AppGerberEditor.py:2404 msgid "Select a shape to act as deletion area ..." msgstr "Wählen Sie eine Form als Löschbereich aus ..." #: appEditors/AppGeoEditor.py:3106 appEditors/AppGeoEditor.py:3132 -#: appEditors/AppGeoEditor.py:3138 appEditors/AppGerberEditor.py:2266 +#: appEditors/AppGeoEditor.py:3138 appEditors/AppGerberEditor.py:2406 msgid "Click to pick-up the erase shape..." msgstr "Klicken Sie, um die Löschform aufzunehmen ..." -#: appEditors/AppGeoEditor.py:3142 appEditors/AppGerberEditor.py:2325 +#: appEditors/AppGeoEditor.py:3142 appEditors/AppGerberEditor.py:2465 msgid "Click to erase ..." msgstr "Klicken zum Löschen ..." @@ -3059,7 +3087,7 @@ msgstr "Klicken zum Löschen ..." msgid "Create Paint geometry ..." msgstr "Malen geometrie erstellen ..." -#: appEditors/AppGeoEditor.py:3234 appEditors/AppGerberEditor.py:2588 +#: appEditors/AppGeoEditor.py:3234 appEditors/AppGerberEditor.py:2731 msgid "Shape transformations ..." msgstr "Formtransformationen ..." @@ -3068,16 +3096,6 @@ msgstr "Formtransformationen ..." msgid "Geometry Editor" msgstr "Geo-Editor" -#: appEditors/AppGeoEditor.py:3296 appEditors/AppGerberEditor.py:3664 -#: appEditors/AppGerberEditor.py:5067 appEditors/appGCodeEditor.py:687 -#: appGUI/ObjectUI.py:316 appGUI/ObjectUI.py:999 appGUI/ObjectUI.py:2032 -#: appGUI/preferences/tools/ToolsCornersPrefGroupUI.py:42 -#: appTools/ToolCorners.py:546 appTools/ToolCutOut.py:2030 -#: appTools/ToolDblSided.py:522 appTools/ToolPunchGerber.py:1088 -#: appTools/ToolTransform.py:574 -msgid "Type" -msgstr "Typ" - #: appEditors/AppGeoEditor.py:3584 msgid "Ring" msgstr "Ring" @@ -3093,9 +3111,9 @@ msgstr "Linie" #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:309 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:326 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:290 -#: appTools/ToolDrilling.py:2589 appTools/ToolIsolation.py:3536 -#: appTools/ToolMilling.py:2265 appTools/ToolNCC.py:4455 -#: appTools/ToolPaint.py:3158 +#: appTools/ToolDrilling.py:2589 appTools/ToolIsolation.py:3524 +#: appTools/ToolMilling.py:2265 appTools/ToolNCC.py:4449 +#: appTools/ToolPaint.py:3154 msgid "Polygon" msgstr "Polygon" @@ -3197,8 +3215,8 @@ msgstr "" "aus. Oder eine andere Malmethode" #: appEditors/AppGerberEditor.py:212 appEditors/AppGerberEditor.py:418 -#: appEditors/AppGerberEditor.py:909 appEditors/AppGerberEditor.py:1224 -#: appEditors/AppGerberEditor.py:1502 appEditors/AppGerberEditor.py:1625 +#: appEditors/AppGerberEditor.py:981 appEditors/AppGerberEditor.py:1346 +#: appEditors/AppGerberEditor.py:1642 appEditors/AppGerberEditor.py:1765 msgid "You need to preselect a aperture in the Aperture Table that has a size." msgstr "" "Sie müssen eine Blende in der Blendentabelle mit einer Größe vorwählen." @@ -3207,7 +3225,7 @@ msgstr "" msgid "Aperture size is zero. It needs to be greater than zero." msgstr "Die Größe der Blende ist Null. Es muss größer als Null sein." -#: appEditors/AppGerberEditor.py:378 appEditors/AppGerberEditor.py:694 +#: appEditors/AppGerberEditor.py:378 appEditors/AppGerberEditor.py:734 msgid "" "Incompatible aperture type. Select an aperture with type 'C', 'R' or 'O'." msgstr "" @@ -3218,80 +3236,80 @@ msgstr "" msgid "Click on the Pad Circular Array Start position" msgstr "Klicken Sie auf die Startposition des Pad-Kreis-Arrays" -#: appEditors/AppGerberEditor.py:792 +#: appEditors/AppGerberEditor.py:864 msgid "Select shape(s) and then click ..." msgstr "Wählen Sie die Form (en) aus und klicken Sie dann auf ..." -#: appEditors/AppGerberEditor.py:804 +#: appEditors/AppGerberEditor.py:876 msgid "Failed. Nothing selected." msgstr "Gescheitert. Nichts ausgewählt." -#: appEditors/AppGerberEditor.py:820 +#: appEditors/AppGerberEditor.py:892 msgid "" "Failed. Poligonize works only on geometries belonging to the same aperture." msgstr "" "Gescheitert. Poligonize funktioniert nur bei Geometrien, die zur selben " "Apertur gehören." -#: appEditors/AppGerberEditor.py:939 appEditors/AppGerberEditor.py:1165 -#: appEditors/AppGerberEditor.py:1189 +#: appEditors/AppGerberEditor.py:1011 appEditors/AppGerberEditor.py:1287 +#: appEditors/AppGerberEditor.py:1311 msgid "Corner Mode 1: 45 degrees ..." msgstr "Eckmodus 1: 45 Grad ..." -#: appEditors/AppGerberEditor.py:1153 appEditors/AppGerberEditor.py:1186 +#: appEditors/AppGerberEditor.py:1275 appEditors/AppGerberEditor.py:1308 msgid "Corner Mode 2: Reverse 45 degrees ..." msgstr "Eckmodus 2: 45 Grad umkehren ..." -#: appEditors/AppGerberEditor.py:1156 appEditors/AppGerberEditor.py:1183 +#: appEditors/AppGerberEditor.py:1278 appEditors/AppGerberEditor.py:1305 msgid "Corner Mode 3: 90 degrees ..." msgstr "Eckmodus 3: 90 Grad ..." -#: appEditors/AppGerberEditor.py:1159 appEditors/AppGerberEditor.py:1180 +#: appEditors/AppGerberEditor.py:1281 appEditors/AppGerberEditor.py:1302 msgid "Corner Mode 4: Reverse 90 degrees ..." msgstr "Eckmodus 4: Um 90 Grad umkehren ..." -#: appEditors/AppGerberEditor.py:1162 appEditors/AppGerberEditor.py:1177 +#: appEditors/AppGerberEditor.py:1284 appEditors/AppGerberEditor.py:1299 msgid "Corner Mode 5: Free angle ..." msgstr "Eckmodus 5: Freiwinkel ..." -#: appEditors/AppGerberEditor.py:1254 appEditors/AppGerberEditor.py:1423 -#: appEditors/AppGerberEditor.py:1462 +#: appEditors/AppGerberEditor.py:1378 appEditors/AppGerberEditor.py:1563 +#: appEditors/AppGerberEditor.py:1602 msgid "Track Mode 1: 45 degrees ..." msgstr "Spurmodus 1: 45 Grad ..." -#: appEditors/AppGerberEditor.py:1403 appEditors/AppGerberEditor.py:1457 +#: appEditors/AppGerberEditor.py:1543 appEditors/AppGerberEditor.py:1597 msgid "Track Mode 2: Reverse 45 degrees ..." msgstr "Spurmodus 2: 45 Grad umkehren ..." -#: appEditors/AppGerberEditor.py:1408 appEditors/AppGerberEditor.py:1452 +#: appEditors/AppGerberEditor.py:1548 appEditors/AppGerberEditor.py:1592 msgid "Track Mode 3: 90 degrees ..." msgstr "Spurmodus 3: 90 Grad ..." -#: appEditors/AppGerberEditor.py:1413 appEditors/AppGerberEditor.py:1447 +#: appEditors/AppGerberEditor.py:1553 appEditors/AppGerberEditor.py:1587 msgid "Track Mode 4: Reverse 90 degrees ..." msgstr "Spurmodus 4: Um 90 Grad umkehren ..." -#: appEditors/AppGerberEditor.py:1418 appEditors/AppGerberEditor.py:1442 +#: appEditors/AppGerberEditor.py:1558 appEditors/AppGerberEditor.py:1582 msgid "Track Mode 5: Free angle ..." msgstr "Spurmodus 5: Freiwinkel ..." -#: appEditors/AppGerberEditor.py:1892 +#: appEditors/AppGerberEditor.py:2032 msgid "Scale the selected Gerber apertures ..." msgstr "Skalieren Sie die ausgewählten Gerber-Öffnungen ..." -#: appEditors/AppGerberEditor.py:1934 +#: appEditors/AppGerberEditor.py:2074 msgid "Buffer the selected apertures ..." msgstr "Die ausgewählten Öffnungen puffern ..." -#: appEditors/AppGerberEditor.py:1976 +#: appEditors/AppGerberEditor.py:2116 msgid "Mark polygon areas in the edited Gerber ..." msgstr "Markiere Polygonbereiche im bearbeiteten Gerber ..." -#: appEditors/AppGerberEditor.py:2042 +#: appEditors/AppGerberEditor.py:2182 msgid "Nothing selected to move" msgstr "Nichts zum Bewegen ausgewählt" -#: appEditors/AppGerberEditor.py:2490 appEditors/AppGerberEditor.py:4066 +#: appEditors/AppGerberEditor.py:2633 appEditors/AppGerberEditor.py:4220 #: appObjects/FlatCAMGeometry.py:2564 appTools/ToolOptimal.py:145 #: appTools/ToolPanelize.py:614 appTools/ToolProperties.py:195 #: appTools/ToolQRCode.py:167 appTools/ToolSolderPaste.py:670 @@ -3300,13 +3318,13 @@ msgstr "Nichts zum Bewegen ausgewählt" msgid "Working ..." msgstr "Arbeiten ..." -#: appEditors/AppGerberEditor.py:3054 appEditors/AppGerberEditor.py:3058 +#: appEditors/AppGerberEditor.py:3205 appEditors/AppGerberEditor.py:3209 msgid "Aperture code value is missing or wrong format. Add it and retry." msgstr "" "Blendencodewert fehlt oder falsches Format. Fügen Sie es hinzu und versuchen " "Sie es erneut." -#: appEditors/AppGerberEditor.py:3094 +#: appEditors/AppGerberEditor.py:3246 msgid "" "Aperture dimensions value is missing or wrong format. Add it in format " "(width, height) and retry." @@ -3314,83 +3332,83 @@ msgstr "" "Wert für Blendenmaße fehlt oder falsches Format. Fügen Sie es im Format " "(Breite, Höhe) hinzu und versuchen Sie es erneut." -#: appEditors/AppGerberEditor.py:3107 +#: appEditors/AppGerberEditor.py:3259 msgid "Aperture size value is missing or wrong format. Add it and retry." msgstr "" "Der Wert für die Blendengröße fehlt oder das Format ist falsch. Fügen Sie es " "hinzu und versuchen Sie es erneut." -#: appEditors/AppGerberEditor.py:3118 +#: appEditors/AppGerberEditor.py:3272 msgid "Aperture already in the aperture table." msgstr "Blende bereits in der Blendentabelle." -#: appEditors/AppGerberEditor.py:3125 +#: appEditors/AppGerberEditor.py:3279 msgid "Added new aperture with code" msgstr "Neue Blende mit Code hinzugefügt" -#: appEditors/AppGerberEditor.py:3157 +#: appEditors/AppGerberEditor.py:3311 msgid "Select an aperture in Aperture Table" msgstr "Wählen Sie eine Blende in der Blendentabelle" -#: appEditors/AppGerberEditor.py:3165 +#: appEditors/AppGerberEditor.py:3319 msgid "Select an aperture in Aperture Table -->" msgstr "Wählen Sie eine Blende in der Blendentabelle ->" -#: appEditors/AppGerberEditor.py:3179 +#: appEditors/AppGerberEditor.py:3333 msgid "Deleted aperture with code" msgstr "Blende mit Code gelöscht" -#: appEditors/AppGerberEditor.py:3247 +#: appEditors/AppGerberEditor.py:3401 msgid "Dimensions need two float values separated by comma." msgstr "Bemaßungen benötigen zwei durch Komma getrennte Gleitkommawerte." -#: appEditors/AppGerberEditor.py:3256 +#: appEditors/AppGerberEditor.py:3410 msgid "Dimensions edited." msgstr "Abmessungen bearbeitet." -#: appEditors/AppGerberEditor.py:3664 appEditors/AppGerberEditor.py:5067 +#: appEditors/AppGerberEditor.py:3818 appEditors/AppGerberEditor.py:5246 #: appGUI/ObjectUI.py:316 appTools/ToolPunchGerber.py:1088 msgid "Code" msgstr "Code" -#: appEditors/AppGerberEditor.py:3664 appEditors/AppGerberEditor.py:5067 +#: appEditors/AppGerberEditor.py:3818 appEditors/AppGerberEditor.py:5246 #: appGUI/ObjectUI.py:316 msgid "Dim" msgstr "Maße" -#: appEditors/AppGerberEditor.py:3778 appObjects/FlatCAMCNCJob.py:1682 +#: appEditors/AppGerberEditor.py:3932 appObjects/FlatCAMCNCJob.py:1682 #: appObjects/FlatCAMCNCJob.py:1972 appObjects/FlatCAMScript.py:129 #: app_Main.py:7181 msgid "Loading" msgstr "Wird geladen" -#: appEditors/AppGerberEditor.py:3909 +#: appEditors/AppGerberEditor.py:4063 msgid "Setting up the UI" msgstr "UI wird initialisiert" -#: appEditors/AppGerberEditor.py:3910 +#: appEditors/AppGerberEditor.py:4064 msgid "Adding geometry finished. Preparing the GUI" msgstr "Geometrie hinzufügen fertig. Vorbereiten der GUI" -#: appEditors/AppGerberEditor.py:3919 +#: appEditors/AppGerberEditor.py:4073 msgid "Finished loading the Gerber object into the editor." msgstr "Gerber-Objekte wurde in den Editor geladen." -#: appEditors/AppGerberEditor.py:4056 +#: appEditors/AppGerberEditor.py:4210 msgid "" "There are no Aperture definitions in the file. Aborting Gerber creation." msgstr "" "Die Datei enthält keine Aperture-Definitionen. Abbruch der Gerber-Erstellung." -#: appEditors/AppGerberEditor.py:4094 +#: appEditors/AppGerberEditor.py:4248 msgid "Cancelled. No aperture is selected" msgstr "Abgebrochen. Es ist keine Blende ausgewählt" -#: appEditors/AppGerberEditor.py:4249 app_Main.py:6637 +#: appEditors/AppGerberEditor.py:4403 app_Main.py:6637 msgid "Coordinates copied to clipboard." msgstr "Koordinaten in die Zwischenablage kopiert." -#: appEditors/AppGerberEditor.py:4558 +#: appEditors/AppGerberEditor.py:4716 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:339 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:339 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:303 @@ -3403,84 +3421,71 @@ msgstr "Koordinaten in die Zwischenablage kopiert." msgid "Plotting" msgstr "Plotten" -#: appEditors/AppGerberEditor.py:4700 +#: appEditors/AppGerberEditor.py:4858 msgid "Failed. No aperture geometry is selected." msgstr "Gescheitert. Es ist keine Aperturgeometrie ausgewählt." -#: appEditors/AppGerberEditor.py:4852 +#: appEditors/AppGerberEditor.py:5033 msgid "No aperture to buffer. Select at least one aperture and try again." msgstr "" "Keine Blende zum Puffern Wählen Sie mindestens eine Blende und versuchen Sie " "es erneut." -#: appEditors/AppGerberEditor.py:4864 appTools/ToolCopperThieving.py:306 -#: appTools/ToolCopperThieving.py:907 appTools/ToolCopperThieving.py:1104 -#: appTools/ToolCorners.py:146 appTools/ToolCorners.py:413 -#: appTools/ToolCutOut.py:779 appTools/ToolCutOut.py:905 -#: appTools/ToolCutOut.py:1128 appTools/ToolCutOut.py:1278 -#: appTools/ToolDblSided.py:406 appTools/ToolFiducials.py:240 -#: appTools/ToolFiducials.py:492 appTools/ToolFiducials.py:540 -#: appTools/ToolFiducials.py:554 appTools/ToolMove.py:166 -#: appTools/ToolPaint.py:2185 app_Main.py:4766 camlib.py:2403 camlib.py:2471 -#: camlib.py:2539 camlib.py:2617 camlib.py:5287 camlib.py:5683 -msgid "Failed." -msgstr "Gescheitert." - -#: appEditors/AppGerberEditor.py:4883 +#: appEditors/AppGerberEditor.py:5064 msgid "Scale factor value is missing or wrong format. Add it and retry." msgstr "" "Der Skalierungsfaktor ist nicht vorhanden oder das Format ist falsch. Fügen " "Sie es hinzu und versuchen Sie es erneut." -#: appEditors/AppGerberEditor.py:4915 +#: appEditors/AppGerberEditor.py:5096 msgid "No aperture to scale. Select at least one aperture and try again." msgstr "" "Keine zu skalierende Blende Wählen Sie mindestens eine Blende und versuchen " "Sie es erneut." -#: appEditors/AppGerberEditor.py:4968 +#: appEditors/AppGerberEditor.py:5148 msgid "Polygons marked." msgstr "Polygone markiert." -#: appEditors/AppGerberEditor.py:4971 +#: appEditors/AppGerberEditor.py:5150 msgid "No polygons were marked. None fit within the limits." msgstr "Es wurden keine Polygone markiert. Keiner passt in die Grenzen." -#: appEditors/AppGerberEditor.py:5034 appGUI/MainGUI.py:745 +#: appEditors/AppGerberEditor.py:5213 appGUI/MainGUI.py:745 #: appGUI/MainGUI.py:1642 appGUI/ObjectUI.py:241 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:27 msgid "Gerber Editor" msgstr "Gerber-Editor" -#: appEditors/AppGerberEditor.py:5054 appGUI/ObjectUI.py:281 +#: appEditors/AppGerberEditor.py:5233 appGUI/ObjectUI.py:281 #: appObjects/FlatCAMObj.py:492 appTools/ToolProperties.py:158 msgid "Apertures" msgstr "Öffnungen" -#: appEditors/AppGerberEditor.py:5056 appGUI/ObjectUI.py:283 +#: appEditors/AppGerberEditor.py:5235 appGUI/ObjectUI.py:283 msgid "Apertures Table for the Gerber Object." msgstr "Blendentabelle für das Gerberobjekt." -#: appEditors/AppGerberEditor.py:5072 appGUI/ObjectUI.py:320 +#: appEditors/AppGerberEditor.py:5251 appGUI/ObjectUI.py:320 msgid "Index" msgstr "Index" -#: appEditors/AppGerberEditor.py:5074 appEditors/AppGerberEditor.py:5103 +#: appEditors/AppGerberEditor.py:5253 appEditors/AppGerberEditor.py:5293 #: appGUI/ObjectUI.py:322 appTools/ToolPunchGerber.py:1095 msgid "Aperture Code" msgstr "Öffnungscode" -#: appEditors/AppGerberEditor.py:5076 appGUI/ObjectUI.py:324 +#: appEditors/AppGerberEditor.py:5255 appGUI/ObjectUI.py:324 #: appTools/ToolPunchGerber.py:1097 msgid "Type of aperture: circular, rectangle, macros etc" msgstr "Öffnungsart: kreisförmig, rechteckig, Makros usw" -#: appEditors/AppGerberEditor.py:5078 appEditors/AppGerberEditor.py:5113 +#: appEditors/AppGerberEditor.py:5257 appEditors/AppGerberEditor.py:5304 #: appGUI/ObjectUI.py:326 appTools/ToolPunchGerber.py:1099 msgid "Aperture Size:" msgstr "Öffnungsgröße:" -#: appEditors/AppGerberEditor.py:5080 appGUI/ObjectUI.py:328 +#: appEditors/AppGerberEditor.py:5259 appGUI/ObjectUI.py:328 msgid "" "Aperture Dimensions:\n" " - (width, height) for R, O type.\n" @@ -3490,12 +3495,20 @@ msgstr "" "  - (Breite, Höhe) für R, O-Typ.\n" "  - (dia, nVertices) für P-Typ" -#: appEditors/AppGerberEditor.py:5104 +#: appEditors/AppGerberEditor.py:5286 +msgid "Add/Delete Aperture" +msgstr "Blende hinzufügen / löschen" + +#: appEditors/AppGerberEditor.py:5288 +msgid "Add/Delete an aperture in the aperture table" +msgstr "Eine Blende in der Blendentabelle hinzufügen / löschen" + +#: appEditors/AppGerberEditor.py:5294 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:58 msgid "Code for the new aperture" msgstr "Code für die neue Blende" -#: appEditors/AppGerberEditor.py:5115 +#: appEditors/AppGerberEditor.py:5306 msgid "" "Size for the new aperture.\n" "If aperture type is 'R' or 'O' then\n" @@ -3509,11 +3522,11 @@ msgstr "" "berechnet als:\n" "Quadrat (Breite ** 2 + Höhe ** 2)" -#: appEditors/AppGerberEditor.py:5129 +#: appEditors/AppGerberEditor.py:5321 msgid "Aperture Type" msgstr "Blendentyp" -#: appEditors/AppGerberEditor.py:5131 +#: appEditors/AppGerberEditor.py:5323 msgid "" "Select the type of new aperture. Can be:\n" "C = circular\n" @@ -3525,11 +3538,11 @@ msgstr "" "R = rechteckig\n" "O = länglich" -#: appEditors/AppGerberEditor.py:5142 +#: appEditors/AppGerberEditor.py:5336 msgid "Aperture Dim" msgstr "Öffnungsmaße" -#: appEditors/AppGerberEditor.py:5144 +#: appEditors/AppGerberEditor.py:5338 msgid "" "Dimensions for the new aperture.\n" "Active only for rectangular apertures (type R).\n" @@ -3539,19 +3552,11 @@ msgstr "" "Aktiv nur für rechteckige Öffnungen (Typ R).\n" "Das Format ist (Breite, Höhe)" -#: appEditors/AppGerberEditor.py:5153 -msgid "Add/Delete Aperture" -msgstr "Blende hinzufügen / löschen" - -#: appEditors/AppGerberEditor.py:5155 -msgid "Add/Delete an aperture in the aperture table" -msgstr "Eine Blende in der Blendentabelle hinzufügen / löschen" - -#: appEditors/AppGerberEditor.py:5165 +#: appEditors/AppGerberEditor.py:5360 msgid "Add a new aperture to the aperture list." msgstr "Fügen Sie der Blendenliste eine neue Blende hinzu." -#: appEditors/AppGerberEditor.py:5168 appEditors/AppGerberEditor.py:5320 +#: appEditors/AppGerberEditor.py:5363 appEditors/AppGerberEditor.py:5532 #: appGUI/GUIElements.py:325 appGUI/GUIElements.py:1013 #: appGUI/GUIElements.py:1399 appGUI/GUIElements.py:1604 #: appGUI/GUIElements.py:1937 appGUI/MainGUI.py:423 appGUI/MainGUI.py:734 @@ -3559,26 +3564,26 @@ msgstr "Fügen Sie der Blendenliste eine neue Blende hinzu." #: appGUI/MainGUI.py:1208 appGUI/MainGUI.py:1692 appGUI/MainGUI.py:2163 #: appGUI/MainGUI.py:2376 appGUI/MainGUI.py:4963 appGUI/ObjectUI.py:1123 #: appObjects/FlatCAMGeometry.py:578 appTools/ToolIsolation.py:71 -#: appTools/ToolIsolation.py:3255 appTools/ToolNCC.py:69 +#: appTools/ToolIsolation.py:3251 appTools/ToolNCC.py:69 #: appTools/ToolNCC.py:4137 appTools/ToolPaint.py:143 #: appTools/ToolPaint.py:2944 appTools/ToolSolderPaste.py:163 #: appTools/ToolSolderPaste.py:1211 app_Main.py:6300 msgid "Delete" msgstr "Löschen" -#: appEditors/AppGerberEditor.py:5171 +#: appEditors/AppGerberEditor.py:5366 msgid "Delete a aperture in the aperture list" msgstr "Löschen Sie eine Blende in der Blendenliste" -#: appEditors/AppGerberEditor.py:5188 +#: appEditors/AppGerberEditor.py:5383 msgid "Buffer Aperture" msgstr "Pufferblende" -#: appEditors/AppGerberEditor.py:5190 +#: appEditors/AppGerberEditor.py:5385 msgid "Buffer a aperture in the aperture list" msgstr "Puffern Sie eine Blende in der Blendenliste" -#: appEditors/AppGerberEditor.py:5206 +#: appEditors/AppGerberEditor.py:5403 msgid "" "There are 3 types of corners:\n" " - 'Round': the corner is rounded.\n" @@ -3592,20 +3597,20 @@ msgstr "" "- 'Abgeschrägt:' Die Ecke ist eine Linie, die die Features, die sich in der " "Ecke treffen, direkt verbindet" -#: appEditors/AppGerberEditor.py:5237 +#: appEditors/AppGerberEditor.py:5439 msgid "Scale Aperture" msgstr "Skalenöffnung" -#: appEditors/AppGerberEditor.py:5239 +#: appEditors/AppGerberEditor.py:5441 msgid "Scale a aperture in the aperture list" msgstr "Skalieren Sie eine Blende in der Blendenliste" -#: appEditors/AppGerberEditor.py:5247 +#: appEditors/AppGerberEditor.py:5449 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:210 msgid "Scale factor" msgstr "Skalierungsfaktor" -#: appEditors/AppGerberEditor.py:5249 +#: appEditors/AppGerberEditor.py:5451 msgid "" "The factor by which to scale the selected aperture.\n" "Values can be between 0.0000 and 999.9999" @@ -3613,19 +3618,19 @@ msgstr "" "Der Faktor, um den die ausgewählte Blende skaliert werden soll.\n" "Die Werte können zwischen 0,0000 und 999,9999 liegen" -#: appEditors/AppGerberEditor.py:5278 +#: appEditors/AppGerberEditor.py:5490 msgid "Mark polygons" msgstr "Polygone markieren" -#: appEditors/AppGerberEditor.py:5280 +#: appEditors/AppGerberEditor.py:5492 msgid "Mark the polygon areas." msgstr "Markieren Sie die Polygonbereiche." -#: appEditors/AppGerberEditor.py:5288 +#: appEditors/AppGerberEditor.py:5500 msgid "Area UPPER threshold" msgstr "Flächenobergrenze" -#: appEditors/AppGerberEditor.py:5290 +#: appEditors/AppGerberEditor.py:5502 msgid "" "The threshold value, all areas less than this are marked.\n" "Can have a value between 0.0000 and 10000.0000" @@ -3633,11 +3638,11 @@ msgstr "" "Der Schwellenwert, alle Bereiche, die darunter liegen, sind markiert.\n" "Kann einen Wert zwischen 0,0000 und 9999,9999 haben" -#: appEditors/AppGerberEditor.py:5297 +#: appEditors/AppGerberEditor.py:5509 msgid "Area LOWER threshold" msgstr "Bereichsuntergrenze" -#: appEditors/AppGerberEditor.py:5299 +#: appEditors/AppGerberEditor.py:5511 msgid "" "The threshold value, all areas more than this are marked.\n" "Can have a value between 0.0000 and 10000.0000" @@ -3646,32 +3651,32 @@ msgstr "" "hinausgehen.\n" "Kann einen Wert zwischen 0,0000 und 9999,9999 haben" -#: appEditors/AppGerberEditor.py:5313 +#: appEditors/AppGerberEditor.py:5525 msgid "Mark" msgstr "Kennzeichen" -#: appEditors/AppGerberEditor.py:5316 +#: appEditors/AppGerberEditor.py:5528 msgid "Mark the polygons that fit within limits." msgstr "Markieren Sie die Polygone, die in Grenzen passen." -#: appEditors/AppGerberEditor.py:5323 +#: appEditors/AppGerberEditor.py:5535 msgid "Delete all the marked polygons." msgstr "Löschen Sie alle markierten Polygone." -#: appEditors/AppGerberEditor.py:5330 +#: appEditors/AppGerberEditor.py:5542 msgid "Clear all the markings." msgstr "Alle Markierungen entfernen." -#: appEditors/AppGerberEditor.py:5350 appGUI/MainGUI.py:753 +#: appEditors/AppGerberEditor.py:5567 appGUI/MainGUI.py:753 #: appGUI/MainGUI.py:1180 appGUI/MainGUI.py:2349 appGUI/MainGUI.py:4950 msgid "Add Pad Array" msgstr "Pad-Array hinzufügen" -#: appEditors/AppGerberEditor.py:5352 +#: appEditors/AppGerberEditor.py:5569 msgid "Add an array of pads (linear or circular array)" msgstr "Hinzufügen eines Arrays von Pads (lineares oder kreisförmiges Array)" -#: appEditors/AppGerberEditor.py:5358 +#: appEditors/AppGerberEditor.py:5576 msgid "" "Select the type of pads array to create.\n" "It can be Linear X(Y) or Circular" @@ -3679,25 +3684,25 @@ msgstr "" "Wählen Sie den zu erstellenden Pad-Array-Typ aus.\n" "Es kann lineares X (Y) oder rund sein" -#: appEditors/AppGerberEditor.py:5369 +#: appEditors/AppGerberEditor.py:5587 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:95 msgid "Nr of pads" msgstr "Anzahl der Pads" -#: appEditors/AppGerberEditor.py:5371 +#: appEditors/AppGerberEditor.py:5589 #: appGUI/preferences/gerber/GerberEditorPrefGroupUI.py:97 msgid "Specify how many pads to be in the array." msgstr "Geben Sie an, wie viele Pads sich im Array befinden sollen." -#: appEditors/AppGerberEditor.py:6437 +#: appEditors/AppGerberEditor.py:6650 msgid "Offset Y cancelled" msgstr "Offset Y aufgehoben" -#: appEditors/AppGerberEditor.py:6453 +#: appEditors/AppGerberEditor.py:6666 msgid "Skew X cancelled" msgstr "Neigung X abgebrochen" -#: appEditors/AppGerberEditor.py:6469 +#: appEditors/AppGerberEditor.py:6682 msgid "Skew Y cancelled" msgstr "Neigung Y abgesagt" @@ -3731,11 +3736,11 @@ msgid "String to replace the one in the Find box throughout the text." msgstr "" "Zeichenfolge, die die Zeichenfolge im Feld Suchen im gesamten Text ersetzt." -#: appEditors/AppTextEditor.py:106 appGUI/GUIElements.py:4369 +#: appEditors/AppTextEditor.py:106 appGUI/GUIElements.py:4372 #: appGUI/ObjectUI.py:1887 appGUI/preferences/cncjob/CNCJobOptPrefGroupUI.py:61 #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:295 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:278 -#: appTools/ToolIsolation.py:3483 appTools/ToolPaint.py:3116 +#: appTools/ToolIsolation.py:3479 appTools/ToolPaint.py:3116 #: appTools/ToolPunchGerber.py:1040 tclCommands/TclCommandPaint.py:162 msgid "All" msgstr "Alles" @@ -3833,7 +3838,7 @@ msgid "Dia" msgstr "Durchm" #: appEditors/appGCodeEditor.py:687 appGUI/ObjectUI.py:999 -#: appGUI/ObjectUI.py:2032 appTools/ToolIsolation.py:3127 +#: appGUI/ObjectUI.py:2032 appTools/ToolIsolation.py:3123 #: appTools/ToolNCC.py:3998 appTools/ToolPaint.py:2831 msgid "TT" msgstr "TT" @@ -3920,7 +3925,7 @@ msgstr "Strg+X" #: appGUI/GUIElements.py:313 appGUI/GUIElements.py:1001 #: appGUI/GUIElements.py:1387 appGUI/GUIElements.py:1592 -#: appGUI/GUIElements.py:1925 appGUI/GUIElements.py:3832 appGUI/MainGUI.py:417 +#: appGUI/GUIElements.py:1925 appGUI/GUIElements.py:3835 appGUI/MainGUI.py:417 #: appGUI/MainGUI.py:731 appGUI/MainGUI.py:790 appGUI/MainGUI.py:870 #: appGUI/MainGUI.py:989 appGUI/MainGUI.py:1206 appGUI/MainGUI.py:1690 #: appGUI/MainGUI.py:2161 appGUI/MainGUI.py:2374 appGUI/MainGUI.py:4952 @@ -3932,7 +3937,7 @@ msgstr "Kopieren" #: appGUI/GUIElements.py:313 appGUI/GUIElements.py:1001 #: appGUI/GUIElements.py:1387 appGUI/GUIElements.py:1592 -#: appGUI/GUIElements.py:1925 appGUI/GUIElements.py:3832 appGUI/MainGUI.py:417 +#: appGUI/GUIElements.py:1925 appGUI/GUIElements.py:3835 appGUI/MainGUI.py:417 #: appGUI/MainGUI.py:4449 msgid "Ctrl+C" msgstr "Kopieren" @@ -3951,7 +3956,7 @@ msgstr "Ctrl+V" #: appGUI/GUIElements.py:325 appGUI/GUIElements.py:1013 #: appGUI/GUIElements.py:1399 appGUI/GUIElements.py:1604 -#: appGUI/GUIElements.py:1937 appGUI/GUIElements.py:3850 appGUI/MainGUI.py:4517 +#: appGUI/GUIElements.py:1937 appGUI/GUIElements.py:3853 appGUI/MainGUI.py:4517 #: appGUI/MainGUI.py:4518 appGUI/MainGUI.py:4722 appGUI/MainGUI.py:4822 #: appGUI/MainGUI.py:4823 appGUI/MainGUI.py:4963 appGUI/MainGUI.py:4964 msgid "Del" @@ -3959,7 +3964,7 @@ msgstr "Del" #: appGUI/GUIElements.py:332 appGUI/GUIElements.py:1020 #: appGUI/GUIElements.py:1406 appGUI/GUIElements.py:1611 -#: appGUI/GUIElements.py:1944 appGUI/GUIElements.py:3840 appGUI/MainGUI.py:448 +#: appGUI/GUIElements.py:1944 appGUI/GUIElements.py:3843 appGUI/MainGUI.py:448 #: appGUI/MainGUI.py:568 appGUI/MainGUI.py:4448 #: appObjects/ObjectCollection.py:1128 appObjects/ObjectCollection.py:1175 msgid "Select All" @@ -3967,7 +3972,7 @@ msgstr "Select All" #: appGUI/GUIElements.py:332 appGUI/GUIElements.py:1020 #: appGUI/GUIElements.py:1406 appGUI/GUIElements.py:1611 -#: appGUI/GUIElements.py:1944 appGUI/GUIElements.py:3840 appGUI/MainGUI.py:448 +#: appGUI/GUIElements.py:1944 appGUI/GUIElements.py:3843 appGUI/MainGUI.py:448 #: appGUI/MainGUI.py:4448 msgid "Ctrl+A" msgstr "Strg+A" @@ -3980,15 +3985,15 @@ msgstr "Steigern Sie" msgid "Step Down" msgstr "Schritt zurück" -#: appGUI/GUIElements.py:2266 appGUI/GUIElements.py:2335 -#: appGUI/GUIElements.py:2396 appGUI/GUIElements.py:2460 -#: appGUI/GUIElements.py:3802 app_Main.py:4470 app_Main.py:4634 +#: appGUI/GUIElements.py:2269 appGUI/GUIElements.py:2338 +#: appGUI/GUIElements.py:2399 appGUI/GUIElements.py:2463 +#: appGUI/GUIElements.py:3805 app_Main.py:4470 app_Main.py:4634 #: app_Main.py:4723 app_Main.py:8520 app_Main.py:8535 app_Main.py:8879 #: app_Main.py:8891 msgid "Ok" msgstr "Ok" -#: appGUI/GUIElements.py:3769 +#: appGUI/GUIElements.py:3772 msgid "" "The reference can be:\n" "- Absolute -> the reference point is point (0,0)\n" @@ -3998,19 +4003,19 @@ msgstr "" "- Absolut -> Der Bezugspunkt ist Punkt (0,0)\n" "- Relativ -> Der Referenzpunkt ist die Mausposition vor dem Sprung" -#: appGUI/GUIElements.py:3774 +#: appGUI/GUIElements.py:3777 msgid "Abs" msgstr "Abs" -#: appGUI/GUIElements.py:3775 +#: appGUI/GUIElements.py:3778 msgid "Relative" msgstr "Relativ" -#: appGUI/GUIElements.py:3785 +#: appGUI/GUIElements.py:3788 msgid "Location" msgstr "Ort" -#: appGUI/GUIElements.py:3787 +#: appGUI/GUIElements.py:3790 msgid "" "The Location value is a tuple (x,y).\n" "If the reference is Absolute then the Jump will be at the position (x,y).\n" @@ -4024,86 +4029,86 @@ msgstr "" "(x, y)\n" "vom aktuellen Mausstandort aus." -#: appGUI/GUIElements.py:3845 +#: appGUI/GUIElements.py:3848 msgid "Save Log" msgstr "Protokoll speichern" -#: appGUI/GUIElements.py:3845 appGUI/MainGUI.py:164 appGUI/MainGUI.py:346 +#: appGUI/GUIElements.py:3848 appGUI/MainGUI.py:164 appGUI/MainGUI.py:346 #: appGUI/MainGUI.py:4458 appGUI/MainGUI.py:4717 appGUI/MainGUI.py:4826 #: appGUI/MainGUI.py:4969 msgid "Ctrl+S" msgstr "Strg+S" -#: appGUI/GUIElements.py:3850 +#: appGUI/GUIElements.py:3853 msgid "Clear All" msgstr "Alles löschen" -#: appGUI/GUIElements.py:3897 appTools/ToolShell.py:299 +#: appGUI/GUIElements.py:3900 appTools/ToolShell.py:299 msgid "Type >help< to get started" msgstr "Geben Sie> help