fix in destructive clip extension (handling of VH lines)

This commit is contained in:
leyghisbb 2020-08-30 11:25:16 +02:00
parent 6202a68d26
commit c6aa4d8eb0

View File

@ -35,8 +35,7 @@ class DestructiveClip(inkex.Effect):
inkex.Effect.__init__(self) inkex.Effect.__init__(self)
self.error_messages = [] self.error_messages = []
self.curve_error = 'Unable to parse path.\nConsider removing curves ' self.curve_error = 'Unable to parse path.\nConsider removing curves with Extensions > Modify Path > Flatten Beziers...'
self.curve_error += 'with Extensions > Modify Path > Flatten Beziers...'
def approxEqual(self, a, b): def approxEqual(self, a, b):
# compare with tiny tolerance # compare with tiny tolerance
@ -153,6 +152,7 @@ class DestructiveClip(inkex.Effect):
clippedLines.extend(self.cullSegmentedLine(self.clipLine(lineToClip, clippingLineSegments), clippingLineSegments, self.maxX(clippingLineSegments))) clippedLines.extend(self.cullSegmentedLine(self.clipLine(lineToClip, clippingLineSegments), clippingLineSegments, self.maxX(clippingLineSegments)))
return clippedLines return clippedLines
#you can also run the extension Modify Path > To Absolute Coordinates to convert VH to L
def fixVHbehaviour(self, elem): def fixVHbehaviour(self, elem):
raw = Path(elem.get("d")).to_arrays() raw = Path(elem.get("d")).to_arrays()
subpaths, prev = [], 0 subpaths, prev = [], 0
@ -163,9 +163,8 @@ class DestructiveClip(inkex.Effect):
subpaths.append(raw[prev:]) subpaths.append(raw[prev:])
seg = [] seg = []
for simpath in subpaths: for simpath in subpaths:
closed = False
if simpath[-1][0] == 'Z': if simpath[-1][0] == 'Z':
closed = True simpath[-1][0] = 'L'
if simpath[-2][0] == 'L': simpath[-1][1] = simpath[0][1] if simpath[-2][0] == 'L': simpath[-1][1] = simpath[0][1]
else: simpath.pop() else: simpath.pop()
for i in range(len(simpath)): for i in range(len(simpath)):
@ -194,10 +193,12 @@ class DestructiveClip(inkex.Effect):
if node.tag == pathTag: if node.tag == pathTag:
path = self.fixVHbehaviour(node) path = self.fixVHbehaviour(node)
if clippingLineSegments is None: # first path is the clipper if clippingLineSegments is None: # first path is the clipper
#(clippingLineSegments, errors) = self.simplepathToLineSegments(node.path.to_arrays())
(clippingLineSegments, errors) = self.simplepathToLineSegments(path) (clippingLineSegments, errors) = self.simplepathToLineSegments(path)
self.error_messages.extend(['{}: {}'.format(id, err) for err in errors]) self.error_messages.extend(['{}: {}'.format(id, err) for err in errors])
else: else:
# do all the work! # do all the work!
#segmentsToClip, errors = self.simplepathToLineSegments(node.path.to_arrays())
segmentsToClip, errors = self.simplepathToLineSegments(path) segmentsToClip, errors = self.simplepathToLineSegments(path)
self.error_messages.extend(['{}: {}'.format(id, err) for err in errors]) self.error_messages.extend(['{}: {}'.format(id, err) for err in errors])
clippedSegments = self.clipLineSegments(segmentsToClip, clippingLineSegments) clippedSegments = self.clipLineSegments(segmentsToClip, clippingLineSegments)
@ -215,4 +216,4 @@ class DestructiveClip(inkex.Effect):
for error in self.error_messages: for error in self.error_messages:
inkex.errormsg(error) inkex.errormsg(error)
DestructiveClip().run() DestructiveClip().run()