def _loadFile(self, source): if not os.path.isfile(source): raise ShapeException('Source image not found') try: return mpimg.imread(source) except Exception as e: raise ShapeException(e)
def __init__(self, *args, **kwargs): try: if not self.__constructWithPoints(args[0], args[1]): if not self.__constructWithCoords(args[0], args[1], args[2], args[3]): raise ShapeException("Line Construction Failed") except IndexError: # If no construction method works, raise an exception raise ShapeException("Invalid arguments for line construction")
def validateSource(source): """Validate a source for an image""" if not os.path.isfile(source): raise ShapeException('Source image not found') try: if imghdr.what(source) not in VALID_IMAGES: raise ShapeException('Source is not a valid image.') except TypeError: raise ShapeException('Source is not a valid image.')
def __init__(self, *args, **kwargs): try: if not self.__constructWithPoints(args[0], args[1], args[2]): if not self.__constructWithLines(args[0], args[1], args[2]): if not self.__constructWithCoords( args[0], args[1], args[2], args[3], args[4], args[5]): raise ShapeException("Triangle construction failed") except IndexError: raise ShapeException("Invalid arguments for triangle construction")
def __init__(self, *args, **kwargs): """Expects arguments as center, focus1, focus2, edge1, edge2""" try: if not self.__constructWithPoints(args[0], args[1], args[2], args[3], args[4]): if not self.__constructWithCoords( args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]): raise ShapeException("Ellipse construction failed") except IndexError: raise ShapeException("Invalid arguments for ellipse construction")
def __init__(self, *args, **kwargs): try: # Construct with x1, y1, x2, y2, x3, y3, x4, y4 if not self.__constructWithPoints(args[0], args[1], args[2], args[3]): if not self.__constructWithLines(args[0], args[1], args[2], args[3]): if not self.__constructWithCoords( args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]): raise ShapeException("Rectangle construction failed") except IndexError: raise ShapeException("Invalid arguments for shape construction")
def validateEllipse(value, errorMessage): if not isinstance(value, Ellipse): raise ShapeException(errorMessage) Line.validateLine(value.axis1, "Axis1 is not a valid line") Line.validateLine(value.axis2, "Axis2 is not a valid line") if value.computeArea() <= 0: raise ShapeException(errorMessage) Validator.validateLinesFormRightAngles([value.axis1, value.axis2], "Axis are not perpendicular")
def validateLinesFormRightAngles(lines, errorMessage): for i in range(len(lines)): m1 = lines[i].computeSlope() m2 = lines[(i+1)%len(lines)].computeSlope() if isInfinite(m1) or m1 == 0 or \ isInfinite(m2) or m2 == 0: if isInfinite(m1) and m2 == 0 or \ isInfinite(m2) and m1 == 0: pass else: raise ShapeException(errorMessage) else: if round(m1, 2) != round(-1/m2, 2): raise ShapeException(errorMessage)
def validateComposite(value, errorMessage): if not isinstance(value, Composite): raise ShapeException(errorMessage) value.center.validate() for shape in value.shapes: shape.validate()
def validateLinesAreSameLength(lines, errorMessage): last_length = lines[0].computeLength() for line in lines: length = line.computeLength() if length != last_length: raise ShapeException(errorMessage) last_length = length
def validateDouble(value, errorMessage): """ Method that validates that value is a double :raises: ShapeException: If value is not a valid double """ if not isinstance(value, numbers.Real) or isInfinite(value): raise ShapeException(errorMessage)
def validateEllipse(value, errorMessage): from shapes.ellipse import Ellipse if not isinstance(value, Ellipse): raise ShapeException(errorMessage) Validator.validatePoint(value.center, "Center is not a valid point.") Validator.validatePoint(value.focus1, "Focus1 is not a valid point.") Validator.validatePoint(value.focus2, "Focus2 is not a valid point.") Validator.validateLine(value.axis1, "Axis1 is not a valid line") Validator.validateLine(value.axis2, "Axis2 is not a valid line") if value.computeArea() <= 0: raise ShapeException(errorMessage) Validator.__validateLinesFormRightAngles([value.axis1, value.axis2], "Axis are not perpendicular") Validator.__validateFociAreAligned(value, "Foci are not aligned")
def build(type, *args, **kwargs): try: shape_class = SHAPE_FACTORY_MAP[type] except KeyError: raise ShapeException( 'Error: Invalid type for shape factory construction') return shape_class(*args, **kwargs)
def loadShape(self, string=None, file=None): if string is None and file is None: raise ShapeException( "Expected either a string or file for loadShape") if file: with open(file, "r") as myfile: string = myfile.readlines() return self._parse(string)
def validateSlopesAreDifferent(lines, errorMessage): for line in lines: lineSlope = line.computeSlope() count = 0 for other_line in lines: if lineSlope == other_line.computeSlope(): count += 1 if count != 1: raise ShapeException(errorMessage)
def __init__(self, *args, **kwargs): points = list(args) if len(points) < 1: raise ShapeException( 'No points provided during shape construction') self.center = points.pop(0) self.points = points self.lines = [] Shape.validateShape(value=self, errorMessage="Invalid Shape")
def validatePositiveDouble(value, errorMessage): """ Method that validates that value is a positive double :raises: ShapeException: If Values is not a valid positive double """ Validator.validateDouble(value, errorMessage) if value < 0: raise ShapeException(errorMessage)
def _findEnd(self, list, index): begin_count = 1 for i in range(index, len(list)): if list[i] == 'begin': begin_count += 1 elif list[i] == 'end': begin_count -= 1 if begin_count == 0: return i raise ShapeException( 'No matching end found for list<{}> index<{}>'.format(list, index))
def validateShape(value, errorMessage): if not isinstance(value, Shape): raise ShapeException(errorMessage) Point.validatePoint( value.center, "Center <{}> is not a valid point.".format(value.center)) for point in value.points: Point.validatePoint( point, "Point <{}> is not a valid point.".format(point))
def validatePoint(value, errorMessage): """ Method that validates that value is a valid point :raises: ShapeException: If value is not a valid point """ if not isinstance(value, Point): raise ShapeException(errorMessage) Validator.validateDouble(value.x, "Invalid x-location") Validator.validateDouble(value.y, "Invalid y-location")
def validateLine(value, errorMessage): """ Method that validates that a line is valid. :raises: ShapeException: If the line is invalid """ if not isinstance(value, Line): raise ShapeException(errorMessage) Point.validatePoint(value.point1, "Invalid point1") Point.validatePoint(value.point2, "Invalid point2") Validator.validateLineHasLength( value, "A Line must have a length greater than 0")
def validateRectangle(value, errorMessage): if not isinstance(value, Rectangle): raise ShapeException(errorMessage) Line.validateLine(value.line1, "Line 1 is not a valid line.") Line.validateLine(value.line2, "Line 2 is not a valid line.") Line.validateLine(value.line3, "Line 3 is not a valid line.") Line.validateLine(value.line4, "Line 4 is not a valid line.") Validator.validateLinesFormLoop([value.line1, value.line2, value.line3, value.line4], "Lines do not form an enclosed rectangle.") Validator.validateLinesFormRightAngles([value.line1, value.line2, value.line3, value.line4], "Lines do not form 90 degree angles.")
def validateTriangle(value, errorMessage): if not isinstance(value, Triangle): raise ShapeException(errorMessage) Line.validateLine(value.line1, "Line 1 has is not a valid line.") Line.validateLine(value.line2, "Line 2 has is not a valid line.") Line.validateLine(value.line3, "Line 3 has is not a valid line.") Validator.validateSlopesAreDifferent( [value.line1, value.line2, value.line3], "Angles of lines form an invalid triangle") Validator.validateLinesFormLoop( [value.line1, value.line2, value.line3], "Lines do not form an enclosed triangle")
def __validateFociAreAligned(ellipse, errorMessage): try: m1 = (ellipse.focus1.y - ellipse.center.y) / (ellipse.focus1.x - ellipse.center.x) except ZeroDivisionError: if (ellipse.center.y - ellipse.focus1.y) > 0: m1 = float('inf') else: m1 = float('-inf') try: m2 = (ellipse.focus2.y - ellipse.center.y) / (ellipse.focus2.x - ellipse.center.x) except ZeroDivisionError: if (ellipse.center.y - ellipse.focus2.y) > 0: m2 = float('-inf') else: m2 = float('inf') if m1 != ellipse.axis1.computeSlope() or \ m2 != ellipse.axis2.computeSlope(): raise ShapeException(errorMessage)
def validateCircle(value, errorMessage): Ellipse.validateEllipse(value, errorMessage) if value.axis1.computeLength() != value.axis2.computeLength(): raise ShapeException(errorMessage)
def __init__(self, *args, **kwargs): try: self.__constructWithCoords(args[0], args[1]) except IndexError: raise ShapeException("Invalid arguments for point construction")
def getShape(self, index): try: return self.shapes[index] except IndexError: raise ShapeException( 'Index out of bounds for getShape({})'.format(index))
def removeShape(self, index): try: return self.shapes.pop(index) except IndexError: raise ShapeException( 'Index out of bounds for removeShape({})'.format(index))
def validateLinesFormLoop(lines, errorMessage): for i in range(len(lines)): if lines[i].point2 != lines[(i + 1) % len(lines)].point1: raise ShapeException(errorMessage)
def validateLineHasLength(value, errorMessage): if value.computeLength() <= 0: raise ShapeException(errorMessage)