From 0635b50db24c3ccf2a0cc1767a96c75a7159af3b Mon Sep 17 00:00:00 2001 From: AnishGulati Date: Jul 06 2019 16:09:34 +0000 Subject: Code cleanup --- diff --git a/synfig-studio/plugins/lottie-exporter/helpers/transform.py b/synfig-studio/plugins/lottie-exporter/helpers/transform.py index 76cc3f6..3cc7df0 100644 --- a/synfig-studio/plugins/lottie-exporter/helpers/transform.py +++ b/synfig-studio/plugins/lottie-exporter/helpers/transform.py @@ -1,18 +1,20 @@ +# pylint: disable=line-too-long """ This module will store all the functions required for transformations corresponding to lottie """ import sys +import math import settings -from misc import get_angle, Count, is_animated, change_axis +from misc import Count, is_animated, change_axis from properties.value import gen_properties_value from properties.valueKeyframed import gen_value_Keyframed from properties.multiDimensionalKeyframed import gen_properties_multi_dimensional_keyframed sys.path.append("../") -def gen_helpers_transform(lottie, layer, pos=[0, 0], anchor=[0, 0, 0], scale=[100, 100, 100], rotation=settings.DEFAULT_ROTATION): +def gen_helpers_transform(lottie, layer, pos=settings.DEFAULT_POSITION, anchor=settings.DEFAULT_ANCHOR, scale=settings.DEFAULT_SCALE, rotation=settings.DEFAULT_ROTATION): """ Generates the dictionary corresponding to helpers/transform.json @@ -68,7 +70,7 @@ def gen_helpers_transform(lottie, layer, pos=[0, 0], anchor=[0, 0, 0], scale=[10 settings.NO_INFO) # setting the rotation - if isinstance(rotation, float) or isinstance(rotation, int): + if isinstance(rotation, (float, int)): gen_properties_value(lottie["r"], rotation, index.inc(), @@ -131,7 +133,7 @@ def gen_helpers_transform(lottie, layer, pos=[0, 0], anchor=[0, 0, 0], scale=[10 gen_value_Keyframed(lottie["s"], scale, index.inc()) else: zoom = 0 - if is_animated == 0: + if is_animate == 0: zoom = float(scale.attrib["value"]) else: zoom = float(scale[0][0].attrib["value"]) diff --git a/synfig-studio/plugins/lottie-exporter/layers/driver.py b/synfig-studio/plugins/lottie-exporter/layers/driver.py index d1be1b0..90092b2 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/driver.py +++ b/synfig-studio/plugins/lottie-exporter/layers/driver.py @@ -1,3 +1,4 @@ +# pylint: disable=line-too-long """ Main driver functions to generate layers """ @@ -15,6 +16,16 @@ sys.path.append("..") def gen_layers(lottie, root, layer_itr): """ + This function will be called for each canvas/composition. Main function to + generate all the layers + + Args: + lottie (dict) : Layers in Lottie format + root (lxml.etree._Element) : All layers of a canvas in Synfig format + layer_itr (int) : position of layer in canvas + + Returns: + (None) """ itr = layer_itr shape_layer = {"star", "circle", "rectangle", "filled_rectangle", "simple_circle"} diff --git a/synfig-studio/plugins/lottie-exporter/layers/image.py b/synfig-studio/plugins/lottie-exporter/layers/image.py index d2b5bf0..73a8e18 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/image.py +++ b/synfig-studio/plugins/lottie-exporter/layers/image.py @@ -8,8 +8,8 @@ import copy from lxml import etree import settings from helpers.transform import gen_helpers_transform -from misc import Count, is_animated, get_frame from helpers.blendMode import get_blend +from misc import is_animated, get_frame from sources.image import add_image_asset from shapes.rectangle import gen_dummy_waypoint, get_vector_at_frame, to_Synfig_axis from properties.multiDimensionalKeyframed import gen_properties_multi_dimensional_keyframed @@ -31,7 +31,6 @@ def gen_layer_image(lottie, layer, idx): """ group.update_layer(layer) - index = Count() lottie["ddd"] = settings.DEFAULT_3D lottie["ind"] = idx lottie["ty"] = settings.LAYER_IMAGE_TYPE diff --git a/synfig-studio/plugins/lottie-exporter/layers/preComp.py b/synfig-studio/plugins/lottie-exporter/layers/preComp.py index b342c29..85d69b2 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/preComp.py +++ b/synfig-studio/plugins/lottie-exporter/layers/preComp.py @@ -1,10 +1,10 @@ +# pylint: disable=line-too-long """ Store all functions corresponding to pre composition in lottie """ import sys import settings -from misc import Count from sources.precomp import add_precomp_asset from layers.rotate_layer import gen_layer_rotate from layers.scale_layer import gen_layer_scale @@ -14,9 +14,18 @@ sys.path.append("..") def gen_layer_precomp(lottie, layer, idx): """ + Generates a pre-composition layer depending upon the layers inside that + pre-comp Here idx represents the position of layer in the .sif file also + + Args: + lottie (dict) : Will store the pre-comp layer + layer (lxml.etree._Element) : Specifies which layer it is + idx (int) : Index of the layer + + Returns: + (None) """ - index = Count() lottie["ddd"] = settings.DEFAULT_3D lottie["ind"] = idx lottie["ty"] = settings.LAYER_PRECOMP_TYPE @@ -46,4 +55,4 @@ def gen_layer_precomp(lottie, layer, idx): lottie["ip"] = settings.lottie_format["ip"] lottie["op"] = settings.lottie_format["op"] lottie["st"] = 0 # Don't know yet - lottie["bm"] = settings.DEFAULT_BLEND # Always have the default blend + lottie["bm"] = settings.DEFAULT_BLEND # Always have the default blend diff --git a/synfig-studio/plugins/lottie-exporter/layers/rotate_layer.py b/synfig-studio/plugins/lottie-exporter/layers/rotate_layer.py index 7ea5531..01d8c65 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/rotate_layer.py +++ b/synfig-studio/plugins/lottie-exporter/layers/rotate_layer.py @@ -6,14 +6,21 @@ import sys import copy import settings from helpers.transform import gen_helpers_transform -from synfig.animation import print_animation, gen_dummy_waypoint +from synfig.animation import gen_dummy_waypoint import synfig.group as group sys.path.append("..") def gen_layer_rotate(lottie, layer): """ - Help generate transform properties + Help generate transform properties of a rotate layer + + Args: + lottie (dict) : Will store the transform properties in lottie format + layer (lxml.etree._Element) : Tranform properties in Synfig format + + Returns: + (None) """ scale = [100, 100, 100] for child in layer: diff --git a/synfig-studio/plugins/lottie-exporter/layers/scale_layer.py b/synfig-studio/plugins/lottie-exporter/layers/scale_layer.py index a1e3187..6af0857 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/scale_layer.py +++ b/synfig-studio/plugins/lottie-exporter/layers/scale_layer.py @@ -6,14 +6,21 @@ import sys import copy import settings from helpers.transform import gen_helpers_transform -from synfig.animation import print_animation, gen_dummy_waypoint +from synfig.animation import gen_dummy_waypoint import synfig.group as group sys.path.append("..") def gen_layer_scale(lottie, layer): """ - Help generate transform properties + Help generate transform properties of a scale layer + + Args: + lottie (dict) : Store transform properties in lottie format + layer (lxml.etree._Element) Transform properties in Synfig format + + Returns: + (None) """ for child in layer: if child.tag == "param": diff --git a/synfig-studio/plugins/lottie-exporter/layers/shape.py b/synfig-studio/plugins/lottie-exporter/layers/shape.py index 56ce0ea..c4671b0 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/shape.py +++ b/synfig-studio/plugins/lottie-exporter/layers/shape.py @@ -4,13 +4,13 @@ Will store all the functions corresponding to shapes in lottie import sys import settings -from helpers.transform import gen_helpers_transform from misc import Count from shapes.star import gen_shapes_star from shapes.circle import gen_shapes_circle from shapes.fill import gen_shapes_fill from shapes.rectangle import gen_shapes_rectangle from helpers.blendMode import get_blend +from helpers.transform import gen_helpers_transform import synfig.group as group sys.path.append("..") @@ -39,7 +39,7 @@ def gen_layer_shape(lottie, layer, idx): pos = [0, 0] # default anchor = [0, 0, 0] # default scale = [100, 100, 100] # default - + gen_helpers_transform(lottie["ks"], layer, pos, anchor, scale) lottie["ao"] = settings.LAYER_DEFAULT_AUTO_ORIENT diff --git a/synfig-studio/plugins/lottie-exporter/layers/shape_solid.py b/synfig-studio/plugins/lottie-exporter/layers/shape_solid.py index 3b4d548..8e571ae 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/shape_solid.py +++ b/synfig-studio/plugins/lottie-exporter/layers/shape_solid.py @@ -39,7 +39,7 @@ def gen_layer_shape_solid(lottie, layer, idx): lottie["ef"] = [] # Stores the effects pos = [settings.lottie_format["w"]/2 + get_additional_width()/2, - settings.lottie_format["h"]/2 + get_additional_height()/2] + settings.lottie_format["h"]/2 + get_additional_height()/2] anchor = pos gen_helpers_transform(lottie["ks"], layer, pos, anchor) diff --git a/synfig-studio/plugins/lottie-exporter/layers/solid.py b/synfig-studio/plugins/lottie-exporter/layers/solid.py index c61773a..fca9c68 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/solid.py +++ b/synfig-studio/plugins/lottie-exporter/layers/solid.py @@ -4,11 +4,11 @@ Will store all the functions corresponding to solids in lottie import sys import settings -from helpers.transform import gen_helpers_transform from misc import Count, get_color_hex from helpers.blendMode import get_blend +from helpers.transform import gen_helpers_transform from effects.fill import gen_effects_fill -from synfig.group import update_layer, get_additional_width, get_additional_height +from synfig.group import get_additional_width, get_additional_height sys.path.append("..") @@ -34,7 +34,7 @@ def gen_layer_solid(lottie, layer, idx): lottie["ef"] = [] # Stores the effects pos = [settings.lottie_format["w"]/2 + get_additional_width()/2, - settings.lottie_format["h"]/2 + get_additional_height()/2] + settings.lottie_format["h"]/2 + get_additional_height()/2] anchor = pos gen_helpers_transform(lottie["ks"], layer, pos, anchor) diff --git a/synfig-studio/plugins/lottie-exporter/layers/translate_layer.py b/synfig-studio/plugins/lottie-exporter/layers/translate_layer.py index 7e0446e..a0a6618 100644 --- a/synfig-studio/plugins/lottie-exporter/layers/translate_layer.py +++ b/synfig-studio/plugins/lottie-exporter/layers/translate_layer.py @@ -6,15 +6,23 @@ import sys import copy import settings from helpers.transform import gen_helpers_transform -from synfig.animation import print_animation, gen_dummy_waypoint +from synfig.animation import gen_dummy_waypoint import synfig.group as group sys.path.append("..") def gen_layer_translate(lottie, layer): """ - Help generate transform properties + Help generate transform properties of translate layer + + Args: + lottie (dict) : Transform properties in lottie format + layer (lxml.etree._Element) : Transform properties in Synfig format + + Returns: + (None) """ + for child in layer: if child.tag == "param": if child.attrib["name"] == "origin": @@ -26,6 +34,8 @@ def gen_layer_translate(lottie, layer): waypoint[0][0].text = str(0) waypoint[0][1].text = str(0) group.update_pos(anchor) + if settings.INSIDE_PRECOMP: group.update_pos(pos) + gen_helpers_transform(lottie, layer, pos[0], anchor[0]) diff --git a/synfig-studio/plugins/lottie-exporter/properties/shapePropKeyframe.py b/synfig-studio/plugins/lottie-exporter/properties/shapePropKeyframe.py index 41aae0c..549f633 100644 --- a/synfig-studio/plugins/lottie-exporter/properties/shapePropKeyframe.py +++ b/synfig-studio/plugins/lottie-exporter/properties/shapePropKeyframe.py @@ -15,6 +15,23 @@ from synfig.animation import to_Synfig_axis, get_vector_at_frame, get_bool_at_fr sys.path.append("../") +def append_path(element, parent, element_name, typ="real"): + """ + Generates a dictionary corresponding to the path followed by that element + and appends it at the parent which will be needed later + """ + # Generating the path and store in the lxml element + element_dict = {} + if typ == "real": + gen_value_Keyframed(element_dict, element, 0) + else: + gen_properties_multi_dimensional_keyframed(element_dict, element, 0) + # Store in lxml element + element_lxml = etree.Element(element_name) + element_lxml.text = str(element_dict) + parent.append(element_lxml) + + def animate_radial_composite(radial_composite, window): """ Animates the radial composite and updates the window of frame if radial @@ -43,21 +60,8 @@ def animate_radial_composite(radial_composite, window): update_child_at_parent(radial_composite, radius, "radius") update_child_at_parent(radial_composite, theta, "theta") - # Generating the radial path and store in the lxml element - radius_dict = {} - gen_value_Keyframed(radius_dict, radius[0], 0) - # Store in lxml element - radius_lxml = etree.Element("radius_path") - radius_lxml.text = str(radius_dict) - radial_composite.append(radius_lxml) - - # Generating the theta path and store in the lxml element - theta_dict = {} - gen_value_Keyframed(theta_dict, theta[0], 0) - # Store in lxml element - theta_lxml = etree.Element("theta_path") - theta_lxml.text = str(theta_dict) - radial_composite.append(theta_lxml) + append_path(radius[0], radial_composite, "radius_path") + append_path(theta[0], radial_composite, "theta_path") def update_frame_window(node, window): @@ -212,13 +216,7 @@ def gen_bline_shapePropKeyframe(lottie, bline_point, origin): split_a = gen_dummy_waypoint(split_a, "split_angle", "bool") update_child_at_parent(composite, split_a, "split_angle") - # Generate path for Lottie format - path_dict = {} - gen_properties_multi_dimensional_keyframed(path_dict, pos[0], 0) - # Store in lxml element - path_lxml = etree.Element("point_path") - path_lxml.text = str(path_dict) - composite.append(path_lxml) + append_path(pos[0], composite, "point_path", "vector") animate_radial_composite(t1[0], window) animate_radial_composite(t2[0], window) @@ -317,13 +315,8 @@ def gen_dynamic_list_shapePropKeyframe(lottie, dynamic_list, origin): pos.getparent().remove(pos) dynamic_list.insert(count, new_pos) - # Generate path for lottie format - path_dict = {} - gen_properties_multi_dimensional_keyframed(path_dict, new_pos[0], 0) - # Store in lxml element - path_lxml = etree.Element("pos_path") - path_lxml.text = str(path_dict) - dynamic_list[count].append(path_lxml) + append_path(new_pos[0], dynamic_list[count], "pos_path", "vector") + count += 1 # Animating the origin @@ -441,21 +434,8 @@ def gen_bline_outline(lottie, bline_point, origin): split_a = gen_dummy_waypoint(split_a, "split_angle", "bool") update_child_at_parent(composite, split_a, "split_angle") - # Generate path for Lottie format - path_dict = {} - gen_properties_multi_dimensional_keyframed(path_dict, pos[0], 0) - # Store in lxml element - path_lxml = etree.Element("point_path") - path_lxml.text = str(path_dict) - composite.append(path_lxml) - - # Generate width for Lottie format - width_dict = {} - gen_value_Keyframed(width_dict, width[0], 0) - # Store in lxml element - width_lxml = etree.Element("width_path") - width_lxml.text = str(width_dict) - composite.append(width_lxml) + append_path(pos[0], composite, "point_path", "vector") + append_path(width[0], composite, "width_path") animate_radial_composite(t1[0], window) animate_radial_composite(t2[0], window) @@ -629,6 +609,7 @@ def synfig_outline(bline_point, st_val, origin_dict, outer_width_dict, sharp_cus CUSP_THRESHOLD = 0.40 SPIKE_AMOUNT = 4 ROUND_END_FACTOR = 4 + outer_width = to_Synfig_axis(get_vector_at_frame(outer_width_dict, fr), "real") expand = to_Synfig_axis(get_vector_at_frame(expand_dict, fr), "real") sharp_cusps = get_bool_at_frame(sharp_cusps_anim[0], fr) diff --git a/synfig-studio/plugins/lottie-exporter/settings.py b/synfig-studio/plugins/lottie-exporter/settings.py index b7b890e..9396270 100644 --- a/synfig-studio/plugins/lottie-exporter/settings.py +++ b/synfig-studio/plugins/lottie-exporter/settings.py @@ -1,5 +1,5 @@ +# pylint: disable=line-too-long """ -settings.py This module contains all the global variables and constants """ @@ -30,6 +30,9 @@ NO_INFO = "no_info" DEFAULT_ROTATION = 0 DEFAULT_OPACITY = 100 DEFAULT_DIRECTION = 1 +DEFAULT_POSITION = [0, 0] +DEFAULT_ANCHOR = [0, 0, 0] +DEFAULT_SCALE = [100, 100, 100] GAMMA = 2.2 PIX_PER_UNIT = 0 TANGENT_FACTOR = 3.0 diff --git a/synfig-studio/plugins/lottie-exporter/sources/precomp.py b/synfig-studio/plugins/lottie-exporter/sources/precomp.py index eba6f4e..6c810d4 100644 --- a/synfig-studio/plugins/lottie-exporter/sources/precomp.py +++ b/synfig-studio/plugins/lottie-exporter/sources/precomp.py @@ -2,7 +2,6 @@ Will store all the functions corresponding to Image Assets in lottie """ -import os import sys import settings import layers.driver @@ -11,8 +10,18 @@ sys.path.append("..") def add_precomp_asset(lottie, root, layer_itr): """ + Generates a unique ID for precomp asset and returns it to the caller + function + + Args: + lottie (dict) : Asset will be stored here in lottie format + root (lxml.etree._Element) : Canvas for which layers are to be generated + layer_itr (int) : Index of the layer in canvas + + Returns: + (str) : Unique ID of the asset """ - lottie["id"] = "precomp_" + str(settings.num_precomp.inc()) + lottie["id"] = "precomp_" + str(settings.num_precomp.inc()) lottie["layers"] = [] # If no layer is added, then might result in an error, keep in mind layers.driver.gen_layers(lottie["layers"], root, layer_itr-1) return lottie["id"] diff --git a/synfig-studio/plugins/lottie-exporter/synfig/group.py b/synfig-studio/plugins/lottie-exporter/synfig/group.py index ea3fb78..22db9d7 100644 --- a/synfig-studio/plugins/lottie-exporter/synfig/group.py +++ b/synfig-studio/plugins/lottie-exporter/synfig/group.py @@ -5,15 +5,19 @@ Synfig/precomp layer of Lottie """ import sys -import math import settings from misc import is_animated, Vector -from synfig.animation import print_animation sys.path.append("..") def get_offset(): """ + Computes the offset by which the layers need to be moved with + + Args: + (None) + Returns: + (misc.Vector) : offset """ x = settings.ADDITIONAL_PRECOMP_WIDTH / 2 y = settings.ADDITIONAL_PRECOMP_HEIGHT / 2 @@ -26,7 +30,13 @@ def update_layer(node): """ Inserts necassary offset in the positions of the layers if they lie inside another composition of Lottie - """ + + Args: + node (lxml.etree._Element) : Can be a layer or parameter of a layer + + Returns: + (None) + """ # This if condition is not applicable for group, rotate, precomp... layers if not settings.INSIDE_PRECOMP: return @@ -46,6 +56,13 @@ def update_layer(node): def update_pos(origin): """ + Updates the position of parameter in Synfig format + + Args: + origin (lxml.etree._Element) : Stores the position of element + + Returns: + (None) """ offset = get_offset() is_animate = is_animated(origin[0]) @@ -58,18 +75,44 @@ def update_pos(origin): def add(vector, offset): """ + Helper function to modify Synfig xml + + Args: + vector (lxml.etree._Element) : Position in Synfig format + offset (misc.Vector) : offset to be added to that position + + Returns: + (None) """ vector[0].text = str(float(vector[0].text) + offset[0]) vector[1].text = str(float(vector[1].text) + offset[1]) def get_additional_width(): + """ + Returns the increase in pre-composition width depending on whether we are + inside a pre-composition yet or not + + Args: + (None) + Returns: + (float | int) : the additional width + """ if settings.INSIDE_PRECOMP: return settings.ADDITIONAL_PRECOMP_WIDTH return 0 def get_additional_height(): + """ + Returns the increase in pre-composition height depending on whether we are + inside a pre-composition yet or not + + Args: + (None) + Returns: + (float | int) : the additional height + """ if settings.INSIDE_PRECOMP: return settings.ADDITIONAL_PRECOMP_HEIGHT return 0