several adjustments in styles to layers
This commit is contained in:
parent
f63f1bb0aa
commit
bebf4fe61c
@ -13,7 +13,7 @@
|
|||||||
<option value="fill">Fill color</option>
|
<option value="fill">Fill color</option>
|
||||||
<option value="fill_opacity">Fill opacity</option>
|
<option value="fill_opacity">Fill opacity</option>
|
||||||
</param>
|
</param>
|
||||||
<param name="parsecolor" gui-text="Sort colors by" type="optiongroup" appearance="combo" gui-description="This option only applies to stroke color and fill color">
|
<param name="sortcolorby" gui-text="Sort colors by" type="optiongroup" appearance="combo" gui-description="This option only applies to stroke color and fill color">
|
||||||
<option value="hexval">Hex value</option>
|
<option value="hexval">Hex value</option>
|
||||||
<option value="hue">Hue</option>
|
<option value="hue">Hue</option>
|
||||||
<option value="saturation">Saturation</option>
|
<option value="saturation">Saturation</option>
|
||||||
|
@ -47,7 +47,7 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
pars.add_argument("--tab")
|
pars.add_argument("--tab")
|
||||||
pars.add_argument("--apply_transformations", type=inkex.Boolean, default=False, help="Run 'Apply Transformations' extension before running vpype. Helps avoiding geometry shifting")
|
pars.add_argument("--apply_transformations", type=inkex.Boolean, default=False, help="Run 'Apply Transformations' extension before running vpype. Helps avoiding geometry shifting")
|
||||||
pars.add_argument("--separateby", default = "stroke", help = "Separate by")
|
pars.add_argument("--separateby", default = "stroke", help = "Separate by")
|
||||||
pars.add_argument("--parsecolors",default = "hexval", help = "Sort colors by")
|
pars.add_argument("--sortcolorby", default = "hexval", help = "Sort colors by")
|
||||||
pars.add_argument("--subdividethreshold", type=int, default = 1, help = "Threshold for splitting into sub layers")
|
pars.add_argument("--subdividethreshold", type=int, default = 1, help = "Threshold for splitting into sub layers")
|
||||||
pars.add_argument("--decimals", type=int, default = 1, help = "Decimal tolerance")
|
pars.add_argument("--decimals", type=int, default = 1, help = "Decimal tolerance")
|
||||||
pars.add_argument("--cleanup", type=inkex.Boolean, default = True, help = "Cleanup all unused groups/layers (requires separate extension)")
|
pars.add_argument("--cleanup", type=inkex.Boolean, default = True, help = "Cleanup all unused groups/layers (requires separate extension)")
|
||||||
@ -57,13 +57,13 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
def effect(self):
|
def effect(self):
|
||||||
|
|
||||||
def colorsort(stroke_value): #this function applies to stroke or fill (hex colors)
|
def colorsort(stroke_value): #this function applies to stroke or fill (hex colors)
|
||||||
if self.options.parsecolors == "hexval":
|
if self.options.sortcolorby == "hexval":
|
||||||
return float(int(stroke_value[1:], 16))
|
return float(int(stroke_value[1:], 16))
|
||||||
elif self.options.parsecolors == "hue":
|
elif self.options.sortcolorby == "hue":
|
||||||
return float(Color(stroke_value).to_hsl()[0])
|
return float(Color(stroke_value).to_hsl()[0])
|
||||||
elif self.options.parsecolors == "saturation":
|
elif self.options.sortcolorby == "saturation":
|
||||||
return float(Color(stroke_value).to_hsl()[1])
|
return float(Color(stroke_value).to_hsl()[1])
|
||||||
elif self.options.parsecolors == "luminance":
|
elif self.options.sortcolorby == "luminance":
|
||||||
return float(Color(stroke_value).to_hsl()[2])
|
return float(Color(stroke_value).to_hsl()[2])
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
|
|
||||||
if isinstance(element, inkex.ShapeElement): # Elements which have a visible representation on the canvas (even without a style attribute but by their type); if we do not use that ifInstance Filter we provokate unkown InkScape fatal crashes
|
if isinstance(element, inkex.ShapeElement): # Elements which have a visible representation on the canvas (even without a style attribute but by their type); if we do not use that ifInstance Filter we provokate unkown InkScape fatal crashes
|
||||||
|
|
||||||
style = element.get('style')
|
style = element.style
|
||||||
if style is not None:
|
if style is not None:
|
||||||
#if no style attributes or stroke/fill are set as extra attribute
|
#if no style attributes or stroke/fill are set as extra attribute
|
||||||
stroke = element.get('stroke')
|
stroke = element.get('stroke')
|
||||||
@ -107,9 +107,9 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
neutral_value = None #we will use this value to slice the filter result into sub layers (threshold)
|
neutral_value = None #we will use this value to slice the filter result into sub layers (threshold)
|
||||||
|
|
||||||
if fill is not None:
|
if fill is not None:
|
||||||
style = 'fill:'+ fill + ";"
|
style['fill'] = fill
|
||||||
if stroke is not None:
|
if stroke is not None:
|
||||||
style = style + 'stroke:' + stroke + ";"
|
style['stroke'] = stroke
|
||||||
|
|
||||||
#we don't want to destroy elements with gradients (they contain svg:stop elements which have a style too) and we don't want to mess with tspans (text)
|
#we don't want to destroy elements with gradients (they contain svg:stop elements which have a style too) and we don't want to mess with tspans (text)
|
||||||
#the Styles to Layers extension still might brick the gradients (some tests failed)
|
#the Styles to Layers extension still might brick the gradients (some tests failed)
|
||||||
@ -120,65 +120,59 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
layer_name = "element_tag-" + element.tag.replace("{http://www.w3.org/2000/svg}", "")
|
layer_name = "element_tag-" + element.tag.replace("{http://www.w3.org/2000/svg}", "")
|
||||||
|
|
||||||
elif self.options.separateby == "stroke":
|
elif self.options.separateby == "stroke":
|
||||||
stroke = re.search('(;|^)stroke:(.*?)(;|$)', style)
|
stroke = style.get('stroke')
|
||||||
if stroke is not None:
|
if stroke is not None and stroke != "none":
|
||||||
stroke = stroke[0]
|
stroke_converted = str(Color(stroke).to_rgb()) #the color can be hex code or clear name. we handle both the same
|
||||||
stroke_value = stroke.split("stroke:")[1].split(";")[0]
|
|
||||||
if stroke_value != "none":
|
|
||||||
stroke_converted = str(Color(stroke_value).to_rgb()) #the color can be hex code or clear name. we handle both the same
|
|
||||||
neutral_value = colorsort(stroke_converted)
|
neutral_value = colorsort(stroke_converted)
|
||||||
layer_name = "stroke-" + self.options.parsecolors + "-" + stroke_converted
|
layer_name = "stroke-{}-{}".format(self.options.sortcolorby, stroke_converted)
|
||||||
else:
|
else:
|
||||||
layer_name = "stroke-" + self.options.parsecolors + "-none"
|
layer_name = "stroke-{}-none".format(self.options.sortcolorby)
|
||||||
|
|
||||||
elif self.options.separateby == "stroke_width":
|
elif self.options.separateby == "stroke_width":
|
||||||
stroke_width = re.search('stroke-width:(.*?)(;|$)', style)
|
stroke_width = style.get('stroke-width')
|
||||||
if stroke_width is not None:
|
if stroke_width is not None:
|
||||||
stroke_width = stroke_width[0]
|
neutral_value = self.svg.unittouu(stroke_width)
|
||||||
neutral_value = self.svg.unittouu(stroke_width.split("stroke-width:")[1].split(";")[0])
|
layer_name = "stroke-width-{}".format(neutral_value)
|
||||||
layer_name = stroke_width
|
|
||||||
else:
|
else:
|
||||||
layer_name = "stroke-width-none"
|
layer_name = "stroke-width-none"
|
||||||
|
|
||||||
elif self.options.separateby == "stroke_hairline":
|
elif self.options.separateby == "stroke_hairline":
|
||||||
stroke_hairline = re.search('-inkscape-stroke:hairline(;|$)', style)
|
inkscape_stroke = style.get('-inkscape-stroke')
|
||||||
if stroke_hairline is not None:
|
if inkscape_stroke is not None and inkscape_stroke == "hairline":
|
||||||
neutral_value = 1
|
neutral_value = 1
|
||||||
layer_name = "stroke-hairline-yes"
|
layer_name = "stroke-hairline-yes"
|
||||||
else:
|
else:
|
||||||
neutral_value = 0
|
neutral_value = 0
|
||||||
layer_name = "stroke-hairline-no"
|
layer_name = "stroke-hairline-no"
|
||||||
|
|
||||||
elif self.options.separateby == "stroke_opacity":
|
elif self.options.separateby == "stroke_opacity":
|
||||||
stroke_opacity = re.search('stroke-opacity:(.*?)(;|$)', style)
|
stroke_opacity = style.get('stroke-opacity')
|
||||||
if stroke_opacity is not None:
|
if stroke_opacity is not None:
|
||||||
stroke_opacity = stroke_opacity[0]
|
neutral_value = float(stroke_opacity)
|
||||||
neutral_value = float(stroke_opacity.split("stroke-opacity:")[1].split(";")[0])
|
layer_name = "stroke-opacity-{}".format(neutral_value)
|
||||||
layer_name = stroke_opacity
|
|
||||||
else:
|
else:
|
||||||
layer_name = "stroke-opacity-none"
|
layer_name = "stroke-opacity-none"
|
||||||
|
|
||||||
elif self.options.separateby == "fill":
|
elif self.options.separateby == "fill":
|
||||||
fill = re.search('fill:(.*?)(;|$)', style)
|
fill = style.get('fill')
|
||||||
if fill is not None:
|
if fill is not None:
|
||||||
fill = fill[0]
|
|
||||||
fill_value = fill.split("fill:")[1].split(";")[0]
|
|
||||||
#check if the fill color is a real color or a gradient. if it's a gradient we skip the element
|
#check if the fill color is a real color or a gradient. if it's a gradient we skip the element
|
||||||
if fill_value != "none" and "url" not in fill_value:
|
if fill != "none" and "url" not in fill:
|
||||||
fill_converted = str(Color(fill_value).to_rgb()) #the color can be hex code or clear name. we handle both the same
|
fill_converted = str(Color(fill).to_rgb()) #the color can be hex code or clear name. we handle both the same
|
||||||
neutral_value = colorsort(fill_converted)
|
neutral_value = colorsort(fill_converted)
|
||||||
layer_name = "fill-" + self.options.parsecolors + "-" + fill_converted
|
layer_name = "fill-{}-{}".format(self.options.sortcolorby,fill_converted)
|
||||||
elif "url" in fill_value: #okay we found a gradient. we put it to some group
|
elif "url" in fill: #okay we found a gradient. we put it to some group
|
||||||
layer_name = "fill-" + self.options.parsecolors + "-gradient"
|
layer_name = "fill-{}-gradient".format(self.options.sortcolorby)
|
||||||
|
else: #none
|
||||||
|
layer_name = "fill-" + self.options.sortcolorby + "-none"
|
||||||
else:
|
else:
|
||||||
layer_name = "fill-" + self.options.parsecolors + "-none"
|
layer_name = "fill-" + self.options.sortcolorby + "-none"
|
||||||
|
|
||||||
elif self.options.separateby == "fill_opacity":
|
elif self.options.separateby == "fill_opacity":
|
||||||
fill_opacity = re.search('fill-opacity:(.*?)(;|$)', style)
|
fill_opacity = style.get('fill-opacity')
|
||||||
if fill_opacity is not None:
|
if fill_opacity is not None:
|
||||||
fill_opacity = fill_opacity[0]
|
neutral_value = float(fill_opacity)
|
||||||
neutral_value = float(fill_opacity.split("fill-opacity:")[1].split(";")[0])
|
layer_name = "fill-opacity-{}".format(neutral_value)
|
||||||
layer_name = fill_opacity
|
|
||||||
else:
|
else:
|
||||||
layer_name = "fill-opacity-none"
|
layer_name = "fill-opacity-none"
|
||||||
|
|
||||||
@ -219,9 +213,8 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
# we do some cosmetics with layers. Sometimes it can happen that one layer includes another. We don't want that. We move all layers to the top level
|
# we do some cosmetics with layers. Sometimes it can happen that one layer includes another. We don't want that. We move all layers to the top level
|
||||||
for newLayerNode in layerNodeList:
|
for newLayerNode in layerNodeList:
|
||||||
self.document.getroot().append(newLayerNode[0])
|
self.document.getroot().append(newLayerNode[0])
|
||||||
|
|
||||||
|
|
||||||
# Additionally if threshold was defined re-arrange the previously created layers by putting them into sub layers
|
# Additionally if threshold was defined re-arrange the previously created layers by putting them into sub layers
|
||||||
if self.options.subdividethreshold > 1 and contentlength > 0: #check if we need to subdivide and if there are items we could rearrange into sub layers
|
if self.options.subdividethreshold > 1 and contentlength > 0: #check if we need to subdivide and if there are items we could rearrange into sub layers
|
||||||
@ -294,6 +287,12 @@ class StylesToLayers(inkex.EffectExtension):
|
|||||||
#clean all empty layers from node list. Please note that the following remove_empty_groups
|
#clean all empty layers from node list. Please note that the following remove_empty_groups
|
||||||
#call does not apply for this so we need to do it as PREVIOUS step before!
|
#call does not apply for this so we need to do it as PREVIOUS step before!
|
||||||
for i in range(0, len(layerNodeList)):
|
for i in range(0, len(layerNodeList)):
|
||||||
|
deletes = []
|
||||||
|
for j in range(0, len(layerNodeList[i][0])):
|
||||||
|
if len(layerNodeList[i][0][j]) == 0 and isinstance(layerNodeList[i][0][j], inkex.Group):
|
||||||
|
deletes.append(layerNodeList[i][0][j])
|
||||||
|
for delete in deletes:
|
||||||
|
delete.getparent().remove(delete)
|
||||||
if len(layerNodeList[i][0]) == 0:
|
if len(layerNodeList[i][0]) == 0:
|
||||||
if layerNodeList[i][0].getparent() is not None:
|
if layerNodeList[i][0].getparent() is not None:
|
||||||
layerNodeList[i][0].getparent().remove(layerNodeList[i][0])
|
layerNodeList[i][0].getparent().remove(layerNodeList[i][0])
|
||||||
|
Reference in New Issue
Block a user