fix issue #36
This commit is contained in:
parent
1d4624fcff
commit
ef51a90dda
@ -40,7 +40,7 @@ from inkex.bezier import csplength
|
|||||||
|
|
||||||
|
|
||||||
class LinksCreator(inkex.EffectExtension):
|
class LinksCreator(inkex.EffectExtension):
|
||||||
|
|
||||||
def add_arguments(self, pars):
|
def add_arguments(self, pars):
|
||||||
pars.add_argument("--tab")
|
pars.add_argument("--tab")
|
||||||
pars.add_argument("--path_types", default="closed_paths", help="Apply for closed paths, open paths or both")
|
pars.add_argument("--path_types", default="closed_paths", help="Apply for closed paths, open paths or both")
|
||||||
@ -53,7 +53,7 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
pars.add_argument("--switch_pattern", type=inkex.Boolean, default=False, help="If enabled, we use gap length as dash length (switches the dasharray pattern")
|
pars.add_argument("--switch_pattern", type=inkex.Boolean, default=False, help="If enabled, we use gap length as dash length (switches the dasharray pattern")
|
||||||
pars.add_argument("--weakening_mode", type=inkex.Boolean, default=False, help="If enabled, we colorize the swap links in #0000ff (blue) and disable the option 'Keep selected elements'")
|
pars.add_argument("--weakening_mode", type=inkex.Boolean, default=False, help="If enabled, we colorize the swap links in #0000ff (blue) and disable the option 'Keep selected elements'")
|
||||||
pars.add_argument("--custom_dasharray_value", default="", help="A list of separated lengths that specify the lengths of alternating dashes and gaps. Input only accepts numbers. It ignores percentages or other characters.")
|
pars.add_argument("--custom_dasharray_value", default="", help="A list of separated lengths that specify the lengths of alternating dashes and gaps. Input only accepts numbers. It ignores percentages or other characters.")
|
||||||
pars.add_argument("--custom_dashoffset_value", type=float, default=0.000, help="Link offset (+/-)")
|
pars.add_argument("--custom_dashoffset_value", type=float, default=0.000, help="Link offset (+/-)")
|
||||||
pars.add_argument("--length_filter", type=inkex.Boolean, default=False, help="Enable path length filtering")
|
pars.add_argument("--length_filter", type=inkex.Boolean, default=False, help="Enable path length filtering")
|
||||||
pars.add_argument("--length_filter_value", type=float, default=0.000, help="Paths with length more than")
|
pars.add_argument("--length_filter_value", type=float, default=0.000, help="Paths with length more than")
|
||||||
pars.add_argument("--length_filter_unit", default="mm", help="Length filter unit")
|
pars.add_argument("--length_filter_unit", default="mm", help="Length filter unit")
|
||||||
@ -69,7 +69,7 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
if element.tag == inkex.addNS('path','svg'):
|
if element.tag == inkex.addNS('path','svg'):
|
||||||
parent = element.getparent()
|
parent = element.getparent()
|
||||||
idx = parent.index(element)
|
idx = parent.index(element)
|
||||||
idSuffix = 0
|
idSuffix = 0
|
||||||
raw = element.path.to_arrays()
|
raw = element.path.to_arrays()
|
||||||
subPaths, prev = [], 0
|
subPaths, prev = [], 0
|
||||||
for i in range(len(raw)): # Breaks compound paths into simple paths
|
for i in range(len(raw)): # Breaks compound paths into simple paths
|
||||||
@ -96,7 +96,7 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
return breakelements
|
return breakelements
|
||||||
|
|
||||||
def effect(self):
|
def effect(self):
|
||||||
def createLinks(element):
|
def createLinks(element):
|
||||||
elementParent = element.getparent()
|
elementParent = element.getparent()
|
||||||
path = element.path.to_arrays() #to_arrays() is deprecated. How to make more modern?
|
path = element.path.to_arrays() #to_arrays() is deprecated. How to make more modern?
|
||||||
pathIsClosed = False
|
pathIsClosed = False
|
||||||
@ -105,14 +105,14 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
(path[-1][0] == 'C' and path[0][1] == [path[-1][1][-2], path[-1][1][-1]]) \
|
(path[-1][0] == 'C' and path[0][1] == [path[-1][1][-2], path[-1][1][-1]]) \
|
||||||
: #if first is last point the path is also closed. The "Z" command is not required
|
: #if first is last point the path is also closed. The "Z" command is not required
|
||||||
pathIsClosed = True
|
pathIsClosed = True
|
||||||
|
|
||||||
if self.options.path_types == 'open_paths' and pathIsClosed is True:
|
if self.options.path_types == 'open_paths' and pathIsClosed is True:
|
||||||
return #skip this loop iteration
|
return #skip this loop iteration
|
||||||
elif self.options.path_types == 'closed_paths' and pathIsClosed is False:
|
elif self.options.path_types == 'closed_paths' and pathIsClosed is False:
|
||||||
return #skip this loop iteration
|
return #skip this loop iteration
|
||||||
elif self.options.path_types == 'both':
|
elif self.options.path_types == 'both':
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# if keeping is enabled we make of copy of the current element and insert it while modifying the original ones. We could also delete the original and modify a copy...
|
# if keeping is enabled we make of copy of the current element and insert it while modifying the original ones. We could also delete the original and modify a copy...
|
||||||
if self.options.keep_selected is True and self.options.weakening_mode is False:
|
if self.options.keep_selected is True and self.options.weakening_mode is False:
|
||||||
parent = element.getparent()
|
parent = element.getparent()
|
||||||
@ -123,7 +123,7 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
# we measure the length of the path to calculate the required dash configuration
|
# we measure the length of the path to calculate the required dash configuration
|
||||||
csp = element.path.transform(element.composed_transform()).to_superpath()
|
csp = element.path.transform(element.composed_transform()).to_superpath()
|
||||||
slengths, stotal = csplength(csp) #get segment lengths and total length of path in document's internal unit
|
slengths, stotal = csplength(csp) #get segment lengths and total length of path in document's internal unit
|
||||||
|
|
||||||
if self.options.length_filter is True:
|
if self.options.length_filter is True:
|
||||||
if stotal < self.svg.unittouu(str(self.options.length_filter_value) + self.options.length_filter_unit):
|
if stotal < self.svg.unittouu(str(self.options.length_filter_value) + self.options.length_filter_unit):
|
||||||
if self.options.show_info is True: self.msg("element " + element.get('id') + " is shorter than minimum allowed length of {:1.3f} {}. Path length is {:1.3f} {}".format(self.options.length_filter_value, self.options.length_filter_unit, stotal, self.options.creationunit))
|
if self.options.show_info is True: self.msg("element " + element.get('id') + " is shorter than minimum allowed length of {:1.3f} {}. Path length is {:1.3f} {}".format(self.options.length_filter_value, self.options.length_filter_unit, stotal, self.options.creationunit))
|
||||||
@ -135,28 +135,28 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
length_link = self.svg.unittouu(str(self.options.length_link) + self.options.creationunit)
|
length_link = self.svg.unittouu(str(self.options.length_link) + self.options.creationunit)
|
||||||
|
|
||||||
dashes = [] #central dashes array
|
dashes = [] #central dashes array
|
||||||
|
|
||||||
if self.options.creationtype == "entered_values":
|
if self.options.creationtype == "entered_values":
|
||||||
dash_length = ((stotal - length_link * self.options.link_count) / self.options.link_count) - 2 * length_link * self.options.link_multiplicator
|
dash_length = ((stotal - length_link * self.options.link_count) / self.options.link_count) - 2 * length_link * self.options.link_multiplicator
|
||||||
dashes.append(dash_length)
|
dashes.append(dash_length)
|
||||||
dashes.append(length_link)
|
dashes.append(length_link)
|
||||||
for i in range(0, self.options.link_multiplicator):
|
for i in range(0, self.options.link_multiplicator):
|
||||||
dashes.append(length_link) #stroke (=gap)
|
dashes.append(length_link) #stroke (=gap)
|
||||||
dashes.append(length_link) #gap
|
dashes.append(length_link) #gap
|
||||||
|
|
||||||
if self.options.switch_pattern is True:
|
if self.options.switch_pattern is True:
|
||||||
dashes = dashes[::-1] #reverse the array
|
dashes = dashes[::-1] #reverse the array
|
||||||
|
|
||||||
#validate dashes. May not be negative (dash or gap cannot be longer than the path itself). Otherwise Inkscape will freeze forever. Reason: rendering issue
|
#validate dashes. May not be negative (dash or gap cannot be longer than the path itself). Otherwise Inkscape will freeze forever. Reason: rendering issue
|
||||||
if any(dash <= 0.0 for dash in dashes) == True:
|
if any(dash <= 0.0 for dash in dashes) == True:
|
||||||
if self.options.show_info is True: self.msg("element " + element.get('id') + ": Error! Dash array may not contain negative numbers: " + ' '.join(format(dash, "1.3f") for dash in dashes) + ". Path skipped. Maybe it's too short. Adjust your link count, multiplicator and length accordingly, or set to unit '%'")
|
if self.options.show_info is True: self.msg("element " + element.get('id') + ": Error! Dash array may not contain negative numbers: " + ' '.join(format(dash, "1.3f") for dash in dashes) + ". Path skipped. Maybe it's too short. Adjust your link count, multiplicator and length accordingly, or set to unit '%'")
|
||||||
return False if self.options.skip_errors is True else exit(1)
|
return False if self.options.skip_errors is True else exit(1)
|
||||||
|
|
||||||
if self.options.creationunit == "percent":
|
if self.options.creationunit == "percent":
|
||||||
stroke_dashoffset = (self.options.link_offset / 100.0 * stotal) - length_link/2
|
stroke_dashoffset = (self.options.link_offset / 100.0 * stotal) - length_link/2
|
||||||
else:
|
else:
|
||||||
stroke_dashoffset = self.svg.unittouu(str(self.options.link_offset) + self.options.creationunit)
|
stroke_dashoffset = self.svg.unittouu(str(self.options.link_offset) + self.options.creationunit)
|
||||||
|
|
||||||
if self.options.switch_pattern is True:
|
if self.options.switch_pattern is True:
|
||||||
stroke_dashoffset = stroke_dashoffset + ((self.options.link_multiplicator * 2) + 1) * length_link
|
stroke_dashoffset = stroke_dashoffset + ((self.options.link_multiplicator * 2) + 1) * length_link
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
except:
|
except:
|
||||||
if self.options.show_info is True: self.msg("element " + element.get('id') + ": No dash style to continue with.")
|
if self.options.show_info is True: self.msg("element " + element.get('id') + ": No dash style to continue with.")
|
||||||
return False if self.options.skip_errors is True else exit(1)
|
return False if self.options.skip_errors is True else exit(1)
|
||||||
|
|
||||||
if self.options.creationtype == "custom_dashpattern":
|
if self.options.creationtype == "custom_dashpattern":
|
||||||
stroke_dashoffset = self.options.custom_dashoffset_value
|
stroke_dashoffset = self.options.custom_dashoffset_value
|
||||||
try:
|
try:
|
||||||
@ -226,20 +226,20 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
self.msg(" * (calculated) offset: {:1.3f} {}".format(self.svg.uutounit(stroke_dashoffset, self.options.creationunit), self.options.creationunit))
|
self.msg(" * (calculated) offset: {:1.3f} {}".format(self.svg.uutounit(stroke_dashoffset, self.options.creationunit), self.options.creationunit))
|
||||||
if self.options.creationtype == "entered_values":
|
if self.options.creationtype == "entered_values":
|
||||||
self.msg(" * (calculated) gap length: {:1.3f} {}".format(length_link, self.options.creationunit))
|
self.msg(" * (calculated) gap length: {:1.3f} {}".format(length_link, self.options.creationunit))
|
||||||
if self.options.creationtype == "entered_values":
|
if self.options.creationtype == "entered_values":
|
||||||
self.msg(" * total gaps = {}".format(self.options.link_count))
|
self.msg(" * total gaps = {}".format(self.options.link_count))
|
||||||
self.msg(" * (calculated) dash/gap pattern: {} ({})".format(stroke_dasharray, self.svg.unit))
|
self.msg(" * (calculated) dash/gap pattern: {} ({})".format(stroke_dasharray, self.svg.unit))
|
||||||
|
|
||||||
# Conversion step (split cosmetic path into real segments)
|
# Conversion step (split cosmetic path into real segments)
|
||||||
if self.options.no_convert is False:
|
if self.options.no_convert is False:
|
||||||
style = element.style #get the style again, but this time as style class
|
style = element.style #get the style again, but this time as style class
|
||||||
|
|
||||||
gaps = []
|
gaps = []
|
||||||
new = []
|
new = []
|
||||||
for sub in element.path.to_superpath():
|
for sub in element.path.to_superpath():
|
||||||
idash = 0
|
idash = 0
|
||||||
dash = dashes[0]
|
dash = dashes[0]
|
||||||
length = float(stroke_dashoffset)
|
length = abs(float(stroke_dashoffset))
|
||||||
while dash < length:
|
while dash < length:
|
||||||
length = length - dash
|
length = length - dash
|
||||||
idash = (idash + 1) % len(dashes)
|
idash = (idash + 1) % len(dashes)
|
||||||
@ -262,19 +262,19 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
new.append([sub[i]])
|
new.append([sub[i]])
|
||||||
else:
|
else:
|
||||||
new[-1].append(sub[i])
|
new[-1].append(sub[i])
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
#filter pointy subpaths
|
#filter pointy subpaths
|
||||||
final_new = []
|
final_new = []
|
||||||
for sub in new:
|
for sub in new:
|
||||||
if len(sub) > 1:
|
if len(sub) > 1:
|
||||||
final_new.append(sub)
|
final_new.append(sub)
|
||||||
|
|
||||||
style.pop('stroke-dasharray')
|
style.pop('stroke-dasharray')
|
||||||
element.pop('sodipodi:type')
|
element.pop('sodipodi:type')
|
||||||
element.path = CubicSuperPath(final_new)
|
element.path = CubicSuperPath(final_new)
|
||||||
element.style = style
|
element.style = style
|
||||||
|
|
||||||
# break apart the combined path to have multiple elements
|
# break apart the combined path to have multiple elements
|
||||||
if self.options.breakapart is True:
|
if self.options.breakapart is True:
|
||||||
breakOutputelements = None
|
breakOutputelements = None
|
||||||
@ -284,7 +284,7 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
breakApartGroup.append(breakOutputelement)
|
breakApartGroup.append(breakOutputelement)
|
||||||
#self.msg(replacedelement.get('id'))
|
#self.msg(replacedelement.get('id'))
|
||||||
#self.svg.selection.set(replacedelement.get('id')) #update selection to split paths segments (does not work, so commented out)
|
#self.svg.selection.set(replacedelement.get('id')) #update selection to split paths segments (does not work, so commented out)
|
||||||
|
|
||||||
if len(self.svg.selected) > 0:
|
if len(self.svg.selected) > 0:
|
||||||
for element in self.svg.selection.values():
|
for element in self.svg.selection.values():
|
||||||
#at first we need to break down combined elements to single path, otherwise dasharray cannot properly be applied
|
#at first we need to break down combined elements to single path, otherwise dasharray cannot properly be applied
|
||||||
@ -295,6 +295,6 @@ class LinksCreator(inkex.EffectExtension):
|
|||||||
else:
|
else:
|
||||||
self.msg('Please select some paths first.')
|
self.msg('Please select some paths first.')
|
||||||
return
|
return
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
LinksCreator().run()
|
LinksCreator().run()
|
Loading…
Reference in New Issue
Block a user