def __draw_link(self, vlink: VLink) -> None: """Draw a link.""" if vlink.name == VLink.FRAME or not vlink.points: return pen = QPen() # Rearrange: Put the nearest point to the next position. qpoints = convex_hull( [(c.x * self.zoom, c.y * -self.zoom) for c in vlink.points_pos(self.vpoints)], as_qpoint=True) if ( self.select_mode == SelectMode.LINK and self.vlinks.index(vlink) in self.selections ): pen.setWidth(self.link_width + 6) pen.setColor(Qt.black if self.monochrome else QColor(161, 16, 239)) self.painter.setPen(pen) self.painter.drawPolygon(*qpoints) pen.setWidth(self.link_width) pen.setColor(Qt.black if self.monochrome else color_qt(vlink.color)) self.painter.setPen(pen) self.painter.drawPolygon(*qpoints) if not self.show_point_mark: return pen.setColor(Qt.darkGray) self.painter.setPen(pen) p_count = len(qpoints) cen_x = sum(p.x() for p in qpoints) / p_count cen_y = sum(p.y() for p in qpoints) / p_count self.painter.drawText( QRectF(cen_x - 50, cen_y - 50, 100, 100), Qt.AlignCenter, f'[{vlink.name}]' )
def catch_l(vlink: VLink) -> bool: """Detection function for links. + Is polygon: Using Qt polygon geometry. + If just a line: Create a range for mouse detection. """ points = [(c.x * self.zoom, c.y * -self.zoom) for c in vlink.points_pos(self.vpoints)] if len(points) > 2: polygon = QPolygonF(convex_hull(points, as_qpoint=True)) else: polygon = QPolygonF(convex_hull( [(x + self.sr, y + self.sr) for x, y in points] + [(x - self.sr, y - self.sr) for x, y in points], as_qpoint=True )) if rect: return polygon.intersects( QPolygonF(self.selector.to_rect(self.zoom))) else: return polygon.containsPoint( QPointF(self.selector.x, -self.selector.y) * self.zoom, Qt.WindingFill )