some fixes in contour scanner and trimmer
This commit is contained in:
parent
56678066cc
commit
e12b2500cc
@ -7,6 +7,7 @@ Extension for InkScape 1.0+
|
||||
- add more comments
|
||||
- add more debug output
|
||||
- add documentation at online page
|
||||
- fix filtering duplicate lines if perfect vertical > write a function process_set_y()
|
||||
- add statistics about type counts and path lengths (before/after sub splitting/trimming)
|
||||
- add options:
|
||||
- replace trimmed paths by bezier paths (calculating lengths and required t parameter)
|
||||
@ -318,11 +319,11 @@ class ContourScannerAndTrimmer(inkex.EffectExtension):
|
||||
'''
|
||||
dx = p1[0] - p0[0]
|
||||
if dx == 0:
|
||||
return sys.float_info.max
|
||||
return sys.float_info.max #vertical
|
||||
return (p1[1] - p0[1]) / dx
|
||||
|
||||
|
||||
def process_set(self, working_set):
|
||||
def process_set_x(self, working_set):
|
||||
if len(working_set) < 2:
|
||||
return (True, working_set)
|
||||
|
||||
@ -342,14 +343,11 @@ class ContourScannerAndTrimmer(inkex.EffectExtension):
|
||||
# the only remaining permissible configuration: collinear segments with a gap between them
|
||||
# e.g. --- -----
|
||||
# otherwise we combine segments and flag the set as requiring more processing
|
||||
s0x0 = working_set[i]['p0'][0]
|
||||
s0x1 = working_set[i]['p1'][0]
|
||||
s1x0 = working_set[j]['p0'][0]
|
||||
s0x0 = working_set[i]['p0'][0]
|
||||
s0x1 = working_set[i]['p1'][0]
|
||||
s1x0 = working_set[j]['p0'][0]
|
||||
s1x1 = working_set[j]['p1'][0]
|
||||
|
||||
#if s0x0 == s1x0 and s0x1 == s1x1:
|
||||
# continue #skip if pointy path is going to be created
|
||||
|
||||
if not (s0x0 < s0x1 and s0x1 < s1x0 and s1x0 < s1x1):
|
||||
# make a duplicate set, omitting segments i and j
|
||||
new_set = [x for (k, x) in enumerate(working_set) if k not in (i, j)]
|
||||
@ -357,9 +355,7 @@ class ContourScannerAndTrimmer(inkex.EffectExtension):
|
||||
# add a segment representing i and j's furthest points
|
||||
pts = [ working_set[i]['p0'], working_set[i]['p1'], working_set[j]['p0'], working_set[j]['p1'] ]
|
||||
pts.sort(key=lambda x: x[0])
|
||||
if pts[0] == pts[-1]:
|
||||
continue #skip if pointy path is going to be created
|
||||
|
||||
|
||||
new_set.append({
|
||||
'p0': pts[0],
|
||||
'p1': pts[-1],
|
||||
@ -415,6 +411,18 @@ class ContourScannerAndTrimmer(inkex.EffectExtension):
|
||||
working_set = []
|
||||
output_set = []
|
||||
input_set.sort(key=lambda x: x['slope'])
|
||||
input_set_new = []
|
||||
|
||||
#loop through input_set to filter out the vertical lines because we need to handle them separately
|
||||
vertical_set = []
|
||||
for i in range(0, len(input_set)):
|
||||
if input_set[i]['slope'] == sys.float_info.max:
|
||||
vertical_set.append(input_set[i])
|
||||
else:
|
||||
input_set_new.append(input_set[i])
|
||||
|
||||
input_set = input_set_new #overwrite the input_set with the filtered one
|
||||
|
||||
input_set.append(False) # used to clear out lingering contents of working_set on last iteration
|
||||
current_slope = input_set[0]['slope']
|
||||
for input in input_set:
|
||||
@ -426,7 +434,7 @@ class ContourScannerAndTrimmer(inkex.EffectExtension):
|
||||
|
||||
else: # slope discontinuity, process accumulated set
|
||||
while True:
|
||||
(done, working_set) = self.process_set(working_set)
|
||||
(done, working_set) = self.process_set_x(working_set)
|
||||
if done:
|
||||
output_set.extend(working_set)
|
||||
break
|
||||
|
Reference in New Issue
Block a user