Exemple #1
0
    def testComputeMidPointNorthWestToSouthEast(self):

        srcPosition: OglPosition = OglPosition(1024, 1024)
        destPosition: OglPosition = OglPosition(8092, 8092)

        midPoint: OglPosition = OglUtils.computeMidPoint(
            srcPosition=srcPosition, destPosition=destPosition)
        self.assertEqual(4558.0, midPoint.x, 'X coordinate is not correct')
        self.assertEqual(4558.0, midPoint.y, 'Y coordinate is not correct')

        self.logger.info(f'midPoint: {midPoint}')
Exemple #2
0
    def testComputeMidPointSouthNorth(self):

        srcPosition: OglPosition = OglPosition(0, 400)
        destPosition: OglPosition = OglPosition(0, 100)

        midPoint: OglPosition = OglUtils.computeMidPoint(
            srcPosition=srcPosition, destPosition=destPosition)
        self.assertEqual(0.0, midPoint.x, 'X coordinate is not correct')
        self.assertEqual(250.0, midPoint.y, 'Y coordinate is not correct')

        self.logger.info(f'midPoint: {midPoint}')
Exemple #3
0
    def testComputeMidPointWestEast(self):

        srcPosition: OglPosition = OglPosition(200, 800)
        destPosition: OglPosition = OglPosition(200, 400)

        midPoint: OglPosition = OglUtils.computeMidPoint(
            srcPosition=srcPosition, destPosition=destPosition)
        self.assertEqual(200.0, midPoint.x, 'X coordinate is not correct')
        self.assertEqual(600.0, midPoint.y, 'Y coordinate is not correct')

        self.logger.info(f'midPoint: {midPoint}')
Exemple #4
0
    def _determineAttachmentPoint(self, attachmentPoint: AttachmentPoint, oglClass: OglClass) -> OglPosition:

        oglPosition: OglPosition = OglPosition()

        dw, dh     = oglClass.GetSize()

        if attachmentPoint == AttachmentPoint.NORTH:
            northX: int = dw // 2
            northY: int = 0
            oglPosition.x = northX
            oglPosition.y = northY
        elif attachmentPoint == AttachmentPoint.SOUTH:
            southX = dw // 2
            southY = dh
            oglPosition.x = southX
            oglPosition.y = southY
        elif attachmentPoint == AttachmentPoint.WEST:
            westX: int = 0
            westY: int = dh // 2
            oglPosition.x = westX
            oglPosition.y = westY
        elif attachmentPoint == AttachmentPoint.EAST:
            eastX: int = dw
            eastY: int = dh // 2
            oglPosition.x = eastX
            oglPosition.y = eastY
        else:
            self.logger.warning(f'Unknown attachment point: {attachmentPoint}')
            assert False, 'Unknown attachment point'

        return oglPosition
Exemple #5
0
    def __init__(self, srcShape: OglSDInstance, pyutSDMessage: PyutSDMessage,
                 dstShape: OglSDInstance):
        """

        Args:
            srcShape:   Source shape OglSDInstance
            pyutSDMessage:  PyutSDMessage
            dstShape:   Destination shape OglSDInstance

        """
        self._pyutSDMessage = pyutSDMessage

        super().__init__(srcShape=srcShape,
                         pyutLink=pyutSDMessage,
                         dstShape=dstShape)
        # LineShape.__init__(self, srcAnchor=srcAnchor, dstAnchor=dstAnchor)
        #
        # Override OglLink anchors
        #
        srcAnchor, dstAnchor = self._createAnchorPoints(
            srcShape=srcShape, pyutSDMessage=pyutSDMessage, dstShape=dstShape)
        srcAnchorPosition = srcAnchor.GetPosition()
        dstAnchorPosition = dstAnchor.GetPosition()

        self._srcAnchor: AnchorPoint = srcAnchor
        self._dstAnchor: AnchorPoint = dstAnchor

        oglSource: OglPosition = OglPosition.tupleToOglPosition(
            srcAnchorPosition)
        oglDestination: OglPosition = OglPosition.tupleToOglPosition(
            dstAnchorPosition)
        linkLength: float = self._computeLinkLength(
            srcPosition=oglSource, destPosition=oglDestination)
        dx, dy = self._computeDxDy(srcPosition=oglSource,
                                   destPosition=oglDestination)

        centerMessageX: int = round(-dy * 5 / linkLength)
        centerMessageY: int = round(dx * 5 / linkLength)

        self._messageLabel: TextShape = self.AddText(
            centerMessageX, centerMessageY,
            pyutSDMessage.getMessage())  # font=self._defaultFont

        self.updateMessage()
        self.SetDrawArrow(True)
Exemple #6
0
    def Draw(self, dc: DC, withChildren: bool = False):
        """
        Called to draw the link content.
        We are going to draw all of our stuff, cardinality, Link name, etc.

        Args:
            dc:     Device context
            withChildren:   draw the children or not
        """
        OglLink.Draw(self, dc, withChildren)
        sp: Tuple[int, int] = self._srcAnchor.GetPosition()
        dp: Tuple[int, int] = self._dstAnchor.GetPosition()

        oglSp: OglPosition = OglPosition(x=sp[0], y=sp[1])
        oglDp: OglPosition = OglPosition(x=dp[0], y=dp[1])

        self._drawSourceCardinality(dc=dc, sp=oglSp, dp=oglDp)
        self._drawCenterLabel(dc=dc, sp=oglSp, dp=oglDp)
        self._drawDestinationCardinality(dc=dc, sp=oglSp, dp=oglDp)
Exemple #7
0
    def testExceptionRaised(self):
        """
        https://ongspxm.github.io/blog/2016/11/assertraises-testing-for-errors-in-unittest/
        """
        from org.pyut.ogl.IllegalOperationException import IllegalOperationException

        mockSourceShape:      MagicMock = self._createMockShape(OglPosition(x=100, y=100), (10, 100))
        mockDestinationShape: MagicMock = self._createMockShape(OglPosition(x=500, y=500), (10, 100))

        mockPyutLink:         MagicMock = MagicMock()

        badOglLink: OglLink = OglLink(srcShape=mockSourceShape, pyutLink=mockPyutLink, dstShape=mockDestinationShape)

        badOglLink._srcShape = None
        self.assertRaises(IllegalOperationException, lambda: self._raiseException(badOglLink))

        badOglLink._srcShape = self._createMockShape(OglPosition(x=100, y=100), (10, 100))

        badOglLink._destShape = None
        self.assertRaises(IllegalOperationException, lambda: self._raiseException(badOglLink))
Exemple #8
0
    def _findClosestControlPoint(self, clickPoint: Tuple[int, int]) -> ControlPoint:

        controlPoints = self.GetControlPoints()

        distance:     float        = 1000.0    # Impossibly long distance
        closestPoint: ControlPoint = cast(ControlPoint, None)
        srcPosition:  OglPosition  = OglPosition(x=clickPoint[0], y=clickPoint[1])

        for controlPoint in controlPoints:
            xy:    Tuple[int, int] = controlPoint.GetPosition()
            destX: int = xy[0]
            destY: int = xy[1]
            destPosition: OglPosition = OglPosition(x=destX, y=destY)

            dx, dy = self._computeDxDy(srcPosition, destPosition)
            currentDistance = sqrt(dx*dx + dy*dy)
            self.clsLogger.debug(f'{currentDistance=}')
            if currentDistance <= distance:
                distance = currentDistance
                closestPoint = cast(ControlPoint, controlPoint)

        return closestPoint
Exemple #9
0
    def computeMidPoint(cls, srcPosition: OglPosition, destPosition: OglPosition) -> OglPosition:
        """

        Args:
            srcPosition:        Tuple x,y source position
            destPosition:       Tuple x,y destination position

        Returns:
                A tuple that is the x,y position between `srcPosition` and `destPosition`

            [Reference]: https://mathbitsnotebook.com/Geometry/CoordinateGeometry/CGmidpoint.html
        """
        if OglUtils.clsLogger.isEnabledFor(DEBUG):
            OglUtils.clsLogger.debug(f'{srcPosition=}  {destPosition=}')
        x1 = srcPosition.x
        y1 = srcPosition.y
        x2 = destPosition.x
        y2 = destPosition.y

        midPointX = round(abs(x1 + x2) / 2)
        midPointY = round(abs(y1 + y2) / 2)

        return OglPosition(x=midPointX, y=midPointY)
Exemple #10
0
class TestOglLink(TestBase):
    """
    """
    MOCK_SOURCE_POSITION:       OglPosition = OglPosition(x=100, y=100)
    MOCK_DESTINATION_POSITION:  OglPosition = OglPosition(x=500, y=500)

    clsLogger: Logger = None

    @classmethod
    def setUpClass(cls):
        TestBase.setUpLogging()
        TestOglLink.clsLogger = getLogger(__name__)

    def setUp(self):
        self.logger: Logger = TestOglLink.clsLogger

        PyutPreferences.determinePreferencesLocation()

    def tearDown(self):
        pass

    def testExceptionRaised(self):
        """
        https://ongspxm.github.io/blog/2016/11/assertraises-testing-for-errors-in-unittest/
        """
        from org.pyut.ogl.IllegalOperationException import IllegalOperationException

        mockSourceShape:      MagicMock = self._createMockShape(OglPosition(x=100, y=100), (10, 100))
        mockDestinationShape: MagicMock = self._createMockShape(OglPosition(x=500, y=500), (10, 100))

        mockPyutLink:         MagicMock = MagicMock()

        badOglLink: OglLink = OglLink(srcShape=mockSourceShape, pyutLink=mockPyutLink, dstShape=mockDestinationShape)

        badOglLink._srcShape = None
        self.assertRaises(IllegalOperationException, lambda: self._raiseException(badOglLink))

        badOglLink._srcShape = self._createMockShape(OglPosition(x=100, y=100), (10, 100))

        badOglLink._destShape = None
        self.assertRaises(IllegalOperationException, lambda: self._raiseException(badOglLink))

    def testBasicComputeLinkLength(self):

        mockSourceShape:      MagicMock = self._createMockShape(self.MOCK_SOURCE_POSITION, (10, 100))
        mockDestinationShape: MagicMock = self._createMockShape(self.MOCK_DESTINATION_POSITION, (10, 100))

        mockPyutLink:         MagicMock = MagicMock()

        oglLink: OglLink = OglLink(srcShape=mockSourceShape, pyutLink=mockPyutLink, dstShape=mockDestinationShape)
        actualLength:   float = oglLink._computeLinkLength(self.MOCK_SOURCE_POSITION, self.MOCK_DESTINATION_POSITION)
        expectedLength: float = 565.685
        self.assertAlmostEqual(expectedLength, actualLength, places=2)

    def testFindClosestControlPoint(self):

        mockSourceShape:      MagicMock = self._createMockShape(self.MOCK_SOURCE_POSITION, (10, 100))
        mockDestinationShape: MagicMock = self._createMockShape(self.MOCK_DESTINATION_POSITION, (10, 100))

        mockPyutLink:         MagicMock = MagicMock()

        oglLink: OglLink = OglLink(srcShape=mockSourceShape, pyutLink=mockPyutLink, dstShape=mockDestinationShape)

        pointsToAdd: ControlPoints = self._createControlPoints()

        for cp in pointsToAdd:
            oglLink.AddControl(cp)

        self.logger.debug(f'{len(oglLink._controls)=}')

        expectedControlPoint: ControlPoint = pointsToAdd[0]
        closestPoint:         ControlPoint = oglLink._findClosestControlPoint(clickPoint=(100, 151))

        self.logger.debug(f'{closestPoint=}')

        self.assertEqual(expectedControlPoint, closestPoint, 'Found incorrect control point')

    def _createMockShape(self, position: OglPosition, size: Tuple[int, int]) -> MagicMock:

        mockShape: MagicMock = MagicMock()

        mockShape.GetPosition.return_value = (position.x, position.y)
        mockShape.GetSize.return_value     = size

        return mockShape

    def _raiseException(self, badOglLink: OglLink):
        badOglLink._computeDxDy(srcPosition=self.MOCK_SOURCE_POSITION, destPosition=self.MOCK_DESTINATION_POSITION)

    def _createControlPoints(self) -> ControlPoints:
        """
        Create a list of control points between the two mock shapes

        Returns:
        """
        cp1: ControlPoint = ControlPoint(x=100, y=200)
        cp2: ControlPoint = ControlPoint(x=200, y=200)
        cp3: ControlPoint = ControlPoint(x=300, y=300)
        cp4: ControlPoint = ControlPoint(x=400, y=400)

        controlPoints: ControlPoints = cast(ControlPoints, [cp1, cp2, cp3, cp4])

        return controlPoints
Exemple #11
0
class OglAssociationLabel:

    text: str = ''
    oglPosition: OglPosition = OglPosition(x=0, y=0)