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

- 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 лет назад
Родитель
Сommit
59704a6e01

+ 7 - 9
FlatCAMApp.py

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

+ 2 - 0
FlatCAMObj.py

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

+ 11 - 2
camlib.py

@@ -3376,8 +3376,17 @@ class Gerber (Geometry):
                 new_poly = cascaded_union(poly_buffer)
                 new_poly = cascaded_union(poly_buffer)
                 new_poly = new_poly.buffer(0, int(self.steps_per_circle / 4))
                 new_poly = new_poly.buffer(0, int(self.steps_per_circle / 4))
                 log.warning("Union done.")
                 log.warning("Union done.")
+
             if current_polarity == 'D':
             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:
             else:
                 self.solid_geometry = self.solid_geometry.difference(new_poly)
                 self.solid_geometry = self.solid_geometry.difference(new_poly)
         except Exception as err:
         except Exception as err:
@@ -6313,7 +6322,7 @@ class CNCjob(Geometry):
             self.z_depthpercut = abs(self.z_cut)
             self.z_depthpercut = abs(self.z_cut)
 
 
         if self.z_move is None:
         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."))
                                  _("Travel Z parameter is None or zero."))
             return 'fail'
             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)
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
         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")
             self.draw_app.select_tool("drill_select")
             return
             return
 
 
@@ -112,7 +113,8 @@ class FCDrillAdd(FCShapeTool):
         self.geometry = DrawToolShape(self.util_shape(self.points))
         self.geometry = DrawToolShape(self.util_shape(self.points))
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         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):
 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)
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
         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
             return
 
 
         try:
         try:
@@ -208,11 +211,12 @@ class FCDrillArray(FCShapeTool):
                 self.drill_linear_angle = float(self.draw_app.linear_angle_spinner.get_value())
                 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())
                 self.drill_angle = float(self.draw_app.drill_angle_entry.get_value())
             except TypeError:
             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
                 return
         except Exception as e:
         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
             return
 
 
         if self.drill_array == 'Linear':
         if self.drill_array == 'Linear':
@@ -310,7 +314,8 @@ class FCDrillArray(FCShapeTool):
                 self.geometry.append(DrawToolShape(geo))
                 self.geometry.append(DrawToolShape(geo))
         else:
         else:
             if (self.drill_angle * self.drill_array_size) > 360:
             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
                 return
 
 
             radius = distance(self.destination, self.origin)
             radius = distance(self.destination, self.origin)
@@ -327,7 +332,8 @@ class FCDrillArray(FCShapeTool):
                 geo = self.util_shape((x, y))
                 geo = self.util_shape((x, y))
                 self.geometry.append(DrawToolShape(geo))
                 self.geometry.append(DrawToolShape(geo))
         self.complete = True
         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.in_action = False
         self.draw_app.array_frame.hide()
         self.draw_app.array_frame.hide()
         return
         return
@@ -355,7 +361,8 @@ class FCSlot(FCShapeTool):
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
         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")
             self.draw_app.select_tool("drill_select")
             return
             return
 
 
@@ -412,15 +419,15 @@ class FCSlot(FCShapeTool):
                 slot_length = float(self.draw_app.slot_length_entry.get_value().replace(',', '.'))
                 slot_length = float(self.draw_app.slot_length_entry.get_value().replace(',', '.'))
                 self.draw_app.slot_length_entry.set_value(slot_length)
                 self.draw_app.slot_length_entry.set_value(slot_length)
             except ValueError:
             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
                 return
 
 
         try:
         try:
             slot_angle = float(self.draw_app.slot_angle_spinner.get_value())
             slot_angle = float(self.draw_app.slot_angle_spinner.get_value())
         except ValueError:
         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
             return
 
 
         if self.draw_app.slot_axis_radio.get_value() == 'X':
         if self.draw_app.slot_axis_radio.get_value() == 'X':
@@ -518,7 +525,8 @@ class FCSlot(FCShapeTool):
 
 
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         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()
         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)
             item = self.draw_app.tools_table_exc.item((self.draw_app.last_tool_selected - 1), 1)
             self.draw_app.tools_table_exc.setCurrentItem(item)
             self.draw_app.tools_table_exc.setCurrentItem(item)
         except KeyError:
         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
             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_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())
                 self.slot_angle = float(self.draw_app.slot_array_angle_entry.get_value())
             except TypeError:
             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
                 return
         except Exception as e:
         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
             return
 
 
         if self.slot_array == 'Linear':
         if self.slot_array == 'Linear':
@@ -687,15 +697,15 @@ class FCSlotArray(FCShapeTool):
                 slot_length = float(self.draw_app.slot_length_entry.get_value().replace(',', '.'))
                 slot_length = float(self.draw_app.slot_length_entry.get_value().replace(',', '.'))
                 self.draw_app.slot_length_entry.set_value(slot_length)
                 self.draw_app.slot_length_entry.set_value(slot_length)
             except ValueError:
             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
                 return
 
 
         try:
         try:
             slot_angle = float(self.draw_app.slot_angle_spinner.get_value())
             slot_angle = float(self.draw_app.slot_angle_spinner.get_value())
         except ValueError:
         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
             return
 
 
         if self.draw_app.slot_axis_radio.get_value() == 'X':
         if self.draw_app.slot_axis_radio.get_value() == 'X':
@@ -804,7 +814,8 @@ class FCSlotArray(FCShapeTool):
                 self.geometry.append(DrawToolShape(geo))
                 self.geometry.append(DrawToolShape(geo))
         else:
         else:
             if (self.slot_angle * self.slot_array_size) > 360:
             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
                 return
 
 
             radius = distance(self.destination, self.origin)
             radius = distance(self.destination, self.origin)
@@ -826,7 +837,8 @@ class FCSlotArray(FCShapeTool):
 
 
                 self.geometry.append(DrawToolShape(geo))
                 self.geometry.append(DrawToolShape(geo))
         self.complete = True
         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.in_action = False
         self.draw_app.slot_frame.hide()
         self.draw_app.slot_frame.hide()
         self.draw_app.slot_array_frame.hide()
         self.draw_app.slot_array_frame.hide()
@@ -872,9 +884,8 @@ class FCDrillResize(FCShapeTool):
         try:
         try:
             new_dia = self.draw_app.resdrill_entry.get_value()
             new_dia = self.draw_app.resdrill_entry.get_value()
         except:
         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
             return
 
 
         if new_dia not in self.draw_app.olddia_newdia:
         if new_dia not in self.draw_app.olddia_newdia:
@@ -963,7 +974,8 @@ class FCDrillResize(FCShapeTool):
                             self.geometry.append(DrawToolShape(new_poly))
                             self.geometry.append(DrawToolShape(new_poly))
                         else:
                         else:
                             # unexpected geometry so we cancel
                             # 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
                             return
 
 
                         # remove the geometry with the old size
                         # remove the geometry with the old size
@@ -1032,7 +1044,8 @@ class FCDrillResize(FCShapeTool):
                     except KeyError:
                     except KeyError:
                         # if the exception happen here then we are not dealing with slots neither
                         # if the exception happen here then we are not dealing with slots neither
                         # therefore something else is not OK so we return
                         # 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
                         return
 
 
             # this simple hack is used so we can delete form self.draw_app.selected but
             # 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
             # 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.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:
         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
         # init this set() for another use perhaps
         self.selected_dia_set = set()
         self.selected_dia_set = set()
@@ -1137,7 +1152,8 @@ class FCDrillMove(FCShapeTool):
             sel_shapes_to_be_deleted = []
             sel_shapes_to_be_deleted = []
 
 
         self.draw_app.build_ui()
         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):
     def selection_bbox(self):
         geo_list = []
         geo_list = []
@@ -1234,7 +1250,8 @@ class FCDrillCopy(FCDrillMove):
             sel_shapes_to_be_deleted = []
             sel_shapes_to_be_deleted = []
 
 
         self.draw_app.build_ui()
         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):
 class FCDrillSelect(DrawTool):
@@ -2395,9 +2412,8 @@ class FlatCAMExcEditor(QtCore.QObject):
                 try:
                 try:
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                     tool_dia = float(self.addtool_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, "
-                                         "use a number.")
-                                         )
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         if tool_dia not in self.olddia_newdia:
         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
             # each time a tool diameter is edited or added
             self.olddia_newdia[tool_dia] = tool_dia
             self.olddia_newdia[tool_dia] = tool_dia
         else:
         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
             return
 
 
         # since we add a new tool, we update also the initial state of the tool_table through it's dictionary
         # 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
         # we add a new entry in the tool2tooldia dict
         self.tool2tooldia[len(self.olddia_newdia)] = tool_dia
         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()
         self.build_ui()
 
 
@@ -2449,7 +2465,8 @@ class FlatCAMExcEditor(QtCore.QObject):
                 else:
                 else:
                     deleted_tool_dia_list.append(float('%.4f' % dia))
                     deleted_tool_dia_list.append(float('%.4f' % dia))
         except Exception as e:
         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
             return
 
 
         for deleted_tool_dia in deleted_tool_dia_list:
         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.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.replot()
         # self.app.inform.emit("Could not delete selected tool")
         # 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.itemChanged.connect(self.on_tool_edit)
         self.tools_table_exc.cellPressed.connect(self.on_row_selected)
         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)
         # self.tools_table_exc.selectionModel().currentChanged.connect(self.on_row_selected)
 
 
@@ -3166,11 +3183,12 @@ class FlatCAMExcEditor(QtCore.QObject):
             try:
             try:
                 excellon_obj.create_geometry()
                 excellon_obj.create_geometry()
             except KeyError:
             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:
             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()
                 msg += traceback.format_exc()
                 app_obj.inform.emit(msg)
                 app_obj.inform.emit(msg)
                 raise
                 raise
@@ -3185,7 +3203,8 @@ class FlatCAMExcEditor(QtCore.QObject):
                 self.app.progress.emit(100)
                 self.app.progress.emit(100)
                 return
                 return
 
 
-            self.app.inform.emit(_("[success] Excellon editing finished."))
+            self.app.inform.emit('[success] %s' %
+                                 _("Excellon editing finished."))
             # self.progress.emit(100)
             # self.progress.emit(100)
 
 
     def on_tool_select(self, tool):
     def on_tool_select(self, tool):
@@ -3202,7 +3221,8 @@ class FlatCAMExcEditor(QtCore.QObject):
             # self.draw_app.select_tool('drill_select')
             # self.draw_app.select_tool('drill_select')
             self.complete = True
             self.complete = True
             current_tool = 'drill_select'
             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
         # This is to make the group behave as radio group
         if current_tool in self.tools_exc:
         if current_tool in self.tools_exc:
@@ -3421,14 +3441,16 @@ class FlatCAMExcEditor(QtCore.QObject):
                         self.active_tool.complete = True
                         self.active_tool.complete = True
                         self.in_action = False
                         self.in_action = False
                         self.delete_utility_geometry()
                         self.delete_utility_geometry()
-                        self.app.inform.emit(_("[success] Done."))
+                        self.app.inform.emit('[success] %s' %
+                                             _("Done."))
                         self.select_tool('drill_select')
                         self.select_tool('drill_select')
                     else:
                     else:
                         if isinstance(self.active_tool, FCDrillAdd):
                         if isinstance(self.active_tool, FCDrillAdd):
                             self.active_tool.complete = True
                             self.active_tool.complete = True
                             self.in_action = False
                             self.in_action = False
                             self.delete_utility_geometry()
                             self.delete_utility_geometry()
-                            self.app.inform.emit(_("[success] Done."))
+                            self.app.inform.emit('[success] %s' %
+                                                 _("Done."))
                             self.select_tool('drill_select')
                             self.select_tool('drill_select')
 
 
                         self.app.cursor = QtGui.QCursor()
                         self.app.cursor = QtGui.QCursor()
@@ -3784,7 +3806,8 @@ class FlatCAMExcEditor(QtCore.QObject):
 
 
         self.selected = []
         self.selected = []
         self.build_ui()
         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):
     def delete_shape(self, del_shape):
         self.is_modified = True
         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(',', '.'))
                 buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buffer_distance)
                 self.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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(',', '.'))
                 buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buffer_distance)
                 self.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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(',', '.'))
                 buffer_distance = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buffer_distance)
                 self.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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):
     def on_paint(self):
         if not self.fcdraw.selected:
         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
             return
 
 
         try:
         try:
@@ -573,8 +574,8 @@ class PaintOptionsTool(FlatCAMTool):
                 tooldia = float(self.painttooldia_entry.get_value().replace(',', '.'))
                 tooldia = float(self.painttooldia_entry.get_value().replace(',', '.'))
                 self.painttooldia_entry.set_value(tooldia)
                 self.painttooldia_entry.set_value(tooldia)
             except ValueError:
             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
                 return
         try:
         try:
             overlap = float(self.paintoverlap_entry.get_value())
             overlap = float(self.paintoverlap_entry.get_value())
@@ -584,8 +585,8 @@ class PaintOptionsTool(FlatCAMTool):
                 overlap = float(self.paintoverlap_entry.get_value().replace(',', '.'))
                 overlap = float(self.paintoverlap_entry.get_value().replace(',', '.'))
                 self.paintoverlap_entry.set_value(overlap)
                 self.paintoverlap_entry.set_value(overlap)
             except ValueError:
             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
                 return
 
 
         try:
         try:
@@ -596,8 +597,8 @@ class PaintOptionsTool(FlatCAMTool):
                 margin = float(self.paintmargin_entry.get_value().replace(',', '.'))
                 margin = float(self.paintmargin_entry.get_value().replace(',', '.'))
                 self.paintmargin_entry.set_value(margin)
                 self.paintmargin_entry.set_value(margin)
             except ValueError:
             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
                 return
         method = self.paintmethod_combo.get_value()
         method = self.paintmethod_combo.get_value()
         contour = self.paintcontour_cb.get_value()
         contour = self.paintcontour_cb.get_value()
@@ -1053,7 +1054,8 @@ class TransformEditorTool(FlatCAMTool):
 
 
     def template(self):
     def template(self):
         if not self.fcdraw.selected:
         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
             return
 
 
 
 
@@ -1074,8 +1076,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.rotate_entry.get_value().replace(',', '.'))
                     value = float(self.rotate_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
-                                         "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
                                        'params': [value]})
                                        'params': [value]})
@@ -1111,8 +1113,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.skewx_entry.get_value().replace(',', '.'))
                     value = float(self.skewx_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_skew("X", value)
         # self.on_skew("X", value)
@@ -1132,8 +1134,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.skewy_entry.get_value().replace(',', '.'))
                     value = float(self.skewy_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_skew("Y", value)
         # self.on_skew("Y", value)
@@ -1153,8 +1155,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     xvalue = float(self.scalex_entry.get_value().replace(',', '.'))
                     xvalue = float(self.scalex_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -1190,8 +1192,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     yvalue = float(self.scaley_entry.get_value().replace(',', '.'))
                     yvalue = float(self.scaley_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Scale Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -1222,8 +1224,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.offx_entry.get_value().replace(',', '.'))
                     value = float(self.offx_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_offset("X", value)
         # self.on_offset("X", value)
@@ -1243,8 +1245,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.offy_entry.get_value().replace(',', '.'))
                     value = float(self.offy_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_offset("Y", value)
         # self.on_offset("Y", value)
@@ -1261,7 +1263,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
         ymaxlist = []
 
 
         if not shape_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Appying Rotate")):
             with self.app.proc_container.new(_("Appying Rotate")):
@@ -1292,12 +1295,14 @@ class TransformEditorTool(FlatCAMTool):
 
 
                     # self.draw_app.transform_complete.emit()
                     # 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)
                     self.app.progress.emit(100)
 
 
                 except Exception as e:
                 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
                     return
 
 
     def on_flip(self, axis):
     def on_flip(self, axis):
@@ -1308,7 +1313,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
         ymaxlist = []
 
 
         if not shape_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Flip")):
             with self.app.proc_container.new(_("Applying Flip")):
@@ -1341,10 +1347,12 @@ class TransformEditorTool(FlatCAMTool):
                     for sha in shape_list:
                     for sha in shape_list:
                         if axis is 'X':
                         if axis is 'X':
                             sha.mirror('X', (px, py))
                             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':
                         elif axis is 'Y':
                             sha.mirror('Y', (px, py))
                             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.replot()
 
 
                     #     self.draw_app.add_shape(DrawToolShape(sha.geo))
                     #     self.draw_app.add_shape(DrawToolShape(sha.geo))
@@ -1354,7 +1362,8 @@ class TransformEditorTool(FlatCAMTool):
                     self.app.progress.emit(100)
                     self.app.progress.emit(100)
 
 
                 except Exception as e:
                 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
                     return
 
 
     def on_skew(self, axis, num):
     def on_skew(self, axis, num):
@@ -1363,7 +1372,8 @@ class TransformEditorTool(FlatCAMTool):
         yminlist = []
         yminlist = []
 
 
         if not shape_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Skew")):
             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.add_shape(DrawToolShape(sha.geo))
                     #
                     #
                     # self.draw_app.transform_complete.emit()
                     # 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)
                     self.app.progress.emit(100)
 
 
                 except Exception as e:
                 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
                     return
 
 
     def on_scale(self, axis, xfactor, yfactor, point=None):
     def on_scale(self, axis, xfactor, yfactor, point=None):
@@ -1406,7 +1421,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
         ymaxlist = []
 
 
         if not shape_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Scale")):
             with self.app.proc_container.new(_("Applying Scale")):
@@ -1442,10 +1458,16 @@ class TransformEditorTool(FlatCAMTool):
                     #
                     #
                     # self.draw_app.transform_complete.emit()
                     # 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)
                     self.app.progress.emit(100)
                 except Exception as e:
                 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
                     return
 
 
     def on_offset(self, axis, num):
     def on_offset(self, axis, num):
@@ -1454,7 +1476,8 @@ class TransformEditorTool(FlatCAMTool):
         yminlist = []
         yminlist = []
 
 
         if not shape_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Offset")):
             with self.app.proc_container.new(_("Applying Offset")):
@@ -1468,11 +1491,17 @@ class TransformEditorTool(FlatCAMTool):
                             sha.offset((0, num))
                             sha.offset((0, num))
                         self.draw_app.replot()
                         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)
                     self.app.progress.emit(100)
 
 
                 except Exception as e:
                 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
                     return
 
 
     def on_rotate_key(self):
     def on_rotate_key(self):
@@ -1485,14 +1514,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_rotate(val=val)
             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
             return
         else:
         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):
     def on_offx_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
         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()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_offx(val=val)
             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
             return
         else:
         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):
     def on_offy_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
         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()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_offx(val=val)
             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
             return
         else:
         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):
     def on_skewx_key(self):
         val_box = FCInputDialog(title=_("Skew on X axis ..."),
         val_box = FCInputDialog(title=_("Skew on X axis ..."),
@@ -1542,12 +1569,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_skewx(val=val)
             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
             return
         else:
         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):
     def on_skewy_key(self):
         val_box = FCInputDialog(title=_("Skew on Y axis ..."),
         val_box = FCInputDialog(title=_("Skew on Y axis ..."),
@@ -1559,12 +1586,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_skewx(val=val)
             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
             return
         else:
         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):
 class DrawToolShape(object):
@@ -1964,7 +1991,8 @@ class FCCircle(FCShapeTool):
         radius = distance(p1, p2)
         radius = distance(p1, p2)
         self.geometry = DrawToolShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4)))
         self.geometry = DrawToolShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4)))
         self.complete = True
         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):
 class FCArc(FCShapeTool):
@@ -2178,7 +2206,8 @@ class FCArc(FCShapeTool):
             self.geometry = DrawToolShape(LineString(arc(center, radius, startangle, stopangle,
             self.geometry = DrawToolShape(LineString(arc(center, radius, startangle, stopangle,
                                                          self.direction, self.steps_per_circ)))
                                                          self.direction, self.steps_per_circ)))
         self.complete = True
         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):
 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 = 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.geometry = DrawToolShape(Polygon([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]))
         self.complete = True
         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):
 class FCPolygon(FCShapeTool):
@@ -2285,7 +2315,8 @@ class FCPolygon(FCShapeTool):
         self.geometry = DrawToolShape(Polygon(self.points))
         self.geometry = DrawToolShape(Polygon(self.points))
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         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):
     def on_key(self, key):
         if key == 'Backspace' or key == QtCore.Qt.Key_Backspace:
         if key == 'Backspace' or key == QtCore.Qt.Key_Backspace:
@@ -2440,7 +2471,8 @@ class FCMove(FCShapeTool):
         self.selection_shape = self.selection_bbox()
         self.selection_shape = self.selection_bbox()
 
 
         if len(self.draw_app.get_selected()) == 0:
         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:
         else:
             self.draw_app.app.inform.emit(_(" MOVE: Click on reference point ..."))
             self.draw_app.app.inform.emit(_(" MOVE: Click on reference point ..."))
 
 
@@ -2479,7 +2511,8 @@ class FCMove(FCShapeTool):
             # Delete old
             # Delete old
             self.draw_app.delete_selected()
             self.draw_app.delete_selected()
             self.complete = True
             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):
     def selection_bbox(self):
         geo_list = []
         geo_list = []
@@ -2599,7 +2632,8 @@ class FCCopy(FCMove):
         self.geometry = [DrawToolShape(affinity.translate(geom.geo, xoff=dx, yoff=dy))
         self.geometry = [DrawToolShape(affinity.translate(geom.geo, xoff=dx, yoff=dy))
                          for geom in self.draw_app.get_selected()]
                          for geom in self.draw_app.get_selected()]
         self.complete = True
         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):
 class FCText(FCShapeTool):
@@ -2635,20 +2669,23 @@ class FCText(FCShapeTool):
                 self.geometry = DrawToolShape(affinity.translate(self.text_gui.text_path, xoff=dx, yoff=dy))
                 self.geometry = DrawToolShape(affinity.translate(self.text_gui.text_path, xoff=dx, yoff=dy))
             except Exception as e:
             except Exception as e:
                 log.debug("Font geometry is empty or incorrect: %s" % str(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.text_path = []
                 self.text_gui.hide_tool()
                 self.text_gui.hide_tool()
                 self.draw_app.select_tool('select')
                 self.draw_app.select_tool('select')
                 return
                 return
         else:
         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
             return
 
 
         self.text_gui.text_path = []
         self.text_gui.text_path = []
         self.text_gui.hide_tool()
         self.text_gui.hide_tool()
         self.complete = True
         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):
     def utility_geometry(self, data=None):
         """
         """
@@ -2687,7 +2724,8 @@ class FCBuffer(FCShapeTool):
 
 
     def on_buffer(self):
     def on_buffer(self):
         if not self.draw_app.selected:
         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
             return
 
 
         try:
         try:
@@ -2698,8 +2736,8 @@ class FCBuffer(FCShapeTool):
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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()
         self.disactivate()
         if ret_val == 'fail':
         if ret_val == 'fail':
             return
             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):
     def on_buffer_int(self):
         if not self.draw_app.selected:
         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
             return
 
 
         try:
         try:
@@ -2726,8 +2766,8 @@ class FCBuffer(FCShapeTool):
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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()
         self.disactivate()
         if ret_val == 'fail':
         if ret_val == 'fail':
             return
             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):
     def on_buffer_ext(self):
         if not self.draw_app.selected:
         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
             return
 
 
         try:
         try:
@@ -2754,8 +2796,8 @@ class FCBuffer(FCShapeTool):
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
                 self.buff_tool.buffer_distance_entry.set_value(buffer_distance)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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()
         self.disactivate()
         if ret_val == 'fail':
         if ret_val == 'fail':
             return
             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):
     def activate(self):
         self.buff_tool.buffer_button.clicked.disconnect()
         self.buff_tool.buffer_button.clicked.disconnect()
@@ -2862,7 +2905,8 @@ class FCEraser(FCShapeTool):
 
 
         self.draw_app.delete_utility_geometry()
         self.draw_app.delete_utility_geometry()
         self.draw_app.plot_all()
         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):
     def utility_geometry(self, data=None):
         """
         """
@@ -3497,8 +3541,13 @@ class FlatCAMGeoEditor(QtCore.QObject):
         if multigeo_tool:
         if multigeo_tool:
             self.multigeo_tool = multigeo_tool
             self.multigeo_tool = multigeo_tool
             geo_to_edit = fcgeometry.flatten(geometry=fcgeometry.tools[self.multigeo_tool]['solid_geometry'])
             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:
         else:
             geo_to_edit = fcgeometry.flatten()
             geo_to_edit = fcgeometry.flatten()
 
 
@@ -3738,7 +3787,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                             self.active_tool.complete = True
                             self.active_tool.complete = True
                             self.in_action = False
                             self.in_action = False
                             self.delete_utility_geometry()
                             self.delete_utility_geometry()
-                            self.app.inform.emit(_("[success] Done."))
+                            self.app.inform.emit('[success] %s' %
+                                                 _("Done."))
                             self.select_tool('select')
                             self.select_tool('select')
                         else:
                         else:
                             self.app.cursor = QtGui.QCursor()
                             self.app.cursor = QtGui.QCursor()
@@ -3752,7 +3802,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                             self.active_tool.make()
                             self.active_tool.make()
                             if self.active_tool.complete:
                             if self.active_tool.complete:
                                 self.on_shape_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)
                                 self.select_tool(self.active_tool.name)
         except Exception as e:
         except Exception as e:
             log.warning("Error: %s" % str(e))
             log.warning("Error: %s" % str(e))
@@ -3869,7 +3920,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
 
 
     def on_copy_click(self):
     def on_copy_click(self):
         if not self.selected:
         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
             return
 
 
         self.app.ui.geo_copy_btn.setChecked(True)
         self.app.ui.geo_copy_btn.setChecked(True)
@@ -4119,8 +4171,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
             results = geo_shapes[0].geo
             results = geo_shapes[0].geo
         except Exception as e:
         except Exception as e:
             log.debug("FlatCAMGeoEditor.intersection() --> %s" % str(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')
             self.select_tool('select')
             return
             return
 
 
@@ -4154,8 +4206,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
             intersector = geo_shapes[0].geo
             intersector = geo_shapes[0].geo
         except Exception as e:
         except Exception as e:
             log.debug("FlatCAMGeoEditor.intersection() --> %s" % str(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')
             self.select_tool('select')
             return
             return
 
 
@@ -4240,9 +4292,9 @@ class FlatCAMGeoEditor(QtCore.QObject):
         selected = self.get_selected()
         selected = self.get_selected()
 
 
         if buf_distance < 0:
         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
             # deselect everything
             self.selected = []
             self.selected = []
@@ -4250,11 +4302,13 @@ class FlatCAMGeoEditor(QtCore.QObject):
             return 'fail'
             return 'fail'
 
 
         if len(selected) == 0:
         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'
             return 'fail'
 
 
         if not isinstance(buf_distance, float):
         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
             # deselect everything
             self.selected = []
             self.selected = []
@@ -4277,7 +4331,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                 )
                 )
 
 
         if not results:
         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
             # deselect everything
             self.selected = []
             self.selected = []
             self.replot()
             self.replot()
@@ -4287,14 +4342,15 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.add_shape(DrawToolShape(sha))
             self.add_shape(DrawToolShape(sha))
 
 
         self.replot()
         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):
     def buffer_int(self, buf_distance, join_style):
         selected = self.get_selected()
         selected = self.get_selected()
 
 
         if buf_distance < 0:
         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
             # deselect everything
             self.selected = []
             self.selected = []
@@ -4302,11 +4358,13 @@ class FlatCAMGeoEditor(QtCore.QObject):
             return 'fail'
             return 'fail'
 
 
         if len(selected) == 0:
         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'
             return 'fail'
 
 
         if not isinstance(buf_distance, float):
         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
             # deselect everything
             self.selected = []
             self.selected = []
             self.replot()
             self.replot()
@@ -4325,7 +4383,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                 )
                 )
 
 
         if not results:
         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
             # deselect everything
             self.selected = []
             self.selected = []
             self.replot()
             self.replot()
@@ -4335,25 +4394,29 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.add_shape(DrawToolShape(sha))
             self.add_shape(DrawToolShape(sha))
 
 
         self.replot()
         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):
     def buffer_ext(self, buf_distance, join_style):
         selected = self.get_selected()
         selected = self.get_selected()
 
 
         if buf_distance < 0:
         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
             # deselect everything
             self.selected = []
             self.selected = []
             self.replot()
             self.replot()
             return
             return
 
 
         if len(selected) == 0:
         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
             return
 
 
         if not isinstance(buf_distance, float):
         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
             # deselect everything
             self.selected = []
             self.selected = []
             self.replot()
             self.replot()
@@ -4372,7 +4435,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                 )
                 )
 
 
         if not results:
         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
             # deselect everything
             self.selected = []
             self.selected = []
             self.replot()
             self.replot()
@@ -4382,7 +4446,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.add_shape(DrawToolShape(sha))
             self.add_shape(DrawToolShape(sha))
 
 
         self.replot()
         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):
     # def paint(self, tooldia, overlap, margin, method):
     #     selected = self.get_selected()
     #     selected = self.get_selected()
@@ -4446,19 +4511,21 @@ class FlatCAMGeoEditor(QtCore.QObject):
         selected = self.get_selected()
         selected = self.get_selected()
 
 
         if len(selected) == 0:
         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
             return
 
 
         for param in [tooldia, overlap, margin]:
         for param in [tooldia, overlap, margin]:
             if not isinstance(param, float):
             if not isinstance(param, float):
                 param_name = [k for k, v in locals().items() if v is param][0]
                 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 = []
         results = []
 
 
         if overlap >= 1:
         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
             return
 
 
         def recurse(geometry, reset=True):
         def recurse(geometry, reset=True):
@@ -4516,8 +4583,8 @@ class FlatCAMGeoEditor(QtCore.QObject):
                         local_results += list(cp.get_objects())
                         local_results += list(cp.get_objects())
                 except Exception as e:
                 except Exception as e:
                     log.debug("Could not Paint the polygons. %s" % str(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))
                           "Or a different method of Paint\n%s") % str(e))
                     return
                     return
 
 

+ 175 - 116
flatcamEditors/FlatCAMGrbEditor.py

@@ -204,14 +204,15 @@ class FCPad(FCShapeTool):
         try:
         try:
             self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2
             self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2
         except KeyError:
         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.draw_app.in_action = False
             self.complete = True
             self.complete = True
             return
             return
 
 
         if self.radius == 0:
         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
             self.dont_execute = True
             return
             return
         else:
         else:
@@ -374,7 +375,8 @@ class FCPad(FCShapeTool):
 
 
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         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):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -395,15 +397,16 @@ class FCPadArray(FCShapeTool):
         try:
         try:
             self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2
             self.radius = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) / 2
         except KeyError:
         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.complete = True
             self.draw_app.in_action = False
             self.draw_app.in_action = False
             self.draw_app.array_frame.hide()
             self.draw_app.array_frame.hide()
             return
             return
 
 
         if self.radius == 0:
         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
             self.dont_execute = True
             return
             return
         else:
         else:
@@ -498,11 +501,12 @@ class FCPadArray(FCShapeTool):
                 self.pad_linear_angle = float(self.draw_app.linear_angle_spinner.get_value())
                 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())
                 self.pad_angle = float(self.draw_app.pad_angle_entry.get_value())
             except TypeError:
             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
                 return
         except Exception as e:
         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
             return
 
 
         if self.pad_array == 'Linear':
         if self.pad_array == 'Linear':
@@ -692,7 +696,8 @@ class FCPadArray(FCShapeTool):
                 self.geometry.append(DrawToolShape(geo))
                 self.geometry.append(DrawToolShape(geo))
         else:
         else:
             if (self.pad_angle * self.pad_array_size) > 360:
             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
                 return
 
 
             radius = distance(self.destination, self.origin)
             radius = distance(self.destination, self.origin)
@@ -714,7 +719,8 @@ class FCPadArray(FCShapeTool):
 
 
                 self.geometry.append(DrawToolShape(geo))
                 self.geometry.append(DrawToolShape(geo))
         self.complete = True
         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.in_action = False
         self.draw_app.array_frame.hide()
         self.draw_app.array_frame.hide()
         return
         return
@@ -746,7 +752,8 @@ class FCPoligonize(FCShapeTool):
         if not self.draw_app.selected:
         if not self.draw_app.selected:
             self.draw_app.in_action = False
             self.draw_app.in_action = False
             self.complete = True
             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")
             self.draw_app.select_tool("select")
             return
             return
 
 
@@ -761,8 +768,9 @@ class FCPoligonize(FCShapeTool):
         if len(apid_set) > 1:
         if len(apid_set) > 1:
             self.draw_app.in_action = False
             self.draw_app.in_action = False
             self.complete = True
             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")
             self.draw_app.select_tool("select")
             return
             return
 
 
@@ -814,7 +822,8 @@ class FCPoligonize(FCShapeTool):
 
 
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         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
         # MS: always return to the Select Tool if modifier key is not pressed
         # else return to the current tool
         # else return to the current tool
@@ -1054,7 +1063,8 @@ class FCRegion(FCShapeTool):
             self.geometry = DrawToolShape(new_geo_el)
             self.geometry = DrawToolShape(new_geo_el)
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
 
     def clean_up(self):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -1157,7 +1167,8 @@ class FCTrack(FCRegion):
 
 
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
 
     def clean_up(self):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -1430,7 +1441,8 @@ class FCDisc(FCShapeTool):
 
 
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
 
     def clean_up(self):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -1687,7 +1699,8 @@ class FCSemiDisc(FCShapeTool):
 
 
         self.draw_app.in_action = False
         self.draw_app.in_action = False
         self.complete = True
         self.complete = True
-        self.draw_app.app.inform.emit(_("[success] Done."))
+        self.draw_app.app.inform.emit('[success] %s' %
+                                      _("Done."))
 
 
     def clean_up(self):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -1835,7 +1848,8 @@ class FCApertureMove(FCShapeTool):
         self.selected_apertures = []
         self.selected_apertures = []
 
 
         if len(self.draw_app.get_selected()) == 0:
         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.complete = True
             self.draw_app.select_tool("select")
             self.draw_app.select_tool("select")
             return
             return
@@ -1958,7 +1972,8 @@ class FCApertureMove(FCShapeTool):
 
 
         self.draw_app.plot_all()
         self.draw_app.plot_all()
         self.draw_app.build_ui()
         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):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -2034,7 +2049,8 @@ class FCApertureCopy(FCApertureMove):
             sel_shapes_to_be_deleted = []
             sel_shapes_to_be_deleted = []
 
 
         self.draw_app.build_ui()
         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):
 class FCEraser(FCShapeTool):
@@ -2141,7 +2157,8 @@ class FCEraser(FCShapeTool):
 
 
         self.draw_app.delete_utility_geometry()
         self.draw_app.delete_utility_geometry()
         self.draw_app.plot_all()
         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):
     def clean_up(self):
         self.draw_app.selected = []
         self.draw_app.selected = []
@@ -3132,12 +3149,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
             try:
             try:
                 ap_id = str(self.apcode_entry.get_value())
                 ap_id = str(self.apcode_entry.get_value())
             except ValueError:
             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
                 return
             if ap_id == '':
             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
                 return
 
 
         if ap_id == '0':
         if ap_id == '0':
@@ -3172,7 +3189,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     except Exception as e:
                     except Exception as e:
                         log.error("FlatCAMGrbEditor.on_aperture_add() --> the R or O aperture dims has to be in a "
                         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))
                                   "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."))
                                                "Add it in format (width, height) and retry."))
                         return
                         return
                 else:
                 else:
@@ -3184,8 +3202,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                             size_val = float(self.apsize_entry.get_value().replace(',', '.'))
                             size_val = float(self.apsize_entry.get_value().replace(',', '.'))
                             self.apsize_entry.set_value(size_val)
                             self.apsize_entry.set_value(size_val)
                         except ValueError:
                         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
                             return
                 self.storage_dict[ap_id]['size'] = size_val
                 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
                 # values  each time a aperture code is edited or added
                 self.olddia_newdia[ap_id] = ap_id
                 self.olddia_newdia[ap_id] = ap_id
             else:
             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
                 return
 
 
         # since we add a new tool, we update also the initial state of the tool_table through it's dictionary
         # 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
         # we add a new entry in the tool2tooldia dict
         self.tool2tooldia[len(self.olddia_newdia)] = int(ap_id)
         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()
         self.build_ui()
 
 
@@ -3230,13 +3250,15 @@ class FlatCAMGrbEditor(QtCore.QObject):
             else:
             else:
                 # deleted_tool_dia = float(self.apertures_table.item(self.apertures_table.currentRow(), 1).text())
                 # deleted_tool_dia = float(self.apertures_table.item(self.apertures_table.currentRow(), 1).text())
                 if len(self.apertures_table.selectionModel().selectedRows()) == 0:
                 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
                     return
                 for index in self.apertures_table.selectionModel().selectedRows():
                 for index in self.apertures_table.selectionModel().selectedRows():
                     row = index.row()
                     row = index.row()
                     deleted_apcode_list.append(self.apertures_table.item(row, 1).text())
                     deleted_apcode_list.append(self.apertures_table.item(row, 1).text())
         except Exception as exc:
         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
             return
 
 
         if deleted_apcode_list:
         if deleted_apcode_list:
@@ -3259,8 +3281,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
 
 
                     self.olddia_newdia.pop(deleted_aperture, None)
                     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.plot_all()
         self.build_ui()
         self.build_ui()
@@ -3910,11 +3932,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
             try:
             try:
                 grb_obj.create_geometry()
                 grb_obj.create_geometry()
             except KeyError:
             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:
             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()
                 msg += traceback.format_exc()
                 app_obj.inform.emit(msg)
                 app_obj.inform.emit(msg)
                 raise
                 raise
@@ -3927,7 +3949,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 self.app.progress.emit(100)
                 self.app.progress.emit(100)
                 return
                 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):
     def on_tool_select(self, tool):
         """
         """
@@ -3943,7 +3966,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
             # self.draw_app.select_tool('select')
             # self.draw_app.select_tool('select')
             self.complete = True
             self.complete = True
             current_tool = 'select'
             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
         # This is to make the group behave as radio group
         if current_tool in self.tools_gerber:
         if current_tool in self.tools_gerber:
@@ -4094,7 +4118,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     self.app.clipboard.setText(
                     self.app.clipboard.setText(
                         self.app.defaults["global_point_clipboard_format"] % (self.pos[0], self.pos[1])
                         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
                     return
 
 
                 # Dispatch event to active_tool
                 # Dispatch event to active_tool
@@ -4153,7 +4178,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                             self.active_tool.complete = True
                             self.active_tool.complete = True
                             self.in_action = False
                             self.in_action = False
                             self.delete_utility_geometry()
                             self.delete_utility_geometry()
-                            self.app.inform.emit(_("[success] Done."))
+                            self.app.inform.emit('[success] %s' %
+                                                 _("Done."))
                             self.select_tool('select')
                             self.select_tool('select')
                         else:
                         else:
                             self.app.cursor = QtGui.QCursor()
                             self.app.cursor = QtGui.QCursor()
@@ -4167,7 +4193,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                             self.active_tool.make()
                             self.active_tool.make()
                             if self.active_tool.complete:
                             if self.active_tool.complete:
                                 self.on_grb_shape_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
                                 # MS: always return to the Select Tool if modifier key is not pressed
                                 # else return to the current tool but not for FCTrack
                                 # 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]
         temp_ref = [s for s in self.selected]
 
 
         if len(temp_ref) == 0:
         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
             return
 
 
         for shape_sel in temp_ref:
         for shape_sel in temp_ref:
@@ -4482,7 +4510,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
 
 
         self.selected = []
         self.selected = []
         self.build_ui()
         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):
     def delete_shape(self, geo_el):
         self.is_modified = True
         self.is_modified = True
@@ -4596,8 +4625,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 buff_value = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 buff_value = float(self.buffer_distance_entry.get_value().replace(',', '.'))
                 self.buffer_distance_entry.set_value(buff_value)
                 self.buffer_distance_entry.set_value(buff_value)
             except ValueError:
             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
                 return
         # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment
         # 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)
         # 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
                     return geom_el
 
 
         if not self.apertures_table.selectedItems():
         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
             return
 
 
         for x in self.apertures_table.selectedItems():
         for x in self.apertures_table.selectedItems():
@@ -4638,10 +4666,12 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 self.storage_dict[apid]['geometry'] = temp_storage
                 self.storage_dict[apid]['geometry'] = temp_storage
             except Exception as e:
             except Exception as e:
                 log.debug("FlatCAMGrbEditor.buffer() --> %s\n%s" % str(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
                 return
         self.plot_all()
         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):
     def on_scale(self):
         scale_factor = 1.0
         scale_factor = 1.0
@@ -4655,8 +4685,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 scale_factor = float(self.scale_factor_entry.get_value().replace(',', '.'))
                 scale_factor = float(self.scale_factor_entry.get_value().replace(',', '.'))
                 self.scale_factor_entry.set_value(scale_factor)
                 self.scale_factor_entry.set_value(scale_factor)
             except ValueError:
             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
                 return
 
 
         def scale_recursion(geom_el, selection):
         def scale_recursion(geom_el, selection):
@@ -4687,9 +4717,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                     return geom_el
                     return geom_el
 
 
         if not self.apertures_table.selectedItems():
         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
             return
 
 
         for x in self.apertures_table.selectedItems():
         for x in self.apertures_table.selectedItems():
@@ -4704,7 +4733,8 @@ class FlatCAMGrbEditor(QtCore.QObject):
                 log.debug("FlatCAMGrbEditor.on_scale() --> %s" % str(e))
                 log.debug("FlatCAMGrbEditor.on_scale() --> %s" % str(e))
 
 
         self.plot_all()
         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):
     def on_markarea(self):
         # clear previous marking
         # clear previous marking
@@ -4741,9 +4771,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
             self.ma_annotation.set(text=text, pos=position, visible=True,
             self.ma_annotation.set(text=text, pos=position, visible=True,
                                    font_size=self.app.defaults["cncjob_annotation_fontsize"],
                                    font_size=self.app.defaults["cncjob_annotation_fontsize"],
                                    color=self.app.defaults["global_sel_draw_color"])
                                    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:
         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):
     def on_eraser(self):
         self.select_tool('eraser')
         self.select_tool('eraser')
@@ -5226,7 +5258,8 @@ class TransformEditorTool(FlatCAMTool):
 
 
     def template(self):
     def template(self):
         if not self.fcdraw.selected:
         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
             return
 
 
         self.draw_app.select_tool("select")
         self.draw_app.select_tool("select")
@@ -5246,8 +5279,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.rotate_entry.get_value().replace(',', '.'))
                     value = float(self.rotate_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Rotate, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
         self.app.worker_task.emit({'fcn': self.on_rotate_action,
                                    'params': [value]})
                                    'params': [value]})
@@ -5289,8 +5322,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.skewx_entry.get_value().replace(',', '.'))
                     value = float(self.skewx_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_skew("X", value)
         # self.on_skew("X", value)
@@ -5316,8 +5349,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.skewy_entry.get_value().replace(',', '.'))
                     value = float(self.skewy_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Skew Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_skew("Y", value)
         # self.on_skew("Y", value)
@@ -5343,8 +5376,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     x_value = float(self.scalex_entry.get_value().replace(',', '.'))
                     x_value = float(self.scalex_entry.get_value().replace(',', '.'))
                 except ValueError:
                 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
                     return
 
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -5384,8 +5417,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     y_value = float(self.scaley_entry.get_value().replace(',', '.'))
                     y_value = float(self.scaley_entry.get_value().replace(',', '.'))
                 except ValueError:
                 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
                     return
 
 
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
         # scaling to zero has no sense so we remove it, because scaling with 1 does nothing
@@ -5422,8 +5455,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.offx_entry.get_value().replace(',', '.'))
                     value = float(self.offx_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset X, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_offset("X", value)
         # self.on_offset("X", value)
@@ -5448,8 +5481,8 @@ class TransformEditorTool(FlatCAMTool):
                 try:
                 try:
                     value = float(self.offy_entry.get_value().replace(',', '.'))
                     value = float(self.offy_entry.get_value().replace(',', '.'))
                 except ValueError:
                 except ValueError:
-                    self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered for Offset Y, "
-                                           "use a number."))
+                    self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                         _("Wrong value format entered, use a number."))
                     return
                     return
 
 
         # self.on_offset("Y", value)
         # self.on_offset("Y", value)
@@ -5471,7 +5504,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
         ymaxlist = []
 
 
         if not elem_list:
         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
             return
 
 
         with self.app.proc_container.new(_("Appying Rotate")):
         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))
                         sel_el['clear'] = affinity.rotate(sel_el['clear'], angle=-num, origin=(px, py))
                 self.draw_app.plot_all()
                 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)
                 self.app.progress.emit(100)
             except Exception as e:
             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
                 return
 
 
     def on_flip(self, axis):
     def on_flip(self, axis):
@@ -5526,7 +5562,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
         ymaxlist = []
 
 
         if not elem_list:
         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
             return
 
 
         with self.app.proc_container.new(_("Applying Flip")):
         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))
                             sel_el['follow'] = affinity.scale(sel_el['follow'], xfact=1, yfact=-1, origin=(px, py))
                         if 'clear' in sel_el:
                         if 'clear' in sel_el:
                             sel_el['clear'] = affinity.scale(sel_el['clear'], xfact=1, yfact=-1, origin=(px, py))
                             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':
                     elif axis is 'Y':
                         if 'solid' in sel_el:
                         if 'solid' in sel_el:
                             sel_el['solid'] = affinity.scale(sel_el['solid'], xfact=-1, yfact=1, origin=(px, py))
                             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))
                             sel_el['follow'] = affinity.scale(sel_el['follow'], xfact=-1, yfact=1, origin=(px, py))
                         if 'clear' in sel_el:
                         if 'clear' in sel_el:
                             sel_el['clear'] = affinity.scale(sel_el['clear'], xfact=-1, yfact=1, origin=(px, py))
                             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.draw_app.plot_all()
                 self.app.progress.emit(100)
                 self.app.progress.emit(100)
 
 
             except Exception as e:
             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
                 return
 
 
     def on_skew(self, axis, num):
     def on_skew(self, axis, num):
@@ -5596,7 +5636,8 @@ class TransformEditorTool(FlatCAMTool):
         yminlist = []
         yminlist = []
 
 
         if not elem_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Skew")):
             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))
                                 sel_el['clear'] = affinity.skew(sel_el['clear'], 0, num, origin=(xminimal, yminimal))
                     self.draw_app.plot_all()
                     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)
                     self.app.progress.emit(100)
 
 
                 except Exception as e:
                 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
                     return
 
 
     def on_scale(self, axis, xfactor, yfactor, point=None):
     def on_scale(self, axis, xfactor, yfactor, point=None):
@@ -5657,7 +5704,8 @@ class TransformEditorTool(FlatCAMTool):
         ymaxlist = []
         ymaxlist = []
 
 
         if not elem_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Scale")):
             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))
                             sel_el['clear'] = affinity.scale(sel_el['clear'], xfactor, yfactor, origin=(px, py))
                     self.draw_app.plot_all()
                     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)
                     self.app.progress.emit(100)
                 except Exception as e:
                 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
                     return
 
 
     def on_offset(self, axis, num):
     def on_offset(self, axis, num):
@@ -5714,7 +5768,8 @@ class TransformEditorTool(FlatCAMTool):
         elem_list = self.draw_app.selected
         elem_list = self.draw_app.selected
 
 
         if not elem_list:
         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
             return
         else:
         else:
             with self.app.proc_container.new(_("Applying Offset")):
             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)
                                 sel_el['clear'] = affinity.translate(sel_el['clear'], 0, num)
                         self.draw_app.plot_all()
                         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)
                     self.app.progress.emit(100)
 
 
                 except Exception as e:
                 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
                     return
 
 
     def on_rotate_key(self):
     def on_rotate_key(self):
@@ -5756,14 +5817,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_rotate(val=val)
             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
             return
         else:
         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):
     def on_offx_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
         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()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_offx(val=val)
             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
             return
         else:
         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):
     def on_offy_key(self):
         units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
         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()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_offx(val=val)
             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
             return
         else:
         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):
     def on_skewx_key(self):
         val_box = FCInputDialog(title=_("Skew on X axis ..."),
         val_box = FCInputDialog(title=_("Skew on X axis ..."),
@@ -5813,12 +5872,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_skewx(val=val)
             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
             return
         else:
         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):
     def on_skewy_key(self):
         val_box = FCInputDialog(title=_("Skew on Y axis ..."),
         val_box = FCInputDialog(title=_("Skew on Y axis ..."),
@@ -5830,12 +5889,12 @@ class TransformEditorTool(FlatCAMTool):
         val, ok = val_box.get_value()
         val, ok = val_box.get_value()
         if ok:
         if ok:
             self.on_skewx(val=val)
             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
             return
         else:
         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):
 def get_shapely_list_bounds(geometry_list):

+ 2 - 2
flatcamGUI/FlatCAMGUI.py

@@ -6665,7 +6665,7 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
 
 
         # ## Plotting type
         # ## Plotting type
         self.ncc_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'},
         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 = QtWidgets.QLabel('%s:' % _("NCC Plotting"))
         plotting_label.setToolTip(
         plotting_label.setToolTip(
             _("- 'Normal' -  normal plotting, done at the end of the NCC job\n"
             _("- 'Normal' -  normal plotting, done at the end of the NCC job\n"
@@ -6971,7 +6971,7 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
 
 
         # ## Plotting type
         # ## Plotting type
         self.paint_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'},
         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 = QtWidgets.QLabel('%s:' % _("Paint Plotting"))
         plotting_label.setToolTip(
         plotting_label.setToolTip(
             _("- 'Normal' -  normal plotting, done at the end of the Paint job\n"
             _("- '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
 from fontTools import ttLib
 
 
 import logging
 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')
 log = logging.getLogger('base2')
 
 
@@ -295,7 +302,7 @@ class ParseFont():
             elif font_type == 'regular':
             elif font_type == 'regular':
                 path_filename = regular_dict[font_name]
                 path_filename = regular_dict[font_name]
         except Exception as e:
         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))
             log.debug("[ERROR_NOTCL] Font Loading: %s" % str(e))
             return "flatcam font parse failed"
             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 given boundary polygon. If not specified, it defaults to
         the rectangular bounding box of target geometry.
         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
         pol_nr = 0
         old_disp_number = 0
         old_disp_number = 0
 
 

+ 23 - 23
flatcamTools/ToolPaint.py

@@ -350,6 +350,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
         self.obj_name = ""
         self.obj_name = ""
         self.paint_obj = None
         self.paint_obj = None
+        self.bound_obj_name = ""
+        self.bound_obj = None
 
 
         self.units = ''
         self.units = ''
         self.paint_tools = {}
         self.paint_tools = {}
@@ -680,8 +682,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
         try:
         try:
             self.tools_table.itemChanged.disconnect()
             self.tools_table.itemChanged.disconnect()
-        except Exception as e:
-            log.debug("ToolPaint.on_tool_add() --> %s" % str(e))
+        except TypeError:
+            pass
 
 
         if dia:
         if dia:
             tool_dia = dia
             tool_dia = dia
@@ -751,8 +753,8 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
         try:
         try:
             self.tools_table.itemChanged.disconnect()
             self.tools_table.itemChanged.disconnect()
-        except Exception as e:
-            log.debug("ToolPaint.on_tool_edit() --> %s" % str(e))
+        except TypeError:
+            pass
 
 
         tool_dias = []
         tool_dias = []
         for k, v in self.paint_tools.items():
         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):
     def on_tool_delete(self, rows_to_delete=None, all=None):
         try:
         try:
             self.tools_table.itemChanged.disconnect()
             self.tools_table.itemChanged.disconnect()
-        except Exception as e:
-            log.debug("ToolPaint.on_tool_delete() --> %s" % str(e))
+        except TypeError:
             pass
             pass
 
 
         deleted_tools_list = []
         deleted_tools_list = []
@@ -1277,13 +1278,13 @@ class ToolPaint(FlatCAMTool, Gerber):
             else:
             else:
                 pass
                 pass
 
 
-            def paint_p(polyg, tooldia):
+            def paint_p(polyg, tooldiameter):
                 cpoly = None
                 cpoly = None
                 try:
                 try:
                     if paint_method == "seed":
                     if paint_method == "seed":
                         # Type(cp) == FlatCAMRTreeStorage | None
                         # Type(cp) == FlatCAMRTreeStorage | None
                         cpoly = self.clear_polygon2(polyg,
                         cpoly = self.clear_polygon2(polyg,
-                                                    tooldia=tooldia,
+                                                    tooldia=tooldiameter,
                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                     overlap=over,
                                                     overlap=over,
                                                     contour=cont,
                                                     contour=cont,
@@ -1293,7 +1294,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                     elif paint_method == "lines":
                     elif paint_method == "lines":
                         # Type(cp) == FlatCAMRTreeStorage | None
                         # Type(cp) == FlatCAMRTreeStorage | None
                         cpoly = self.clear_polygon3(polyg,
                         cpoly = self.clear_polygon3(polyg,
-                                                    tooldia=tooldia,
+                                                    tooldia=tooldiameter,
                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                     steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                     overlap=over,
                                                     overlap=over,
                                                     contour=cont,
                                                     contour=cont,
@@ -1303,12 +1304,12 @@ class ToolPaint(FlatCAMTool, Gerber):
                     else:
                     else:
                         # Type(cp) == FlatCAMRTreeStorage | None
                         # Type(cp) == FlatCAMRTreeStorage | None
                         cpoly = self.clear_polygon(polyg,
                         cpoly = self.clear_polygon(polyg,
-                                                   tooldia=tooldia,
+                                                   tooldia=tooldiameter,
                                                    steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                    steps_per_circle=self.app.defaults["geometry_circle_steps"],
                                                    overlap=over,
                                                    overlap=over,
                                                    contour=cont,
                                                    contour=cont,
                                                    connect=conn,
                                                    connect=conn,
-                                                    prog_plot=prog_plot)
+                                                   prog_plot=prog_plot)
                 except FlatCAMApp.GracefulException:
                 except FlatCAMApp.GracefulException:
                     return "fail"
                     return "fail"
                 except Exception as e:
                 except Exception as e:
@@ -1318,8 +1319,8 @@ class ToolPaint(FlatCAMTool, Gerber):
                     geo_obj.solid_geometry += list(cpoly.get_objects())
                     geo_obj.solid_geometry += list(cpoly.get_objects())
                     return cpoly
                     return cpoly
                 else:
                 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
                     return None
 
 
             try:
             try:
@@ -1363,10 +1364,12 @@ class ToolPaint(FlatCAMTool, Gerber):
                     return "fail"
                     return "fail"
                 except Exception as e:
                 except Exception as e:
                     log.debug("Could not Paint the polygons. %s" % str(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"
                     return "fail"
 
 
                 # add the solid_geometry to the current too in self.paint_tools (tools_storage)
                 # 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)
                 painted_area = recurse(obj.solid_geometry)
                 # variables to display the percentage of work done
                 # variables to display the percentage of work done
                 geo_len = len(painted_area)
                 geo_len = len(painted_area)
-                disp_number = 0
+
                 old_disp_number = 0
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
                 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)
                 painted_area = recurse(obj.solid_geometry)
                 # variables to display the percentage of work done
                 # variables to display the percentage of work done
                 geo_len = int(len(painted_area) / 100)
                 geo_len = int(len(painted_area) / 100)
-                disp_number = 0
+
                 old_disp_number = 0
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
                 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
                 # variables to display the percentage of work done
                 geo_len = len(painted_area)
                 geo_len = len(painted_area)
-                disp_number = 0
                 old_disp_number = 0
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
 
 
@@ -2111,7 +2113,6 @@ class ToolPaint(FlatCAMTool, Gerber):
                             continue
                             continue
                         poly_buf = geo.buffer(-paint_margin)
                         poly_buf = geo.buffer(-paint_margin)
 
 
-                        cp = None
                         if paint_method == "seed":
                         if paint_method == "seed":
                             # Type(cp) == FlatCAMRTreeStorage | None
                             # Type(cp) == FlatCAMRTreeStorage | None
                             cp = self.clear_polygon2(poly_buf,
                             cp = self.clear_polygon2(poly_buf,
@@ -2140,7 +2141,7 @@ class ToolPaint(FlatCAMTool, Gerber):
                                                     overlap=over,
                                                     overlap=over,
                                                     contour=cont,
                                                     contour=cont,
                                                     connect=conn,
                                                     connect=conn,
-                                                     prog_plot=prog_plot)
+                                                    prog_plot=prog_plot)
 
 
                         if cp is not None:
                         if cp is not None:
                             total_geometry += list(cp.get_objects())
                             total_geometry += list(cp.get_objects())
@@ -2269,7 +2270,6 @@ class ToolPaint(FlatCAMTool, Gerber):
 
 
                 # variables to display the percentage of work done
                 # variables to display the percentage of work done
                 geo_len = len(painted_area)
                 geo_len = len(painted_area)
-                disp_number = 0
                 old_disp_number = 0
                 old_disp_number = 0
                 log.warning("Total number of polygons to be cleared. %s" % str(geo_len))
                 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):
                     if isinstance(panel_obj, FlatCAMGerber):
                         obj_fin.apertures = deepcopy(panel_obj.apertures)
                         obj_fin.apertures = deepcopy(panel_obj.apertures)
                         for ap in obj_fin.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)
                     self.app.progress.emit(0)
                     for row in range(rows):
                     for row in range(rows):
@@ -599,36 +594,29 @@ class Panelize(FlatCAMTool):
                                     obj_fin.solid_geometry.append(geo)
                                     obj_fin.solid_geometry.append(geo)
 
 
                                 for apid in panel_obj.apertures:
                                 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
                             currentx += lenghtx
                         currenty += lenghty
                         currenty += lenghty
 
 
                     app_obj.log.debug("Found %s geometries. Creating a panel geometry cascaded union ..." %
                     app_obj.log.debug("Found %s geometries. Creating a panel geometry cascaded union ..." %
                                       len(obj_fin.solid_geometry))
                                       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.")
                     app_obj.log.debug("Finished creating a cascaded union for the panel.")
 
 
                 if isinstance(panel_obj, FlatCAMExcellon):
                 if isinstance(panel_obj, FlatCAMExcellon):

BIN
locale/de/LC_MESSAGES/strings.mo


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


BIN
locale/en/LC_MESSAGES/strings.mo


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


BIN
locale/ro/LC_MESSAGES/strings.mo


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


Разница между файлами не показана из-за своего большого размера
+ 304 - 288
locale_template/strings.pot


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