def get_param(self, layer, name, param_type="auto"): """Get the value of a layer parameter Keyword arguments: layer -- the layer to get the parameter from name -- param name param_type -- parameter type (default "auto") NOT FULLY IMPLEMENTED """ layer_type = layer.get("type") assert layer_type, "Layer does not have a type" if param_type == "auto": param_type = sif.paramType(layer_type, name) for param in layer.iterchildren(): if param.get("name") == name: if param_type == "real": return float(param[0].get("value", "0")) elif param_type == "integer": return int(param[0].get("integer", "0")) else: raise Exception( "Getting this type of parameter not yet implemented")
def set_param(self, layer, name, value, param_type="auto", guid=None, modify_linked=False): """Set a layer parameter Keyword arguments: layer -- the layer to set the parameter for name -- parameter name value -- parameter value param_type -- parameter type (default "auto") guid -- guid of the parameter value """ if modify_linked: raise AssertionError, "Modifying linked parameters is not supported" layer_type = layer.get("type") assert layer_type, "Layer does not have a type" if param_type == "auto": param_type = sif.paramType(layer_type, name) # Remove existing parameters with this name existing = [] for param in layer.iterchildren(): if param.get("name") == name: existing.append(param) if len(existing) == 0: self.build_param(layer, name, value, param_type, guid) elif len(existing) > 1: raise AssertionError, "Found multiple parameters with the same name" else: new_param = self.build_param(None, name, value, param_type, guid) layer.replace(existing[0], new_param)
def set_param(self, layer, name, value, param_type="auto", guid=None, modify_linked=False): """Set a layer parameter Keyword arguments: layer -- the layer to set the parameter for name -- parameter name value -- parameter value param_type -- parameter type (default "auto") guid -- guid of the parameter value """ if modify_linked: raise AssertionError( "Modifying linked parameters is not supported") layer_type = layer.get("type") assert layer_type, "Layer does not have a type" if param_type == "auto": param_type = sif.paramType(layer_type, name) # Remove existing parameters with this name existing = [] for param in layer.iterchildren(): if param.get("name") == name: existing.append(param) if len(existing) == 0: self.build_param(layer, name, value, param_type, guid) elif len(existing) > 1: raise AssertionError( "Found multiple parameters with the same name") else: new_param = self.build_param(None, name, value, param_type, guid) layer.replace(existing[0], new_param)
def get_param(self, layer, name, param_type="auto"): """Get the value of a layer parameter Keyword arguments: layer -- the layer to get the parameter from name -- param name param_type -- parameter type (default "auto") NOT FULLY IMPLEMENTED """ layer_type = layer.get("type") assert layer_type, "Layer does not have a type" if param_type == "auto": param_type = sif.paramType(layer_type, name) for param in layer.iterchildren(): if param.get("name") == name: if param_type == "real": return float(param[0].get("value", "0")) elif param_type == "integer": return int(param[0].get("integer", "0")) else: raise Exception, "Getting this type of parameter not yet implemented"
def build_param(self, layer, name, value, param_type="auto", guid=None): """Add a parameter node to a layer""" if layer is None: param = self.root_canvas.makeelement("param") else: param = etree.SubElement(layer, "param") param.set("name", name) # Automatically detect param_type if param_type == "auto": if layer is not None: layer_type = layer.get("type") param_type = sif.paramType(layer_type, name) else: param_type = sif.paramType(None, name, value) if param_type == "real": el = etree.SubElement(param, "real") el.set("value", str(float(value))) elif param_type == "integer": el = etree.SubElement(param, "integer") el.set("value", str(int(value))) elif param_type == "vector": el = etree.SubElement(param, "vector") x = etree.SubElement(el, "x") x.text = str(float(value[0])) y = etree.SubElement(el, "y") y.text = str(float(value[1])) elif param_type == "color": el = etree.SubElement(param, "color") r = etree.SubElement(el, "r") r.text = str(float(value[0])) g = etree.SubElement(el, "g") g.text = str(float(value[1])) b = etree.SubElement(el, "b") b.text = str(float(value[2])) a = etree.SubElement(el, "a") a.text = str(float(value[3])) if len(value) > 3 else "1.0" elif param_type == "gradient": el = etree.SubElement(param, "gradient") # Value is a dictionary of color stops # see get_gradient() for pos in value.keys(): color = etree.SubElement(el, "color") color.set("pos", str(float(pos))) c = value[pos] r = etree.SubElement(color, "r") r.text = str(float(c[0])) g = etree.SubElement(color, "g") g.text = str(float(c[1])) b = etree.SubElement(color, "b") b.text = str(float(c[2])) a = etree.SubElement(color, "a") a.text = str(float(c[3])) if len(c) > 3 else "1.0" elif param_type == "bool": el = etree.SubElement(param, "bool") if value: el.set("value", "true") else: el.set("value", "false") elif param_type == "time": el = etree.SubElement(param, "time") if type(value) == int: el.set("value", "{:d}s".format(value)) elif type(value) == float: el.set("value", "{:f}s".format(value)) elif type(value) == str: el.set("value", value) elif param_type == "bline": el = etree.SubElement(param, "bline") el.set("type", "bline_point") # value is a bline (dictionary type), see path_to_bline_list if value["loop"]: el.set("loop", "true") else: el.set("loop", "false") for vertex in value["points"]: x = float(vertex[1][0]) y = float(vertex[1][1]) tg1x = float(vertex[0][0]) tg1y = float(vertex[0][1]) tg2x = float(vertex[2][0]) tg2y = float(vertex[2][1]) tg1_radius = self._calc_radius(x, y, tg1x, tg1y) tg1_angle = self._calc_angle(x, y, tg1x, tg1y) tg2_radius = self._calc_radius(x, y, tg2x, tg2y) tg2_angle = self._calc_angle(x, y, tg2x, tg2y) - 180.0 if vertex[3]: split = "true" else: split = "false" entry = etree.SubElement(el, "entry") composite = etree.SubElement(entry, "composite") composite.set("type", "bline_point") point = etree.SubElement(composite, "point") vector = etree.SubElement(point, "vector") etree.SubElement(vector, "x").text = str(x) etree.SubElement(vector, "y").text = str(y) width = etree.SubElement(composite, "width") etree.SubElement(width, "real").set("value", "1.0") origin = etree.SubElement(composite, "origin") etree.SubElement(origin, "real").set("value", "0.5") split_el = etree.SubElement(composite, "split") etree.SubElement(split_el, "bool").set("value", split) t1 = etree.SubElement(composite, "t1") t2 = etree.SubElement(composite, "t2") t1_rc = etree.SubElement(t1, "radial_composite") t1_rc.set("type", "vector") t2_rc = etree.SubElement(t2, "radial_composite") t2_rc.set("type", "vector") t1_r = etree.SubElement(t1_rc, "radius") t2_r = etree.SubElement(t2_rc, "radius") t1_radius = etree.SubElement(t1_r, "real") t2_radius = etree.SubElement(t2_r, "real") t1_radius.set("value", str(tg1_radius)) t2_radius.set("value", str(tg2_radius)) t1_t = etree.SubElement(t1_rc, "theta") t2_t = etree.SubElement(t2_rc, "theta") t1_angle = etree.SubElement(t1_t, "angle") t2_angle = etree.SubElement(t2_t, "angle") t1_angle.set("value", str(tg1_angle)) t2_angle.set("value", str(tg2_angle)) elif param_type == "canvas": el = etree.SubElement(param, "canvas") el.set("xres", "10.0") el.set("yres", "10.0") # "value" is a list of layers if value is not None: for layer in value: el.append(layer) else: raise AssertionError( "Unsupported param type {}".format(param_type)) if guid: el.set("guid", guid) else: el.set("guid", self.new_guid()) return param
def build_param(self, layer, name, value, param_type="auto", guid=None): """Add a parameter node to a layer""" if layer is None: param = self.root_canvas.makeelement("param") else: param = etree.SubElement(layer, "param") param.set("name", name) # Automatically detect param_type if param_type == "auto": if layer is not None: layer_type = layer.get("type") param_type = sif.paramType(layer_type, name) else: param_type = sif.paramType(None, name, value) if param_type == "real": el = etree.SubElement(param, "real") el.set("value", str(float(value))) elif param_type == "integer": el = etree.SubElement(param, "integer") el.set("value", str(int(value))) elif param_type == "vector": el = etree.SubElement(param, "vector") x = etree.SubElement(el, "x") x.text = str(float(value[0])) y = etree.SubElement(el, "y") y.text = str(float(value[1])) elif param_type == "color": el = etree.SubElement(param, "color") r = etree.SubElement(el, "r") r.text = str(float(value[0])) g = etree.SubElement(el, "g") g.text = str(float(value[1])) b = etree.SubElement(el, "b") b.text = str(float(value[2])) a = etree.SubElement(el, "a") a.text = str(float(value[3])) if len(value) > 3 else "1.0" elif param_type == "gradient": el = etree.SubElement(param, "gradient") # Value is a dictionary of color stops # see get_gradient() for pos in value.keys(): color = etree.SubElement(el, "color") color.set("pos", str(float(pos))) c = value[pos] r = etree.SubElement(color, "r") r.text = str(float(c[0])) g = etree.SubElement(color, "g") g.text = str(float(c[1])) b = etree.SubElement(color, "b") b.text = str(float(c[2])) a = etree.SubElement(color, "a") a.text = str(float(c[3])) if len(c) > 3 else "1.0" elif param_type == "bool": el = etree.SubElement(param, "bool") if value: el.set("value", "true") else: el.set("value", "false") elif param_type == "time": el = etree.SubElement(param, "time") if type(value) == int: el.set("value", "%ds" % value) elif type(value) == float: el.set("value", "%fs" % value) elif type(value) == str: el.set("value", value) elif param_type == "bline": el = etree.SubElement(param, "bline") el.set("type", "bline_point") # value is a bline (dictionary type), see path_to_bline_list if value["loop"] == True: el.set("loop", "true") else: el.set("loop", "false") for vertex in value["points"]: x = float(vertex[1][0]) y = float(vertex[1][1]) tg1x = float(vertex[0][0]) tg1y = float(vertex[0][1]) tg2x = float(vertex[2][0]) tg2y = float(vertex[2][1]) tg1_radius = self._calc_radius(x, y, tg1x, tg1y) tg1_angle = self._calc_angle(x, y, tg1x, tg1y) tg2_radius = self._calc_radius(x, y, tg2x, tg2y) tg2_angle = self._calc_angle(x, y, tg2x, tg2y) - 180.0 if vertex[3]: split = "true" else: split = "false" entry = etree.SubElement(el, "entry") composite = etree.SubElement(entry, "composite") composite.set("type", "bline_point") point = etree.SubElement(composite, "point") vector = etree.SubElement(point, "vector") etree.SubElement(vector, "x").text = str(x) etree.SubElement(vector, "y").text = str(y) width = etree.SubElement(composite, "width") etree.SubElement(width, "real").set("value", "1.0") origin = etree.SubElement(composite, "origin") etree.SubElement(origin, "real").set("value", "0.5") split_el = etree.SubElement(composite, "split") etree.SubElement(split_el, "bool").set("value", split) t1 = etree.SubElement(composite, "t1") t2 = etree.SubElement(composite, "t2") t1_rc = etree.SubElement(t1, "radial_composite") t1_rc.set("type", "vector") t2_rc = etree.SubElement(t2, "radial_composite") t2_rc.set("type", "vector") t1_r = etree.SubElement(t1_rc, "radius") t2_r = etree.SubElement(t2_rc, "radius") t1_radius = etree.SubElement(t1_r, "real") t2_radius = etree.SubElement(t2_r, "real") t1_radius.set("value", str(tg1_radius)) t2_radius.set("value", str(tg2_radius)) t1_t = etree.SubElement(t1_rc, "theta") t2_t = etree.SubElement(t2_rc, "theta") t1_angle = etree.SubElement(t1_t, "angle") t2_angle = etree.SubElement(t2_t, "angle") t1_angle.set("value", str(tg1_angle)) t2_angle.set("value", str(tg2_angle)) elif param_type == "canvas": el = etree.SubElement(param, "canvas") el.set("xres", "10.0") el.set("yres", "10.0") # "value" is a list of layers if value is not None: for layer in value: el.append(layer) else: raise AssertionError, "Unsupported param type %s" % (param_type) if guid: el.set("guid", guid) else: el.set("guid", self.new_guid()) return param