def simple_cut(cutter: Rect, line: QLine): t1, t2 = count_T(line.p1(), cutter), count_T(line.p2(), cutter) flag = 1 r1, r2 = copy.deepcopy(line.p1()), copy.deepcopy(line.p2()) # отрезок полностью видимый if t1 | t2 == 0: return step_31(flag, r1, r2) pl = t1 & t2 # отрезок лежит по одну из сторон окна (невидимый)- тривиальная невидимость if pl != 0: flag = -1 return step_31(flag) # отрезок частично видимый if t1 == 0: r1 = copy.deepcopy(line.p1()) q = copy.deepcopy(line.p2()) i = 2 return step_15(flag, i, q, line, r1, r2, cutter) if t2 == 0: r1 = copy.deepcopy(line.p2()) q = copy.deepcopy(line.p1()) i = 2 return step_15(flag, i, q, line, r1, r2, cutter) # внутри окна нет концов отрезка i = 0 return step_12(flag, i, line, r1, r2, cutter)
class CameraTri(QGraphicsItem): """A triangle showing a level of the camera""" def __init__(self, start, end, pos, parent=None): super().__init__(parent) self.start, self.end = start, end self.pos = pos self.line = QLine(0, 0, 100, 0) def updatePos(self, pos): self.pos = pos self.update() def getPoint(self): if self.pos < self.start: return self.line.p1() elif self.pos > self.end: return self.line.p2() else: c = (self.pos - self.start) / (self.end - self.start) return self.line.p1() * (1 - c) + self.line.p2() * c def paint(self, painter: QPainter, option, widget=None): rect = getRect(widget) delta = QPoint(5, 0) self.line = QLine(rect.bottomRight() + delta * 2, rect.topRight() + delta * 2) point = self.getPoint() painter.setPen(QPen(Qt.black, 0)) painter.setBrush(Qt.black) offset_h = QPointF(10, 0) offset_v = QPointF(0, 10) points = QPolygonF(( QPointF(point), QPointF(point + offset_h - offset_v), QPointF(point + offset_h + offset_v), QPointF(point) )) painter.drawPolygon(points, 4) def boundingRect(self): offset = QPointF(20, 0) return QRectF(self.line.p1() - offset, self.line.p2() + offset)
def step_12(flag: int, i: int, line: QLine, r1: QPoint, r2: QPoint, cutter: Rect): # внутри окна нет концов отрезков i += 1 if i > 2: return step_31(flag, r1, r2) q = line.p1() if i == 1 else line.p2() return step_15(flag, i, q, line, r1, r2, cutter)
class NGL_Line(NGL_Base): """ NGL_Line(NGL_Base) Provides a embedded NGL library line widget. """ # Signal used to indicate changes to the status of the widget. valueChanged = pyqtSignal(QLine) def __init__(self, parent=None): """ Constructor for ngl widget """ super(NGL_Line, self).__init__(parent) self._line = QLine(0, 0, 150, 150) self._static = True self.update() def paintEvent(self, event): """ Paint ngl widget event """ p = QPainter() p.begin(self) p.drawLine(self._line) p.end() def sizeHint(self): """ Return Qt sizeHint """ return self._size() def _size(self): width = abs(self._line.x2() - self._line.x1()) + 1 height = abs(self._line.y2() - self._line.y1()) + 1 return QSize(width, height) def update(self): self._size_update() super(NGL_Line, self).update() def _size_update(self): """ Size update for widget """ w = self._size().width() h = self._size().height() self.setMinimumSize(w, h) self.setMaximumSize(w, h) # # Provide getter and setter methods for the property. @pyqtProperty(QPoint) def P1(self): return self._line.p1() @P1.setter def P1(self, point): self._line.setP1(point) self.update() # Provide getter and setter methods for the property. @pyqtProperty(QPoint) def P2(self): return self._line.p2() @P2.setter def P2(self, point): self._line.setP2(point) self.update() def doNGLCode(self, **kwargs): template = 'NGL_GP_DrawLine({x0}, {y0}, {x1}, {y1}, {color});' # convert coordinates g = self._ngl_geometry() y1 = self._ngl_y(self.P1.y(), g.height() - 1) y2 = self._ngl_y(self.P2.y(), g.height() - 1) return template.format( x0 = g.x(), y0 = g.y() + y1, x1 = g.x() + g.width() - 1, y1 = g.y() + y2, color = self._ngl_color('color: rgb'))