diff --git a/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.inx b/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.inx
index 91759a86..1670740f 100644
--- a/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.inx
+++ b/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.inx
@@ -7,7 +7,8 @@
false
false
- true
+ true
+ true
diff --git a/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.py b/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.py
index ad2250e7..5b366099 100644
--- a/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.py
+++ b/extensions/fablabchemnitz/filter_by_length_area/filter_by_length_area.py
@@ -30,7 +30,8 @@ class FilterByLengthArea(inkex.EffectExtension):
pars.add_argument('--tab')
pars.add_argument('--debug', type=inkex.Boolean, default=False)
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("--breakapart", type=inkex.Boolean, default=True, help="Performs CTRL + SHIFT + K to break the new output path into it's parts. Recommended to enable because default break apart of Inkscape might produce pointy paths.")
+ pars.add_argument("--breakapart", type=inkex.Boolean, default=True, help="Break apart selected path(s) into segments")
+ pars.add_argument("--breakapart_total", type=inkex.Boolean, default=True, help="Gives the best results for nodes/ filtering")
pars.add_argument("--cleanup", type=inkex.Boolean, default = True, help = "Cleanup all unused groups/layers (requires separate extension)")
pars.add_argument('--unit')
pars.add_argument('--min_filter_enable', type=inkex.Boolean, default=True, help='Enable filtering min.')
@@ -63,21 +64,40 @@ class FilterByLengthArea(inkex.EffectExtension):
idSuffix = 0
raw = element.path.to_arrays()
subPaths, prev = [], 0
- for i in range(len(raw)): # Breaks compound paths into simple paths
- if raw[i][0] == 'M' and i != 0:
- subPaths.append(raw[prev:i])
- prev = i
- subPaths.append(raw[prev:])
+ if self.options.breakapart_total is False:
+ for i in range(len(raw)): # Breaks compound paths into simple paths
+ if raw[i][0] == 'M' and i != 0:
+ subPaths.append(raw[prev:i])
+ prev = i
+ subPaths.append(raw[prev:])
+ else:
+ rawCopy = element.path.to_arrays() #we need another set of the same path
+ for i in range(len(raw)): # Breaks compound paths into simple paths
+ if i != 0:
+ if raw[i][0] == 'C':
+ rawCopy[i][1] = [raw[i][1][-2], raw[i][1][-1]]
+ elif raw[i][0] == 'L':
+ rawCopy[i][1] = [raw[i][1][0], raw[i][1][1]]
+ elif raw[i][0] == 'Z': #replace Z with another L command (which moves to the coordinates of the first M command in path) to have better overview
+ raw[-1][0] = 'L'
+ raw[-1][1] = raw[0][1]
+ rawCopy[i][0] = 'M' #we really need M. Does not matter if 'L' or 'C'.
+ #self.msg("s1={},s2={}".format(rawCopy[i-1], raw[i]))
+ subPaths.append([rawCopy[i-1], raw[i]])
+ prev = i
+ subPaths = subPaths[::-1]
+
for subpath in subPaths:
+ #self.msg(subpath)
replacedelement = copy.copy(element)
oldId = replacedelement.get('id')
csp = CubicSuperPath(subpath)
if len(subpath) > 1 and csp[0][0] != csp[0][1]: #avoids pointy paths like M "31.4794 57.6024 Z"
replacedelement.set('d', csp)
if len(subPaths) == 1:
- replacedelement.set('id', oldId)
+ replacedelement.set('id', "{}".format(oldId))
else:
- replacedelement.set('id', oldId + str(idSuffix))
+ replacedelement.set('id', "{}-{}".format(oldId, str(idSuffix)))
idSuffix += 1
parent.insert(idx, replacedelement)
breakelements.append(replacedelement)
@@ -116,7 +136,7 @@ class FilterByLengthArea(inkex.EffectExtension):
elements.extend(self.breakContours(element, None))
if so.debug is True:
- inkex.utils.debug("Collecting elements ...")
+ inkex.utils.debug("Collecting svg:path elements ...")
for element in elements:
# additional option to apply transformations. As we clear up some groups to form new layers, we might lose translations, rotations, etc.
@@ -229,12 +249,15 @@ class FilterByLengthArea(inkex.EffectExtension):
if so.group is True:
group.append(element)
- if so.cleanup == True:
- try:
- import remove_empty_groups
- remove_empty_groups.RemoveEmptyGroups.effect(self)
- except:
- self.msg("Calling 'Remove Empty Groups' extension failed. Maybe the extension is not installed. You can download it from official InkScape Gallery. Skipping ...")
+ #if len(group) == 0:
+ # group.delete()
+
+ if so.cleanup is True:
+ try:
+ import remove_empty_groups
+ remove_empty_groups.RemoveEmptyGroups.effect(self)
+ except:
+ self.msg("Calling 'Remove Empty Groups' extension failed. Maybe the extension is not installed. You can download it from official InkScape Gallery. Skipping ...")
if __name__ == '__main__':
FilterByLengthArea().run()
\ No newline at end of file