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}')
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}')
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}')
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
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)
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)
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 _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
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)
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
class OglAssociationLabel: text: str = '' oglPosition: OglPosition = OglPosition(x=0, y=0)