- Film Tool - made sure that the reference point is used for all transformations in case of positive film

This commit is contained in:
Marius Stanciu
2021-02-26 08:27:29 +02:00
committed by Marius
parent dbef2e854d
commit ca29bc0ca3
3 changed files with 93 additions and 69 deletions

View File

@@ -11,6 +11,7 @@ CHANGELOG for FlatCAM beta
- fixes in Drilling & Milling Plugins for the error: "RuntimeError: wrapped C/C++ object of type ... has been deleted" - fixes in Drilling & Milling Plugins for the error: "RuntimeError: wrapped C/C++ object of type ... has been deleted"
- Milling Tool (Plugin) - fix to use the tool diameter set in the Milling plugin tool; selection in the Tools Table is now by row - Milling Tool (Plugin) - fix to use the tool diameter set in the Milling plugin tool; selection in the Tools Table is now by row
- Film Tool - made sure that the reference point is used for all transformations in case of positive film
13.02.2021 13.02.2021

View File

@@ -321,7 +321,11 @@ class Film(AppTool):
skew_factor_x = None skew_factor_x = None
skew_factor_y = None skew_factor_y = None
mirror = None mirror = None
skew_reference = 'center'
try:
reference_point = self.ui.film_reference.get_value()
except Exception:
reference_point = 'center'
if self.ui.film_scale_cb.get_value(): if self.ui.film_scale_cb.get_value():
if self.ui.film_scalex_entry.get_value() != 1.0: if self.ui.film_scalex_entry.get_value() != 1.0:
@@ -334,7 +338,6 @@ class Film(AppTool):
if self.ui.film_skewy_entry.get_value() != 0.0: if self.ui.film_skewy_entry.get_value() != 0.0:
skew_factor_y = self.ui.film_skewy_entry.get_value() skew_factor_y = self.ui.film_skewy_entry.get_value()
skew_reference = self.ui.film_reference.get_value()
if self.ui.film_mirror_cb.get_value(): if self.ui.film_mirror_cb.get_value():
if self.ui.film_mirror_axis.get_value() != 'none': if self.ui.film_mirror_axis.get_value() != 'none':
mirror = self.ui.film_mirror_axis.get_value() mirror = self.ui.film_mirror_axis.get_value()
@@ -361,10 +364,7 @@ class Film(AppTool):
filename = str(filename) filename = str(filename)
if str(filename) == "": if str(filename) != "":
self.app.inform.emit('[WARNING_NOTCL] %s' % _("Cancelled."))
return
else:
pagesize = self.ui.pagesize_combo.get_value() pagesize = self.ui.pagesize_combo.get_value()
orientation = self.ui.orientation_radio.get_value() orientation = self.ui.orientation_radio.get_value()
color = self.app.defaults['tools_film_color'] color = self.app.defaults['tools_film_color']
@@ -373,11 +373,15 @@ class Film(AppTool):
scale_stroke_factor=factor, scale_stroke_factor=factor,
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y, scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y,
skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y, skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y,
skew_reference=skew_reference, reference_point=reference_point,
mirror=mirror, mirror=mirror,
pagesize_val=pagesize, orientation_val=orientation, color_val=color, opacity_val=1.0, pagesize_val=pagesize, orientation_val=orientation, color_val=color, opacity_val=1.0,
ftype=ftype ftype=ftype
) )
return
# if we reach here then the filename is null
self.app.inform.emit('[WARNING_NOTCL] %s' % _("Cancelled."))
def generate_positive_punched_film(self, name, boxname, source, factor, ftype='svg'): def generate_positive_punched_film(self, name, boxname, source, factor, ftype='svg'):
@@ -464,7 +468,11 @@ class Film(AppTool):
skew_factor_x = None skew_factor_x = None
skew_factor_y = None skew_factor_y = None
mirror = None mirror = None
skew_reference = 'center'
try:
reference_point = self.ui.film_reference.get_value()
except Exception:
reference_point = 'center'
if self.ui.film_scale_cb.get_value(): if self.ui.film_scale_cb.get_value():
if self.ui.film_scalex_entry.get_value() != 1.0: if self.ui.film_scalex_entry.get_value() != 1.0:
@@ -477,7 +485,6 @@ class Film(AppTool):
if self.ui.film_skewy_entry.get_value() != 0.0: if self.ui.film_skewy_entry.get_value() != 0.0:
skew_factor_y = self.ui.film_skewy_entry.get_value() skew_factor_y = self.ui.film_skewy_entry.get_value()
skew_reference = self.ui.film_reference.get_value()
if self.ui.film_mirror_cb.get_value(): if self.ui.film_mirror_cb.get_value():
if self.ui.film_mirror_axis.get_value() != 'none': if self.ui.film_mirror_axis.get_value() != 'none':
mirror = self.ui.film_mirror_axis.get_value() mirror = self.ui.film_mirror_axis.get_value()
@@ -517,14 +524,14 @@ class Film(AppTool):
scale_stroke_factor=factor, scale_stroke_factor=factor,
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y, scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y,
skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y, skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y,
skew_reference=skew_reference, reference_point=reference_point,
mirror=mirror, ftype=ftype mirror=mirror, ftype=ftype
) )
def export_negative(self, obj_name, box_name, filename, boundary, def export_negative(self, obj_name, box_name, filename, boundary,
scale_stroke_factor=0.00, scale_stroke_factor=0.00,
scale_factor_x=1, scale_factor_y=1, scale_factor_x=1, scale_factor_y=1,
skew_factor_x=None, skew_factor_y=None, skew_reference='center', skew_factor_x=None, skew_factor_y=None, reference_point='center',
mirror=None, mirror=None,
use_thread=True, ftype='svg'): use_thread=True, ftype='svg'):
""" """
@@ -540,9 +547,9 @@ class Film(AppTool):
:param scale_factor_y: factor to scale the svg geometry on the Y axis :param scale_factor_y: factor to scale the svg geometry on the Y axis
:param skew_factor_x: factor to skew the svg geometry on the X axis :param skew_factor_x: factor to skew the svg geometry on the X axis
:param skew_factor_y: factor to skew the svg geometry on the Y axis :param skew_factor_y: factor to skew the svg geometry on the Y axis
:param skew_reference: reference to use for skew. Can be 'bottomleft', 'bottomright', 'topleft', :param reference_point: reference to use for transformation. Can be 'bottomleft', 'bottomright', 'topleft',
'topright', 'center' and those are the 5 points of the bounding box of the 'topright', 'center' and those are the 5 points of the bounding box of the
geometry to be skewed. geometry to be altered.
:param mirror: can be 'x' or 'y' or 'both'. Axis on which to mirror the svg geometry :param mirror: can be 'x' or 'y' or 'both'. Axis on which to mirror the svg geometry
:param use_thread: if to be run in a separate thread; boolean :param use_thread: if to be run in a separate thread; boolean
:param ftype: the type of file for saving the film: 'svg', 'png' or 'pdf' :param ftype: the type of file for saving the film: 'svg', 'png' or 'pdf'
@@ -602,15 +609,15 @@ class Film(AppTool):
box_geo = unary_union(box.flatten()) box_geo = unary_union(box.flatten())
skew_ref = 'center' skew_ref = 'center'
if skew_reference != 'center': if reference_point != 'center':
xmin, ymin, xmax, ymax = box_geo.bounds xmin, ymin, xmax, ymax = box_geo.bounds
if skew_reference == 'topleft': if reference_point == 'topleft':
skew_ref = (xmin, ymax) skew_ref = (xmin, ymax)
elif skew_reference == 'bottomleft': elif reference_point == 'bottomleft':
skew_ref = (xmin, ymin) skew_ref = (xmin, ymin)
elif skew_reference == 'topright': elif reference_point == 'topright':
skew_ref = (xmax, ymax) skew_ref = (xmax, ymax)
elif skew_reference == 'bottomright': elif reference_point == 'bottomright':
skew_ref = (xmax, ymin) skew_ref = (xmax, ymin)
transformed_box_geo = box_geo transformed_box_geo = box_geo
@@ -647,7 +654,7 @@ class Film(AppTool):
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y, scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y,
skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y, skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y,
mirror=mirror, mirror=mirror,
scale_reference=scale_reference, skew_reference=skew_reference scale_reference=scale_reference, skew_reference=reference_point
) )
uom = obj.units.lower() uom = obj.units.lower()
@@ -804,8 +811,8 @@ class Film(AppTool):
def export_positive(self, obj_name, box_name, filename, def export_positive(self, obj_name, box_name, filename,
scale_stroke_factor=0.00, scale_stroke_factor=0.00,
scale_factor_x=1, scale_factor_y=1, scale_factor_x=1, scale_factor_y=1,
skew_factor_x=None, skew_factor_y=None, skew_reference='center', skew_factor_x=None, skew_factor_y=None, reference_point='center',
mirror=None, orientation_val='p', pagesize_val='A4', color_val='black', opacity_val=1.0, mirror=None, orientation_val='p', pagesize_val='A4', color_val='black', opacity_val=1.0,
use_thread=True, ftype='svg'): use_thread=True, ftype='svg'):
""" """
@@ -819,8 +826,9 @@ class Film(AppTool):
:param scale_factor_y: factor to scale the geometry on the Y axis :param scale_factor_y: factor to scale the geometry on the Y axis
:param skew_factor_x: factor to skew the geometry on the X axis :param skew_factor_x: factor to skew the geometry on the X axis
:param skew_factor_y: factor to skew the geometry on the Y axis :param skew_factor_y: factor to skew the geometry on the Y axis
:param skew_reference: reference to use for skew. Can be 'bottomleft', 'bottomright', 'topleft', :param reference_point: reference to use for transformation. Can be 'bottomleft', 'bottomright', 'topleft',
'topright' and those are the 4 points of the bounding box of the geometry to be skewed. 'topright' and those are the 4 points of the bounding box of the geometry
to be altered.
:param mirror: can be 'x' or 'y' or 'both'. Axis on which to mirror the svg geometry :param mirror: can be 'x' or 'y' or 'both'. Axis on which to mirror the svg geometry
:param orientation_val: :param orientation_val:
:param pagesize_val: :param pagesize_val:
@@ -863,12 +871,11 @@ class Film(AppTool):
def make_positive_film(p_size, orientation, color, transparency_level, scale_factor_x, scale_factor_y): def make_positive_film(p_size, orientation, color, transparency_level, scale_factor_x, scale_factor_y):
log.debug("FilmTool.export_positive().make_positive_film()") log.debug("FilmTool.export_positive().make_positive_film()")
scale_reference = 'center'
self.screen_dpi = self.app.qapp.screens()[0].logicalDotsPerInch() self.screen_dpi = self.app.qapp.screens()[0].logicalDotsPerInch()
new_png_dpi = self.ui.png_dpi_spinner.get_value() new_png_dpi = self.ui.png_dpi_spinner.get_value()
dpi_rate = new_png_dpi / self.screen_dpi dpi_rate = new_png_dpi / self.screen_dpi
# Determine bounding area for svg export # Determine bounding area for svg export
bounds = box.bounds() bounds = box.bounds()
tr_scale_reference = (bounds[0], bounds[1]) tr_scale_reference = (bounds[0], bounds[1])
@@ -876,7 +883,6 @@ class Film(AppTool):
if dpi_rate != 1 and ftype == 'png': if dpi_rate != 1 and ftype == 'png':
scale_factor_x += dpi_rate scale_factor_x += dpi_rate
scale_factor_y += dpi_rate scale_factor_y += dpi_rate
scale_reference = (bounds[0], bounds[1])
if box.kind.lower() == 'geometry': if box.kind.lower() == 'geometry':
flat_geo = [] flat_geo = []
@@ -889,44 +895,41 @@ class Film(AppTool):
else: else:
box_geo = unary_union(box.flatten()) box_geo = unary_union(box.flatten())
skew_ref = 'center' xmin, ymin, xmax, ymax = box_geo.bounds
if skew_reference != 'center': ref_val = 'center'
xmin, ymin, xmax, ymax = box_geo.bounds if reference_point == 'topleft':
if skew_reference == 'topleft': ref_val = (xmin, ymax)
skew_ref = (xmin, ymax) elif reference_point == 'bottomleft':
elif skew_reference == 'bottomleft': ref_val = (xmin, ymin)
skew_ref = (xmin, ymin) elif reference_point == 'topright':
elif skew_reference == 'topright': ref_val = (xmax, ymax)
skew_ref = (xmax, ymax) elif reference_point == 'bottomright':
elif skew_reference == 'bottomright': ref_val = (xmax, ymin)
skew_ref = (xmax, ymin)
transformed_box_geo = box_geo transformed_box_geo = box_geo
if scale_factor_x and not scale_factor_y: if scale_factor_x and not scale_factor_y:
transformed_box_geo = affinity.scale(transformed_box_geo, scale_factor_x, 1.0, transformed_box_geo = affinity.scale(transformed_box_geo, scale_factor_x, 1.0, origin=ref_val)
origin=tr_scale_reference)
elif not scale_factor_x and scale_factor_y: elif not scale_factor_x and scale_factor_y:
transformed_box_geo = affinity.scale(transformed_box_geo, 1.0, scale_factor_y, transformed_box_geo = affinity.scale(transformed_box_geo, 1.0, scale_factor_y, origin=ref_val)
origin=tr_scale_reference)
elif scale_factor_x and scale_factor_y: elif scale_factor_x and scale_factor_y:
transformed_box_geo = affinity.scale(transformed_box_geo, scale_factor_x, scale_factor_y, transformed_box_geo = affinity.scale(transformed_box_geo, scale_factor_x, scale_factor_y,
origin=tr_scale_reference) origin=ref_val)
if skew_factor_x and not skew_factor_y: if skew_factor_x and not skew_factor_y:
transformed_box_geo = affinity.skew(transformed_box_geo, skew_factor_x, 0.0, origin=skew_ref) transformed_box_geo = affinity.skew(transformed_box_geo, skew_factor_x, 0.0, origin=ref_val)
elif not skew_factor_x and skew_factor_y: elif not skew_factor_x and skew_factor_y:
transformed_box_geo = affinity.skew(transformed_box_geo, 0.0, skew_factor_y, origin=skew_ref) transformed_box_geo = affinity.skew(transformed_box_geo, 0.0, skew_factor_y, origin=ref_val)
elif skew_factor_x and skew_factor_y: elif skew_factor_x and skew_factor_y:
transformed_box_geo = affinity.skew(transformed_box_geo, skew_factor_x, skew_factor_y, origin=skew_ref) transformed_box_geo = affinity.skew(transformed_box_geo, skew_factor_x, skew_factor_y, origin=ref_val)
if mirror: if mirror:
if mirror == 'x': if mirror == 'x':
transformed_box_geo = affinity.scale(transformed_box_geo, 1.0, -1.0) transformed_box_geo = affinity.scale(transformed_box_geo, 1.0, -1.0, origin=ref_val)
if mirror == 'y': if mirror == 'y':
transformed_box_geo = affinity.scale(transformed_box_geo, -1.0, 1.0) transformed_box_geo = affinity.scale(transformed_box_geo, -1.0, 1.0, origin=ref_val)
if mirror == 'both': if mirror == 'both':
transformed_box_geo = affinity.scale(transformed_box_geo, -1.0, -1.0) transformed_box_geo = affinity.scale(transformed_box_geo, -1.0, -1.0, origin=ref_val)
bounds = transformed_box_geo.bounds bounds = transformed_box_geo.bounds
size = bounds[2] - bounds[0], bounds[3] - bounds[1] size = bounds[2] - bounds[0], bounds[3] - bounds[1]
@@ -935,7 +938,7 @@ class Film(AppTool):
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y, scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y,
skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y, skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y,
mirror=mirror, mirror=mirror,
scale_reference=scale_reference, skew_reference=skew_reference scale_reference=reference_point, skew_reference=reference_point
) )
# Change the attributes of the exported SVG # Change the attributes of the exported SVG
@@ -1004,7 +1007,7 @@ class Film(AppTool):
"Most likely another app is holding the file open and not accessible.")) "Most likely another app is holding the file open and not accessible."))
return 'fail' return 'fail'
except Exception as e: except Exception as e:
log.error("FilmTool.export_positive() --> PNG output --> %s" % str(e)) self.app.log.error("FilmTool.export_positive() --> PNG output --> %s" % str(e))
return 'fail' return 'fail'
else: else:
try: try:
@@ -1053,7 +1056,7 @@ class Film(AppTool):
"Most likely another app is holding the file open and not accessible.")) "Most likely another app is holding the file open and not accessible."))
return 'fail' return 'fail'
except Exception as e: except Exception as e:
log.error("FilmTool.export_positive() --> PDF output --> %s" % str(e)) self.app.log.error("FilmTool.export_positive() --> PDF output --> %s" % str(e))
return 'fail' return 'fail'
if self.app.defaults["global_open_style"] is False: if self.app.defaults["global_open_style"] is False:
@@ -1069,7 +1072,7 @@ class Film(AppTool):
transparency_level=transparency_level, transparency_level=transparency_level,
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y) scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y)
except Exception as e: except Exception as e:
log.error("export_positive() process -> %s" % str(e)) self.app.log.error("export_positive() process -> %s" % str(e))
return return
self.app.worker_task.emit({'fcn': job_thread_film, 'params': []}) self.app.worker_task.emit({'fcn': job_thread_film, 'params': []})

View File

@@ -2285,7 +2285,7 @@ class Geometry(object):
def export_svg(self, scale_stroke_factor=0.00, def export_svg(self, scale_stroke_factor=0.00,
scale_factor_x=None, scale_factor_y=None, scale_factor_x=None, scale_factor_y=None,
skew_factor_x=None, skew_factor_y=None, skew_factor_x=None, skew_factor_y=None,
skew_reference='center', scale_reference='center', skew_reference='center', scale_reference='center', mirror_reference='center',
mirror=None): mirror=None):
""" """
Exports the Geometry Object as a SVG Element Exports the Geometry Object as a SVG Element
@@ -2305,26 +2305,46 @@ class Geometry(object):
else: else:
geom_svg = unary_union(self.flatten()) geom_svg = unary_union(self.flatten())
xmin, ymin, xmax, ymax = geom_svg.bounds
skew_ref = 'center' skew_ref = 'center'
if skew_reference != 'center': if skew_reference == 'topleft':
xmin, ymin, xmax, ymax = geom_svg.bounds skew_ref = (xmin, ymax)
if skew_reference == 'topleft': elif skew_reference == 'bottomleft':
skew_ref = (xmin, ymax) skew_ref = (xmin, ymin)
elif skew_reference == 'bottomleft': elif skew_reference == 'topright':
skew_ref = (xmin, ymin) skew_ref = (xmax, ymax)
elif skew_reference == 'topright': elif skew_reference == 'bottomright':
skew_ref = (xmax, ymax) skew_ref = (xmax, ymin)
elif skew_reference == 'bottomright':
skew_ref = (xmax, ymin) scale_ref = 'center'
if scale_reference == 'topleft':
scale_ref = (xmin, ymax)
elif scale_reference == 'bottomleft':
scale_ref = (xmin, ymin)
elif scale_reference == 'topright':
scale_ref = (xmax, ymax)
elif scale_reference == 'bottomright':
scale_ref = (xmax, ymin)
mirror_ref = 'center'
if mirror_reference == 'topleft':
mirror_ref = (xmin, ymax)
elif mirror_reference == 'bottomleft':
mirror_ref = (xmin, ymin)
elif mirror_reference == 'topright':
mirror_ref = (xmax, ymax)
elif mirror_reference == 'bottomright':
mirror_ref = (xmax, ymin)
geom = geom_svg geom = geom_svg
if scale_factor_x and not scale_factor_y: if scale_factor_x and not scale_factor_y:
geom = affinity.scale(geom_svg, scale_factor_x, 1.0, origin=scale_reference) geom = affinity.scale(geom_svg, scale_factor_x, 1.0, origin=scale_ref)
elif not scale_factor_x and scale_factor_y: elif not scale_factor_x and scale_factor_y:
geom = affinity.scale(geom_svg, 1.0, scale_factor_y, origin=scale_reference) geom = affinity.scale(geom_svg, 1.0, scale_factor_y, origin=scale_ref)
elif scale_factor_x and scale_factor_y: elif scale_factor_x and scale_factor_y:
geom = affinity.scale(geom_svg, scale_factor_x, scale_factor_y, origin=scale_reference) geom = affinity.scale(geom_svg, scale_factor_x, scale_factor_y, origin=scale_ref)
if skew_factor_x and not skew_factor_y: if skew_factor_x and not skew_factor_y:
geom = affinity.skew(geom_svg, skew_factor_x, 0.0, origin=skew_ref) geom = affinity.skew(geom_svg, skew_factor_x, 0.0, origin=skew_ref)
@@ -2335,11 +2355,11 @@ class Geometry(object):
if mirror: if mirror:
if mirror == 'x': if mirror == 'x':
geom = affinity.scale(geom_svg, 1.0, -1.0) geom = affinity.scale(geom_svg, 1.0, -1.0, origin=mirror_ref)
if mirror == 'y': if mirror == 'y':
geom = affinity.scale(geom_svg, -1.0, 1.0) geom = affinity.scale(geom_svg, -1.0, 1.0, origin=mirror_ref)
if mirror == 'both': if mirror == 'both':
geom = affinity.scale(geom_svg, -1.0, -1.0) geom = affinity.scale(geom_svg, -1.0, -1.0, origin=mirror_ref)
# scale_factor is a multiplication factor for the SVG stroke-width used within shapely's svg export # scale_factor is a multiplication factor for the SVG stroke-width used within shapely's svg export
# If 0 or less which is invalid then default to 0.01 # If 0 or less which is invalid then default to 0.01