def AttachmentIsValid(self, attachment): totalNumberAttachments = len(self.GetRegions()) * 2 + 2 if attachment >= totalNumberAttachments: return Shape.AttachmentIsValid(self, attachment) else: return attachment >= 0
def GetAttachmentPosition(self, attachment, nth = 0, no_arcs = 1, line = None): totalNumberAttachments = len(self.GetRegions()) * 2 + 2 if self.GetAttachmentMode() == ATTACHMENT_MODE_NONE or attachment >= totalNumberAttachments: return Shape.GetAttachmentPosition(self, attachment, nth, no_arcs) n = len(self.GetRegions()) isEnd = line and line.IsEnd(self) left = self._xpos - self._width / 2.0 right = self._xpos + self._width / 2.0 top = self._ypos - self._height / 2.0 bottom = self._ypos + self._height / 2.0 # Zero is top, n + 1 is bottom if attachment == 0: y = top if self._spaceAttachments: if line and line.GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE: # Align line according to the next handle along point = line.GetNextControlPoint(self) if point[0] < left: x = left elif point[0] > right: x = right else: x = point[0] else: x = left + (nth + 1) * self._width / (no_arcs + 1.0) else: x = self._xpos elif attachment == n + 1: y = bottom if self._spaceAttachments: if line and line.GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE: # Align line according to the next handle along point = line.GetNextControlPoint(self) if point[0] < left: x = left elif point[0] > right: x = right else: x = point[0] else: x = left + (nth + 1) * self._width / (no_arcs + 1.0) else: x = self._xpos else: # Left or right isLeft = not attachment < (n + 1) if isLeft: i = totalNumberAttachments - attachment - 1 else: i = attachment - 1 region = self.GetRegions()[i] if region: if isLeft: x = left else: x = right # Calculate top and bottom of region top = self._ypos + region._y - region._height / 2.0 bottom = self._ypos + region._y + region._height / 2.0 # Assuming we can trust the absolute size and # position of these regions if self._spaceAttachments: if line and line.GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE: # Align line according to the next handle along point = line.GetNextControlPoint(self) if point[1] < bottom: y = bottom elif point[1] > top: y = top else: y = point[1] else: y = top + (nth + 1) * region._height / (no_arcs + 1.0) else: y = self._ypos + region._y else: return False return x, y