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

- fixed issue #343; updated the Image Tool

Marius Stanciu 6 лет назад
Родитель
Сommit
462e9b4bd8
4 измененных файлов с 92 добавлено и 59 удалено
  1. 6 47
      FlatCAMApp.py
  2. 4 0
      README.md
  3. 7 9
      camlib.py
  4. 75 3
      flatcamTools/ToolImage.py

+ 6 - 47
FlatCAMApp.py

@@ -2090,7 +2090,6 @@ class App(QtCore.QObject):
 
         # Sets up FlatCAMObj, FCProcess and FCProcessContainer.
         self.setup_obj_classes()
-        self.setup_recent_items()
         self.setup_component_editor()
 
         # #####################################################################################
@@ -2380,6 +2379,11 @@ class App(QtCore.QObject):
         # always install tools only after the shell is initialized because the self.inform.emit() depends on shell
         self.install_tools()
 
+        # ##################################################################################
+        # ########################### SETUP RECENT ITEMS ###################################
+        # ##################################################################################
+        self.setup_recent_items()
+
         # ##################################################################################
         # ########################### BookMarks Manager ####################################
         # ##################################################################################
@@ -10533,51 +10537,6 @@ class App(QtCore.QObject):
             self.inform.emit('[success] %s: %s' % (_("Opened"), filename))
             self.progress.emit(100)
 
-    def import_image(self, filename, o_type='gerber', dpi=96, mode='black', mask=[250, 250, 250, 250], outname=None):
-        """
-        Adds a new Geometry Object to the projects and populates
-        it with shapes extracted from the SVG file.
-
-        :param filename: Path to the SVG file.
-        :param o_type: type of FlatCAM objeect
-        :param dpi: dot per inch
-        :param mode: black or color
-        :param mask: dictate the level of detail
-        :param outname: name for the resulting file
-        :return:
-        """
-        self.report_usage("import_image()")
-
-        if o_type is None or o_type == "geometry":
-            obj_type = "geometry"
-        elif o_type == "gerber":
-            obj_type = o_type
-        else:
-            self.inform.emit('[ERROR_NOTCL] %s' %
-                             _("Not supported type is picked as parameter. "
-                               "Only Geometry and Gerber are supported"))
-            return
-
-        def obj_init(geo_obj, app_obj):
-            geo_obj.import_image(filename, units=units, dpi=dpi, mode=mode, mask=mask)
-            geo_obj.multigeo = False
-
-        with self.proc_container.new(_("Importing Image")) as proc:
-
-            # Object name
-            name = outname or filename.split('/')[-1].split('\\')[-1]
-            units = self.defaults['units']
-
-            self.new_object(obj_type, name, obj_init)
-            self.progress.emit(20)
-            # Register recent file
-            self.file_opened.emit("image", filename)
-
-            # GUI feedback
-            self.inform.emit('[success] %s: %s' %
-                             (_("Opened"), filename))
-            self.progress.emit(100)
-
     def open_gerber(self, filename, outname=None):
         """
         Opens a Gerber file, parses it and creates a new object for
@@ -11265,7 +11224,7 @@ class App(QtCore.QObject):
             'project': self.open_project,
             'svg': self.import_svg,
             'dxf': self.import_dxf,
-            'image': self.import_image,
+            'image': self.image_tool.import_image,
             'pdf': lambda fname: self.worker_task.emit({'fcn': self.pdf_tool.open_pdf, 'params': [fname]})
         }
 

+ 4 - 0
README.md

@@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing.
 
 =================================================
 
+2.12.2019
+
+- fixed issue #343; updated the Image Tool
+
 28.11.2019
 
 - small fixes in NCC Tool and in the FlatCAMGeometry class

+ 7 - 9
camlib.py

@@ -1084,7 +1084,7 @@ class Geometry(object):
         #     geos_text_f = []
         #     self.solid_geometry = [self.solid_geometry, geos_text_f]
 
-    def import_image(self, filename, flip=True, units='MM', dpi=96, mode='black', mask=[128, 128, 128, 128]):
+    def import_image(self, filename, flip=True, units='MM', dpi=96, mode='black', mask=None):
         """
         Imports shapes from an IMAGE file into the object's geometry.
 
@@ -1098,15 +1098,13 @@ class Geometry(object):
         :param mask: level of detail for the import
         :return: None
         """
-        scale_factor = 0.264583333
+        if mask is None:
+            mask = [128, 128, 128, 128]
 
-        if units.lower() == 'mm':
-            scale_factor = 25.4 / dpi
-        else:
-            scale_factor = 1 / dpi
+        scale_factor = 25.4 / dpi if units.lower() == 'mm' else 1 / dpi
 
-        geos = []
-        unscaled_geos = []
+        geos = list()
+        unscaled_geos = list()
 
         with rasterio.open(filename) as src:
             # if filename.lower().rpartition('.')[-1] == 'bmp':
@@ -1153,7 +1151,7 @@ class Geometry(object):
 
         # Add to object
         if self.solid_geometry is None:
-            self.solid_geometry = []
+            self.solid_geometry = list()
 
         if type(self.solid_geometry) is list:
             # self.solid_geometry.append(cascaded_union(geos))

+ 75 - 3
flatcamTools/ToolImage.py

@@ -59,6 +59,7 @@ class ToolImage(FlatCAMTool):
 
         # DPI value of the imported image
         self.dpi_entry = FCSpinner()
+        self.dpi_entry.set_range(0, 99999)
         self.dpi_label = QtWidgets.QLabel('%s:' % _("DPI value"))
         self.dpi_label.setToolTip(_("Specify a DPI value for the image.") )
         ti_form_layout.addRow(self.dpi_label, self.dpi_entry)
@@ -145,8 +146,11 @@ class ToolImage(FlatCAMTool):
 
         self.layout.addStretch()
 
+        self.on_image_type(val=False)
+
         # ## Signals
         self.import_button.clicked.connect(self.on_file_importimage)
+        self.image_type.activated_custom.connect(self.on_image_type)
 
     def run(self, toggle=True):
         self.app.report_usage("ToolImage()")
@@ -187,6 +191,28 @@ class ToolImage(FlatCAMTool):
         self.mask_g_entry.set_value(250)
         self.mask_b_entry.set_value(250)
 
+    def on_image_type(self, val):
+        if val == 'color':
+            self.mask_r_label.setDisabled(False)
+            self.mask_r_entry.setDisabled(False)
+            self.mask_g_label.setDisabled(False)
+            self.mask_g_entry.setDisabled(False)
+            self.mask_b_label.setDisabled(False)
+            self.mask_b_entry.setDisabled(False)
+
+            self.mask_bw_label.setDisabled(True)
+            self.mask_bw_entry.setDisabled(True)
+        else:
+            self.mask_r_label.setDisabled(True)
+            self.mask_r_entry.setDisabled(True)
+            self.mask_g_label.setDisabled(True)
+            self.mask_g_entry.setDisabled(True)
+            self.mask_b_label.setDisabled(True)
+            self.mask_b_entry.setDisabled(True)
+
+            self.mask_bw_label.setDisabled(False)
+            self.mask_bw_entry.setDisabled(False)
+
     def on_file_importimage(self):
         """
         Callback for menu item File->Import IMAGE.
@@ -194,7 +220,7 @@ class ToolImage(FlatCAMTool):
         :type type_of_obj: str
         :return: None
         """
-        mask = []
+        mask = list()
         self.app.log.debug("on_file_importimage()")
 
         _filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
@@ -218,6 +244,52 @@ class ToolImage(FlatCAMTool):
         if filename == "":
             self.app.inform.emit(_("Open cancelled."))
         else:
-            self.app.worker_task.emit({'fcn': self.app.import_image,
+            self.app.worker_task.emit({'fcn': self.import_image,
                                        'params': [filename, type_obj, dpi, mode, mask]})
-            #  self.import_svg(filename, "geometry")
+
+    def import_image(self, filename, o_type='gerber', dpi=96, mode='black', mask=None, outname=None):
+        """
+        Adds a new Geometry Object to the projects and populates
+        it with shapes extracted from the SVG file.
+
+        :param filename: Path to the SVG file.
+        :param o_type: type of FlatCAM objeect
+        :param dpi: dot per inch
+        :param mode: black or color
+        :param mask: dictate the level of detail
+        :param outname: name for the resulting file
+        :return:
+        """
+
+        self.app.report_usage("import_image()")
+
+        if mask is None:
+            mask = [250, 250, 250, 250]
+
+        if o_type is None or o_type == "geometry":
+            obj_type = "geometry"
+        elif o_type == "gerber":
+            obj_type = o_type
+        else:
+            self.app.inform.emit('[ERROR_NOTCL] %s' %
+                                 _("Not supported type is picked as parameter. "
+                                   "Only Geometry and Gerber are supported"))
+            return
+
+        def obj_init(geo_obj, app_obj):
+            geo_obj.import_image(filename, units=units, dpi=dpi, mode=mode, mask=mask)
+            geo_obj.multigeo = False
+
+        with self.app.proc_container.new(_("Importing Image")) as proc:
+
+            # Object name
+            name = outname or filename.split('/')[-1].split('\\')[-1]
+            units = self.app.defaults['units']
+
+            self.app.new_object(obj_type, name, obj_init)
+
+            # Register recent file
+            self.app.file_opened.emit("image", filename)
+
+            # GUI feedback
+            self.app.inform.emit('[success] %s: %s' % (_("Opened"), filename))