def _createOrthogonalLines(
        self, lineType: LineType
    ) -> Tuple[UmlLineDefinition, UmlLineDefinition, UmlLineDefinition,
               UmlLineDefinition]:

        northLinePositions: LinePositions = [
            Position(BOTTOM_LINE_LEFT_X + X_INC, TOP_LINE_Y),
            Position(BOTTOM_LINE_LEFT_X + X_INC, BOTTOM_LINE_Y)
        ]
        north: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=northLinePositions)

        northLinePositions: LinePositions = [
            Position(BOTTOM_LINE_RIGHT_X + X_DEC, TOP_LINE_Y),
            Position(BOTTOM_LINE_RIGHT_X + X_DEC, BOTTOM_LINE_Y)
        ]
        south: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=northLinePositions)

        eastLinePositions: LinePositions = [
            Position(V_LEFT_X, V_TOP_Y + Y_INC),
            Position(V_RIGHT_X, V_TOP_Y + Y_INC)
        ]
        east: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=eastLinePositions)

        westLinePositions: LinePositions = [
            Position(V_RIGHT_X, V_BOTTOM_Y + Y_DEC),
            Position(V_LEFT_X, V_BOTTOM_Y + Y_DEC)
        ]
        west: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=westLinePositions)

        return north, south, east, west
    def __createDiagonalLines(
        self, lineType: LineType
    ) -> Tuple[UmlLineDefinition, UmlLineDefinition, UmlLineDefinition,
               UmlLineDefinition]:

        pos: Position = Position(ELLIPSE_X, ELLIPSE_Y)
        arrowSize: float = ELLIPSE_WIDTH / 2

        center: Position = self.__computeEllipseCenter(pos)
        neDst: Position = self.__computeNorthEastDestination(
            center=center, arrowSize=arrowSize)
        nwDst: Position = self.__computeNorthWestDestination(
            center=center, arrowSize=arrowSize)
        seDst: Position = self.__computeSouthEastDestination(
            center=center, arrowSize=arrowSize)
        swDst: Position = self.__computeSouthWestDestination(
            center=center, arrowSize=arrowSize)

        nePositions: LinePositions = [center, neDst]
        northEast: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=nePositions)

        nwPositions: LinePositions = [center, nwDst]
        northWest: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=nwPositions)

        swPositions: LinePositions = [center, swDst]
        southWest: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=swPositions)

        sePositions: LinePositions = [center, seDst]
        southEast: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=sePositions)

        return northEast, northWest, southEast, southWest
Beispiel #3
0
    def layoutLines(self, oglObjects: List[OglClass]):

        umlLineDefinitions: UmlLineDefinitions = []

        for umlObject in oglObjects:

            if not isinstance(umlObject, OglLink):
                continue
            oglLink: OglLink = cast(OglLink, umlObject)

            pyutLink: PyutLink = oglLink.getPyutObject()
            umlLinkType: LinkType = pyutLink.linkType
            lineType: LineType = self._toPyUmlLineType(umlLinkType)

            linePositions: LinePositions = self._toPyUmlPositions(
                oglLink, umlLinkType)
            self.logger.debug(f'{lineType=} {linePositions=}')

            line: UmlLineDefinition = UmlLineDefinition(
                lineType=lineType, linePositions=linePositions)

            self._diagram.drawUmlLine(lineDefinition=line)
            umlLineDefinitions.append(line)

        self._umlLineDefinitions = umlLineDefinitions
    def testMinimalInheritance(self):

        baseName: str = f'{TestConstants.TEST_FILE_NAME}-MinimalInheritance'
        fileName: str = f'{baseName}.{ImageFormat.PNG.value}'

        diagram: ImageDiagram = ImageDiagram(fileName=f'{fileName}')

        cat: ClassDefinition = ClassDefinition(name='Gato',
                                               position=Position(536, 19),
                                               size=Size(height=74, width=113))
        opie: ClassDefinition = ClassDefinition(name='Opie',
                                                position=Position(495, 208),
                                                size=Size(width=216,
                                                          height=87))

        diagram.drawClass(classDefinition=cat)
        diagram.drawClass(classDefinition=opie)

        startPosition: Position = Position(600, 208)
        endPosition: Position = Position(600, 93)
        linePositions: LinePositions = [startPosition, endPosition]

        opieToCat: UmlLineDefinition = UmlLineDefinition(
            lineType=LineType.Inheritance, linePositions=linePositions)

        diagram.drawUmlLine(lineDefinition=opieToCat)
        diagram.write()

        self._assertIdenticalFiles(
            baseName=baseName,
            generatedFileName=fileName,
            failMessage='Minimal Inheritance image file should be identical')
    def _buildSophisticatedLineDefinitions(self) -> UmlLineDefinitions:

        startPosition: Position = Position(600, 208)
        endPosition: Position = Position(600, 93)
        opieToCatLinePositions: LinePositions = [startPosition, endPosition]

        opieToCat: UmlLineDefinition = UmlLineDefinition(
            lineType=LineType.Inheritance,
            linePositions=opieToCatLinePositions)

        startPosition2: Position = Position(190, 224)
        endPosition2: Position = Position(190, 130)

        eCarToCarLinePositions: LinePositions = [startPosition2, endPosition2]
        eCarToCar: UmlLineDefinition = UmlLineDefinition(
            lineType=LineType.Inheritance,
            linePositions=eCarToCarLinePositions)
        lineDefinitions: UmlLineDefinitions = [opieToCat, eCarToCar]

        return lineDefinitions
Beispiel #6
0
    def __createOrthogonalLines(
        self, lineType: LineType
    ) -> Tuple[UmlLineDefinition, UmlLineDefinition, UmlLineDefinition,
               UmlLineDefinition]:

        northLinePositions: LinePositions = [
            Position(TestPdfLine.V_RIGHT_X, TestPdfLine.V_TOP_Y),
            Position(TestPdfLine.V_RIGHT_X, TestPdfLine.V_BOTTOM_Y)
        ]
        north: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=northLinePositions)

        southLinePositions: LinePositions = [
            Position(TestPdfLine.V_LEFT_X, TestPdfLine.V_BOTTOM_Y),
            Position(TestPdfLine.V_LEFT_X, TestPdfLine.V_TOP_Y)
        ]
        south: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=southLinePositions)

        eastLinePositions: LinePositions = [
            Position(TestPdfLine.H_LEFT_X,
                     TestPdfLine.H_LEFT_TOP_Y + TestPdfLine.Y_INC),
            Position(TestPdfLine.H_RIGHT_X,
                     TestPdfLine.H_LEFT_TOP_Y + TestPdfLine.Y_INC)
        ]

        east: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=eastLinePositions)

        westLinePositions: LinePositions = [
            Position(TestPdfLine.H_RIGHT_X, TestPdfLine.H_RIGHT_BOTTOM_Y),
            Position(TestPdfLine.H_LEFT_X, TestPdfLine.H_LEFT_BOTTOM_Y)
        ]
        west: UmlLineDefinition = UmlLineDefinition(
            lineType=lineType, linePositions=westLinePositions)

        return north, south, east, west
    def _buildBendTest(self):

        startPos: Position = Position(x=330.0, y=359.0)
        cp1Pos: Position = Position(x=330.0, y=286.0)
        cp2Pos: Position = Position(x=178.0, y=286.0)
        cp3Pos: Position = Position(x=178.0, y=207.0)
        endPos: Position = Position(x=409.0, y=207.0)

        bigBends: LinePositions = [startPos, cp1Pos, cp2Pos, cp3Pos, endPos]

        leftToTop: UmlLineDefinition = UmlLineDefinition(
            lineType=LineType.Inheritance, linePositions=bigBends)

        startPosition2: Position = Position(x=604.0, y=354.0)
        midPosition: Position = Position(x=604.0, y=209.0)
        endPosition2: Position = Position(x=523.0, y=209.0)

        basicBends: LinePositions = [startPosition2, midPosition, endPosition2]
        rightToTop: UmlLineDefinition = UmlLineDefinition(
            lineType=LineType.Inheritance, linePositions=basicBends)

        bentLineDefinitions: UmlLineDefinitions = [leftToTop, rightToTop]

        return bentLineDefinitions
Beispiel #8
0
    def generateUmlLineDefinitions(self):

        graphicLinkNodes: NodeList = self._documentNode.getElementsByTagName(
            ELEMENT_GRAPHIC_LINK)

        for xmlGraphicLink in graphicLinkNodes:

            xmlGraphicLink: Element = cast(Element, xmlGraphicLink)

            xmlLink: Element = xmlGraphicLink.getElementsByTagName(
                ELEMENT_MODEL_LINK)[0]
            controlPoints: NodeList = xmlGraphicLink.getElementsByTagName(
                ELEMENT_CONTROL_POINT)

            srcX: float = float(
                xmlGraphicLink.getAttribute(ATTR_LINK_SOURCE_ANCHOR_X))
            srcY: float = float(
                xmlGraphicLink.getAttribute(ATTR_LINK_SOURCE_ANCHOR_Y))

            strType: str = xmlLink.getAttribute(ATTR_TYPE)
            lineType: LineType = LineType.toEnum(strType)

            srcPosition: Position = Position(x=srcX, y=srcY)
            linePositions: LinePositions = [srcPosition]
            umlLineDefinition: UmlLineDefinition = UmlLineDefinition(
                linePositions=linePositions, lineType=lineType)

            for controlPoint in controlPoints:

                controlPoint: Element = cast(Element, controlPoint)

                self.logger.debug(f'{controlPoint=}')
                x: float = float(controlPoint.getAttribute(ATTR_X))
                y: float = float(controlPoint.getAttribute(ATTR_Y))
                bendPosition: Position = Position(x=x, y=y)
                linePositions.append(bendPosition)

            destX: float = float(
                xmlGraphicLink.getAttribute(ATTR_LINK_DESTINATION_ANCHOR_X))
            destY: float = float(
                xmlGraphicLink.getAttribute(ATTR_LINK_DESTINATION_ANCHOR_Y))

            destPosition: Position = Position(x=destX, y=destY)

            linePositions.append(destPosition)
            self.logger.debug(f'{umlLineDefinition=}')
            self._umlLineDefinitions.append(umlLineDefinition)
Beispiel #9
0
    def testMinimalInheritance(self):

        baseName: str = f'{TestConstants.TEST_FILE_NAME}-MinimalInheritance'
        fileName: str = f'{baseName}{TestConstants.TEST_SUFFIX}'

        diagram: PdfDiagram = PdfDiagram(fileName=f'{fileName}', dpi=75)

        cat:  ClassDefinition = ClassDefinition(name='Gato', position=Position(536, 19), size=Size(height=74, width=113))
        opie: ClassDefinition = ClassDefinition(name='Opie', position=Position(495, 208), size=Size(width=216, height=87))

        diagram.drawClass(classDefinition=cat)
        diagram.drawClass(classDefinition=opie)

        linePositions: LinePositions = [Position(600, 208), Position(600, 93)]
        opieToCat: UmlLineDefinition = UmlLineDefinition(lineType=LineType.Inheritance, linePositions=linePositions)

        diagram.drawUmlLine(lineDefinition=opieToCat)
        diagram.docTimeStamp = self.unitTestTimeStamp
        diagram.write()

        self._assertIdenticalFiles(baseName=baseName, generatedFileName=fileName, failMessage='SophisticatedLayout should be identical')