def connect(self, source: Mobject, target: Mobject, label: Optional[str] = None) -> Connection: result = Connection() label_direction = UP label_buff = 0 arrow: Optional[Arrow] = None if source.get_x(RIGHT) <= target.get_x(LEFT): arrow = Arrow(start=source.get_edge_center(RIGHT), end=target.get_edge_center(LEFT), buff=0) label_direction = UP elif source.get_x(LEFT) >= target.get_x(RIGHT): arrow = Arrow(start=source.get_edge_center(LEFT), end=target.get_edge_center(RIGHT), buff=0) label_direction = UP elif source.get_y(DOWN) >= target.get_y(UP): arrow = Arrow(start=source.get_edge_center(DOWN), end=target.get_edge_center(UP), buff=0) label_direction = RIGHT label_buff = VERTICAL_ARROW_LABEL_BUFF elif source.get_y(UP) <= target.get_y(DOWN): arrow = Arrow(start=source.get_edge_center(UP), end=target.get_edge_center(DOWN), buff=0) label_direction = RIGHT label_buff = VERTICAL_ARROW_LABEL_BUFF if not arrow: raise ValueError("Unable to connect") result.add(arrow) if label: text = Text(label, font=self.text_font, size=0.7, slant=ITALIC) text.next_to(arrow, direction=label_direction, buff=label_buff) result.add(text) return result
def __init__(self, source: Mobject, target: Mobject, label: Optional[str] = None, font=DEFAULT_FONT, **kwargs): """ Args: source: The source object target: The target object label: The optional label text to put over the arrow """ super().__init__(**kwargs) self.font = font label_direction = UP label_buff = 0 arrow: Optional[Arrow] = None if source.get_x(RIGHT) <= target.get_x(LEFT): arrow = Arrow(start=source.get_edge_center(RIGHT), end=target.get_edge_center(LEFT), buff=0) label_direction = UP elif source.get_x(LEFT) >= target.get_x(RIGHT): arrow = Arrow(start=source.get_edge_center(LEFT), end=target.get_edge_center(RIGHT), buff=0) label_direction = UP elif source.get_y(DOWN) >= target.get_y(UP): arrow = Arrow(start=source.get_edge_center(DOWN), end=target.get_edge_center(UP), buff=0) label_direction = RIGHT label_buff = VERTICAL_ARROW_LABEL_BUFF elif source.get_y(UP) <= target.get_y(DOWN): arrow = Arrow(start=source.get_edge_center(UP), end=target.get_edge_center(DOWN), buff=0) label_direction = RIGHT label_buff = VERTICAL_ARROW_LABEL_BUFF if not arrow: raise ValueError("Unable to connect") self.add(arrow) if label: text = Text(label, font=self.font, size=0.5, slant=ITALIC) text.next_to(arrow, direction=label_direction, buff=label_buff) self.add(text)