def test_angle(self): self.assertEqual(0.0, angle(QtCore.QPointF(0, 0), QtCore.QPointF(+1, 0))) self.assertEqual(+math.pi / 2, angle(QtCore.QPointF(0, 0), QtCore.QPointF(0, -1))) self.assertEqual(-math.pi / 2, angle(QtCore.QPointF(0, 0), QtCore.QPointF(0, +1))) self.assertEqual(math.pi, angle(QtCore.QPointF(0, 0), QtCore.QPointF(-1, 0))) self.assertEqual(+math.pi / 4, angle(QtCore.QPointF(0, 0), QtCore.QPointF(1, -1)))
def updatePos(self, points): """ Update the current text position with respect to the shape. :type points: T <= tuple | list """ if not points: return if self.isCentered(): # Here the label should be centered in the edge path. # In this case we need to handle 2 different situations: # 1. when the edge path is composed of an even number of points (odd subpaths) # 2. when the edge path is composed of an odd number of points (even subpaths) if len(points) % 2 == 0: # If we have an even number of points, compute the position of the label # according to the midpoint of the subpath connecting the middle points. p1 = points[int(len(points) / 2) - 1] p2 = points[int(len(points) / 2)] mid = midpoint(p1, p2) rad = angle(p1, p2) spaceX = -40 spaceY = -16 self.setPos( QtCore.QPointF(mid.x() + spaceX * sin(rad), mid.y() + spaceY * cos(rad))) else: # If we have an odd number of points compute the position # of the label according the point in the middle of the edge. mid = points[int(len(points) / 2)] rad1 = angle(points[int(len(points) / 2) - 1], mid) rad2 = angle(mid, points[int(len(points) / 2) + 1]) diff = rad2 - rad1 spaceX1 = 0 spaceX2 = 0 spaceY = -16 if 0 < diff < M_PI: spaceX1 = -80 * sin(rad1) spaceX2 = -80 * sin(rad2) spaceY += spaceY * sin(diff) * 1.8 self.setPos( QtCore.QPointF(mid.x() + spaceX1 + spaceX2, mid.y() + spaceY)) else: # Here instead we will place the label near the intersection with # the target shape: this is mostly used for input edges connecting # role chain nodes and property assertion nodes, so we can inspect # visually the partecipation order of connected nodes without having # to scroll the diagram. rad = angle(points[-2], points[-1]) pos = points[-1] - QtCore.QPointF( sin(rad + M_PI / 3.0) * 20, cos(rad + M_PI / 3.0) * 20) self.setPos(pos)
def updatePos(self, points): """ Update the current text position with respect to the shape. :type points: T <= tuple | list """ if not points: return if self.isCentered(): # Here the label should be centered in the edge path. # In this case we need to handle 2 different situations: # 1. when the edge path is composed of an even number of points (odd subpaths) # 2. when the edge path is composed of an odd number of points (even subpaths) if len(points) % 2 == 0: # If we have an even number of points, compute the position of the label # according to the midpoint of the subpath connecting the middle points. p1 = points[int(len(points) / 2) - 1] p2 = points[int(len(points) / 2)] mid = midpoint(p1, p2) rad = angle(p1, p2) spaceX = -40 spaceY = -16 self.setPos(QtCore.QPointF(mid.x() + spaceX * sin(rad), mid.y() + spaceY * cos(rad))) else: # If we have an odd number of points compute the position # of the label according the point in the middle of the edge. mid = points[int(len(points) / 2)] rad1 = angle(points[int(len(points) / 2) - 1], mid) rad2 = angle(mid, points[int(len(points) / 2) + 1]) diff = rad2 - rad1 spaceX1 = 0 spaceX2 = 0 spaceY = -16 if 0 < diff < M_PI: spaceX1 = -80 * sin(rad1) spaceX2 = -80 * sin(rad2) spaceY += spaceY * sin(diff) * 1.8 self.setPos(QtCore.QPointF(mid.x() + spaceX1 + spaceX2, mid.y() + spaceY)) else: # Here instead we will place the label near the intersection with # the target shape: this is mostly used for input edges connecting # role chain nodes and property assertion nodes, so we can inspect # visually the partecipation order of connected nodes without having # to scroll the diagram. rad = angle(points[-2], points[-1]) pos = points[-1] - QtCore.QPointF(sin(rad + M_PI / 3.0) * 20, cos(rad + M_PI / 3.0) * 20) self.setPos(pos)
def test_angle(): assert 0.0 == angle(QtCore.QPointF(0, 0), QtCore.QPointF(+1, 0)) assert +math.pi / 2 == angle(QtCore.QPointF(0, 0), QtCore.QPointF(0, -1)) assert -math.pi / 2 == angle(QtCore.QPointF(0, 0), QtCore.QPointF(0, +1)) assert math.pi == angle(QtCore.QPointF(0, 0), QtCore.QPointF(-1, 0)) assert +math.pi / 4 == angle(QtCore.QPointF(0, 0), QtCore.QPointF(1, -1))