Преглед изворни кода

- fixed some issues with the recent preparation for dark icons resource usage
- added a new preprocessor file contributed by Daniel Friderich and added fixes for it
- RELEASE 8.99

Marius Stanciu пре 6 година
родитељ
комит
0eabc57e70

+ 35 - 6
FlatCAMObj.py

@@ -6624,6 +6624,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
         gcode = ''
         roland = False
         hpgl = False
+        isel_icp = False
 
         try:
             if self.special_group:
@@ -6641,20 +6642,47 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                 if self.cnc_tools[key]['data']['ppname_g'] == 'Roland_MDX_20':
                     roland = True
                     break
+        except Exception:
+            try:
+                for key in self.cnc_tools:
+                    if self.cnc_tools[key]['data']['ppname_e'] == 'Roland_MDX_20':
+                        roland = True
+                        break
+            except Exception:
+                pass
+
+        # detect if using HPGL preprocessor
+        try:
+            for key in self.cnc_tools:
                 if self.cnc_tools[key]['data']['ppname_g'] == 'hpgl':
                     hpgl = True
                     break
-        except Exception as e:
+        except Exception:
             try:
                 for key in self.cnc_tools:
-                    if self.cnc_tools[key]['data']['ppname_e'] == 'Roland_MDX_20':
-                        roland = True
+                    if self.cnc_tools[key]['data']['ppname_e'] == 'hpgl':
+                        hpgl = True
                         break
-            except Exception as e:
+            except Exception:
+                pass
+
+        # detect if using ISEL_ICP_CNC preprocessor
+        try:
+            for key in self.cnc_tools:
+                if 'ISEL_ICP' in self.cnc_tools[key]['data']['ppname_g'].upper():
+                    isel_icp = True
+                    break
+        except Exception:
+            try:
+                for key in self.cnc_tools:
+                    if 'ISEL_ICP' in self.cnc_tools[key]['data']['ppname_e'].upper():
+                        isel_icp = True
+                        break
+            except Exception:
                 pass
 
         # do not add gcode_header when using the Roland preprocessor, add it for every other preprocessor
-        if roland is False and hpgl is False:
+        if roland is False and hpgl is False and isel_icp is False:
             gcode = self.gcode_header()
 
         # detect if using multi-tool and make the Gcode summation correctly for each case
@@ -6680,7 +6708,8 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                 g_idx = gcode.rfind('G21')
 
             # if it did not find 'G20' and it did not find 'G21' then there is an error and return
-            if g_idx == -1:
+            # but only when the preprocessor is not ISEL_ICP who is allowed not to have the G20/G21 command
+            if g_idx == -1 and isel_icp is False:
                 self.app.inform.emit('[ERROR_NOTCL] %s' % _("G-code does not have a units code: either G20 or G21"))
                 return
 

+ 2 - 0
README.md

@@ -17,6 +17,8 @@ CAD program, and create G-Code for Isolation routing.
 - updated the languages
 - fixed a typo
 - fixed layout on first launch of the app
+- fixed some issues with the recent preparation for dark icons resource usage
+- added a new preprocessor file contributed by Daniel Friderich and added fixes for it
 - RELEASE 8.99
 
 14.12.2019

+ 21 - 19
flatcamEditors/FlatCAMGeoEditor.py

@@ -1934,11 +1934,13 @@ class FCCircle(FCShapeTool):
         DrawTool.__init__(self, draw_app)
         self.name = 'circle'
 
+        self.draw_app = draw_app
+
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
         except Exception:
             pass
-        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.app.resource_location + '/aero_circle_geo.png'))
+        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.draw_app.app.resource_location + '/aero_circle_geo.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
         self.draw_app.app.inform.emit(_("Click on Center point ..."))
@@ -1986,11 +1988,13 @@ class FCArc(FCShapeTool):
         DrawTool.__init__(self, draw_app)
         self.name = 'arc'
 
+        self.draw_app = draw_app
+
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
         except Exception:
             pass
-        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.app.resource_location + '/aero_arc.png'))
+        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.draw_app.resource_location + '/aero_arc.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
         self.draw_app.app.inform.emit(_("Click on Center point ..."))
@@ -2204,12 +2208,13 @@ class FCRectangle(FCShapeTool):
     def __init__(self, draw_app):
         DrawTool.__init__(self, draw_app)
         self.name = 'rectangle'
+        self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
         except Exception:
             pass
-        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.app.resource_location + '/aero.png'))
+        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.draw_app.app.resource_location + '/aero.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
         self.draw_app.app.inform.emit(_("Click on 1st corner ..."))
@@ -2258,12 +2263,13 @@ class FCPolygon(FCShapeTool):
     def __init__(self, draw_app):
         DrawTool.__init__(self, draw_app)
         self.name = 'polygon'
+        self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
         except Exception:
             pass
-        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.app.resource_location + '/aero.png'))
+        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.draw_app.app.resource_location + '/aero.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
         self.draw_app.app.inform.emit(_("Click on 1st corner ..."))
@@ -2321,12 +2327,13 @@ class FCPath(FCPolygon):
     """
     def __init__(self, draw_app):
         FCPolygon.__init__(self, draw_app)
+        self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
         except Exception:
             pass
-        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.app.resource_location + '/aero_path5.png'))
+        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.draw_app.app.resource_location + '/aero_path5.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
     def make(self):
@@ -2365,6 +2372,7 @@ class FCSelect(DrawTool):
     def __init__(self, draw_app):
         DrawTool.__init__(self, draw_app)
         self.name = 'select'
+        self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
@@ -2443,12 +2451,11 @@ class FCExplode(FCShapeTool):
     def __init__(self, draw_app):
         FCShapeTool.__init__(self, draw_app)
         self.name = 'explode'
-
         self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
-        except Exception as e:
+        except Exception:
             pass
 
         self.storage = self.draw_app.storage
@@ -2457,8 +2464,7 @@ class FCExplode(FCShapeTool):
 
         self.draw_app.active_tool = self
         if len(self.draw_app.get_selected()) == 0:
-            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s...' %
-                                          _("No shape selected. Select a shape to explode"))
+            self.draw_app.app.inform.emit('[WARNING_NOTCL] %s...' % ("No shape selected. Select a shape to explode"))
         else:
             self.make()
 
@@ -2498,6 +2504,7 @@ class FCMove(FCShapeTool):
     def __init__(self, draw_app):
         FCShapeTool.__init__(self, draw_app)
         self.name = 'move'
+        self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
@@ -2673,24 +2680,22 @@ class FCCopy(FCMove):
         self.geometry = [DrawToolShape(affinity.translate(geom.geo, xoff=dx, yoff=dy))
                          for geom in self.draw_app.get_selected()]
         self.complete = True
-        self.draw_app.app.inform.emit('[success] %s' %
-                                      _("Done. Geometry(s) Copy completed."))
+        self.draw_app.app.inform.emit('[success] %s' % _("Done. Geometry(s) Copy completed."))
 
 
 class FCText(FCShapeTool):
     def __init__(self, draw_app):
         FCShapeTool.__init__(self, draw_app)
         self.name = 'text'
+        self.draw_app = draw_app
 
         try:
             QtGui.QGuiApplication.restoreOverrideCursor()
         except Exception:
             pass
-        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.app.resource_location + '/aero_text.png'))
+        self.cursor = QtGui.QCursor(QtGui.QPixmap(self.draw_app.app.resource_location + '/aero_text.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
-        # self.shape_buffer = self.draw_app.shape_buffer
-        self.draw_app = draw_app
         self.app = draw_app.app
 
         self.draw_app.app.inform.emit(_("Click on 1st corner ..."))
@@ -2762,8 +2767,7 @@ class FCBuffer(FCShapeTool):
 
     def on_buffer(self):
         if not self.draw_app.selected:
-            self.app.inform.emit('[WARNING_NOTCL] %s' %
-                                 _("Buffer cancelled. No shape selected."))
+            self.app.inform.emit('[WARNING_NOTCL] %s' % _("Buffer cancelled. No shape selected."))
             return
 
         try:
@@ -2876,6 +2880,7 @@ class FCEraser(FCShapeTool):
     def __init__(self, draw_app):
         DrawTool.__init__(self, draw_app)
         self.name = 'eraser'
+        self.draw_app = draw_app
 
         self.origin = None
         self.destination = None
@@ -2982,8 +2987,6 @@ class FCPaint(FCShapeTool):
     def __init__(self, draw_app):
         FCShapeTool.__init__(self, draw_app)
         self.name = 'paint'
-
-        # self.shape_buffer = self.draw_app.shape_buffer
         self.draw_app = draw_app
         self.app = draw_app.app
 
@@ -2997,7 +3000,6 @@ class FCTransform(FCShapeTool):
         FCShapeTool.__init__(self, draw_app)
         self.name = 'transformation'
 
-        # self.shape_buffer = self.draw_app.shape_buffer
         self.draw_app = draw_app
         self.app = draw_app.app
 

BIN
locale/de/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 190 - 194
locale/de/LC_MESSAGES/strings.po


BIN
locale/en/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 190 - 194
locale/en/LC_MESSAGES/strings.po


BIN
locale/es/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 190 - 194
locale/es/LC_MESSAGES/strings.po


BIN
locale/fr/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 190 - 194
locale/fr/LC_MESSAGES/strings.po


BIN
locale/pt_BR/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 190 - 194
locale/pt_BR/LC_MESSAGES/strings.po


BIN
locale/ro/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 190 - 194
locale/ro/LC_MESSAGES/strings.po


BIN
locale/ru/LC_MESSAGES/strings.mo


Разлика између датотеке није приказан због своје велике величине
+ 189 - 193
locale/ru/LC_MESSAGES/strings.po


Разлика између датотеке није приказан због своје велике величине
+ 187 - 191
locale_template/strings.pot


+ 139 - 0
preprocessors/ISEL_ICP_CNC.py

@@ -0,0 +1,139 @@
+# ########################################################## ##
+# FlatCAM: 2D Post-processing for Manufacturing            #
+# http://flatcam.org                                       #
+# File Author: Matthieu Berthomé, Daniel Friderich         #
+# Date: 12/15/2019                                          #
+# MIT Licence                                              #
+# ########################################################## ##
+
+from FlatCAMPostProc import *
+
+
+class ISEL_ICP_CNC(FlatCAMPostProc):    
+    def start_code(self, p):
+        units = ' ' + str(p['units']).lower()
+        coords_xy = p['xy_toolchange']
+        gcode = ''
+
+        xmin = '%.*f' % (p.coords_decimals, p['options']['xmin'])
+        xmax = '%.*f' % (p.coords_decimals, p['options']['xmax'])
+        ymin = '%.*f' % (p.coords_decimals, p['options']['ymin'])
+        ymax = '%.*f' % (p.coords_decimals, p['options']['ymax'])
+        
+        gcode += 'IMF_PBL flatcam\r\n'
+        
+        if str(p['options']['type']) == 'Geometry':
+            gcode += '; TOOL DIAMETER: ' + str(p['options']['tool_dia']) + units + '\r\n'
+            
+        gcode += '; Spindle Speed: %s RPM\r\n' % str(p['spindlespeed'])
+
+        gcode += '; Feedrate: ' + str(p['feedrate']) + units + '/min' + '\r\n'
+
+        if str(p['options']['type']) == 'Geometry':
+            gcode += '; Feedrate_Z: ' + str(p['z_feedrate']) + units + '/min' + '\r\n'
+
+        gcode += '; Feedrate rapids ' + str(p['feedrate_rapid']) + units + '/min' + '\r\n\r\n'
+        gcode += '; Z_Cut: ' + str(p['z_cut']) + units + '\r\n'
+
+        if str(p['options']['type']) == 'Geometry':
+            if p['multidepth'] is True:
+                gcode += '; DepthPerCut: ' + str(p['z_depthpercut']) + units + ' <=>' + \
+                         str(math.ceil(abs(p['z_cut']) / p['z_depthpercut'])) + ' passes' + '\r\n'
+
+        gcode += '; Z_Move: ' + str(p['z_move']) + units + '\r\n'
+        gcode += '; Z Toolchange: ' + str(p['z_toolchange']) + units + '\r\n'
+
+        if coords_xy is not None:
+            gcode += '; X,Y Toolchange: ' + "%.*f, %.*f" % (p.decimals, coords_xy[0],
+                                                           p.decimals, coords_xy[1]) + units + '\r\n'
+        else:
+            gcode += '; X,Y Toolchange: ' + "None" + units + '\r\n'
+
+        gcode += '; Z Start: ' + str(p['startz']) + units + '\r\n'
+        gcode += '; Z End: ' + str(p['z_end']) + units + '\r\n'
+        gcode += '; Steps per circle: ' + str(p['steps_per_circle']) + '\r\n'
+
+        if str(p['options']['type']) == 'Excellon' or str(p['options']['type']) == 'Excellon Geometry':
+            gcode += '; Preprocessor Excellon: ' + str(p['pp_excellon_name']) + '\r\n'
+        else:
+            gcode += '; Preprocessor Geometry: ' + str(p['pp_geometry_name']) + '\r\n'
+
+        gcode += '; X range: ' + '{: >9s}'.format(xmin) + ' ... ' + '{: >9s}'.format(xmax) + ' ' + units + '\r\n'
+        gcode += '; Y range: ' + '{: >9s}'.format(ymin) + ' ... ' + '{: >9s}'.format(ymax) + ' ' + units + '\r\n'
+
+        return gcode
+
+    def startz_code(self, p):
+        if p.startz is not None:
+            return 'FASTABS Z' + str(int(p.startz * 1000))
+        else:
+            return ''
+
+    def lift_code(self, p):
+        return 'FASTABS Z' + str(int(p.z_move * 1000))
+
+    def down_code(self, p):
+        return 'MOVEABS Z' + str(int(p.z_cut * 1000))
+
+    def toolchange_code(self, p):
+        f_plunge = p.f_plunge
+        no_drills = 1
+
+        toolC_formatted = '%.*f' % (p.decimals, p.toolC)
+
+        if str(p['options']['type']) == 'Excellon':
+            for i in p['options']['Tools_in_use']:
+                if i[0] == p.tool:
+                    no_drills = i[2]
+
+            gcode = "GETTOOL {tool}\r\n; Changed to Tool Dia = {toolC}".format(tool=int(p.tool), t_drills=no_drills, toolC=toolC_formatted)
+
+            if f_plunge is True:
+                gcode += '\r\nFASTABS Z' + str(int(p.z_move * 1000))
+            return gcode
+
+        else:
+            gcode = "GETTOOL {tool}\r\n; Changed to Tool Dia = {toolC})".format(tool=int(p.tool), toolC=toolC_formatted)
+
+            if f_plunge is True:
+                gcode += '\r\nFASTABS Z' + str(int(p.z_move * 1000))
+            return gcode
+
+    def up_to_zero_code(self, p):
+        return 'MOVEABS Z0'
+
+    def position_code(self, p):
+        return ('X' + str(int(p.x * 1000)) + ' Y' + str(int(p.y * 1000)))
+    def rapid_code(self, p):
+        return ('FASTABS ' + self.position_code(p)).format(**p)
+
+    def linear_code(self, p):
+        return ('MOVEABS ' + self.position_code(p)).format(**p)
+
+    def end_code(self, p):
+        gcode = ''
+        gcode += 'WPCLEAR\r\n'
+        gcode += 'FASTABS Z0\r\n'
+        gcode += 'FASTABS X0 Y0\r\n'
+        gcode += 'PROGEND'
+        return gcode
+
+    def feedrate_code(self, p):
+        return 'VEL ' + str(int(p.feedrate / 60 * 1000))
+
+    def z_feedrate_code(self, p):
+        return 'VEL ' + str(int(p.z_feedrate / 60 * 1000))
+
+    def spindle_code(self, p):
+        sdir = {'CW': 'SPINDLE CW', 'CCW': 'SPINDLE CCW'}[p.spindledir]
+        if p.spindlespeed:
+            return '%s RPM%s' % (sdir, str(int(p.spindlespeed)))
+        else:
+            return sdir
+
+    def dwell_code(self, p):
+        if p.dwelltime:
+            return 'WAIT ' + str(int(p.dwelltime * 1000))
+
+    def spindle_stop_code(self,p):
+        return 'SPINDLE OFF'

Неке датотеке нису приказане због велике количине промена