Forráskód Böngészése

- fixed issue when loading unbuffered a Gerber file that has negative regions
- fixed Panelize Tool to save the aperture geometries into the panel apertures. Also made the tool faster by removing the buffering at the end of the job
- modified FlatCAMEditor's files to the new string format that will allow easier translations
- updated POT file and the Romanian translation

Marius Stanciu 6 éve
szülő
commit
59704a6e01

+ 7 - 9
FlatCAMApp.py

@@ -7495,7 +7495,7 @@ class App(QtCore.QObject):
 
     def on_file_savegerber(self):
         """
-        Callback for menu item File->Export Gerber.
+        Callback for menu item in Project context menu.
 
         :return: None
         """
@@ -7504,7 +7504,7 @@ class App(QtCore.QObject):
 
         obj = self.collection.get_active()
         if obj is None:
-            self.inform.emit('[WARNING_NOTCL] %S' %
+            self.inform.emit('[WARNING_NOTCL] %s' %
                              _("No object selected. Please select an Gerber object to export."))
             return
 
@@ -7539,7 +7539,7 @@ class App(QtCore.QObject):
 
     def on_file_saveexcellon(self):
         """
-        Callback for menu item File->Export Gerber.
+        Callback for menu item in project context menu.
 
         :return: None
         """
@@ -8671,14 +8671,14 @@ class App(QtCore.QObject):
 
             with self.proc_container.new(_("Exporting Gerber")) as proc:
 
-                def job_thread_exc(app_obj):
+                def job_thread_grb(app_obj):
                     ret = make_gerber()
                     if ret == 'fail':
                         self.inform.emit('[ERROR_NOTCL] %s' %
                                          _('Could not export Gerber file.'))
                         return
 
-                self.worker_task.emit({'fcn': job_thread_exc, 'params': [self]})
+                self.worker_task.emit({'fcn': job_thread_grb, 'params': [self]})
         else:
             ret = make_gerber()
             if ret == 'fail':
@@ -8912,10 +8912,8 @@ class App(QtCore.QObject):
                 app_obj.progress.emit(0)
                 return "fail"
             except ParseError as err:
-                app_obj.inform.emit(_("{e_code} Failed to parse file: {name}. {error}").format(
-                    e_code=_("[ERROR_NOTCL]"),
-                    name=filename,
-                    error=str(err)))
+                app_obj.inform.emit('[ERROR_NOTCL] %s: %s. %s' %
+                                    (_("Failed to parse file"), filename, str(err)))
                 app_obj.progress.emit(0)
                 self.log.error(str(err))
                 return "fail"

+ 2 - 0
FlatCAMObj.py

@@ -1503,6 +1503,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
 
         :return: Gerber_code
         """
+        log.debug("FlatCAMGerber.export_gerber() --> Generating the Gerber code from the selected Gerber file")
 
         def tz_format(x, y, fac):
             x_c = x * fac
@@ -1650,6 +1651,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                         for geo_elem in self.apertures[apid]['geometry']:
                             if 'follow' in geo_elem:
                                 geo = geo_elem['follow']
+                                print(geo)
                                 if not geo.is_empty:
                                     if isinstance(geo, Point):
                                         if g_zeros == 'T':

+ 4 - 0
README.md

@@ -19,6 +19,10 @@ CAD program, and create G-Code for Isolation routing.
 - modified FlatCAMObj.py file to the new string format that will allow easier translations
 - modified camlib.py, FlatCAMAPp.py and ObjectCollection.py files to the new string format that will allow easier translations
 - updated the POT file and the German language
+- fixed issue when loading unbuffered a Gerber file that has negative regions
+- fixed Panelize Tool to save the aperture geometries into the panel apertures. Also made the tool faster by removing the buffering at the end of the job
+- modified FlatCAMEditor's files to the new string format that will allow easier translations
+- updated POT file and the Romanian translation
 
 8.09.2019
 

+ 11 - 2
camlib.py

@@ -3376,8 +3376,17 @@ class Gerber (Geometry):
                 new_poly = cascaded_union(poly_buffer)
                 new_poly = new_poly.buffer(0, int(self.steps_per_circle / 4))
                 log.warning("Union done.")
+
             if current_polarity == 'D':
-                self.solid_geometry = self.solid_geometry.union(new_poly)
+                try:
+                    self.solid_geometry = self.solid_geometry.union(new_poly)
+                except Exception as e:
+                    # in case in the new_poly are some self intersections try to avoid making union with them
+                    for poly in new_poly:
+                        try:
+                            self.solid_geometry = self.solid_geometry.union(poly)
+                        except:
+                            pass
             else:
                 self.solid_geometry = self.solid_geometry.difference(new_poly)
         except Exception as err:
@@ -6313,7 +6322,7 @@ class CNCjob(Geometry):
             self.z_depthpercut = abs(self.z_cut)
 
         if self.z_move is None:
-            self.app.inform.emit('[ERROR_NOTCL] %S' %
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
                                  _("Travel Z parameter is None or zero."))
             return 'fail'
 

+ 77 - 54
flatcamEditors/FlatCAMExcEditor.py

@@ -50,7 +50,8 @@ class FCDrillAdd(FCShapeTool):
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add a drill first select a tool"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("To add a drill first select a tool"))
             self.draw_app.select_tool("drill_select")
             return
 
@@ -112,7 +113,8 @@ class FCDrillAdd(FCShapeTool):
         self.geometry = DrawToolShape(self.util_shape(self.points))
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Drill added."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Drill added."))
 
 
 class FCDrillArray(FCShapeTool):
@@ -154,7 +156,8 @@ class FCDrillArray(FCShapeTool):
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("To add an Drill Array first select a tool in Tool Table"))
             return
 
         try:
@@ -208,11 +211,12 @@ class FCDrillArray(FCShapeTool):
                 self.drill_linear_angle = float(self.draw_app.linear_angle_spinner.get_value())
                 self.drill_angle = float(self.draw_app.drill_angle_entry.get_value())
             except TypeError:
-                self.draw_app.app.inform.emit(
-                    _("[ERROR_NOTCL] The value is not Float. Check for comma instead of dot separator."))
+                self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                              _("The value is not Float. Check for comma instead of dot separator."))
                 return
         except Exception as e:
-            self.draw_app.app.inform.emit(_("[ERROR_NOTCL] The value is mistyped. Check the value. %s") % str(e))
+            self.draw_app.app.inform.emit('[ERROR_NOTCL] %s. %s' %
+                                          (_("The value is mistyped. Check the value"), str(e)))
             return
 
         if self.drill_array == 'Linear':
@@ -310,7 +314,8 @@ class FCDrillArray(FCShapeTool):
                 self.geometry.append(DrawToolShape(geo))
         else:
             if (self.drill_angle * self.drill_array_size) > 360:
-                self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Too many drills for the selected spacing angle."))
+                self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                              _("Too many drills for the selected spacing angle."))
                 return
 
             radius = distance(self.destination, self.origin)
@@ -327,7 +332,8 @@ class FCDrillArray(FCShapeTool):
                 geo = self.util_shape((x, y))
                 self.geometry.append(DrawToolShape(geo))
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Drill Array added."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Drill Array added."))
         self.draw_app.in_action = False
         self.draw_app.array_frame.hide()
         return
@@ -355,7 +361,8 @@ class FCSlot(FCShapeTool):
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add a slot first select a tool"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("To add a slot first select a tool"))
             self.draw_app.select_tool("drill_select")
             return
 
@@ -412,15 +419,15 @@ class FCSlot(FCShapeTool):
                 slot_length = float(self.draw_app.slot_length_entry.get_value().replace(',', '.'))
                 self.draw_app.slot_length_entry.set_value(slot_length)
             except ValueError:
-                self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Value is missing or wrong format. "
-                                                "Add it and retry."))
+                self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                              _("Value is missing or wrong format. Add it and retry."))
                 return
 
         try:
             slot_angle = float(self.draw_app.slot_angle_spinner.get_value())
         except ValueError:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Value is missing or wrong format. "
-                                            "Add it and retry."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("Value is missing or wrong format. Add it and retry."))
             return
 
         if self.draw_app.slot_axis_radio.get_value() == 'X':
@@ -518,7 +525,8 @@ class FCSlot(FCShapeTool):
 
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Adding Slot completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Adding Slot completed."))
         self.draw_app.slot_frame.hide()
 
 
@@ -544,7 +552,8 @@ class FCSlotArray(FCShapeTool):
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Slot Array first select a tool in Tool Table"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("To add an Slot Array first select a tool in Tool Table"))
             return
 
 
@@ -622,11 +631,12 @@ class FCSlotArray(FCShapeTool):
                 self.slot_linear_angle = float(self.draw_app.slot_array_linear_angle_spinner.get_value())
                 self.slot_angle = float(self.draw_app.slot_array_angle_entry.get_value())
             except TypeError:
-                self.draw_app.app.inform.emit(
-                    _("[ERROR_NOTCL] The value is not Float. Check for comma instead of dot separator."))
+                self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                              _("The value is not Float. Check for comma instead of dot separator."))
                 return
         except Exception as e:
-            self.draw_app.app.inform.emit(_("[ERROR_NOTCL] The value is mistyped. Check the value."))
+            self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                          _("The value is mistyped. Check the value."))
             return
 
         if self.slot_array == 'Linear':
@@ -687,15 +697,15 @@ class FCSlotArray(FCShapeTool):
                 slot_length = float(self.draw_app.slot_length_entry.get_value().replace(',', '.'))
                 self.draw_app.slot_length_entry.set_value(slot_length)
             except ValueError:
-                self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Value is missing or wrong format. "
-                                                "Add it and retry."))
+                self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                              _("Value is missing or wrong format. Add it and retry."))
                 return
 
         try:
             slot_angle = float(self.draw_app.slot_angle_spinner.get_value())
         except ValueError:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Value is missing or wrong format. "
-                                            "Add it and retry."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("Value is missing or wrong format. Add it and retry."))
             return
 
         if self.draw_app.slot_axis_radio.get_value() == 'X':
@@ -804,7 +814,8 @@ class FCSlotArray(FCShapeTool):
                 self.geometry.append(DrawToolShape(geo))
         else:
             if (self.slot_angle * self.slot_array_size) > 360:
-                self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Too many Slots for the selected spacing angle."))
+                self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                              _("Too many Slots for the selected spacing angle."))
                 return
 
             radius = distance(self.destination, self.origin)
@@ -826,7 +837,8 @@ class FCSlotArray(FCShapeTool):
 
                 self.geometry.append(DrawToolShape(geo))
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Slot Array added."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Slot Array added."))
         self.draw_app.in_action = False
         self.draw_app.slot_frame.hide()
         self.draw_app.slot_array_frame.hide()
@@ -872,9 +884,8 @@ class FCDrillResize(FCShapeTool):
         try:
             new_dia = self.draw_app.resdrill_entry.get_value()
         except:
-            self.draw_app.app.inform.emit(
-                _("[ERROR_NOTCL] Resize drill(s) failed. Please enter a diameter for resize.")
-            )
+            self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                          _("Resize drill(s) failed. Please enter a diameter for resize."))
             return
 
         if new_dia not in self.draw_app.olddia_newdia:
@@ -963,7 +974,8 @@ class FCDrillResize(FCShapeTool):
                             self.geometry.append(DrawToolShape(new_poly))
                         else:
                             # unexpected geometry so we cancel
-                            self.draw_app.app.inform.emit(_("[ERROR_NOTCL] Cancelled."))
+                            self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                                          _("Cancelled."))
                             return
 
                         # remove the geometry with the old size
@@ -1032,7 +1044,8 @@ class FCDrillResize(FCShapeTool):
                     except KeyError:
                         # if the exception happen here then we are not dealing with slots neither
                         # therefore something else is not OK so we return
-                        self.draw_app.app.inform.emit(_("[ERROR_NOTCL] Cancelled."))
+                        self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                                      _("Cancelled."))
                         return
 
             # this simple hack is used so we can delete form self.draw_app.selected but
@@ -1052,9 +1065,11 @@ class FCDrillResize(FCShapeTool):
             # we reactivate the signals after the after the tool editing
             self.draw_app.tools_table_exc.itemChanged.connect(self.draw_app.on_tool_edit)
 
-            self.draw_app.app.inform.emit(_("[success] Done. Drill/Slot Resize completed."))
+            self.draw_app.app.inform.emit('[success] Done. %s' %
+                                          _("Drill/Slot Resize completed."))
         else:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Cancelled. No drills/slots selected for resize ..."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("Cancelled. No drills/slots selected for resize ..."))
 
         # init this set() for another use perhaps
         self.selected_dia_set = set()
@@ -1137,7 +1152,8 @@ class FCDrillMove(FCShapeTool):
             sel_shapes_to_be_deleted = []
 
         self.draw_app.build_ui()
-        self.draw_app.app.inform.emit(_("[success] Done. Drill(s) Move completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Drill(s) Move completed."))
 
     def selection_bbox(self):
         geo_list = []
@@ -1234,7 +1250,8 @@ class FCDrillCopy(FCDrillMove):
             sel_shapes_to_be_deleted = []
 
         self.draw_app.build_ui()
-        self.draw_app.app.inform.emit(_("[success] Done. Drill(s) copied."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Drill(s) copied."))
 
 
 class FCDrillSelect(DrawTool):
@@ -2395,9 +2412,8 @@ class FlatCAMExcEditor(QtCore.QObject):
                 try:
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number.")
-                                         )
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         if tool_dia not in self.olddia_newdia:
@@ -2408,17 +2424,17 @@ class FlatCAMExcEditor(QtCore.QObject):
             # each time a tool diameter is edited or added
             self.olddia_newdia[tool_dia] = tool_dia
         else:
-            self.app.inform.emit(_("[WARNING_NOTCL] Tool already in the original or actual tool list.\n"
-                                 "Save and reedit Excellon if you need to add this tool. ")
-                                 )
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Tool already in the original or actual tool list.\n"
+                                 "Save and reedit Excellon if you need to add this tool. "))
             return
 
         # since we add a new tool, we update also the initial state of the tool_table through it's dictionary
         # we add a new entry in the tool2tooldia dict
         self.tool2tooldia[len(self.olddia_newdia)] = tool_dia
 
-        self.app.inform.emit(_("[success] Added new tool with dia: {dia} {units}").format(dia=str(tool_dia),
-                                                                                          units=str(self.units)))
+        self.app.inform.emit('[success] %s: %s %s' %
+                             (_("Added new tool with dia"), str(tool_dia), str(self.units)))
 
         self.build_ui()
 
@@ -2449,7 +2465,8 @@ class FlatCAMExcEditor(QtCore.QObject):
                 else:
                     deleted_tool_dia_list.append(float('%.4f' % dia))
         except Exception as e:
-            self.app.inform.emit(_("[WARNING_NOTCL] Select a tool in Tool Table"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Select a tool in Tool Table"))
             return
 
         for deleted_tool_dia in deleted_tool_dia_list:
@@ -2481,9 +2498,8 @@ class FlatCAMExcEditor(QtCore.QObject):
 
             self.olddia_newdia.pop(deleted_tool_dia, None)
 
-            self.app.inform.emit(_("[success] Deleted tool with dia: {del_dia} {units}").format(
-                del_dia=str(deleted_tool_dia),
-                units=str(self.units)))
+            self.app.inform.emit('[success] %s: %s %s' %
+                                 (_("Deleted tool with diameter"), str(deleted_tool_dia), str(self.units)))
 
         self.replot()
         # self.app.inform.emit("Could not delete selected tool")
@@ -2632,7 +2648,8 @@ class FlatCAMExcEditor(QtCore.QObject):
         self.tools_table_exc.itemChanged.connect(self.on_tool_edit)
         self.tools_table_exc.cellPressed.connect(self.on_row_selected)
 
-        self.app.inform.emit(_("[success] Done. Tool edit completed."))
+        self.app.inform.emit('[success] %s' %
+                             _("Done. Tool edit completed."))
 
         # self.tools_table_exc.selectionModel().currentChanged.connect(self.on_row_selected)
 
@@ -3166,11 +3183,12 @@ class FlatCAMExcEditor(QtCore.QObject):
             try:
                 excellon_obj.create_geometry()
             except KeyError:
-                self.app.inform.emit(
-                   _("[ERROR_NOTCL] There are no Tools definitions in the file. Aborting Excellon creation.")
+                self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                     _("There are no Tools definitions in the file. Aborting Excellon creation.")
                 )
             except:
-                msg = _("[ERROR] An internal error has ocurred. See shell.\n")
+                msg = '[ERROR] %s' % \
+                      _("An internal error has ocurred. See Shell.\n")
                 msg += traceback.format_exc()
                 app_obj.inform.emit(msg)
                 raise
@@ -3185,7 +3203,8 @@ class FlatCAMExcEditor(QtCore.QObject):
                 self.app.progress.emit(100)
                 return
 
-            self.app.inform.emit(_("[success] Excellon editing finished."))
+            self.app.inform.emit('[success] %s' %
+                                 _("Excellon editing finished."))
             # self.progress.emit(100)
 
     def on_tool_select(self, tool):
@@ -3202,7 +3221,8 @@ class FlatCAMExcEditor(QtCore.QObject):
             # self.draw_app.select_tool('drill_select')
             self.complete = True
             current_tool = 'drill_select'
-            self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. There is no Tool/Drill selected"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Cancelled. There is no Tool/Drill selected"))
 
         # This is to make the group behave as radio group
         if current_tool in self.tools_exc:
@@ -3421,14 +3441,16 @@ class FlatCAMExcEditor(QtCore.QObject):
                         self.active_tool.complete = True
                         self.in_action = False
                         self.delete_utility_geometry()
-                        self.app.inform.emit(_("[success] Done."))
+                        self.app.inform.emit('[success] %s' %
+                                             _("Done."))
                         self.select_tool('drill_select')
                     else:
                         if isinstance(self.active_tool, FCDrillAdd):
                             self.active_tool.complete = True
                             self.in_action = False
                             self.delete_utility_geometry()
-                            self.app.inform.emit(_("[success] Done."))
+                            self.app.inform.emit('[success] %s' %
+                                                 _("Done."))
                             self.select_tool('drill_select')
 
                         self.app.cursor = QtGui.QCursor()
@@ -3784,7 +3806,8 @@ class FlatCAMExcEditor(QtCore.QObject):
 
         self.selected = []
         self.build_ui()
-        self.app.inform.emit(_("[success] Done. Drill(s) deleted."))
+        self.app.inform.emit('[success] %s' %
+                             _("Done. Drill(s) deleted."))
 
     def delete_shape(self, del_shape):
         self.is_modified = True

+ 192 - 125
flatcamEditors/FlatCAMGeoEditor.py

@@ -137,8 +137,8 @@ class BufferSelectionTool(FlatCAMTool):
                 buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (which is really an INT)
@@ -154,8 +154,8 @@ class BufferSelectionTool(FlatCAMTool):
                 buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (which is really an INT)
@@ -171,8 +171,8 @@ class BufferSelectionTool(FlatCAMTool):
                 buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (which is really an INT)
@@ -562,7 +562,8 @@ class PaintOptionsTool(FlatCAMTool):
 
     def on_paint(self):
         if not self.fcdraw.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Paint cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Paint cancelled. No shape selected."))
             return
 
         try:
@@ -573,8 +574,8 @@ class PaintOptionsTool(FlatCAMTool):
                 tooldia = float(self.painttooldia_entry.get_value().replace(',', '.'))
                 self.painttooldia_entry.set_value(tooldia)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Tool diameter value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Tool diameter value is missing or wrong format. Add it and retry."))
                 return
         try:
             overlap = float(self.paintoverlap_entry.get_value())
@@ -584,8 +585,8 @@ class PaintOptionsTool(FlatCAMTool):
                 overlap = float(self.paintoverlap_entry.get_value().replace(',', '.'))
                 self.paintoverlap_entry.set_value(overlap)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Overlap value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Overlap value is missing or wrong format. Add it and retry."))
                 return
 
         try:
@@ -596,8 +597,8 @@ class PaintOptionsTool(FlatCAMTool):
                 margin = float(self.paintmargin_entry.get_value().replace(',', '.'))
                 self.paintmargin_entry.set_value(margin)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Margin distance value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Margin distance value is missing or wrong format. Add it and retry."))
                 return
         method = self.paintmethod_combo.get_value()
         contour = self.paintcontour_cb.get_value()
@@ -1053,7 +1054,8 @@ class TransformEditorTool(FlatCAMTool):
 
     def template(self):
         if not self.fcdraw.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Transformation cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Transformation cancelled. No shape selected."))
             return
 
 
@@ -1074,8 +1076,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.rotate_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
-                                         "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
                                        'params': [value]})
@@ -1111,8 +1113,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.skewx_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_skew("X", value)
@@ -1132,8 +1134,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.skewy_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_skew("Y", value)
@@ -1153,8 +1155,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     xvalue = float(self.scalex_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -1190,8 +1192,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     yvalue = float(self.scaley_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -1222,8 +1224,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.offx_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_offset("X", value)
@@ -1243,8 +1245,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.offy_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_offset("Y", value)
@@ -1261,7 +1263,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
 
         if not shape_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to rotate!"))
             return
         else:
             with self.app.proc_container.new(_("Appying Rotate")):
@@ -1292,12 +1295,14 @@ class TransformEditorTool(FlatCAMTool):
 
                     # self.draw_app.transform_complete.emit()
 
-                    self.app.inform.emit(_("[success] Done. Rotate completed."))
+                    self.app.inform.emit('[success] %s' %
+                                         _("Done. Rotate completed."))
 
                     self.app.progress.emit(100)
 
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, rotation movement was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Rotation action was not executed"),str(e)))
                     return
 
     def on_flip(self, axis):
@@ -1308,7 +1313,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
 
         if not shape_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to flip!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to flip!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Flip")):
@@ -1341,10 +1347,12 @@ class TransformEditorTool(FlatCAMTool):
                     for sha in shape_list:
                         if axis is 'X':
                             sha.mirror('X', (px, py))
-                            self.app.inform.emit(_('[success] Flip on the Y axis done ...'))
+                            self.app.inform.emit('[success] %s...' %
+                                                 _('Flip on the Y axis done'))
                         elif axis is 'Y':
                             sha.mirror('Y', (px, py))
-                            self.app.inform.emit(_('[success] Flip on the X axis done ...'))
+                            self.app.inform.emit('[success] %s' %
+                                                 _('Flip on the X axis done'))
                         self.draw_app.replot()
 
                     #     self.draw_app.add_shape(DrawToolShape(sha.geo))
@@ -1354,7 +1362,8 @@ class TransformEditorTool(FlatCAMTool):
                     self.app.progress.emit(100)
 
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Flip action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Flip action was not executed"), str(e)))
                     return
 
     def on_skew(self, axis, num):
@@ -1363,7 +1372,8 @@ class TransformEditorTool(FlatCAMTool):
         yminlist = []
 
         if not shape_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to shear/skew!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Skew")):
@@ -1390,12 +1400,17 @@ class TransformEditorTool(FlatCAMTool):
                     #     self.draw_app.add_shape(DrawToolShape(sha.geo))
                     #
                     # self.draw_app.transform_complete.emit()
-
-                    self.app.inform.emit(_('[success] Skew on the %s axis done ...') % str(axis))
+                    if axis == 'X':
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Skew on the X axis done'))
+                    else:
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Skew on the Y axis done'))
                     self.app.progress.emit(100)
 
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Skew action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Skew action was not executed"), str(e)))
                     return
 
     def on_scale(self, axis, xfactor, yfactor, point=None):
@@ -1406,7 +1421,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
 
         if not shape_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to scale!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to scale!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Scale")):
@@ -1442,10 +1458,16 @@ class TransformEditorTool(FlatCAMTool):
                     #
                     # self.draw_app.transform_complete.emit()
 
-                    self.app.inform.emit(_('[success] Scale on the %s axis done ...') % str(axis))
+                    if str(axis) == 'X':
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Scale on the X axis done'))
+                    else:
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Scale on the Y axis done'))
                     self.app.progress.emit(100)
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Scale action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Scale action was not executed"), str(e)))
                     return
 
     def on_offset(self, axis, num):
@@ -1454,7 +1476,8 @@ class TransformEditorTool(FlatCAMTool):
         yminlist = []
 
         if not shape_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to offset!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to offset!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Offset")):
@@ -1468,11 +1491,17 @@ class TransformEditorTool(FlatCAMTool):
                             sha.offset((0, num))
                         self.draw_app.replot()
 
-                    self.app.inform.emit(_('[success] Offset on the %s axis done ...') % str(axis))
+                    if axis == 'X':
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Offset on the X axis done'))
+                    else:
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Offset on the Y axis done'))
                     self.app.progress.emit(100)
 
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Offset action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Offset action was not executed"), str(e)))
                     return
 
     def on_rotate_key(self):
@@ -1485,14 +1514,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_rotate(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape rotate done...")
-                )
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape rotate done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape rotate cancelled...")
-                )
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Geometry shape rotate cancelled"))
 
     def on_offx_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
@@ -1506,12 +1533,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_offx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape offset on X axis done..."))
+            self.app.inform.emit('[success] %s' %
+                                 _("Geometry shape offset on X axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape offset X cancelled..."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Geometry shape offset X cancelled"))
 
     def on_offy_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
@@ -1525,12 +1552,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_offx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape offset on Y axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape offset on Y axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape offset Y cancelled..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape offset on Y axis canceled"))
 
     def on_skewx_key(self):
         val_box = FCInputDialog(title=_("Skew on X axis ..."),
@@ -1542,12 +1569,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_skewx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape skew on X axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape skew on X axis done"))
             return
         else:
-            self.app.inform.emit(
-               _("[WARNING_NOTCL] Geometry shape skew X cancelled..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape skew on X axis canceled"))
 
     def on_skewy_key(self):
         val_box = FCInputDialog(title=_("Skew on Y axis ..."),
@@ -1559,12 +1586,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_skewx(val=val)
-            self.app.inform.emit(
-               _("[success] Geometry shape skew on Y axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape skew on Y axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape skew Y cancelled..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape skew on Y axis canceled"))
 
 
 class DrawToolShape(object):
@@ -1964,7 +1991,8 @@ class FCCircle(FCShapeTool):
         radius = distance(p1, p2)
         self.geometry = DrawToolShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4)))
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Adding Circle completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Adding Circle completed."))
 
 
 class FCArc(FCShapeTool):
@@ -2178,7 +2206,8 @@ class FCArc(FCShapeTool):
             self.geometry = DrawToolShape(LineString(arc(center, radius, startangle, stopangle,
                                                          self.direction, self.steps_per_circ)))
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Arc completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Arc completed."))
 
 
 class FCRectangle(FCShapeTool):
@@ -2231,7 +2260,8 @@ class FCRectangle(FCShapeTool):
         # self.geometry = LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])])
         self.geometry = DrawToolShape(Polygon([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]))
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Rectangle completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Rectangle completed."))
 
 
 class FCPolygon(FCShapeTool):
@@ -2285,7 +2315,8 @@ class FCPolygon(FCShapeTool):
         self.geometry = DrawToolShape(Polygon(self.points))
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Polygon completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Polygon completed."))
 
     def on_key(self, key):
         if key == 'Backspace' or key == QtCore.Qt.Key_Backspace:
@@ -2440,7 +2471,8 @@ class FCMove(FCShapeTool):
         self.selection_shape = self.selection_bbox()
 
         if len(self.draw_app.get_selected()) == 0:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] MOVE: No shape selected. Select a shape to move ..."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                          _("MOVE: No shape selected. Select a shape to move"))
         else:
             self.draw_app.app.inform.emit(_(" MOVE: Click on reference point ..."))
 
@@ -2479,7 +2511,8 @@ class FCMove(FCShapeTool):
             # Delete old
             self.draw_app.delete_selected()
             self.complete = True
-            self.draw_app.app.inform.emit(_("[success] Done. Geometry(s) Move completed."))
+            self.draw_app.app.inform.emit('[success] %s' %
+                                          _("Done. Geometry(s) Move completed."))
 
     def selection_bbox(self):
         geo_list = []
@@ -2599,7 +2632,8 @@ class FCCopy(FCMove):
         self.geometry = [DrawToolShape(affinity.translate(geom.geo, xoff=dx, yoff=dy))
                          for geom in self.draw_app.get_selected()]
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Geometry(s) Copy completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Geometry(s) Copy completed."))
 
 
 class FCText(FCShapeTool):
@@ -2635,20 +2669,23 @@ class FCText(FCShapeTool):
                 self.geometry = DrawToolShape(affinity.translate(self.text_gui.text_path, xoff=dx, yoff=dy))
             except Exception as e:
                 log.debug("Font geometry is empty or incorrect: %s" % str(e))
-                self.draw_app.app.inform.emit(_("[ERROR]Font not supported. Only Regular, Bold, Italic and BoldItalic are "
-                                              "supported. Error: %s") % str(e))
+                self.draw_app.app.inform.emit('[ERROR] %s: %s' %
+                                              (_("Font not supported. Only Regular, Bold, Italic and BoldItalic are "
+                                              "supported. Error"), str(e)))
                 self.text_gui.text_path = []
                 self.text_gui.hide_tool()
                 self.draw_app.select_tool('select')
                 return
         else:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] No text to add."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("No text to add."))
             return
 
         self.text_gui.text_path = []
         self.text_gui.hide_tool()
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Adding Text completed."))
+        self.draw_app.app.inform.emit('[success]%s' %
+                                      _(" Done. Adding Text completed."))
 
     def utility_geometry(self, data=None):
         """
@@ -2687,7 +2724,8 @@ class FCBuffer(FCShapeTool):
 
     def on_buffer(self):
         if not self.draw_app.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Buffer cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Buffer cancelled. No shape selected."))
             return
 
         try:
@@ -2698,8 +2736,8 @@ class FCBuffer(FCShapeTool):
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                     "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT)
@@ -2711,11 +2749,13 @@ class FCBuffer(FCShapeTool):
         self.disactivate()
         if ret_val == 'fail':
             return
-        self.draw_app.app.inform.emit(_("[success] Done. Buffer Tool completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Buffer Tool completed."))
 
     def on_buffer_int(self):
         if not self.draw_app.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Buffer cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Buffer cancelled. No shape selected."))
             return
 
         try:
@@ -2726,8 +2766,8 @@ class FCBuffer(FCShapeTool):
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                     "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT)
@@ -2739,11 +2779,13 @@ class FCBuffer(FCShapeTool):
         self.disactivate()
         if ret_val == 'fail':
             return
-        self.draw_app.app.inform.emit(_("[success] Done. Buffer Int Tool completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Buffer Int Tool completed."))
 
     def on_buffer_ext(self):
         if not self.draw_app.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Buffer cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Buffer cancelled. No shape selected."))
             return
 
         try:
@@ -2754,8 +2796,8 @@ class FCBuffer(FCShapeTool):
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                     "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT)
@@ -2767,7 +2809,8 @@ class FCBuffer(FCShapeTool):
         self.disactivate()
         if ret_val == 'fail':
             return
-        self.draw_app.app.inform.emit(_("[success] Done. Buffer Ext Tool completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Buffer Ext Tool completed."))
 
     def activate(self):
         self.buff_tool.buffer_button.clicked.disconnect()
@@ -2862,7 +2905,8 @@ class FCEraser(FCShapeTool):
 
         self.draw_app.delete_utility_geometry()
         self.draw_app.plot_all()
-        self.draw_app.app.inform.emit(_("[success] Done. Eraser tool action completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Eraser tool action completed."))
 
     def utility_geometry(self, data=None):
         """
@@ -3497,8 +3541,13 @@ class FlatCAMGeoEditor(QtCore.QObject):
         if multigeo_tool:
             self.multigeo_tool = multigeo_tool
             geo_to_edit = fcgeometry.flatten(geometry=fcgeometry.tools[self.multigeo_tool]['solid_geometry'])
-            self.app.inform.emit(_("[WARNING_NOTCL] Editing MultiGeo Geometry, tool: {tool} with diameter: {dia}").
-                                 format(tool=self.multigeo_tool, dia=fcgeometry.tools[self.multigeo_tool]['tooldia']))
+            self.app.inform.emit('[WARNING_NOTCL] %s: %s %s: %s' %
+                                 (_("Editing MultiGeo Geometry, tool"),
+                                 str(self.multigeo_tool),
+                                 _("with diameter"),
+                                 str(fcgeometry.tools[self.multigeo_tool]['tooldia'])
+                                 )
+                                 )
         else:
             geo_to_edit = fcgeometry.flatten()
 
@@ -3738,7 +3787,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                             self.active_tool.complete = True
                             self.in_action = False
                             self.delete_utility_geometry()
-                            self.app.inform.emit(_("[success] Done."))
+                            self.app.inform.emit('[success] %s' %
+                                                 _("Done."))
                             self.select_tool('select')
                         else:
                             self.app.cursor = QtGui.QCursor()
@@ -3752,7 +3802,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                             self.active_tool.make()
                             if self.active_tool.complete:
                                 self.on_shape_complete()
-                                self.app.inform.emit(_("[success] Done."))
+                                self.app.inform.emit('[success] %s' %
+                                                     _("Done."))
                                 self.select_tool(self.active_tool.name)
         except Exception as e:
             log.warning("Error: %s" % str(e))
@@ -3869,7 +3920,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
 
     def on_copy_click(self):
         if not self.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Copy cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Copy cancelled. No shape selected."))
             return
 
         self.app.ui.geo_copy_btn.setChecked(True)
@@ -4119,8 +4171,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
             results = geo_shapes[0].geo
         except Exception as e:
             log.debug("FlatCAMGeoEditor.intersection() --> %s" % str(e))
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] A selection of at least 2 geo items is required to do Intersection."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("A selection of at least 2 geo items is required to do Intersection."))
             self.select_tool('select')
             return
 
@@ -4154,8 +4206,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
             intersector = geo_shapes[0].geo
         except Exception as e:
             log.debug("FlatCAMGeoEditor.intersection() --> %s" % str(e))
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] A selection of at least 2 geo items is required to do Intersection."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("A selection of at least 2 geo items is required to do Intersection."))
             self.select_tool('select')
             return
 
@@ -4240,9 +4292,9 @@ class FlatCAMGeoEditor(QtCore.QObject):
         selected = self.get_selected()
 
         if buf_distance < 0:
-            self.app.inform.emit(
-               _("[ERROR_NOTCL] Negative buffer value is not accepted. "
-                 "Use Buffer interior to generate an 'inside' shape"))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Negative buffer value is not accepted. Use Buffer interior to generate an "
+                                   "'inside' shape"))
 
             # deselect everything
             self.selected = []
@@ -4250,11 +4302,13 @@ class FlatCAMGeoEditor(QtCore.QObject):
             return 'fail'
 
         if len(selected) == 0:
-            self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for buffering."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Nothing selected for buffering."))
             return 'fail'
 
         if not isinstance(buf_distance, float):
-            self.app.inform.emit(_("[WARNING_NOTCL] Invalid distance for buffering."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Invalid distance for buffering."))
 
             # deselect everything
             self.selected = []
@@ -4277,7 +4331,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                 )
 
         if not results:
-            self.app.inform.emit(_("[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value."))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Failed, the result is empty. Choose a different buffer value."))
             # deselect everything
             self.selected = []
             self.replot()
@@ -4287,14 +4342,15 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.add_shape(DrawToolShape(sha))
 
         self.replot()
-        self.app.inform.emit(_("[success] Full buffer geometry created."))
+        self.app.inform.emit('[success] %s' %
+                             _("Full buffer geometry created."))
 
     def buffer_int(self, buf_distance, join_style):
         selected = self.get_selected()
 
         if buf_distance < 0:
-            self.app.inform.emit(
-                _("[ERROR_NOTCL] Negative buffer value is not accepted.")
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Negative buffer value is not accepted.")
             )
             # deselect everything
             self.selected = []
@@ -4302,11 +4358,13 @@ class FlatCAMGeoEditor(QtCore.QObject):
             return 'fail'
 
         if len(selected) == 0:
-            self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for buffering."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Nothing selected for buffering."))
             return 'fail'
 
         if not isinstance(buf_distance, float):
-            self.app.inform.emit(_("[WARNING_NOTCL] Invalid distance for buffering."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Invalid distance for buffering."))
             # deselect everything
             self.selected = []
             self.replot()
@@ -4325,7 +4383,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                 )
 
         if not results:
-            self.app.inform.emit(_("[ERROR_NOTCL] Failed, the result is empty. Choose a smaller buffer value."))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Failed, the result is empty. Choose a smaller buffer value."))
             # deselect everything
             self.selected = []
             self.replot()
@@ -4335,25 +4394,29 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.add_shape(DrawToolShape(sha))
 
         self.replot()
-        self.app.inform.emit(_("[success] Interior buffer geometry created."))
+        self.app.inform.emit('[success] %s' %
+                             _("Interior buffer geometry created."))
 
     def buffer_ext(self, buf_distance, join_style):
         selected = self.get_selected()
 
         if buf_distance < 0:
-            self.app.inform.emit(_("[ERROR_NOTCL] Negative buffer value is not accepted. "
-                                   "Use Buffer interior to generate an 'inside' shape"))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Negative buffer value is not accepted. Use Buffer interior to generate an "
+                                   "'inside' shape"))
             # deselect everything
             self.selected = []
             self.replot()
             return
 
         if len(selected) == 0:
-            self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for buffering."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Nothing selected for buffering."))
             return
 
         if not isinstance(buf_distance, float):
-            self.app.inform.emit(_("[WARNING_NOTCL] Invalid distance for buffering."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Invalid distance for buffering."))
             # deselect everything
             self.selected = []
             self.replot()
@@ -4372,7 +4435,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                 )
 
         if not results:
-            self.app.inform.emit(_("[ERROR_NOTCL] Failed, the result is empty. Choose a different buffer value."))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Failed, the result is empty. Choose a different buffer value."))
             # deselect everything
             self.selected = []
             self.replot()
@@ -4382,7 +4446,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.add_shape(DrawToolShape(sha))
 
         self.replot()
-        self.app.inform.emit(_("[success] Exterior buffer geometry created."))
+        self.app.inform.emit('[success] %s' %
+                             _("Exterior buffer geometry created."))
 
     # def paint(self, tooldia, overlap, margin, method):
     #     selected = self.get_selected()
@@ -4446,19 +4511,21 @@ class FlatCAMGeoEditor(QtCore.QObject):
         selected = self.get_selected()
 
         if len(selected) == 0:
-            self.app.inform.emit(_("[WARNING_NOTCL] Nothing selected for painting."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Nothing selected for painting."))
             return
 
         for param in [tooldia, overlap, margin]:
             if not isinstance(param, float):
                 param_name = [k for k, v in locals().items() if v is param][0]
-                self.app.inform.emit(_("[WARNING] Invalid value for {}").format(param))
+                self.app.inform.emit('[WARNING] %s: %s' %
+                                     (_("Invalid value for"), str(param)))
 
         results = []
 
         if overlap >= 1:
-            self.app.inform.emit(
-                _("[ERROR_NOTCL] Could not do Paint. Overlap value has to be less than 1.00 (100%)."))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Could not do Paint. Overlap value has to be less than 1.00 (100%%)."))
             return
 
         def recurse(geometry, reset=True):
@@ -4516,8 +4583,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                         local_results += list(cp.get_objects())
                 except Exception as e:
                     log.debug("Could not Paint the polygons. %s" % str(e))
-                    self.app.inform.emit(
-                        _("[ERROR] Could not do Paint. Try a different combination of parameters. "
+                    self.app.inform.emit('[ERROR] %s' %
+                                         _("Could not do Paint. Try a different combination of parameters. "
                           "Or a different method of Paint\n%s") % str(e))
                     return
 

+ 175 - 116
flatcamEditors/FlatCAMGrbEditor.py

@@ -204,14 +204,15 @@ class FCPad(FCShapeTool):
         try:
             self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2
         except KeyError:
-            self.draw_app.app.inform.emit(_(
-                "[WARNING_NOTCL] To add an Pad first select a aperture in Aperture Table"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("To add an Pad first select a aperture in Aperture Table"))
             self.draw_app.in_action = False
             self.complete = True
             return
 
         if self.radius == 0:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("Aperture size is zero. It needs to be greater than zero."))
             self.dont_execute = True
             return
         else:
@@ -374,7 +375,8 @@ class FCPad(FCShapeTool):
 
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Adding Pad completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Adding Pad completed."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -395,15 +397,16 @@ class FCPadArray(FCShapeTool):
         try:
             self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2
         except KeyError:
-            self.draw_app.app.inform.emit(_(
-                "[WARNING_NOTCL] To add an Pad Array first select a aperture in Aperture Table"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("To add an Pad Array first select a aperture in Aperture Table"))
             self.complete = True
             self.draw_app.in_action = False
             self.draw_app.array_frame.hide()
             return
 
         if self.radius == 0:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Aperture size is zero. It needs to be greater than zero."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("Aperture size is zero. It needs to be greater than zero."))
             self.dont_execute = True
             return
         else:
@@ -498,11 +501,12 @@ class FCPadArray(FCShapeTool):
                 self.pad_linear_angle = float(self.draw_app.linear_angle_spinner.get_value())
                 self.pad_angle = float(self.draw_app.pad_angle_entry.get_value())
             except TypeError:
-                self.draw_app.app.inform.emit(
-                    _("[ERROR_NOTCL] The value is not Float. Check for comma instead of dot separator."))
+                self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                              _("The value is not Float. Check for comma instead of dot separator."))
                 return
         except Exception as e:
-            self.draw_app.app.inform.emit(_("[ERROR_NOTCL] The value is mistyped. Check the value."))
+            self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                          _("The value is mistyped. Check the value."))
             return
 
         if self.pad_array == 'Linear':
@@ -692,7 +696,8 @@ class FCPadArray(FCShapeTool):
                 self.geometry.append(DrawToolShape(geo))
         else:
             if (self.pad_angle * self.pad_array_size) > 360:
-                self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Too many Pads for the selected spacing angle."))
+                self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                              _("Too many Pads for the selected spacing angle."))
                 return
 
             radius = distance(self.destination, self.origin)
@@ -714,7 +719,8 @@ class FCPadArray(FCShapeTool):
 
                 self.geometry.append(DrawToolShape(geo))
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Pad Array added."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Pad Array added."))
         self.draw_app.in_action = False
         self.draw_app.array_frame.hide()
         return
@@ -746,7 +752,8 @@ class FCPoligonize(FCShapeTool):
         if not self.draw_app.selected:
             self.draw_app.in_action = False
             self.complete = True
-            self.draw_app.app.inform.emit(_("[ERROR_NOTCL] Failed. Nothing selected."))
+            self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' %
+                                          _("Failed. Nothing selected."))
             self.draw_app.select_tool("select")
             return
 
@@ -761,8 +768,9 @@ class FCPoligonize(FCShapeTool):
         if len(apid_set) > 1:
             self.draw_app.in_action = False
             self.complete = True
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Failed. Poligonize works only on "
-                                            "geometries belonging to the same aperture."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' %
+                                          _("Failed. Poligonize works only on geometries belonging "
+                                            "to the same aperture."))
             self.draw_app.select_tool("select")
             return
 
@@ -814,7 +822,8 @@ class FCPoligonize(FCShapeTool):
 
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done. Poligonize completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Poligonize completed."))
 
         # MS: always return to the Select Tool if modifier key is not pressed
         # else return to the current tool
@@ -1054,7 +1063,8 @@ class FCRegion(FCShapeTool):
             self.geometry = DrawToolShape(new_geo_el)
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -1157,7 +1167,8 @@ class FCTrack(FCRegion):
 
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -1430,7 +1441,8 @@ class FCDisc(FCShapeTool):
 
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -1687,7 +1699,8 @@ class FCSemiDisc(FCShapeTool):
 
         self.draw_app.in_action = False
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -1835,7 +1848,8 @@ class FCApertureMove(FCShapeTool):
         self.selected_apertures = []
 
         if len(self.draw_app.get_selected()) == 0:
-            self.draw_app.app.inform.emit(_("[WARNING_NOTCL] Nothing selected to move ..."))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                          _("Nothing selected to move"))
             self.complete = True
             self.draw_app.select_tool("select")
             return
@@ -1958,7 +1972,8 @@ class FCApertureMove(FCShapeTool):
 
         self.draw_app.plot_all()
         self.draw_app.build_ui()
-        self.draw_app.app.inform.emit(_("[success] Done. Apertures Move completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Apertures Move completed."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -2034,7 +2049,8 @@ class FCApertureCopy(FCApertureMove):
             sel_shapes_to_be_deleted = []
 
         self.draw_app.build_ui()
-        self.draw_app.app.inform.emit(_("[success] Done. Apertures copied."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Apertures copied."))
 
 
 class FCEraser(FCShapeTool):
@@ -2141,7 +2157,8 @@ class FCEraser(FCShapeTool):
 
         self.draw_app.delete_utility_geometry()
         self.draw_app.plot_all()
-        self.draw_app.app.inform.emit(_("[success] Done. Eraser tool action completed."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done. Eraser tool action completed."))
 
     def clean_up(self):
         self.draw_app.selected = []
@@ -3132,12 +3149,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
             try:
                 ap_id = str(self.apcode_entry.get_value())
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Aperture code value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Aperture code value is missing or wrong format. Add it and retry."))
                 return
             if ap_id == '':
-                self.app.inform.emit(_("[WARNING_NOTCL] Aperture code value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Aperture code value is missing or wrong format. Add it and retry."))
                 return
 
         if ap_id == '0':
@@ -3172,7 +3189,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     except Exception as e:
                         log.error("FlatCAMGrbEditor.on_aperture_add() --> the R or O aperture dims has to be in a "
                                   "tuple format (x,y)\nError: %s" % str(e))
-                        self.app.inform.emit(_("[WARNING_NOTCL] Aperture dimensions value is missing or wrong format. "
+                        self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                             _("Aperture dimensions value is missing or wrong format. "
                                                "Add it in format (width, height) and retry."))
                         return
                 else:
@@ -3184,8 +3202,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                             size_val = float(self.apsize_entry.get_value().replace(',', '.'))
                             self.apsize_entry.set_value(size_val)
                         except ValueError:
-                            self.app.inform.emit(_("[WARNING_NOTCL] Aperture size value is missing or wrong format. "
-                                                   "Add it and retry."))
+                            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                                 _("Aperture size value is missing or wrong format. Add it and retry."))
                             return
                 self.storage_dict[ap_id]['size'] = size_val
 
@@ -3195,14 +3213,16 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 # values  each time a aperture code is edited or added
                 self.olddia_newdia[ap_id] = ap_id
             else:
-                self.app.inform.emit(_("[WARNING_NOTCL] 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
         # we add a new entry in the tool2tooldia dict
         self.tool2tooldia[len(self.olddia_newdia)] = int(ap_id)
 
-        self.app.inform.emit(_("[success] Added new aperture with code: {apid}").format(apid=str(ap_id)))
+        self.app.inform.emit('[success] %s: %s' %
+                             (_("Added new aperture with code"), str(ap_id)))
 
         self.build_ui()
 
@@ -3230,13 +3250,15 @@ class FlatCAMGrbEditor(QtCore.QObject):
             else:
                 # deleted_tool_dia = float(self.apertures_table.item(self.apertures_table.currentRow(), 1).text())
                 if len(self.apertures_table.selectionModel().selectedRows()) == 0:
-                    self.app.inform.emit(_("[WARNING_NOTCL] Select an aperture in Aperture Table"))
+                    self.app.inform.emit('[WARNING_NOTCL]%s' %
+                                         _(" Select an aperture in Aperture Table"))
                     return
                 for index in self.apertures_table.selectionModel().selectedRows():
                     row = index.row()
                     deleted_apcode_list.append(self.apertures_table.item(row, 1).text())
         except Exception as exc:
-            self.app.inform.emit(_("[WARNING_NOTCL] Select an aperture in Aperture Table --> %s" % str(exc)))
+            self.app.inform.emit('[WARNING_NOTCL] %s %s' %
+                                 (_("Select an aperture in Aperture Table -->", str(exc))))
             return
 
         if deleted_apcode_list:
@@ -3259,8 +3281,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
 
                     self.olddia_newdia.pop(deleted_aperture, None)
 
-                    self.app.inform.emit(_("[success] Deleted aperture with code: {del_dia}").format(
-                        del_dia=str(deleted_aperture)))
+                    self.app.inform.emit('[success] %s: %s' %
+                                         (_("Deleted aperture with code"), str(deleted_aperture)))
 
         self.plot_all()
         self.build_ui()
@@ -3910,11 +3932,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
             try:
                 grb_obj.create_geometry()
             except KeyError:
-                self.app.inform.emit(
-                   _("[ERROR_NOTCL] There are no Aperture definitions in the file. Aborting Gerber creation.")
-                )
+                self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                     _("There are no Aperture definitions in the file. Aborting Gerber creation."))
             except Exception as e:
-                msg = _("[ERROR] An internal error has occurred. See shell.\n")
+                msg = '[ERROR] %s' % \
+                      _("An internal error has occurred. See shell.\n")
                 msg += traceback.format_exc()
                 app_obj.inform.emit(msg)
                 raise
@@ -3927,7 +3949,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 self.app.progress.emit(100)
                 return
 
-            self.app.inform.emit(_("[success] Gerber editing finished."))
+            self.app.inform.emit('[success] %s' %
+                                 _("Done. Gerber editing finished."))
 
     def on_tool_select(self, tool):
         """
@@ -3943,7 +3966,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
             # self.draw_app.select_tool('select')
             self.complete = True
             current_tool = 'select'
-            self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. No aperture is selected"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Cancelled. No aperture is selected"))
 
         # This is to make the group behave as radio group
         if current_tool in self.tools_gerber:
@@ -4094,7 +4118,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     self.app.clipboard.setText(
                         self.app.defaults["global_point_clipboard_format"] % (self.pos[0], self.pos[1])
                     )
-                    self.app.inform.emit(_("[success] Coordinates copied to clipboard."))
+                    self.app.inform.emit('[success] %s' %
+                                         _("Coordinates copied to clipboard."))
                     return
 
                 # Dispatch event to active_tool
@@ -4153,7 +4178,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                             self.active_tool.complete = True
                             self.in_action = False
                             self.delete_utility_geometry()
-                            self.app.inform.emit(_("[success] Done."))
+                            self.app.inform.emit('[success] %s' %
+                                                 _("Done."))
                             self.select_tool('select')
                         else:
                             self.app.cursor = QtGui.QCursor()
@@ -4167,7 +4193,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                             self.active_tool.make()
                             if self.active_tool.complete:
                                 self.on_grb_shape_complete()
-                                self.app.inform.emit(_("[success] Done."))
+                                self.app.inform.emit('[success] %s' %
+                                                     _("Done."))
 
                                 # MS: always return to the Select Tool if modifier key is not pressed
                                 # else return to the current tool but not for FCTrack
@@ -4474,7 +4501,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
         temp_ref = [s for s in self.selected]
 
         if len(temp_ref) == 0:
-            self.app.inform.emit(_("[ERROR_NOTCL] Failed. No aperture geometry is selected."))
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Failed. No aperture geometry is selected."))
             return
 
         for shape_sel in temp_ref:
@@ -4482,7 +4510,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
 
         self.selected = []
         self.build_ui()
-        self.app.inform.emit(_("[success] Done. Apertures geometry deleted."))
+        self.app.inform.emit('[success] %s' %
+                             _("Done. Apertures geometry deleted."))
 
     def delete_shape(self, geo_el):
         self.is_modified = True
@@ -4596,8 +4625,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 buff_value = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buff_value)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. "
-                                       "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Buffer distance value is missing or wrong format. Add it and retry."))
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # I populated the combobox such that the index coincide with the join styles value (which is really an INT)
@@ -4624,9 +4653,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     return geom_el
 
         if not self.apertures_table.selectedItems():
-            self.app.inform.emit(_(
-                "[WARNING_NOTCL] No aperture to buffer. Select at least one aperture and try again."
-            ))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No aperture to buffer. Select at least one aperture and try again."))
             return
 
         for x in self.apertures_table.selectedItems():
@@ -4638,10 +4666,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 self.storage_dict[apid]['geometry'] = temp_storage
             except Exception as e:
                 log.debug("FlatCAMGrbEditor.buffer() --> %s\n%s" % str(e))
-                self.app.inform.emit(_("[ERROR_NOTCL] Failed.\n%s") % str(traceback.print_exc()))
+                self.app.inform.emit('[ERROR_NOTCL] %s\n%s' %
+                                     (_("Failed."), str(traceback.print_exc())))
                 return
         self.plot_all()
-        self.app.inform.emit(_("[success] Done. Buffer Tool completed."))
+        self.app.inform.emit('[success] %s' %
+                             _("Done. Buffer Tool completed."))
 
     def on_scale(self):
         scale_factor = 1.0
@@ -4655,8 +4685,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 scale_factor = float(self.scale_factor_entry.get_value().replace(',', '.'))
                 self.scale_factor_entry.set_value(scale_factor)
             except ValueError:
-                self.app.inform.emit(_("[WARNING_NOTCL] Scale factor value is missing or wrong format. "
-                                     "Add it and retry."))
+                self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                     _("Scale factor value is missing or wrong format. Add it and retry."))
                 return
 
         def scale_recursion(geom_el, selection):
@@ -4687,9 +4717,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     return geom_el
 
         if not self.apertures_table.selectedItems():
-            self.app.inform.emit(_(
-                "[WARNING_NOTCL] No aperture to scale. Select at least one aperture and try again."
-            ))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No aperture to scale. Select at least one aperture and try again."))
             return
 
         for x in self.apertures_table.selectedItems():
@@ -4704,7 +4733,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 log.debug("FlatCAMGrbEditor.on_scale() --> %s" % str(e))
 
         self.plot_all()
-        self.app.inform.emit(_("[success] Done. Scale Tool completed."))
+        self.app.inform.emit('[success] %s' %
+                             _("Done. Scale Tool completed."))
 
     def on_markarea(self):
         # clear previous marking
@@ -4741,9 +4771,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
             self.ma_annotation.set(text=text, pos=position, visible=True,
                                    font_size=self.app.defaults["cncjob_annotation_fontsize"],
                                    color=self.app.defaults["global_sel_draw_color"])
-            self.app.inform.emit(_("[success] Polygon areas marked."))
+            self.app.inform.emit('[success] %s' %
+                                 _("Polygon areas marked."))
         else:
-            self.app.inform.emit(_("[WARNING_NOTCL] There are no polygons to mark area."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("There are no polygons to mark area."))
 
     def on_eraser(self):
         self.select_tool('eraser')
@@ -5226,7 +5258,8 @@ class TransformEditorTool(FlatCAMTool):
 
     def template(self):
         if not self.fcdraw.selected:
-            self.app.inform.emit(_("[WARNING_NOTCL] Transformation cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("Transformation cancelled. No shape selected."))
             return
 
         self.draw_app.select_tool("select")
@@ -5246,8 +5279,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.rotate_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
                                    'params': [value]})
@@ -5289,8 +5322,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.skewx_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_skew("X", value)
@@ -5316,8 +5349,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.skewy_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_skew("Y", value)
@@ -5343,8 +5376,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     x_value = float(self.scalex_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -5384,8 +5417,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     y_value = float(self.scaley_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -5422,8 +5455,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.offx_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_offset("X", value)
@@ -5448,8 +5481,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                     value = float(self.offy_entry.get_value().replace(',', '.'))
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
 
         # self.on_offset("Y", value)
@@ -5471,7 +5504,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
 
         if not elem_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to rotate!"))
             return
 
         with self.app.proc_container.new(_("Appying Rotate")):
@@ -5507,10 +5541,12 @@ class TransformEditorTool(FlatCAMTool):
                         sel_el['clear'] = affinity.rotate(sel_el['clear'], angle=-num, origin=(px, py))
                 self.draw_app.plot_all()
 
-                self.app.inform.emit(_("[success] Done. Rotate completed."))
+                self.app.inform.emit('[success] %s' %
+                                     _("Done. Rotate completed."))
                 self.app.progress.emit(100)
             except Exception as e:
-                self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, rotation movement was not executed.") % str(e))
+                self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                     (_("Rotation action was not executed."), str(e)))
                 return
 
     def on_flip(self, axis):
@@ -5526,7 +5562,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
 
         if not elem_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to flip!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to flip!"))
             return
 
         with self.app.proc_container.new(_("Applying Flip")):
@@ -5568,7 +5605,8 @@ class TransformEditorTool(FlatCAMTool):
                             sel_el['follow'] = affinity.scale(sel_el['follow'], xfact=1, yfact=-1, origin=(px, py))
                         if 'clear' in sel_el:
                             sel_el['clear'] = affinity.scale(sel_el['clear'], xfact=1, yfact=-1, origin=(px, py))
-                        self.app.inform.emit(_('[success] Flip on the Y axis done ...'))
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Flip on the Y axis done'))
                     elif axis is 'Y':
                         if 'solid' in sel_el:
                             sel_el['solid'] = affinity.scale(sel_el['solid'], xfact=-1, yfact=1, origin=(px, py))
@@ -5576,12 +5614,14 @@ class TransformEditorTool(FlatCAMTool):
                             sel_el['follow'] = affinity.scale(sel_el['follow'], xfact=-1, yfact=1, origin=(px, py))
                         if 'clear' in sel_el:
                             sel_el['clear'] = affinity.scale(sel_el['clear'], xfact=-1, yfact=1, origin=(px, py))
-                        self.app.inform.emit(_('[success] Flip on the X axis done ...'))
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Flip on the X axis done'))
                 self.draw_app.plot_all()
                 self.app.progress.emit(100)
 
             except Exception as e:
-                self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Flip action was not executed.") % str(e))
+                self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                     (_("Flip action was not executed."), str(e)))
                 return
 
     def on_skew(self, axis, num):
@@ -5596,7 +5636,8 @@ class TransformEditorTool(FlatCAMTool):
         yminlist = []
 
         if not elem_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to shear/skew!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to shear/skew!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Skew")):
@@ -5634,11 +5675,17 @@ class TransformEditorTool(FlatCAMTool):
                                 sel_el['clear'] = affinity.skew(sel_el['clear'], 0, num, origin=(xminimal, yminimal))
                     self.draw_app.plot_all()
 
-                    self.app.inform.emit(_('[success] Skew on the %s axis done ...') % str(axis))
+                    if str(axis) == 'X':
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Skew on the X axis done'))
+                    else:
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Skew on the Y axis done'))
                     self.app.progress.emit(100)
 
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Skew action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Skew action was not executed."), str(e)))
                     return
 
     def on_scale(self, axis, xfactor, yfactor, point=None):
@@ -5657,7 +5704,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
 
         if not elem_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to scale!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to scale!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Scale")):
@@ -5698,10 +5746,16 @@ class TransformEditorTool(FlatCAMTool):
                             sel_el['clear'] = affinity.scale(sel_el['clear'], xfactor, yfactor, origin=(px, py))
                     self.draw_app.plot_all()
 
-                    self.app.inform.emit(_('[success] Scale on the %s axis done ...') % str(axis))
+                    if str(axis) == 'X':
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Scale on the X axis done'))
+                    else:
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Scale on the Y axis done'))
                     self.app.progress.emit(100)
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Scale action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Scale action was not executed."), str(e)))
                     return
 
     def on_offset(self, axis, num):
@@ -5714,7 +5768,8 @@ class TransformEditorTool(FlatCAMTool):
         elem_list = self.draw_app.selected
 
         if not elem_list:
-            self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to offset!"))
+            self.app.inform.emit('[WARNING_NOTCL] %s' %
+                                 _("No shape selected. Please Select a shape to offset!"))
             return
         else:
             with self.app.proc_container.new(_("Applying Offset")):
@@ -5739,11 +5794,17 @@ class TransformEditorTool(FlatCAMTool):
                                 sel_el['clear'] = affinity.translate(sel_el['clear'], 0, num)
                         self.draw_app.plot_all()
 
-                    self.app.inform.emit(_('[success] Offset on the %s axis done ...') % str(axis))
+                    if str(axis) == 'X':
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Offset on the X axis done'))
+                    else:
+                        self.app.inform.emit('[success] %s...' %
+                                             _('Offset on the Y axis done'))
                     self.app.progress.emit(100)
 
                 except Exception as e:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Due of %s, Offset action was not executed.") % str(e))
+                    self.app.inform.emit('[ERROR_NOTCL] %s: %s' %
+                                         (_("Offset action was not executed."), str(e)))
                     return
 
     def on_rotate_key(self):
@@ -5756,14 +5817,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_rotate(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape rotate done...")
-            )
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape rotate done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape rotate cancelled...")
-            )
+            self.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                 _("Geometry shape rotate cancelled"))
 
     def on_offx_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
@@ -5777,12 +5836,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_offx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape offset on X axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape offset on X axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape offset X cancelled..."))
+            self.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                 _("Geometry shape offset X cancelled"))
 
     def on_offy_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
@@ -5796,12 +5855,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_offx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape offset on Y axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape offset on Y axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape offset Y cancelled..."))
+            self.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                 _("Geometry shape offset Y cancelled"))
 
     def on_skewx_key(self):
         val_box = FCInputDialog(title=_("Skew on X axis ..."),
@@ -5813,12 +5872,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_skewx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape skew on X axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape skew on X axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape skew X cancelled..."))
+            self.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                 _("Geometry shape skew X cancelled"))
 
     def on_skewy_key(self):
         val_box = FCInputDialog(title=_("Skew on Y axis ..."),
@@ -5830,12 +5889,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         if ok:
             self.on_skewx(val=val)
-            self.app.inform.emit(
-                _("[success] Geometry shape skew on Y axis done..."))
+            self.app.inform.emit('[success] %s...' %
+                                 _("Geometry shape skew on Y axis done"))
             return
         else:
-            self.app.inform.emit(
-                _("[WARNING_NOTCL] Geometry shape skew Y cancelled..."))
+            self.app.inform.emit('[WARNING_NOTCL] %s...' %
+                                 _("Geometry shape skew Y cancelled"))
 
 
 def get_shapely_list_bounds(geometry_list):

+ 2 - 2
flatcamGUI/FlatCAMGUI.py

@@ -6665,7 +6665,7 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
 
         # ## Plotting type
         self.ncc_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'},
-                                            {"label": _("progressive"), "value": "progressive"}])
+                                            {"label": _("Progressive"), "value": "progressive"}])
         plotting_label = QtWidgets.QLabel('%s:' % _("NCC Plotting"))
         plotting_label.setToolTip(
             _("- 'Normal' -  normal plotting, done at the end of the NCC job\n"
@@ -6971,7 +6971,7 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
 
         # ## Plotting type
         self.paint_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'},
-                                              {"label": _("progressive"), "value": "progressive"}])
+                                              {"label": _("Progressive"), "value": "progressive"}])
         plotting_label = QtWidgets.QLabel('%s:' % _("Paint Plotting"))
         plotting_label.setToolTip(
             _("- 'Normal' -  normal plotting, done at the end of the Paint job\n"

+ 8 - 1
flatcamParsers/ParseFont.py

@@ -23,6 +23,13 @@ import freetype as ft
 from fontTools import ttLib
 
 import logging
+import gettext
+import FlatCAMTranslation as fcTranslate
+import builtins
+
+fcTranslate.apply_language('strings')
+if '_' not in builtins.__dict__:
+    _ = gettext.gettext
 
 log = logging.getLogger('base2')
 
@@ -295,7 +302,7 @@ class ParseFont():
             elif font_type == 'regular':
                 path_filename = regular_dict[font_name]
         except Exception as e:
-            self.app.inform.emit("[ERROR_NOTCL] Font not supported, try another one.")
+            self.app.inform.emit('[ERROR_NOTCL] %s' % _("Font not supported, try another one."))
             log.debug("[ERROR_NOTCL] Font Loading: %s" % str(e))
             return "flatcam font parse failed"
 

+ 4 - 1
flatcamTools/ToolNonCopperClear.py

@@ -2564,7 +2564,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
         the given boundary polygon. If not specified, it defaults to
         the rectangular bounding box of target geometry.
         """
-        geo_len = len(target)
+        if isinstance(target, Polygon):
+            geo_len = 1
+        else:
+            geo_len = len(target)
         pol_nr = 0
         old_disp_number = 0
 

+ 23 - 23
flatcamTools/ToolPaint.py

@@ -350,6 +350,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
         self.obj_name = ""
         self.paint_obj = None
+        self.bound_obj_name = ""
+        self.bound_obj = None
 
         self.units = ''
         self.paint_tools = {}
@@ -680,8 +682,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
         try:
             self.tools_table.itemChanged.disconnect()
-        except Exception as e:
-            log.debug("ToolPaint.on_tool_add() --> %s" % str(e))
+        except TypeError:
+            pass
 
         if dia:
             tool_dia = dia
@@ -751,8 +753,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
         try:
             self.tools_table.itemChanged.disconnect()
-        except Exception as e:
-            log.debug("ToolPaint.on_tool_edit() --> %s" % str(e))
+        except TypeError:
+            pass
 
         tool_dias = []
         for k, v in self.paint_tools.items():
@@ -850,8 +852,7 @@ class ToolPaint(FlatCAMTool, Gerber):
     def on_tool_delete(self, rows_to_delete=None, all=None):
         try:
             self.tools_table.itemChanged.disconnect()
-        except Exception as e:
-            log.debug("ToolPaint.on_tool_delete() --> %s" % str(e))
+        except TypeError:
             pass
 
         deleted_tools_list = []
@@ -1277,13 +1278,13 @@ class ToolPaint(FlatCAMTool, Gerber):
             else:
                 pass
 
-            def paint_p(polyg, tooldia):
+            def paint_p(polyg, tooldiameter):
                 cpoly = None
                 try:
                     if paint_method == "seed":
                         # Type(cp) == FlatCAMRTreeStorage | None
                         cpoly = self.clear_polygon2(polyg,
-                                                    tooldia=tooldia,
+                                                    tooldia=tooldiameter,
                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                     overlap=over,
                                                     contour=cont,
@@ -1293,7 +1294,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                     elif paint_method == "lines":
                         # Type(cp) == FlatCAMRTreeStorage | None
                         cpoly = self.clear_polygon3(polyg,
-                                                    tooldia=tooldia,
+                                                    tooldia=tooldiameter,
                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                     overlap=over,
                                                     contour=cont,
@@ -1303,12 +1304,12 @@ class ToolPaint(FlatCAMTool, Gerber):
                     else:
                         # Type(cp) == FlatCAMRTreeStorage | None
                         cpoly = self.clear_polygon(polyg,
-                                                   tooldia=tooldia,
+                                                   tooldia=tooldiameter,
                                                    steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                    overlap=over,
                                                    contour=cont,
                                                    connect=conn,
-                                                    prog_plot=prog_plot)
+                                                   prog_plot=prog_plot)
                 except FlatCAMApp.GracefulException:
                     return "fail"
                 except Exception as e:
@@ -1318,8 +1319,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                     geo_obj.solid_geometry += list(cpoly.get_objects())
                     return cpoly
                 else:
-                    self.app.inform.emit('[ERROR_NOTCL] %s' %
-                                         _('Geometry could not be painted completely'))
+                    app_obj.inform.emit('[ERROR_NOTCL] %s' %
+                                        _('Geometry could not be painted completely'))
                     return None
 
             try:
@@ -1363,10 +1364,12 @@ class ToolPaint(FlatCAMTool, Gerber):
                     return "fail"
                 except Exception as e:
                     log.debug("Could not Paint the polygons. %s" % str(e))
-                    self.app.inform.emit('[ERROR] %s\n%s' %
-                                         (_("Could not do Paint. Try a different combination of parameters. "
-                                            "Or a different strategy of paint"),
-                                          str(e)))
+                    app_obj.inform.emit('[ERROR] %s\n%s' %
+                                        (_("Could not do Paint. Try a different combination of parameters. "
+                                           "Or a different strategy of paint"),
+                                         str(e)
+                                         )
+                                        )
                     return "fail"
 
                 # add the solid_geometry to the current too in self.paint_tools (tools_storage)
@@ -1636,7 +1639,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                 painted_area = recurse(obj.solid_geometry)
                 # variables to display the percentage of work done
                 geo_len = len(painted_area)
-                disp_number = 0
+
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
 
@@ -1800,7 +1803,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                 painted_area = recurse(obj.solid_geometry)
                 # variables to display the percentage of work done
                 geo_len = int(len(painted_area) / 100)
-                disp_number = 0
+
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
 
@@ -2099,7 +2102,6 @@ class ToolPaint(FlatCAMTool, Gerber):
 
                 # variables to display the percentage of work done
                 geo_len = len(painted_area)
-                disp_number = 0
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
 
@@ -2111,7 +2113,6 @@ class ToolPaint(FlatCAMTool, Gerber):
                             continue
                         poly_buf = geo.buffer(-paint_margin)
 
-                        cp = None
                         if paint_method == "seed":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             cp = self.clear_polygon2(poly_buf,
@@ -2140,7 +2141,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                                                     overlap=over,
                                                     contour=cont,
                                                     connect=conn,
-                                                     prog_plot=prog_plot)
+                                                    prog_plot=prog_plot)
 
                         if cp is not None:
                             total_geometry += list(cp.get_objects())
@@ -2269,7 +2270,6 @@ class ToolPaint(FlatCAMTool, Gerber):
 
                 # variables to display the percentage of work done
                 geo_len = len(painted_area)
-                disp_number = 0
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
 

+ 15 - 27
flatcamTools/ToolPanelize.py

@@ -565,12 +565,7 @@ class Panelize(FlatCAMTool):
                     if isinstance(panel_obj, FlatCAMGerber):
                         obj_fin.apertures = deepcopy(panel_obj.apertures)
                         for ap in obj_fin.apertures:
-                            if 'solid_geometry' in obj_fin.apertures[ap]:
-                                obj_fin.apertures[ap]['solid_geometry'] = []
-                            if 'clear_geometry' in obj_fin.apertures[ap]:
-                                obj_fin.apertures[ap]['clear_geometry'] = []
-                            if 'follow_geometry' in obj_fin.apertures[ap]:
-                                obj_fin.apertures[ap]['follow_geometry'] = []
+                            obj_fin.apertures[ap]['geometry'] = list()
 
                     self.app.progress.emit(0)
                     for row in range(rows):
@@ -599,36 +594,29 @@ class Panelize(FlatCAMTool):
                                     obj_fin.solid_geometry.append(geo)
 
                                 for apid in panel_obj.apertures:
-                                    if 'solid_geometry' in panel_obj.apertures[apid]:
-                                        geo_aper = translate_recursion(panel_obj.apertures[apid]['solid_geometry'])
-                                        if isinstance(geo_aper, list):
-                                            obj_fin.apertures[apid]['solid_geometry'] += geo_aper
-                                        else:
-                                            obj_fin.apertures[apid]['solid_geometry'].append(geo_aper)
+                                    for el in panel_obj.apertures[apid]['geometry']:
+                                        new_el = dict()
+                                        if 'solid' in el:
+                                            geo_aper = translate_recursion(el['solid'])
+                                            new_el['solid'] = deepcopy(geo_aper)
 
-                                    if 'clear_geometry' in panel_obj.apertures[apid]:
-                                        geo_aper = translate_recursion(panel_obj.apertures[apid]['clear_geometry'])
-                                        if isinstance(geo_aper, list):
-                                            obj_fin.apertures[apid]['clear_geometry'] += geo_aper
-                                        else:
-                                            obj_fin.apertures[apid]['clear_geometry'].append(geo_aper)
+                                        if 'clear' in el:
+                                            geo_aper = translate_recursion(el['clear'])
+                                            new_el['clear'] = deepcopy(geo_aper)
 
-                                    if 'follow_geometry' in panel_obj.apertures[apid]:
-                                        geo_aper = translate_recursion(panel_obj.apertures[apid]['follow_geometry'])
-                                        if isinstance(geo_aper, list):
-                                            obj_fin.apertures[apid]['follow_geometry'] += geo_aper
-                                        else:
-                                            obj_fin.apertures[apid]['follow_geometry'].append(geo_aper)
+                                        if 'follow' in el:
+                                            geo_aper = translate_recursion(el['follow'])
+                                            new_el['follow'] = deepcopy(geo_aper)
+
+                                        obj_fin.apertures[apid]['geometry'].append(deepcopy(new_el))
 
                             currentx += lenghtx
                         currenty += lenghty
 
                     app_obj.log.debug("Found %s geometries. Creating a panel geometry cascaded union ..." %
                                       len(obj_fin.solid_geometry))
-                    self.app.inform.emit(_("Found %s geometries. Creating a final panel geometry ...") %
-                                         len(obj_fin.solid_geometry))
 
-                    obj_fin.solid_geometry = cascaded_union(obj_fin.solid_geometry)
+                    # obj_fin.solid_geometry = cascaded_union(obj_fin.solid_geometry)
                     app_obj.log.debug("Finished creating a cascaded union for the panel.")
 
                 if isinstance(panel_obj, FlatCAMExcellon):

BIN
locale/de/LC_MESSAGES/strings.mo


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 295 - 292
locale/de/LC_MESSAGES/strings.po


BIN
locale/en/LC_MESSAGES/strings.mo


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 487 - 347
locale/en/LC_MESSAGES/strings.po


BIN
locale/ro/LC_MESSAGES/strings.mo


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 474 - 476
locale/ro/LC_MESSAGES/strings.po


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 304 - 288
locale_template/strings.pot


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott