Skip to content

Commit e19f440

Browse files
committed
Merge pull request #25 from anthrotype/staticmethod
use @staticmethod for BooleanOperationManager and export top-level functions
2 parents d5a52f3 + 0f7fe25 commit e19f440

File tree

2 files changed

+58
-45
lines changed

2 files changed

+58
-45
lines changed

Lib/booleanOperations/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
from __future__ import print_function, division, absolute_import
22
from .booleanOperationManager import BooleanOperationManager
33

4-
__version__ = "0.2"
4+
__version__ = "0.3"
5+
6+
# export BooleanOperationManager static methods
7+
union = BooleanOperationManager.union
8+
difference = BooleanOperationManager.difference
9+
intersection = BooleanOperationManager.intersection
10+
xor = BooleanOperationManager.xor
11+
getIntersections = BooleanOperationManager.getIntersections

Lib/booleanOperations/booleanOperationManager.py

Lines changed: 50 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,58 +13,64 @@
1313
"""
1414

1515

16-
class BooleanOperationManager(object):
16+
def _performOperation(operation, subjectContours, clipContours, outPen):
17+
# prep the contours
18+
subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1]
19+
clipInputContours = [InputContour(contour) for contour in clipContours if contour and len(contour) > 1]
20+
inputContours = subjectInputContours + clipInputContours
1721

18-
def _performOperation(self, operation, subjectContours, clipContours, outPen):
19-
# prep the contours
20-
subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1]
21-
clipInputContours = [InputContour(contour) for contour in clipContours if contour and len(contour) > 1]
22-
inputContours = subjectInputContours + clipInputContours
23-
24-
resultContours = pyClipper.clipExecute([subjectInputContour.originalFlat for subjectInputContour in subjectInputContours],
25-
[clipInputContour.originalFlat for clipInputContour in clipInputContours],
26-
operation, subjectFillType="noneZero", clipFillType="noneZero")
27-
# convert to output contours
28-
outputContours = [OutputContour(contour) for contour in resultContours]
29-
# re-curve entire contour
30-
for inputContour in inputContours:
31-
for outputContour in outputContours:
32-
if outputContour.final:
33-
continue
34-
if outputContour.reCurveFromEntireInputContour(inputContour):
35-
# the input is expired if a match was made,
36-
# so stop passing it to the outputs
37-
break
38-
# re-curve segments
39-
for inputContour in inputContours:
40-
# skip contours that were comppletely used in the previous step
41-
if inputContour.used:
42-
continue
43-
# XXX this could be expensive if an input becomes completely used
44-
# it doesn't stop from being passed to the output
45-
for outputContour in outputContours:
46-
outputContour.reCurveFromInputContourSegments(inputContour)
47-
# curve fit
22+
resultContours = pyClipper.clipExecute([subjectInputContour.originalFlat for subjectInputContour in subjectInputContours],
23+
[clipInputContour.originalFlat for clipInputContour in clipInputContours],
24+
operation, subjectFillType="noneZero", clipFillType="noneZero")
25+
# convert to output contours
26+
outputContours = [OutputContour(contour) for contour in resultContours]
27+
# re-curve entire contour
28+
for inputContour in inputContours:
4829
for outputContour in outputContours:
49-
outputContour.reCurveSubSegments(inputContours)
50-
# output the results
30+
if outputContour.final:
31+
continue
32+
if outputContour.reCurveFromEntireInputContour(inputContour):
33+
# the input is expired if a match was made,
34+
# so stop passing it to the outputs
35+
break
36+
# re-curve segments
37+
for inputContour in inputContours:
38+
# skip contours that were comppletely used in the previous step
39+
if inputContour.used:
40+
continue
41+
# XXX this could be expensive if an input becomes completely used
42+
# it doesn't stop from being passed to the output
5143
for outputContour in outputContours:
52-
outputContour.drawPoints(outPen)
53-
return outputContours
44+
outputContour.reCurveFromInputContourSegments(inputContour)
45+
# curve fit
46+
for outputContour in outputContours:
47+
outputContour.reCurveSubSegments(inputContours)
48+
# output the results
49+
for outputContour in outputContours:
50+
outputContour.drawPoints(outPen)
51+
return outputContours
52+
53+
54+
class BooleanOperationManager(object):
5455

55-
def union(self, contours, outPen):
56-
return self._performOperation("union", contours, [], outPen)
56+
@staticmethod
57+
def union(contours, outPen):
58+
return _performOperation("union", contours, [], outPen)
5759

58-
def difference(self, subjectContours, clipContours, outPen):
59-
return self._performOperation("difference", subjectContours, clipContours, outPen)
60+
@staticmethod
61+
def difference(subjectContours, clipContours, outPen):
62+
return _performOperation("difference", subjectContours, clipContours, outPen)
6063

61-
def intersection(self, subjectContours, clipContours, outPen):
62-
return self._performOperation("intersection", subjectContours, clipContours, outPen)
64+
@staticmethod
65+
def intersection(subjectContours, clipContours, outPen):
66+
return _performOperation("intersection", subjectContours, clipContours, outPen)
6367

64-
def xor(self, subjectContours, clipContours, outPen):
65-
return self._performOperation("xor", subjectContours, clipContours, outPen)
68+
@staticmethod
69+
def xor(subjectContours, clipContours, outPen):
70+
return _performOperation("xor", subjectContours, clipContours, outPen)
6671

67-
def getIntersections(self, contours):
72+
@staticmethod
73+
def getIntersections(contours):
6874
from flatten import _scalePoints, inverseClipperScale
6975
# prep the contours
7076
inputContours = [InputContour(contour) for contour in contours if contour and len(contour) > 1]

0 commit comments

Comments
 (0)