added some options to unwind paths

This commit is contained in:
Mario Voigt 2021-05-20 13:31:03 +02:00
parent ef87020278
commit e02bfadbca
2 changed files with 75 additions and 54 deletions

View File

@ -4,10 +4,14 @@
<id>fablabchemnitz.de.unwind_paths</id> <id>fablabchemnitz.de.unwind_paths</id>
<param name="tab" type="notebook"> <param name="tab" type="notebook">
<page name="tab_settings" gui-text="Unwind Paths"> <page name="tab_settings" gui-text="Unwind Paths">
<label appearance="header">Settings</label> <label appearance="header">General Settings</label>
<param name="keep_original" type="bool" gui-text="Keep original paths" gui-description="If selected, the original paths get deleted">false</param> <param name="keep_original" type="bool" gui-text="Keep original paths" gui-description="If selected, the original paths get deleted">false</param>
<param name="break_apart" type="bool" gui-text="Break apart paths" gui-description="Split each path into single curve segments">false</param> <param name="break_apart" type="bool" gui-text="Break apart paths" gui-description="Split each path into single curve segments">false</param>
<param name="colorize" type="bool" gui-text="Colorize glue pairs" gui-description="Requires enabled 'Break apart' option">false</param> <param name="break_only" type="bool" gui-text="Break apart paths only" gui-description="No unwinding at all">false</param>
<label appearance="header">Color Style</label>
<param name="colorize" type="bool" gui-text="Colorize" gui-description="Colorize original paths and glue pairs">false</param>
<param name="color_increment" type="int" min="1" max="255" gui-text="Color increment" gui-description="For each segment we count up n colors. Does not apply if 'Randomize colors' is enabled.">10000</param>
<param name="randomize_colors" type="bool" gui-text="Randomize colors">false</param>
<label appearance="header">Extrude Options</label> <label appearance="header">Extrude Options</label>
<param name="extrude" type="bool" gui-text="Extrude">false</param> <param name="extrude" type="bool" gui-text="Extrude">false</param>
<param name="extrude_height" type="float" min="0.000" max="99999.000" precision="3" gui-text="Extrude height">10.000</param> <param name="extrude_height" type="float" min="0.000" max="99999.000" precision="3" gui-text="Extrude height">10.000</param>

View File

@ -25,7 +25,7 @@ ToDos:
""" """
import copy import copy
import inkex import inkex
from inkex import bezier, Path, CubicSuperPath from inkex import Color, bezier, Path, CubicSuperPath
from lxml import etree from lxml import etree
import math import math
import random import random
@ -41,7 +41,10 @@ class UnwindPaths(inkex.EffectExtension):
pars.add_argument('--tab') pars.add_argument('--tab')
pars.add_argument('--keep_original', type=inkex.Boolean, default=False, help="If selected, the original paths get deleted") pars.add_argument('--keep_original', type=inkex.Boolean, default=False, help="If selected, the original paths get deleted")
pars.add_argument('--break_apart', type=inkex.Boolean, default=False, help="Split each path into single curve segments") pars.add_argument('--break_apart', type=inkex.Boolean, default=False, help="Split each path into single curve segments")
pars.add_argument('--colorize', type=inkex.Boolean, default=False, help="Requires enabled 'Break apart' option") pars.add_argument('--break_only', type=inkex.Boolean, default=False, help="Only splits root paths into segments (no unwinding)")
pars.add_argument('--colorize', type=inkex.Boolean, default=False, help="Colorize original paths and glue pairs")
pars.add_argument('--color_increment', type=int, default=10000, help="For each segment we count up n colors. Does not apply if 'Randomize colors' is enabled.")
pars.add_argument('--randomize_colors', type=inkex.Boolean, default=False, help="Randomize colors")
pars.add_argument('--extrude', type=inkex.Boolean, default=False) pars.add_argument('--extrude', type=inkex.Boolean, default=False)
pars.add_argument('--extrude_height', type=float, default=10.000) pars.add_argument('--extrude_height', type=float, default=10.000)
pars.add_argument('--unit', default="mm") pars.add_argument('--unit', default="mm")
@ -79,6 +82,14 @@ class UnwindPaths(inkex.EffectExtension):
self.breakContours(child, breakelements) self.breakContours(child, breakelements)
return breakelements return breakelements
def rgb(self, minimum, maximum, value):
minimum, maximum = float(minimum), float(maximum)
ratio = 2 * (value-minimum) / (maximum - minimum)
b = int(max(0, 255 * (1 - ratio)))
r = int(max(0, 255 * (ratio - 1)))
g = 255 - b - r
return r, g, b
def effect(self): def effect(self):
shifting = self.svg.unittouu(str(self.options.extrude_height) + self.options.unit) shifting = self.svg.unittouu(str(self.options.extrude_height) + self.options.unit)
@ -106,12 +117,16 @@ class UnwindPaths(inkex.EffectExtension):
#generate random colors; used to identify glue tab pairs #generate random colors; used to identify glue tab pairs
if self.options.colorize is True: if self.options.colorize is True:
randomColorSet = [] colorSet = []
while len(randomColorSet) < subCount - 1: if self.options.randomize_colors is True:
while len(colorSet) < subCount - 1:
r = lambda: random.randint(0,255) r = lambda: random.randint(0,255)
newColor = '#%02X%02X%02X' % (r(),r(),r()) newColor = '#%02X%02X%02X' % (r(),r(),r())
if newColor not in randomColorSet: if newColor not in colorSet:
randomColorSet.append(newColor) colorSet.append(newColor)
else:
for i in range(subCount):
colorSet.append(Color(self.rgb(0, i+self.options.color_increment, 1*i)))
for sub in csp: for sub in csp:
#generate new horizontal line data by measuring each segment #generate new horizontal line data by measuring each segment
@ -125,19 +140,22 @@ class UnwindPaths(inkex.EffectExtension):
if self.options.break_apart is True: if self.options.break_apart is True:
topLineGroup = self.svg.get_current_layer().add(inkex.Group(id="hline-top-" + element.get('id'))) topLineGroup = self.svg.get_current_layer().add(inkex.Group(id="hline-top-" + element.get('id')))
bottomLineGroup = self.svg.get_current_layer().add(inkex.Group(id="hline-bottom-" + element.get('id'))) bottomLineGroup = self.svg.get_current_layer().add(inkex.Group(id="hline-bottom-" + element.get('id')))
newOriginalPathGroup = self.svg.get_current_layer().add(inkex.Group(id="new-original-" + element.get('id')))
elemGroup.append(topLineGroup) elemGroup.append(topLineGroup)
elemGroup.append(bottomLineGroup) elemGroup.append(bottomLineGroup)
newOriginalPathGroup = self.svg.get_current_layer().add(inkex.Group(id="new-original-" + element.get('id')))
self.svg.get_current_layer().append(newOriginalPathGroup) #we want this to be one level above unwound stuff self.svg.get_current_layer().append(newOriginalPathGroup) #we want this to be one level above unwound stuff
if self.options.extrude is True: if self.options.extrude is True:
vlinesGroup = self.svg.get_current_layer().add(inkex.Group(id="vlines-" + element.get('id'))) vlinesGroup = self.svg.get_current_layer().add(inkex.Group(id="vlines-" + element.get('id')))
elemGroup.append(vlinesGroup) elemGroup.append(vlinesGroup)
if self.options.break_only is False:
while i <= len(sub) - 1: while i <= len(sub) - 1:
stroke_color = '#000000' stroke_color = '#000000'
if self.options.colorize is True and self.options.break_apart is True: if self.options.colorize is True and self.options.break_apart is True:
stroke_color =randomColorSet[i-1] stroke_color =colorSet[i-1]
horizontal_line_style = {'stroke':stroke_color,'stroke-width':'1px','fill':'none'} horizontal_line_style = {'stroke':stroke_color,'stroke-width':'1px','fill':'none'}
@ -155,7 +173,6 @@ class UnwindPaths(inkex.EffectExtension):
lengths.append(length) lengths.append(length)
i += 1 i += 1
if self.options.break_apart is False: if self.options.break_apart is False:
self.drawline(topPathData, "combined-top-{0}".format(element.get('id')), elemGroup, horizontal_line_style) self.drawline(topPathData, "combined-top-{0}".format(element.get('id')), elemGroup, horizontal_line_style)
if self.options.extrude is True: if self.options.extrude is True:
@ -204,7 +221,7 @@ class UnwindPaths(inkex.EffectExtension):
stroke_color = '#000000' stroke_color = '#000000'
if self.options.colorize is True: if self.options.colorize is True:
stroke_color =randomColorSet[i-1] stroke_color =colorSet[i-1]
new_original_line_style = {'stroke':stroke_color,'stroke-width':'1px','fill':'none'} new_original_line_style = {'stroke':stroke_color,'stroke-width':'1px','fill':'none'}
self.drawline(d, "segmented-" + element.get('id'), newOriginalPathGroup, new_original_line_style) self.drawline(d, "segmented-" + element.get('id'), newOriginalPathGroup, new_original_line_style)