diff options
| author | Lex Neva <github@lexneva.name> | 2016-02-23 22:24:36 -0500 |
|---|---|---|
| committer | Lex Neva <github@lexneva.name> | 2016-02-23 22:24:36 -0500 |
| commit | 25a70ba1482b382ead37ebd2cd670a75c0780f41 (patch) | |
| tree | 7d887bf886d308c1d06ad3a612bd201717640181 /embroider.py | |
| parent | b054de3735c8fd6b134ea77b742d4b47ab43f85f (diff) | |
rework satin_column to properly handle segments that are less than the zigzag length
Diffstat (limited to 'embroider.py')
| -rw-r--r-- | embroider.py | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/embroider.py b/embroider.py index 992ba92f..62862d72 100644 --- a/embroider.py +++ b/embroider.py @@ -1150,6 +1150,9 @@ class Embroider(inkex.Effect): # Take each bezier segment in turn, drawing zigzags between the two # paths in that segment. + remainder_path1 = [] + remainder_path2 = [] + for segment in xrange(1, len(path1)): # construct the current bezier segments bezier1 = (path1[segment - 1][1], # point from previous 3-tuple @@ -1164,9 +1167,20 @@ class Embroider(inkex.Effect): path2[segment][1], ) - # Find their lengths. The math is actually fairly involved. - len1 = bezierlength(bezier1) - len2 = bezierlength(bezier2) + # Here's what I want to be able to do. However, beziertatlength is so incredibly slow that it's unusable. + #for stitch in xrange(num_zigzags): + # patch.addStitch(bezierpointatt(bezier1, beziertatlength(bezier1, stitch_len1 * stitch))) + # patch.addStitch(bezierpointatt(bezier2, beziertatlength(bezier2, stitch_len2 * (stitch + 0.5)))) + + # Instead, flatten the beziers down to a set of line segments. + subpath1 = remainder_path1 + flatten([[path1[segment - 1], path1[segment]]], self.options.flat)[0] + subpath2 = remainder_path2 + flatten([[path2[segment - 1], path2[segment]]], self.options.flat)[0] + + len1 = shgeo.LineString(subpath1).length + len2 = shgeo.LineString(subpath2).length + + subpath1 = [PyEmb.Point(*p) for p in subpath1] + subpath2 = [PyEmb.Point(*p) for p in subpath2] # Base the number of stitches in each section on the _longest_ of # the two beziers. Otherwise, things could get too sparse when one @@ -1174,7 +1188,7 @@ class Embroider(inkex.Effect): # The risk here is that we poke a hole in the fabric if we try to # cram too many stitches on the short bezier. The user will need # to avoid this through careful construction of paths. - num_zigzags = int(max(len1, len2) / zigzag_spacing_px) + num_zigzags = max(len1, len2) / zigzag_spacing_px stitch_len1 = len1 / num_zigzags stitch_len2 = len2 / num_zigzags @@ -1182,18 +1196,6 @@ class Embroider(inkex.Effect): # Now do the stitches. Each "zigzag" has a "zig" and a "zag", that # is, go from path1 to path2 and then back to path1. - # Here's what I want to be able to do. However, beziertatlength is so incredibly slow that it's unusable. - #for stitch in xrange(num_zigzags): - # patch.addStitch(bezierpointatt(bezier1, beziertatlength(bezier1, stitch_len1 * stitch))) - # patch.addStitch(bezierpointatt(bezier2, beziertatlength(bezier2, stitch_len2 * (stitch + 0.5)))) - - # Instead, flatten the beziers down to a set of line segments. - subpath1 = flatten([[path1[segment - 1], path1[segment]]], self.options.flat) - subpath2 = flatten([[path2[segment - 1], path2[segment]]], self.options.flat) - - subpath1 = [PyEmb.Point(*p) for p in subpath1[0]] - subpath2 = [PyEmb.Point(*p) for p in subpath2[0]] - def walk(path, start_pos, start_index, distance): # Move <distance> pixels along <path>'s line segments. # <start_index> is the index of the line segment in <path> that @@ -1227,17 +1229,36 @@ class Embroider(inkex.Effect): pos1 = subpath1[0] i1 = 0 - pos2, i2 = walk(subpath2, subpath2[0], 0, stitch_len2 * 0.5) + pos2 = subpath2[0] i2 = 0 - for stitch in xrange(num_zigzags): - # In each iteration, do a "zig" and a "zag". +# if num_zigzags >= 1.0: +# for stitch in xrange(int(num_zigzags) + 1): + for stitch in xrange(int(num_zigzags)): + # In each iteration, do a "zig" and a "zag". patch.addStitch(pos1) pos1, i1 = walk(subpath1, pos1, i1, stitch_len1) patch.addStitch(pos2) pos2, i2 = walk(subpath2, pos2, i2, stitch_len2) + if i1 < len(subpath1) - 1: + remainder_path1 = [pos1] + subpath1[i1 + 1:] + else: + remainder_path1 = [] + + if i2 < len(subpath2) - 1: + remainder_path2 = [pos2] + subpath2[i2 + 1:] + else: + remainder_path2 = [] + + remainder_path1 = [p.as_tuple() for p in remainder_path1] + remainder_path2 = [p.as_tuple() for p in remainder_path2] + + # We're off by one in the algorithm above, so add one more stitch. + patch.addStitch(pos1) + patch.addStitch(pos2) + return [patch] if __name__ == '__main__': |
