diff --git a/FlatCAMApp.py b/FlatCAMApp.py index c54b1ff6..b4114bc0 100644 --- a/FlatCAMApp.py +++ b/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]}) } diff --git a/README.md b/README.md index 61158ab2..474785eb 100644 --- a/README.md +++ b/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 diff --git a/camlib.py b/camlib.py index 6d2501ce..14515f4c 100644 --- a/camlib.py +++ b/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)) diff --git a/flatcamTools/ToolImage.py b/flatcamTools/ToolImage.py index b6253949..674c5ebc 100644 --- a/flatcamTools/ToolImage.py +++ b/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))