Skip to content

Commit 0d83efc

Browse files
authored
Merge pull request #67 from skef/mergefirst
Improved mergeFirstSegments handling
2 parents 25f7091 + 71124f2 commit 0d83efc

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

Lib/booleanOperations/flatten.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -693,21 +693,34 @@ def reCurveSubSegments(self, inputContours):
693693
lp = segmentedFlatPoints[-1][-1]
694694
mergeFirstSegments = False
695695
if fp in flatInputPoints and lp in flatInputPoints:
696+
# fp and lp are "known" points with associated input
697+
# segments and fp is an isolated point in
698+
# segmentedFlatPoints[0]. If both points are
699+
# associated with the same input segment or if one
700+
# is the previous on-curve point for the other
701+
# segment (and the two are oriented correctly)
702+
# we want to merge the first and last segments.
696703
firstInputSegment = flatInputPointsSegmentDict[fp]
697704
lastInputSegment = flatInputPointsSegmentDict[lp]
698705
reversedFirstInputSegment = reversedFlatInputPointsSegmentDict[fp]
699706
reversedLastInputSegment = reversedFlatInputPointsSegmentDict[lp]
700-
if (firstInputSegment.segmentType == reversedFirstInputSegment.segmentType == "curve") or (lastInputSegment.segmentType == reversedLastInputSegment.segmentType == "curve"):
701-
if firstInputSegment == lastInputSegment or reversedFirstInputSegment == reversedLastInputSegment:
707+
firstCurved = firstInputSegment.segmentType == reversedFirstInputSegment.segmentType == "curve"
708+
lastCurved = lastInputSegment.segmentType == reversedLastInputSegment.segmentType == "curve"
709+
if firstCurved or lastCurved:
710+
if (firstInputSegment == lastInputSegment or
711+
reversedFirstInputSegment == reversedLastInputSegment):
702712
mergeFirstSegments = True
703-
# elif len(firstInputSegment.points) > 1 and len(lastInputSegment.points) > 1:
704-
elif fp == lastInputSegment.scaledPreviousOnCurve:
713+
elif (fp == lastInputSegment.scaledPreviousOnCurve and
714+
lastCurved and lp == lastInputSegment.flat[0]):
705715
mergeFirstSegments = True
706-
elif lp == firstInputSegment.scaledPreviousOnCurve:
716+
elif (lp == firstInputSegment.scaledPreviousOnCurve and
717+
firstCurved and fp == firstInputSegment.flat[0]):
707718
mergeFirstSegments = True
708-
elif fp == reversedLastInputSegment.scaledPreviousOnCurve:
719+
elif (fp == reversedLastInputSegment.scaledPreviousOnCurve and
720+
lastCurved and lp == reversedLastInputSegment.flat[0]):
709721
mergeFirstSegments = True
710-
elif lp == reversedFirstInputSegment.scaledPreviousOnCurve:
722+
elif (lp == reversedFirstInputSegment.scaledPreviousOnCurve and
723+
firstCurved and fp == reversedFirstInputSegment.flat[0]):
711724
mergeFirstSegments = True
712725
elif not hasOncurvePoints and _distance(fp, lp):
713726
# Merge last segment with first segment if the distance between the last point and the first

0 commit comments

Comments
 (0)