- fixed issues in the Scale feature of the Film Plugin
- in the Scale feature of the Film plugin added ability to scale by a length amount
This commit is contained in:
@@ -7,6 +7,11 @@ CHANGELOG for FlatCAM beta
|
|||||||
|
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
17.03.2022
|
||||||
|
|
||||||
|
- fixed issues in the Scale feature of the Film Plugin
|
||||||
|
- in the Scale feature of the Film plugin added ability to scale by a length amount
|
||||||
|
|
||||||
16.03.2022
|
16.03.2022
|
||||||
|
|
||||||
- fixed an exception encountered on saving projects due of getting a "circular error" on serializing the project objects
|
- fixed an exception encountered on saving projects due of getting a "circular error" on serializing the project objects
|
||||||
|
|||||||
@@ -506,6 +506,7 @@ class PreferencesUIManager(QtCore.QObject):
|
|||||||
"tools_film_color": self.ui.plugin_pref_form.tools_film_group.film_color_entry,
|
"tools_film_color": self.ui.plugin_pref_form.tools_film_group.film_color_entry,
|
||||||
|
|
||||||
"tools_film_scale_cb": self.ui.plugin_pref_form.tools_film_group.film_scale_cb,
|
"tools_film_scale_cb": self.ui.plugin_pref_form.tools_film_group.film_scale_cb,
|
||||||
|
"tools_film_scale_type": self.ui.plugin_pref_form.tools_film_group.film_scale_type_combo, # "length"
|
||||||
"tools_film_scale_x_entry": self.ui.plugin_pref_form.tools_film_group.film_scalex_entry,
|
"tools_film_scale_x_entry": self.ui.plugin_pref_form.tools_film_group.film_scalex_entry,
|
||||||
"tools_film_scale_y_entry": self.ui.plugin_pref_form.tools_film_group.film_scaley_entry,
|
"tools_film_scale_y_entry": self.ui.plugin_pref_form.tools_film_group.film_scaley_entry,
|
||||||
"tools_film_scale_ref": self.ui.plugin_pref_form.tools_film_group.film_scale_ref_combo,
|
"tools_film_scale_ref": self.ui.plugin_pref_form.tools_film_group.film_scale_ref_combo,
|
||||||
|
|||||||
@@ -58,25 +58,37 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
grid_scale = FCGridLayout(v_spacing=5, h_spacing=3)
|
grid_scale = FCGridLayout(v_spacing=5, h_spacing=3)
|
||||||
scale_frame.setLayout(grid_scale)
|
scale_frame.setLayout(grid_scale)
|
||||||
|
|
||||||
|
# Scale Type
|
||||||
|
self.film_scale_type_lbl = FCLabel('%s:' % _("Type"))
|
||||||
|
self.film_scale_type_lbl.setToolTip(
|
||||||
|
_("'Length' -> scale by a length value\n"
|
||||||
|
"'Factor' -> scale by a ratio")
|
||||||
|
)
|
||||||
|
self.film_scale_type_combo = FCComboBox2()
|
||||||
|
self.film_scale_type_combo.addItems([_("Length"), _("Factor")])
|
||||||
|
|
||||||
|
grid_scale.addWidget(self.film_scale_type_lbl, 0, 0)
|
||||||
|
grid_scale.addWidget(self.film_scale_type_combo, 0, 1)
|
||||||
|
|
||||||
# Scale X factor
|
# Scale X factor
|
||||||
self.film_scalex_label = FCLabel('%s:' % _("X factor"))
|
self.film_scalex_label = FCLabel('%s:' % _("X val"))
|
||||||
self.film_scalex_entry = FCDoubleSpinner()
|
self.film_scalex_entry = FCDoubleSpinner()
|
||||||
self.film_scalex_entry.set_range(-999.9999, 999.9999)
|
self.film_scalex_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_scalex_entry.set_precision(self.decimals)
|
self.film_scalex_entry.set_precision(self.decimals)
|
||||||
self.film_scalex_entry.setSingleStep(0.01)
|
self.film_scalex_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
grid_scale.addWidget(self.film_scalex_label, 0, 0)
|
grid_scale.addWidget(self.film_scalex_label, 2, 0)
|
||||||
grid_scale.addWidget(self.film_scalex_entry, 0, 1)
|
grid_scale.addWidget(self.film_scalex_entry, 2, 1)
|
||||||
|
|
||||||
# Scale Y factor
|
# Scale Y factor
|
||||||
self.film_scaley_label = FCLabel('%s:' % _("Y factor"))
|
self.film_scaley_label = FCLabel('%s:' % _("Y val"))
|
||||||
self.film_scaley_entry = FCDoubleSpinner()
|
self.film_scaley_entry = FCDoubleSpinner()
|
||||||
self.film_scaley_entry.set_range(-999.9999, 999.9999)
|
self.film_scaley_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_scaley_entry.set_precision(self.decimals)
|
self.film_scaley_entry.set_precision(self.decimals)
|
||||||
self.film_scaley_entry.setSingleStep(0.01)
|
self.film_scaley_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
grid_scale.addWidget(self.film_scaley_label, 2, 0)
|
grid_scale.addWidget(self.film_scaley_label, 4, 0)
|
||||||
grid_scale.addWidget(self.film_scaley_entry, 2, 1)
|
grid_scale.addWidget(self.film_scaley_entry, 4, 1)
|
||||||
|
|
||||||
# Scale reference
|
# Scale reference
|
||||||
self.scale_ref_label = FCLabel('%s:' % _("Reference"))
|
self.scale_ref_label = FCLabel('%s:' % _("Reference"))
|
||||||
@@ -88,8 +100,8 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
self.film_scale_ref_combo.addItems(
|
self.film_scale_ref_combo.addItems(
|
||||||
[_('Center'), _('Bottom Left'), _('Top Left'), _('Bottom Right'), _('Top right')])
|
[_('Center'), _('Bottom Left'), _('Top Left'), _('Bottom Right'), _('Top right')])
|
||||||
|
|
||||||
grid_scale.addWidget(self.scale_ref_label, 4, 0)
|
grid_scale.addWidget(self.scale_ref_label, 6, 0)
|
||||||
grid_scale.addWidget(self.film_scale_ref_combo, 4, 1)
|
grid_scale.addWidget(self.film_scale_ref_combo, 6, 1)
|
||||||
|
|
||||||
# Skew Geometry
|
# Skew Geometry
|
||||||
self.film_skew_cb = FCCheckBox('%s' % _("Skew"))
|
self.film_skew_cb = FCCheckBox('%s' % _("Skew"))
|
||||||
@@ -102,11 +114,11 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
QCheckBox {font-weight: bold; color: black}
|
QCheckBox {font-weight: bold; color: black}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
adj_grid.addWidget(self.film_skew_cb, 6, 0, 1, 2)
|
adj_grid.addWidget(self.film_skew_cb, 8, 0, 1, 2)
|
||||||
|
|
||||||
# SKEW FRAME
|
# SKEW FRAME
|
||||||
skew_frame = FCFrame()
|
skew_frame = FCFrame()
|
||||||
adj_grid.addWidget(skew_frame, 8, 0, 1, 2)
|
adj_grid.addWidget(skew_frame, 10, 0, 1, 2)
|
||||||
|
|
||||||
grid_skew = FCGridLayout(v_spacing=5, h_spacing=3)
|
grid_skew = FCGridLayout(v_spacing=5, h_spacing=3)
|
||||||
skew_frame.setLayout(grid_skew)
|
skew_frame.setLayout(grid_skew)
|
||||||
@@ -115,17 +127,17 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
self.film_skew_type_lbl.setToolTip(
|
self.film_skew_type_lbl.setToolTip(
|
||||||
_("'Length' -> deform by a length value\n"
|
_("'Length' -> deform by a length value\n"
|
||||||
"'Angle' -> deform by an angle\n"
|
"'Angle' -> deform by an angle\n"
|
||||||
"'Ratio' -> deform by a ratio between what should be and what is")
|
"'Factor' -> deform by a ratio between what should be and what is")
|
||||||
)
|
)
|
||||||
self.film_skew_type_combo = FCComboBox2()
|
self.film_skew_type_combo = FCComboBox2()
|
||||||
self.film_skew_type_combo.addItems([_("Length"), _("Angle"), _("Ratio")])
|
self.film_skew_type_combo.addItems([_("Length"), _("Angle"), _("Factor")])
|
||||||
|
|
||||||
grid_skew.addWidget(self.film_skew_type_lbl, 0, 0)
|
grid_skew.addWidget(self.film_skew_type_lbl, 0, 0)
|
||||||
grid_skew.addWidget(self.film_skew_type_combo, 0, 1)
|
grid_skew.addWidget(self.film_skew_type_combo, 0, 1)
|
||||||
|
|
||||||
self.film_skewx_label = FCLabel('%s:' % _("X val"))
|
self.film_skewx_label = FCLabel('%s:' % _("X val"))
|
||||||
self.film_skewx_entry = FCDoubleSpinner()
|
self.film_skewx_entry = FCDoubleSpinner()
|
||||||
self.film_skewx_entry.set_range(-999.9999, 999.9999)
|
self.film_skewx_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_skewx_entry.set_precision(self.decimals)
|
self.film_skewx_entry.set_precision(self.decimals)
|
||||||
self.film_skewx_entry.setSingleStep(0.01)
|
self.film_skewx_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
@@ -134,7 +146,7 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
|
|
||||||
self.film_skewy_label = FCLabel('%s:' % _("Y val"))
|
self.film_skewy_label = FCLabel('%s:' % _("Y val"))
|
||||||
self.film_skewy_entry = FCDoubleSpinner()
|
self.film_skewy_entry = FCDoubleSpinner()
|
||||||
self.film_skewy_entry.set_range(-999.9999, 999.9999)
|
self.film_skewy_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_skewy_entry.set_precision(self.decimals)
|
self.film_skewy_entry.set_precision(self.decimals)
|
||||||
self.film_skewy_entry.setSingleStep(0.01)
|
self.film_skewy_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
@@ -164,7 +176,7 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
QCheckBox {font-weight: bold; color: black}
|
QCheckBox {font-weight: bold; color: black}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
adj_grid.addWidget(self.film_mirror_cb, 10, 0, 1, 2)
|
adj_grid.addWidget(self.film_mirror_cb, 12, 0, 1, 2)
|
||||||
|
|
||||||
self.film_mirror_axis = RadioSet([{'label': _('X'), 'value': 'x'},
|
self.film_mirror_axis = RadioSet([{'label': _('X'), 'value': 'x'},
|
||||||
{'label': _('Y'), 'value': 'y'},
|
{'label': _('Y'), 'value': 'y'},
|
||||||
@@ -172,8 +184,8 @@ class ToolsFilmPrefGroupUI(OptionsGroupUI):
|
|||||||
compact=True)
|
compact=True)
|
||||||
self.film_mirror_axis_label = FCLabel('%s:' % _("Mirror Axis"))
|
self.film_mirror_axis_label = FCLabel('%s:' % _("Mirror Axis"))
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_mirror_axis_label, 12, 0)
|
adj_grid.addWidget(self.film_mirror_axis_label, 14, 0)
|
||||||
adj_grid.addWidget(self.film_mirror_axis, 12, 1)
|
adj_grid.addWidget(self.film_mirror_axis, 14, 1)
|
||||||
|
|
||||||
# separator_line3 = QtWidgets.QFrame()
|
# separator_line3 = QtWidgets.QFrame()
|
||||||
# separator_line3.setFrameShape(QtWidgets.QFrame.Shape.HLine)
|
# separator_line3.setFrameShape(QtWidgets.QFrame.Shape.HLine)
|
||||||
|
|||||||
@@ -351,8 +351,9 @@ class Film(AppTool):
|
|||||||
def generate_positive_normal_film(self, name, boxname, factor, ftype='svg'):
|
def generate_positive_normal_film(self, name, boxname, factor, ftype='svg'):
|
||||||
self.app.log.debug("ToolFilm.Film.generate_positive_normal_film() started ...")
|
self.app.log.debug("ToolFilm.Film.generate_positive_normal_film() started ...")
|
||||||
|
|
||||||
scale_factor_x = 1
|
scale_factor_x = None
|
||||||
scale_factor_y = 1
|
scale_factor_y = None
|
||||||
|
scale_type = 0
|
||||||
skew_factor_x = None
|
skew_factor_x = None
|
||||||
skew_factor_y = None
|
skew_factor_y = None
|
||||||
skew_type = 0
|
skew_type = 0
|
||||||
@@ -364,10 +365,18 @@ class Film(AppTool):
|
|||||||
skew_reference = reference_list[int(self.ui.skew_ref_combo.get_value())]
|
skew_reference = reference_list[int(self.ui.skew_ref_combo.get_value())]
|
||||||
|
|
||||||
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:
|
scale_type = self.ui.film_scale_type_combo.get_value()
|
||||||
scale_factor_x = self.ui.film_scalex_entry.get_value()
|
|
||||||
if self.ui.film_scaley_entry.get_value() != 1.0:
|
if scale_type == 0: # "length"
|
||||||
scale_factor_y = self.ui.film_scaley_entry.get_value()
|
if self.ui.film_scalex_entry.get_value() != 0.0:
|
||||||
|
scale_factor_x = self.ui.film_scalex_entry.get_value()
|
||||||
|
if self.ui.film_scaley_entry.get_value() != 0.0:
|
||||||
|
scale_factor_y = self.ui.film_scaley_entry.get_value()
|
||||||
|
else: # "factor"
|
||||||
|
if self.ui.film_scalex_entry.get_value() != 1.0:
|
||||||
|
scale_factor_x = self.ui.film_scalex_entry.get_value()
|
||||||
|
if self.ui.film_scaley_entry.get_value() != 1.0:
|
||||||
|
scale_factor_y = self.ui.film_scaley_entry.get_value()
|
||||||
|
|
||||||
if self.ui.film_skew_cb.get_value():
|
if self.ui.film_skew_cb.get_value():
|
||||||
if self.ui.film_skewx_entry.get_value() != 0.0:
|
if self.ui.film_skewx_entry.get_value() != 0.0:
|
||||||
@@ -405,7 +414,7 @@ class Film(AppTool):
|
|||||||
self.export_positive_handler(name, boxname, filename,
|
self.export_positive_handler(name, boxname, filename,
|
||||||
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,
|
||||||
scale_reference=scale_reference,
|
scale_reference=scale_reference, scale_type=scale_type,
|
||||||
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, skew_type=skew_type,
|
skew_reference=skew_reference, skew_type=skew_type,
|
||||||
mirror=mirror,
|
mirror=mirror,
|
||||||
@@ -502,6 +511,7 @@ class Film(AppTool):
|
|||||||
|
|
||||||
scale_factor_x = 1
|
scale_factor_x = 1
|
||||||
scale_factor_y = 1
|
scale_factor_y = 1
|
||||||
|
scale_type = 0
|
||||||
skew_factor_x = None
|
skew_factor_x = None
|
||||||
skew_factor_y = None
|
skew_factor_y = None
|
||||||
skew_type = 0
|
skew_type = 0
|
||||||
@@ -517,6 +527,7 @@ class Film(AppTool):
|
|||||||
scale_factor_x = self.ui.film_scalex_entry.get_value()
|
scale_factor_x = self.ui.film_scalex_entry.get_value()
|
||||||
if self.ui.film_scaley_entry.get_value() != 1.0:
|
if self.ui.film_scaley_entry.get_value() != 1.0:
|
||||||
scale_factor_y = self.ui.film_scaley_entry.get_value()
|
scale_factor_y = self.ui.film_scaley_entry.get_value()
|
||||||
|
scale_type = self.ui.film_scale_type_combo.get_value()
|
||||||
|
|
||||||
if self.ui.film_skew_cb.get_value():
|
if self.ui.film_skew_cb.get_value():
|
||||||
if self.ui.film_skewx_entry.get_value() != 0.0:
|
if self.ui.film_skewx_entry.get_value() != 0.0:
|
||||||
@@ -562,7 +573,7 @@ class Film(AppTool):
|
|||||||
self.export_negative_handler(name, boxname, filename, border,
|
self.export_negative_handler(name, boxname, filename, border,
|
||||||
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,
|
||||||
scale_reference=scale_reference,
|
scale_reference=scale_reference, scale_type=scale_type,
|
||||||
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, skew_type=skew_type,
|
skew_reference=skew_reference, skew_type=skew_type,
|
||||||
mirror=mirror, ftype=ftype,
|
mirror=mirror, ftype=ftype,
|
||||||
@@ -572,7 +583,7 @@ class Film(AppTool):
|
|||||||
|
|
||||||
def export_negative_handler(self, obj_name, box_name, filename, boundary,
|
def export_negative_handler(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_reference='center',
|
scale_factor_x=1, scale_factor_y=1, scale_reference='center', scale_type=0,
|
||||||
skew_factor_x=None, skew_factor_y=None, skew_reference='center', skew_type=0,
|
skew_factor_x=None, skew_factor_y=None, skew_reference='center', skew_type=0,
|
||||||
mirror=None, opacity_val=1.0,
|
mirror=None, opacity_val=1.0,
|
||||||
use_thread=True, ftype='svg', use_convex_hull=False, rounded_box=False):
|
use_thread=True, ftype='svg', use_convex_hull=False, rounded_box=False):
|
||||||
@@ -589,13 +600,16 @@ 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 scale_reference: reference to use for transformation.
|
:param scale_reference: reference to use for transformation.
|
||||||
Values: 'center', 'bottomleft', 'topleft', 'bottomright', 'topright'
|
Values: 'center', 'bottomleft', 'topleft', 'bottomright', 'topright'
|
||||||
|
:param scale_type: Values 0, 1, 2 -> 'Length', 'Factor'
|
||||||
|
Length means that the scaling is done by a specific length, factor means
|
||||||
|
scaling by a ratio between what should be and what is
|
||||||
: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 transformation.
|
:param skew_reference: reference to use for transformation.
|
||||||
Values: 'center', 'bottomleft', 'topleft', 'bottomright', 'topright'
|
Values: 'center', 'bottomleft', 'topleft', 'bottomright', 'topright'
|
||||||
:param skew_type: Values 0, 1, 2 -> 'Length', 'Angle', 'Ratio'
|
:param skew_type: Values 0, 1, 2 -> 'Length', 'Angle', 'Factor'
|
||||||
Length means that the deformation is done by a specific length, angle means
|
Length means that the deformation is done by a specific length, angle means
|
||||||
deformation by angle and ratio means deformation by a ratio between what should be
|
deformation by angle and factor means deformation by a ratio between what should be
|
||||||
and what is
|
and what is
|
||||||
: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 opacity_val:
|
:param opacity_val:
|
||||||
@@ -649,14 +663,14 @@ class Film(AppTool):
|
|||||||
|
|
||||||
transformed_box_geo = self.transform_geometry(box, scale_factor_x=scale_factor_x,
|
transformed_box_geo = self.transform_geometry(box, scale_factor_x=scale_factor_x,
|
||||||
scale_factor_y=scale_factor_y,
|
scale_factor_y=scale_factor_y,
|
||||||
scale_reference=scale_reference,
|
scale_reference=scale_reference, scale_type=scale_type,
|
||||||
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, skew_type=skew_type,
|
skew_reference=skew_reference, skew_type=skew_type,
|
||||||
mirror=mirror)
|
mirror=mirror)
|
||||||
|
|
||||||
transformed_obj_geo = self.transform_geometry(obj, scale_factor_x=scale_factor_x,
|
transformed_obj_geo = self.transform_geometry(obj, scale_factor_x=scale_factor_x,
|
||||||
scale_factor_y=scale_factor_y,
|
scale_factor_y=scale_factor_y,
|
||||||
scale_reference=scale_reference,
|
scale_reference=scale_reference, scale_type=scale_type,
|
||||||
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, skew_type=skew_type,
|
skew_reference=skew_reference, skew_type=skew_type,
|
||||||
mirror=mirror)
|
mirror=mirror)
|
||||||
@@ -794,7 +808,7 @@ class Film(AppTool):
|
|||||||
|
|
||||||
def export_positive_handler(self, obj_name, box_name, filename,
|
def export_positive_handler(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_reference='center',
|
scale_factor_x=None, scale_factor_y=None, scale_reference='center', scale_type=0,
|
||||||
skew_factor_x=None, skew_factor_y=None, skew_reference='center', skew_type=0,
|
skew_factor_x=None, skew_factor_y=None, skew_reference='center', skew_type=0,
|
||||||
mirror=None, opacity_val=1.0,
|
mirror=None, opacity_val=1.0,
|
||||||
use_thread=True, ftype='svg'):
|
use_thread=True, ftype='svg'):
|
||||||
@@ -810,13 +824,16 @@ 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 scale_reference: reference to use for transformation.
|
:param scale_reference: reference to use for transformation.
|
||||||
Values: 'center', 'bottomleft', 'topleft', 'bottomright', 'topright'
|
Values: 'center', 'bottomleft', 'topleft', 'bottomright', 'topright'
|
||||||
|
:param scale_type: Values 0, 1, 2 -> 'Length', 'Factor'
|
||||||
|
Length means that the deformation is done by a specific length, factor means
|
||||||
|
scaling by a ratio between what should be and what is
|
||||||
: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 transformation.
|
:param skew_reference: reference to use for transformation.
|
||||||
Values: 'center', 'bottomleft'
|
Values: 'center', 'bottomleft'
|
||||||
:param skew_type: Values 0, 1, 2 -> 'Length', 'Angle', 'Ratio'
|
:param skew_type: Values 0, 1, 2 -> 'Length', 'Angle', 'Factor'
|
||||||
Length means that the deformation is done by a specific length, angle means
|
Length means that the deformation is done by a specific length, angle means
|
||||||
deformation by angle and ratio means deformation by a ratio between what should be
|
deformation by angle and factor means deformation by a ratio between what should be
|
||||||
and what is
|
and what is
|
||||||
: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 opacity_val:
|
:param opacity_val:
|
||||||
@@ -868,14 +885,14 @@ class Film(AppTool):
|
|||||||
|
|
||||||
transformed_box_geo = self.transform_geometry(box, scale_factor_x=scale_factor_x,
|
transformed_box_geo = self.transform_geometry(box, scale_factor_x=scale_factor_x,
|
||||||
scale_factor_y=scale_factor_y,
|
scale_factor_y=scale_factor_y,
|
||||||
scale_reference=scale_reference,
|
scale_reference=scale_reference, scale_type=scale_type,
|
||||||
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, skew_type=skew_type,
|
skew_reference=skew_reference, skew_type=skew_type,
|
||||||
mirror=mirror)
|
mirror=mirror)
|
||||||
|
|
||||||
transformed_obj_geo = self.transform_geometry(obj, scale_factor_x=scale_factor_x,
|
transformed_obj_geo = self.transform_geometry(obj, scale_factor_x=scale_factor_x,
|
||||||
scale_factor_y=scale_factor_y,
|
scale_factor_y=scale_factor_y,
|
||||||
scale_reference=scale_reference,
|
scale_reference=scale_reference, scale_type=scale_type,
|
||||||
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, skew_type=skew_type,
|
skew_reference=skew_reference, skew_type=skew_type,
|
||||||
mirror=mirror)
|
mirror=mirror)
|
||||||
@@ -1032,8 +1049,7 @@ class Film(AppTool):
|
|||||||
self.app.log.error("FilmTool.write_output_file() --> PDF output --> %s" % str(e))
|
self.app.log.error("FilmTool.write_output_file() --> PDF output --> %s" % str(e))
|
||||||
return 'fail'
|
return 'fail'
|
||||||
|
|
||||||
@staticmethod
|
def transform_geometry(self, obj, scale_factor_x=None, scale_factor_y=None, scale_reference='center', scale_type=0,
|
||||||
def transform_geometry(obj, scale_factor_x=None, scale_factor_y=None, scale_reference='center',
|
|
||||||
skew_factor_x=None, skew_factor_y=None,
|
skew_factor_x=None, skew_factor_y=None,
|
||||||
skew_reference='center', skew_type=0, mirror=None):
|
skew_reference='center', skew_type=0, mirror=None):
|
||||||
"""
|
"""
|
||||||
@@ -1041,6 +1057,8 @@ class Film(AppTool):
|
|||||||
|
|
||||||
:return: Shapely geometry transformed
|
:return: Shapely geometry transformed
|
||||||
"""
|
"""
|
||||||
|
# import inspect
|
||||||
|
# self.app.log.debug(str(inspect.stack()[1][3]) + "--> Film.transform_geometry()")
|
||||||
|
|
||||||
# Make sure we see a Shapely Geometry class and not a list
|
# Make sure we see a Shapely Geometry class and not a list
|
||||||
if obj.kind.lower() == 'geometry':
|
if obj.kind.lower() == 'geometry':
|
||||||
@@ -1068,22 +1086,35 @@ class Film(AppTool):
|
|||||||
ref_scale_val = (xmax, ymin)
|
ref_scale_val = (xmax, ymin)
|
||||||
|
|
||||||
if scale_factor_x and not scale_factor_y:
|
if scale_factor_x and not scale_factor_y:
|
||||||
val_x = scale_factor_x
|
if scale_type == 1: # "factor"
|
||||||
val_y = 0
|
val_x = scale_factor_x
|
||||||
|
else:
|
||||||
|
val_x = ((xmax - xmin) + scale_factor_x) / (xmax - xmin)
|
||||||
|
val_y = 1
|
||||||
elif not scale_factor_x and scale_factor_y:
|
elif not scale_factor_x and scale_factor_y:
|
||||||
val_x = 0
|
val_x = 1
|
||||||
val_y = scale_factor_y
|
if scale_type == 1: # "factor"
|
||||||
|
val_y = scale_factor_y
|
||||||
|
else:
|
||||||
|
val_y = ((ymax - ymin) + scale_factor_y) / (ymax - ymin)
|
||||||
else:
|
else:
|
||||||
val_x = scale_factor_x
|
if scale_type == 1: # "factor"
|
||||||
val_y = scale_factor_y
|
val_x = scale_factor_x
|
||||||
|
val_y = scale_factor_y
|
||||||
|
else:
|
||||||
|
val_x = ((xmax - xmin) + scale_factor_x) / (xmax - xmin)
|
||||||
|
val_y = ((ymax - ymin) + scale_factor_y) / (ymax - ymin)
|
||||||
|
|
||||||
transformed_geo = affinity.scale(transformed_geo, val_x, val_y, origin=ref_scale_val)
|
transformed_geo = affinity.scale(transformed_geo, val_x, val_y, origin=ref_scale_val)
|
||||||
|
|
||||||
|
# return transformed_geo
|
||||||
|
|
||||||
# SKEWING
|
# SKEWING
|
||||||
if skew_factor_x or skew_factor_y:
|
if skew_factor_x or skew_factor_y:
|
||||||
xmin, ymin, xmax, ymax = transformed_geo.bounds
|
xmin, ymin, xmax, ymax = transformed_geo.bounds
|
||||||
if skew_reference == 'bottomleft':
|
if skew_reference == 'bottomleft':
|
||||||
ref_skew_val = (xmin, ymin)
|
ref_skew_val = (xmin, ymin)
|
||||||
if skew_type == 0: # "length"
|
if skew_type == 0: # "length"
|
||||||
if skew_factor_x and not skew_factor_y:
|
if skew_factor_x and not skew_factor_y:
|
||||||
skew_angle_x = math.degrees(math.atan2(skew_factor_x, (ymax - ymin)))
|
skew_angle_x = math.degrees(math.atan2(skew_factor_x, (ymax - ymin)))
|
||||||
skew_angle_y = 0.0
|
skew_angle_y = 0.0
|
||||||
@@ -1093,7 +1124,7 @@ class Film(AppTool):
|
|||||||
else:
|
else:
|
||||||
skew_angle_x = math.degrees(math.atan2(skew_factor_x, (ymax - ymin)))
|
skew_angle_x = math.degrees(math.atan2(skew_factor_x, (ymax - ymin)))
|
||||||
skew_angle_y = math.degrees(math.atan2(skew_factor_y, (xmax - xmin)))
|
skew_angle_y = math.degrees(math.atan2(skew_factor_y, (xmax - xmin)))
|
||||||
elif skew_type == 1: # "angle"
|
elif skew_type == 1: # "angle"
|
||||||
if skew_factor_x and not skew_factor_y:
|
if skew_factor_x and not skew_factor_y:
|
||||||
skew_angle_x = skew_factor_x
|
skew_angle_x = skew_factor_x
|
||||||
skew_angle_y = 0.0
|
skew_angle_y = 0.0
|
||||||
@@ -1104,7 +1135,6 @@ class Film(AppTool):
|
|||||||
skew_angle_x = skew_factor_x
|
skew_angle_x = skew_factor_x
|
||||||
skew_angle_y = skew_factor_y
|
skew_angle_y = skew_factor_y
|
||||||
else: # "ratio"
|
else: # "ratio"
|
||||||
|
|
||||||
if skew_factor_x and not skew_factor_y:
|
if skew_factor_x and not skew_factor_y:
|
||||||
future_x = (xmax - xmin) * skew_factor_x - (xmax - xmin)
|
future_x = (xmax - xmin) * skew_factor_x - (xmax - xmin)
|
||||||
skew_angle_x = math.degrees(math.atan2(future_x, (ymax - ymin)))
|
skew_angle_x = math.degrees(math.atan2(future_x, (ymax - ymin)))
|
||||||
@@ -1336,25 +1366,37 @@ class FilmUI:
|
|||||||
)
|
)
|
||||||
adj_grid.addWidget(self.film_scale_cb, 2, 0, 1, 2)
|
adj_grid.addWidget(self.film_scale_cb, 2, 0, 1, 2)
|
||||||
|
|
||||||
|
# Scale Type
|
||||||
|
self.film_scale_type_lbl = FCLabel('%s:' % _("Type"))
|
||||||
|
self.film_scale_type_lbl.setToolTip(
|
||||||
|
_("'Length' -> scale by a length value\n"
|
||||||
|
"'Factor' -> scale by a ratio")
|
||||||
|
)
|
||||||
|
self.film_scale_type_combo = FCComboBox2()
|
||||||
|
self.film_scale_type_combo.addItems([_("Length"), _("Factor")])
|
||||||
|
|
||||||
|
adj_grid.addWidget(self.film_scale_type_lbl, 4, 0)
|
||||||
|
adj_grid.addWidget(self.film_scale_type_combo, 4, 1)
|
||||||
|
|
||||||
# Scale X
|
# Scale X
|
||||||
self.film_scalex_label = FCLabel('%s:' % _("X factor"))
|
self.film_scalex_label = FCLabel('%s:' % _("X val"))
|
||||||
self.film_scalex_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
self.film_scalex_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
||||||
self.film_scalex_entry.set_range(-999.9999, 999.9999)
|
self.film_scalex_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_scalex_entry.set_precision(self.decimals)
|
self.film_scalex_entry.set_precision(self.decimals)
|
||||||
self.film_scalex_entry.setSingleStep(0.01)
|
self.film_scalex_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_scalex_label, 4, 0)
|
adj_grid.addWidget(self.film_scalex_label, 6, 0)
|
||||||
adj_grid.addWidget(self.film_scalex_entry, 4, 1)
|
adj_grid.addWidget(self.film_scalex_entry, 6, 1)
|
||||||
|
|
||||||
# Scale Y
|
# Scale Y
|
||||||
self.film_scaley_label = FCLabel('%s:' % _("Y factor"))
|
self.film_scaley_label = FCLabel('%s:' % _("Y val"))
|
||||||
self.film_scaley_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
self.film_scaley_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
||||||
self.film_scaley_entry.set_range(-999.9999, 999.9999)
|
self.film_scaley_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_scaley_entry.set_precision(self.decimals)
|
self.film_scaley_entry.set_precision(self.decimals)
|
||||||
self.film_scaley_entry.setSingleStep(0.01)
|
self.film_scaley_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_scaley_label, 6, 0)
|
adj_grid.addWidget(self.film_scaley_label, 7, 0)
|
||||||
adj_grid.addWidget(self.film_scaley_entry, 6, 1)
|
adj_grid.addWidget(self.film_scaley_entry, 7, 1)
|
||||||
|
|
||||||
# Scale reference
|
# Scale reference
|
||||||
self.scale_ref_label = FCLabel('%s:' % _("Reference"))
|
self.scale_ref_label = FCLabel('%s:' % _("Reference"))
|
||||||
@@ -1366,11 +1408,13 @@ class FilmUI:
|
|||||||
self.scale_ref_combo.addItems(
|
self.scale_ref_combo.addItems(
|
||||||
[_('Center'), _('Bottom Left'), _('Top Left'), _('Bottom Right'), _('Top right')])
|
[_('Center'), _('Bottom Left'), _('Top Left'), _('Bottom Right'), _('Top right')])
|
||||||
|
|
||||||
adj_grid.addWidget(self.scale_ref_label, 8, 0)
|
adj_grid.addWidget(self.scale_ref_label, 10, 0)
|
||||||
adj_grid.addWidget(self.scale_ref_combo, 8, 1)
|
adj_grid.addWidget(self.scale_ref_combo, 10, 1)
|
||||||
|
|
||||||
self.ois_scale = OptionalHideInputSection(self.film_scale_cb,
|
self.ois_scale = OptionalHideInputSection(self.film_scale_cb,
|
||||||
[
|
[
|
||||||
|
self.film_scale_type_lbl,
|
||||||
|
self.film_scale_type_combo,
|
||||||
self.film_scalex_label,
|
self.film_scalex_label,
|
||||||
self.film_scalex_entry,
|
self.film_scalex_entry,
|
||||||
self.film_scaley_label,
|
self.film_scaley_label,
|
||||||
@@ -1382,7 +1426,7 @@ class FilmUI:
|
|||||||
self.scale_separator_line = QtWidgets.QFrame()
|
self.scale_separator_line = QtWidgets.QFrame()
|
||||||
self.scale_separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
|
self.scale_separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
|
||||||
self.scale_separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
|
self.scale_separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
|
||||||
adj_grid.addWidget(self.scale_separator_line, 10, 0, 1, 2)
|
adj_grid.addWidget(self.scale_separator_line, 12, 0, 1, 2)
|
||||||
|
|
||||||
# Skew Geometry
|
# Skew Geometry
|
||||||
self.film_skew_cb = FCCheckBox('%s' % _("Skew"))
|
self.film_skew_cb = FCCheckBox('%s' % _("Skew"))
|
||||||
@@ -1395,8 +1439,9 @@ class FilmUI:
|
|||||||
QCheckBox {font-weight: bold; color: black}
|
QCheckBox {font-weight: bold; color: black}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
adj_grid.addWidget(self.film_skew_cb, 12, 0, 1, 2)
|
adj_grid.addWidget(self.film_skew_cb, 14, 0, 1, 2)
|
||||||
|
|
||||||
|
# Skew Type
|
||||||
self.film_skew_type_lbl = FCLabel('%s:' % _("Type"))
|
self.film_skew_type_lbl = FCLabel('%s:' % _("Type"))
|
||||||
self.film_skew_type_lbl.setToolTip(
|
self.film_skew_type_lbl.setToolTip(
|
||||||
_("'Length' -> deform by a length value\n"
|
_("'Length' -> deform by a length value\n"
|
||||||
@@ -1404,30 +1449,30 @@ class FilmUI:
|
|||||||
"'Ratio' -> deform by a ratio between what should be and what is")
|
"'Ratio' -> deform by a ratio between what should be and what is")
|
||||||
)
|
)
|
||||||
self.film_skew_type_combo = FCComboBox2()
|
self.film_skew_type_combo = FCComboBox2()
|
||||||
self.film_skew_type_combo.addItems([_("Length"), _("Angle"), _("Ratio")])
|
self.film_skew_type_combo.addItems([_("Length"), _("Angle"), _("Factor")])
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_skew_type_lbl, 14, 0)
|
adj_grid.addWidget(self.film_skew_type_lbl, 16, 0)
|
||||||
adj_grid.addWidget(self.film_skew_type_combo, 14, 1)
|
adj_grid.addWidget(self.film_skew_type_combo, 16, 1)
|
||||||
|
|
||||||
# Skew X
|
# Skew X
|
||||||
self.film_skewx_label = FCLabel('%s:' % _("X val"))
|
self.film_skewx_label = FCLabel('%s:' % _("X val"))
|
||||||
self.film_skewx_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
self.film_skewx_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
||||||
self.film_skewx_entry.set_range(-999.9999, 999.9999)
|
self.film_skewx_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_skewx_entry.set_precision(self.decimals)
|
self.film_skewx_entry.set_precision(self.decimals)
|
||||||
self.film_skewx_entry.setSingleStep(0.01)
|
self.film_skewx_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_skewx_label, 16, 0)
|
adj_grid.addWidget(self.film_skewx_label, 18, 0)
|
||||||
adj_grid.addWidget(self.film_skewx_entry, 16, 1)
|
adj_grid.addWidget(self.film_skewx_entry, 18, 1)
|
||||||
|
|
||||||
# Skew Y
|
# Skew Y
|
||||||
self.film_skewy_label = FCLabel('%s:' % _("Y val"))
|
self.film_skewy_label = FCLabel('%s:' % _("Y val"))
|
||||||
self.film_skewy_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
self.film_skewy_entry = FCDoubleSpinner(callback=self.confirmation_message)
|
||||||
self.film_skewy_entry.set_range(-999.9999, 999.9999)
|
self.film_skewy_entry.set_range(-10000.0000, 10000.0000)
|
||||||
self.film_skewy_entry.set_precision(self.decimals)
|
self.film_skewy_entry.set_precision(self.decimals)
|
||||||
self.film_skewy_entry.setSingleStep(0.01)
|
self.film_skewy_entry.setSingleStep(0.01)
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_skewy_label, 18, 0)
|
adj_grid.addWidget(self.film_skewy_label, 20, 0)
|
||||||
adj_grid.addWidget(self.film_skewy_entry, 18, 1)
|
adj_grid.addWidget(self.film_skewy_entry, 20, 1)
|
||||||
|
|
||||||
# Skew Reference
|
# Skew Reference
|
||||||
self.skew_ref_label = FCLabel('%s:' % _("Reference"))
|
self.skew_ref_label = FCLabel('%s:' % _("Reference"))
|
||||||
@@ -1439,8 +1484,8 @@ class FilmUI:
|
|||||||
self.skew_ref_combo.addItems(
|
self.skew_ref_combo.addItems(
|
||||||
[_('Center'), _('Bottom Left')])
|
[_('Center'), _('Bottom Left')])
|
||||||
|
|
||||||
adj_grid.addWidget(self.skew_ref_label, 20, 0)
|
adj_grid.addWidget(self.skew_ref_label, 22, 0)
|
||||||
adj_grid.addWidget(self.skew_ref_combo, 20, 1)
|
adj_grid.addWidget(self.skew_ref_combo, 22, 1)
|
||||||
|
|
||||||
self.ois_skew = OptionalHideInputSection(self.film_skew_cb,
|
self.ois_skew = OptionalHideInputSection(self.film_skew_cb,
|
||||||
[
|
[
|
||||||
@@ -1457,7 +1502,7 @@ class FilmUI:
|
|||||||
self.skew_separator_line1 = QtWidgets.QFrame()
|
self.skew_separator_line1 = QtWidgets.QFrame()
|
||||||
self.skew_separator_line1.setFrameShape(QtWidgets.QFrame.Shape.HLine)
|
self.skew_separator_line1.setFrameShape(QtWidgets.QFrame.Shape.HLine)
|
||||||
self.skew_separator_line1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
|
self.skew_separator_line1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
|
||||||
adj_grid.addWidget(self.skew_separator_line1, 22, 0, 1, 2)
|
adj_grid.addWidget(self.skew_separator_line1, 24, 0, 1, 2)
|
||||||
|
|
||||||
# Mirror Geometry
|
# Mirror Geometry
|
||||||
self.film_mirror_cb = FCCheckBox('%s' % _("Mirror"))
|
self.film_mirror_cb = FCCheckBox('%s' % _("Mirror"))
|
||||||
@@ -1469,7 +1514,7 @@ class FilmUI:
|
|||||||
QCheckBox {font-weight: bold; color: black}
|
QCheckBox {font-weight: bold; color: black}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
adj_grid.addWidget(self.film_mirror_cb, 24, 0, 1, 2)
|
adj_grid.addWidget(self.film_mirror_cb, 26, 0, 1, 2)
|
||||||
|
|
||||||
self.film_mirror_axis = RadioSet([{'label': _('X'), 'value': 'x'},
|
self.film_mirror_axis = RadioSet([{'label': _('X'), 'value': 'x'},
|
||||||
{'label': _('Y'), 'value': 'y'},
|
{'label': _('Y'), 'value': 'y'},
|
||||||
@@ -1480,8 +1525,8 @@ class FilmUI:
|
|||||||
_("Mirror the film geometry on the selected axis or on both.")
|
_("Mirror the film geometry on the selected axis or on both.")
|
||||||
)
|
)
|
||||||
|
|
||||||
adj_grid.addWidget(self.film_mirror_axis_label, 26, 0)
|
adj_grid.addWidget(self.film_mirror_axis_label, 28, 0)
|
||||||
adj_grid.addWidget(self.film_mirror_axis, 26, 1)
|
adj_grid.addWidget(self.film_mirror_axis, 28, 1)
|
||||||
|
|
||||||
self.ois_mirror = OptionalHideInputSection(self.film_mirror_cb,
|
self.ois_mirror = OptionalHideInputSection(self.film_mirror_cb,
|
||||||
[
|
[
|
||||||
|
|||||||
10
defaults.py
10
defaults.py
@@ -577,16 +577,18 @@ class AppDefaults:
|
|||||||
"tools_film_color": '#000000',
|
"tools_film_color": '#000000',
|
||||||
|
|
||||||
"tools_film_scale_cb": False,
|
"tools_film_scale_cb": False,
|
||||||
"tools_film_scale_x_entry": 1.0,
|
"tools_film_scale_type": 0, # "length"
|
||||||
"tools_film_scale_y_entry": 1.0,
|
|
||||||
"tools_film_scale_ref": 0, # "center
|
"tools_film_scale_x_entry": 0.0,
|
||||||
|
"tools_film_scale_y_entry": 0.0,
|
||||||
|
"tools_film_scale_ref": 1, # "bottom left"
|
||||||
|
|
||||||
"tools_film_skew_cb": False,
|
"tools_film_skew_cb": False,
|
||||||
"tools_film_skew_type": 0, # "length"
|
"tools_film_skew_type": 0, # "length"
|
||||||
|
|
||||||
"tools_film_skew_x_entry": 0.0,
|
"tools_film_skew_x_entry": 0.0,
|
||||||
"tools_film_skew_y_entry": 0.0,
|
"tools_film_skew_y_entry": 0.0,
|
||||||
"tools_film_skew_ref": 0, # "center
|
"tools_film_skew_ref": 1, # "bottom left"
|
||||||
|
|
||||||
"tools_film_mirror_cb": False,
|
"tools_film_mirror_cb": False,
|
||||||
"tools_film_mirror_axis_radio": 'x',
|
"tools_film_mirror_axis_radio": 'x',
|
||||||
|
|||||||
Reference in New Issue
Block a user