Skip to content

Commit a7113f8

Browse files
authored
Merge pull request #37 from anthrotype/exceptions
raise custom exceptions when pyclipper fails
2 parents 610d966 + a413e59 commit a7113f8

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

Lib/booleanOperations/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import print_function, division, absolute_import
22
from .booleanOperationManager import BooleanOperationManager
3+
from .exceptions import BooleanOperationsError
34

45
# export BooleanOperationManager static methods
56
union = BooleanOperationManager.union

Lib/booleanOperations/booleanOperationManager.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import print_function, division, absolute_import
22
from .flatten import InputContour, OutputContour
3+
from .exceptions import (
4+
InvalidSubjectContourError, InvalidClippingContourError, ExecutionError)
35
import pyclipper
46

57

@@ -32,13 +34,23 @@ def clipExecute(subjectContours, clipContours, operation, subjectFillType="nonZe
3234
clipFillType="nonZero"):
3335
pc = pyclipper.Pyclipper()
3436

35-
if subjectContours:
36-
pc.AddPaths(subjectContours, pyclipper.PT_SUBJECT)
37-
if clipContours:
38-
pc.AddPaths(clipContours, pyclipper.PT_CLIP)
39-
40-
solution = pc.Execute(_operationMap[operation], _fillTypeMap[subjectFillType],
41-
_fillTypeMap[clipFillType])
37+
for i, subjectContour in enumerate(subjectContours):
38+
try:
39+
pc.AddPath(subjectContour, pyclipper.PT_SUBJECT)
40+
except pyclipper.ClipperException:
41+
raise InvalidSubjectContourError("contour %d is invalid for clipping" % i)
42+
for j, clipContour in enumerate(clipContours):
43+
try:
44+
pc.AddPath(clipContour, pyclipper.PT_CLIP)
45+
except pyclipper.ClipperException:
46+
raise InvalidClippingContourError("contour %d is invalid for clipping" % j)
47+
48+
try:
49+
solution = pc.Execute(_operationMap[operation],
50+
_fillTypeMap[subjectFillType],
51+
_fillTypeMap[clipFillType])
52+
except pyclipper.ClipperException as exc:
53+
raise ExecutionError(exc)
4254

4355
return [[tuple(p) for p in path] for path in solution]
4456

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from __future__ import print_function, division, absolute_import
2+
3+
4+
class BooleanOperationsError(Exception):
5+
"""Base BooleanOperations exception"""
6+
7+
8+
class InvalidContourError(BooleanOperationsError):
9+
"""Rased when any input contour is invalid"""
10+
11+
12+
class InvalidSubjectContourError(InvalidContourError):
13+
"""Rased when a 'subject' contour is not valid"""
14+
15+
16+
class InvalidClippingContourError(InvalidContourError):
17+
"""Rased when a 'clipping' contour is not valid"""
18+
19+
20+
class ExecutionError(BooleanOperationsError):
21+
"""Raised when clipping execution fails"""

0 commit comments

Comments
 (0)