- fixed issue #343; updated the Image Tool
This commit is contained in:
parent
cefbcd1816
commit
462e9b4bd8
|
@ -2090,7 +2090,6 @@ class App(QtCore.QObject):
|
||||||
|
|
||||||
# Sets up FlatCAMObj, FCProcess and FCProcessContainer.
|
# Sets up FlatCAMObj, FCProcess and FCProcessContainer.
|
||||||
self.setup_obj_classes()
|
self.setup_obj_classes()
|
||||||
self.setup_recent_items()
|
|
||||||
self.setup_component_editor()
|
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
|
# always install tools only after the shell is initialized because the self.inform.emit() depends on shell
|
||||||
self.install_tools()
|
self.install_tools()
|
||||||
|
|
||||||
|
# ##################################################################################
|
||||||
|
# ########################### SETUP RECENT ITEMS ###################################
|
||||||
|
# ##################################################################################
|
||||||
|
self.setup_recent_items()
|
||||||
|
|
||||||
# ##################################################################################
|
# ##################################################################################
|
||||||
# ########################### BookMarks Manager ####################################
|
# ########################### BookMarks Manager ####################################
|
||||||
# ##################################################################################
|
# ##################################################################################
|
||||||
|
@ -10533,51 +10537,6 @@ class App(QtCore.QObject):
|
||||||
self.inform.emit('[success] %s: %s' % (_("Opened"), filename))
|
self.inform.emit('[success] %s: %s' % (_("Opened"), filename))
|
||||||
self.progress.emit(100)
|
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):
|
def open_gerber(self, filename, outname=None):
|
||||||
"""
|
"""
|
||||||
Opens a Gerber file, parses it and creates a new object for
|
Opens a Gerber file, parses it and creates a new object for
|
||||||
|
@ -11265,7 +11224,7 @@ class App(QtCore.QObject):
|
||||||
'project': self.open_project,
|
'project': self.open_project,
|
||||||
'svg': self.import_svg,
|
'svg': self.import_svg,
|
||||||
'dxf': self.import_dxf,
|
'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]})
|
'pdf': lambda fname: self.worker_task.emit({'fcn': self.pdf_tool.open_pdf, 'params': [fname]})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
28.11.2019
|
||||||
|
|
||||||
- small fixes in NCC Tool and in the FlatCAMGeometry class
|
- small fixes in NCC Tool and in the FlatCAMGeometry class
|
||||||
|
|
16
camlib.py
16
camlib.py
|
@ -1084,7 +1084,7 @@ class Geometry(object):
|
||||||
# geos_text_f = []
|
# geos_text_f = []
|
||||||
# self.solid_geometry = [self.solid_geometry, 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.
|
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
|
:param mask: level of detail for the import
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
scale_factor = 0.264583333
|
if mask is None:
|
||||||
|
mask = [128, 128, 128, 128]
|
||||||
|
|
||||||
if units.lower() == 'mm':
|
scale_factor = 25.4 / dpi if units.lower() == 'mm' else 1 / dpi
|
||||||
scale_factor = 25.4 / dpi
|
|
||||||
else:
|
|
||||||
scale_factor = 1 / dpi
|
|
||||||
|
|
||||||
geos = []
|
geos = list()
|
||||||
unscaled_geos = []
|
unscaled_geos = list()
|
||||||
|
|
||||||
with rasterio.open(filename) as src:
|
with rasterio.open(filename) as src:
|
||||||
# if filename.lower().rpartition('.')[-1] == 'bmp':
|
# if filename.lower().rpartition('.')[-1] == 'bmp':
|
||||||
|
@ -1153,7 +1151,7 @@ class Geometry(object):
|
||||||
|
|
||||||
# Add to object
|
# Add to object
|
||||||
if self.solid_geometry is None:
|
if self.solid_geometry is None:
|
||||||
self.solid_geometry = []
|
self.solid_geometry = list()
|
||||||
|
|
||||||
if type(self.solid_geometry) is list:
|
if type(self.solid_geometry) is list:
|
||||||
# self.solid_geometry.append(cascaded_union(geos))
|
# self.solid_geometry.append(cascaded_union(geos))
|
||||||
|
|
|
@ -59,6 +59,7 @@ class ToolImage(FlatCAMTool):
|
||||||
|
|
||||||
# DPI value of the imported image
|
# DPI value of the imported image
|
||||||
self.dpi_entry = FCSpinner()
|
self.dpi_entry = FCSpinner()
|
||||||
|
self.dpi_entry.set_range(0, 99999)
|
||||||
self.dpi_label = QtWidgets.QLabel('%s:' % _("DPI value"))
|
self.dpi_label = QtWidgets.QLabel('%s:' % _("DPI value"))
|
||||||
self.dpi_label.setToolTip(_("Specify a DPI value for the image.") )
|
self.dpi_label.setToolTip(_("Specify a DPI value for the image.") )
|
||||||
ti_form_layout.addRow(self.dpi_label, self.dpi_entry)
|
ti_form_layout.addRow(self.dpi_label, self.dpi_entry)
|
||||||
|
@ -145,8 +146,11 @@ class ToolImage(FlatCAMTool):
|
||||||
|
|
||||||
self.layout.addStretch()
|
self.layout.addStretch()
|
||||||
|
|
||||||
|
self.on_image_type(val=False)
|
||||||
|
|
||||||
# ## Signals
|
# ## Signals
|
||||||
self.import_button.clicked.connect(self.on_file_importimage)
|
self.import_button.clicked.connect(self.on_file_importimage)
|
||||||
|
self.image_type.activated_custom.connect(self.on_image_type)
|
||||||
|
|
||||||
def run(self, toggle=True):
|
def run(self, toggle=True):
|
||||||
self.app.report_usage("ToolImage()")
|
self.app.report_usage("ToolImage()")
|
||||||
|
@ -187,6 +191,28 @@ class ToolImage(FlatCAMTool):
|
||||||
self.mask_g_entry.set_value(250)
|
self.mask_g_entry.set_value(250)
|
||||||
self.mask_b_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):
|
def on_file_importimage(self):
|
||||||
"""
|
"""
|
||||||
Callback for menu item File->Import IMAGE.
|
Callback for menu item File->Import IMAGE.
|
||||||
|
@ -194,7 +220,7 @@ class ToolImage(FlatCAMTool):
|
||||||
:type type_of_obj: str
|
:type type_of_obj: str
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
mask = []
|
mask = list()
|
||||||
self.app.log.debug("on_file_importimage()")
|
self.app.log.debug("on_file_importimage()")
|
||||||
|
|
||||||
_filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
|
_filter = "Image Files(*.BMP *.PNG *.JPG *.JPEG);;" \
|
||||||
|
@ -218,6 +244,52 @@ class ToolImage(FlatCAMTool):
|
||||||
if filename == "":
|
if filename == "":
|
||||||
self.app.inform.emit(_("Open cancelled."))
|
self.app.inform.emit(_("Open cancelled."))
|
||||||
else:
|
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]})
|
'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))
|
||||||
|
|
Loading…
Reference in New Issue