예제 #1
0
def add_door_right(room_, side_):
    line = QLineF(room_.topRight(), room_.bottomRight())

    line_lenght = int(line.length())
    step = line_lenght / 100.

    line_points = []
    for t in np.arange(0.25, 0.75, step):
        line_point = line.pointAt(t)
        line_points.append(QPointF(line_point.x(), line_point.y()))

    random_center_door = random.choice(line_points)

    left_door = QPointF(random_center_door.x(), random_center_door.y() - 0.5)
    right_door = QPointF(random_center_door.x(), random_center_door.y() + 0.5)

    if side_ == 'bottom':
        polygon = QPolygonF([
            right_door,
            room_.topRight(),
            room_.topLeft(),
            room_.bottomLeft(),
            room_.bottomRight(), left_door
        ])

    elif side_ == 'top':
        polygon = QPolygonF([
            right_door,
            room_.bottomRight(),
            room_.bottomLeft(),
            room_.topLeft(),
            room_.topRight(), left_door
        ])

    return polygon
예제 #2
0
    def paintLimits(self, painter, limit, rect):
        hh = int(rect.height() / 2)
        posFo = QPolygonF(
            [QPointF(s, (f * hh) + hh + 2) for s, f in enumerate(limit)])
        negFo = QPolygonF(
            [QPointF(s, (-f * hh) + hh - 2) for s, f in enumerate(limit)])

        painter.save()
        painter.setPen(QPen(self.limitColor, 2))
        painter.drawPolyline(posFo)
        painter.drawPolyline(negFo)
        painter.restore()
    def compute_circle_arc_polygon(self,
                                   x0,
                                   y0,
                                   radius,
                                   phi_begin,
                                   arc_length,
                                   steps=32):
        polygon = QPolygonF()

        x0_t, y0_t = self.convert_position(x0, y0)
        polygon.append(QPointF(x0_t, y0_t))

        begin = phi_begin
        end = arc_length + phi_begin
        step = (begin - end) / steps

        angle = float(begin)

        for i in range(steps):
            x = x0 + radius * numpy.cos(angle)
            y = y0 + radius * numpy.sin(angle)

            x_t, y_t = self.convert_position(x, y)

            polygon.append(QPointF(x_t, y_t))

            angle += step

        return polygon
예제 #4
0
    def _generate_indicators(self, **kwargs):  # pylint: disable=unused-argument
        """
        Paint arrow indicators of selected instructions and labels.
        """
        scene = self.scene()
        for item in self._map_indicator_items:
            scene.removeItem(item)
        self._map_indicator_items.clear()

        for addr in list(self.disasm_view.infodock.selected_insns) + list(
                self.disasm_view.infodock.selected_labels):
            pos = self._get_pos_from_addr(addr)
            if pos is None:
                continue

            pos -= 1  # this is the top-left x coordinate of our arrow body (the rectangle)

            pen = QPen(Qt.yellow)
            brush = QBrush(Qt.yellow)
            item = QGraphicsRectItem(QRectF(pos, 0, 2, 10), parent=self)
            item.setPen(pen)
            item.setBrush(brush)
            item.setZValue(self.ZVALUE_INDICATOR)
            self._map_indicator_items.append(item)

            triangle = QPolygonF()
            triangle.append(QPointF(pos - 1, 10))
            triangle.append(QPointF(pos + 3, 10))
            triangle.append(QPointF(pos + 1, 12))
            triangle.append(QPointF(pos - 1, 10))
            item = QGraphicsPolygonItem(triangle, parent=self)
            item.setPen(pen)
            item.setBrush(brush)
            item.setZValue(self.ZVALUE_INDICATOR)
            self._map_indicator_items.append(item)
예제 #5
0
    def newLoadData(self, threadName, timestamps, load):
        """
        Slot called when new load data is available

        :param threadName: the name of the thread given as string
        :param loadData: the load data, given as the QByteArray of a n x 2 np.float32 array
        :return:
        """
        atimestamps = np.frombuffer(memoryview(timestamps), dtype=np.int64)
        aload = np.frombuffer(memoryview(load), dtype=np.float32)
        if LoadDisplayWidget.baseTimestamp is None:
            LoadDisplayWidget.baseTimestamp = np.min(atimestamps)
        if threadName not in self._loadData:
            self._loadData[threadName] = QPolygonF()
        p = self._loadData[threadName]
        for i in range(aload.shape[0]):
            x = 1e-9 * (atimestamps[i] - self.baseTimestamp)
            if p.size() > 0 and p.at(p.count() - 1).x() > x:
                # it seems that QT re-orders slots :( we have to maintain the order here
                idx = p.count()
                while idx > 0 and p.at(idx - 1).x() > x:
                    idx -= 1
                p.insert(idx, QPointF(x, aload[i]))
            else:
                p.append(QPointF(x, aload[i]))
        if p[p.count() - 1].x() - p[0].x() > 60:
            for i in range(p.count()):
                if p[p.count() - 1].x() - p[i].x() <= 60:
                    p.remove(0, i)
                    break
        self.update()
예제 #6
0
    def center_apartment(self):
        union_polygon = QPolygonF()

        for list in self.dict_rooms_and_corridors_per_side.values():
            for room in list:
                union_polygon = union_polygon.united(
                    room.room_qpolygon)  # Para obtener el bounding box
                self.total_rooms_and_corridors.append(room)

        self.initial_corridor.setLeft(union_polygon.boundingRect().left())
        self.initial_corridor.setRight(union_polygon.boundingRect().right())

        self.total_rooms_and_corridors.append(
            Room(type='corridor',
                 p=self.initial_corridor.topLeft(),
                 w=self.initial_corridor.width(),
                 h=self.initial_corridor.height()))

        union_polygon = union_polygon.united(self.initial_corridor)

        initial_center = union_polygon.boundingRect().center()
        union_polygon.translate(-initial_center)

        self.apartment_boundingRect = union_polygon.boundingRect()

        # Desplazo habitaciones y pasillos al centro
        for i, room in enumerate(self.total_rooms_and_corridors):
            room.room_qpolygon.translate(
                -initial_center
            )  # Desplazo los poligonos para que la habitación esté centrada
            room.room_qrect.translate(-initial_center)
예제 #7
0
def add_door_center(room_):
    line = QLineF(room_.topLeft(), room_.topRight())
    line_lenght = int(
        line.length()
    )  # -1 sin pasillo, 0 antes de la primera habitacion, 1 antes de la segunda

    step = line_lenght / 100.

    line_points = []
    for t in np.arange(0.25, 0.75, step):
        line_point = line.pointAt(t)
        line_points.append(QPointF(line_point.x(), line_point.y()))

    random_center_door = random.choice(line_points)

    left_door = QPointF(random_center_door.x() - 0.5, random_center_door.y())
    right_door = QPointF(random_center_door.x() + 0.5, random_center_door.y())

    polygon = QPolygonF([
        right_door,
        room_.topRight(),
        room_.bottomRight(),
        room_.bottomLeft(),
        room_.topLeft(), left_door
    ])

    return polygon
예제 #8
0
 def updatePath(self):
     axeSize = self.size
     yZero = self.yZero
     try:
         X = []
         for item in self.fixedPoints:
             X.extend([item.B.x() + item.x(), item.C.x() + item.x()])
         X = np.array(X)
         Y = np.array(
             [-(item.A.y() + item.y())
              for item in self.fixedPoints]) + yZero
         T = displacementSpline(X,
                                Y,
                                self.xCoords,
                                clippingInterval=[-self.scene().axeSize, 0],
                                period=self.period)
         self.spline = [
             QPointF(x, y + yZero) for x, y in zip(self.xCoords, -T)
         ]  # scene coord.
         # build path
         polygon = QPolygonF(self.spline)
         qpp = QPainterPath()
         qpp.addPolygon(polygon)
         # stroke path
         stroker = QPainterPathStroker()
         stroker.setWidth(self.strokeWidth)
         mboundingPath = stroker.createStroke(qpp)
         self.setPath(mboundingPath)
     except ValueError:
         pass
예제 #9
0
    def _paint_insn_indicators(self):

        scene = self.view.scene()  # type: QGraphicsScene
        for item in self._insn_indicators:
            scene.removeItem(item)
        self._insn_indicators.clear()

        for selected_insn_addr in self.disasm_view.infodock.selected_insns:
            pos = self._get_pos_from_addr(selected_insn_addr)
            if pos is None:
                continue

            pos -= 1  # this is the top-left x coordinate of our arrow body (the rectangle)

            pen = QPen(Qt.yellow)
            brush = QBrush(Qt.yellow)
            rect = QRectF(pos, 0, 2, 5)
            # rectangle
            item = scene.addRect(rect, pen, brush)
            self._insn_indicators.append(item)
            # triangle
            triangle = QPolygonF()
            triangle.append(QPointF(pos - 1, 5))
            triangle.append(QPointF(pos + 3, 5))
            triangle.append(QPointF(pos + 1, 7))
            triangle.append(QPointF(pos - 1, 5))
            item = scene.addPolygon(triangle, pen, brush)
            self._insn_indicators.append(item)
예제 #10
0
    def setUp(self):
        #Acquire resources
        super(QColorOnSetBrush, self).setUp()

        self.scene = QGraphicsScene()
        poly = QPolygonF()
        self.item = self.scene.addPolygon(poly)
        self.color = QColor('black')
예제 #11
0
    def beforeTest(self):
        points = [QPointF(0, 0), QPointF(100, 100), QPointF(0, 100)]
        pol = self.scene.addPolygon(QPolygonF(points))
        self.assert_(isinstance(pol, QGraphicsPolygonItem))
        self.wrp = weakref.ref(pol, pol_del)

        #refcount need be 3 because one ref for QGraphicsScene, and one to rect obj
        self.assertEqual(sys.getrefcount(pol), 3)
예제 #12
0
 def createPoly(self, n, r, s):
     polygon = QPolygonF()
     w = 360/n                                                       # angle per step
     for i in range(n):                                              # add the points of polygon
         t = w*i + s
         x = r*math.cos(math.radians(t))
         y = r*math.sin(math.radians(t))
         polygon.append(QtCore.QPointF(self.w/2 +x, self.h/2 + y))
예제 #13
0
    def __init__(self, starCount=1, maxStarCount=5):
        self.starCount = starCount
        self.maxStarCount = maxStarCount

        # Create the star shape we'll be drawing.
        self.starPolygon = QPolygonF()
        self.starPolygon.append(QPointF(1.0, 0.5))
        for i in range(1, 5):
            self.starPolygon.append(QPointF(0.5 + 0.5 * cos(0.8 * i * pi),
                                    0.5 + 0.5 * sin(0.8 * i * pi)))

        # Create the diamond shape we'll show in the editor
        self.diamondPolygon = QPolygonF()
        diamondPoints = [QPointF(0.4, 0.5), QPointF(0.5, 0.4),
                         QPointF(0.6, 0.5), QPointF(0.5, 0.6),
                         QPointF(0.4, 0.5)]
        self.diamondPolygon.append(diamondPoints)
예제 #14
0
 def paintWaves(self, painter, waves, rect):
     hh = int(rect.height() / 2)
     curve = QPolygonF(
         [QPointF(s, (-f * hh) + hh) for s, f in enumerate(waves)])
     painter.save()
     painter.setPen(QPen(self.waveColor, 2))
     painter.drawPolyline(curve)
     painter.restore()
 def draw_shapely_poly(self, scene: QGraphicsScene, poly: Polygon,
                       pen: QPen, brush: QBrush) -> Optional[QPolygonF]:
     if poly.is_empty:
         return None
     points = []
     for x, y in poly.exterior.coords:
         x, y = self._transform_point(Point(x, y))
         points.append(QPointF(x, y))
     return scene.addPolygon(QPolygonF(points), pen, brush)
예제 #16
0
 def updatePath(self, calculate=True):
     """
     Calculates (if calculate=true) and displays the spline.
     Called by activePoint and activeTangent mouse event
     @param calculate:
     @type calculate: bool
     """
     # calculate the array of slopes
     d = [
         item.controlPoint - item.contactPoint
         for item in self.fixedTangents
     ]
     d1 = -np.array(list(map(lambda a: a.y(), d)))
     d2 = np.array(list(map(lambda a: a.x(), d)))
     d = d1 / d2
     # add boundary points if needed
     X = [item.x() for item in self.fixedPoints]
     Y = [item.y() for item in self.fixedPoints]
     X0, X1 = X[0], X[-1]
     Y0, Y1 = Y[0], Y[-1]
     t = (Y1 - Y0) / (X1 - X0)
     Y2 = Y0 - X0 * t
     Y3 = Y0 + (self.size - X0) * t
     d = d.tolist()
     if X[0] > 0.0:
         X.insert(0, 0.0)
         Y.insert(0, Y2)
         d.insert(0, t)
     if X[-1] < self.size:
         X.append(self.size)
         Y.append(Y3)
         d.append(t)
     d = np.array(d)
     try:
         if calculate:
             T = interpolationQuadSpline(
                 np.array(X) / self.size, -np.array(Y) / self.size,
                 d) * self.size
             self.spline = [
                 QPointF(x, y)
                 for x, y in zip(np.arange(256) * (self.size / 255.0), -T)
             ]
         for P in self.spline:
             if P.x() < X0:
                 P.setY(Y0)
             elif P.x() > X1:
                 P.setY(Y1)
         polygon = QPolygonF(self.spline)
         qpp = QPainterPath()
         qpp.addPolygon(polygon)
         # stroke path
         stroker = QPainterPathStroker()
         stroker.setWidth(self.strokeWidth)
         mboundingPath = stroker.createStroke(qpp)
         self.setPath(mboundingPath)
     except Exception as e:
         print(str(e))
예제 #17
0
 def create_room(self):
     print(
         f'Creating room of type {self.type} with width = {self.width} and height = {self.height}'
     )
     self.room_qrect = QRectF(self.initial_point.x(),
                              self.initial_point.y(), self.width,
                              self.height)
     self.room_qpolygon = QPolygonF(self.room_qrect)
     self.area = abs(self.width * self.height)
예제 #18
0
 def getFrozenQuad(self):
     """
     Returns the starting quad for the current type of transformation
     @return:
     @rtype: QPolygonF
     """
     poly = QPolygonF()
     for role in ['topLeft', 'topRight', 'bottomRight', 'bottomLeft']:
         poly.append(self.btnDict[role].posRelImg_frozen)
     return poly
예제 #19
0
 def getSourceQuad(self):
     """
     Returns the starting quad for the transformation in progress
     @return:
     @rtype: QPolygonF
     """
     poly = QPolygonF()
     for role in ['topLeft', 'topRight', 'bottomRight', 'bottomLeft']:
         poly.append(self.btnDict[role].posRelImg_ori)
     return poly
예제 #20
0
 def __init__(self, type='genericRoom', p=QPointF(), w=-1, h=-1):
     self.type = type  # corridor, bedroom, kitchen, bathroom, etc
     self.width = w
     self.height = h
     self.initial_point = p
     self.room_qrect = QRectF()
     self.room_qpolygon = QPolygonF()
     self.area = -1
     self.door_position = None
     self.create_room()
예제 #21
0
 def getTargetQuad(self):
     """
     Returns the current quad, as defined by the 4 buttons.
     Coordinates are relative to the full size image
     @return:
     @rtype: QPolygonF
     """
     poly = QPolygonF()
     for role in ['topLeft', 'topRight', 'bottomRight', 'bottomLeft']:
         poly.append(self.btnDict[role].posRelImg)
     return poly
예제 #22
0
    def addBackground(self):
        scene = self.scene()

        if not DisplayOptions.map_poly:
            bg = QPixmap("./resources/" + self.game.theater.overview_image)
            scene.addPixmap(bg)

            # Apply graphical effects to simulate current daytime
            if self.game.current_turn_time_of_day == TimeOfDay.Day:
                pass
            elif self.game.current_turn_time_of_day == TimeOfDay.Night:
                ov = QPixmap(bg.width(), bg.height())
                ov.fill(CONST.COLORS["night_overlay"])
                overlay = scene.addPixmap(ov)
                effect = QGraphicsOpacityEffect()
                effect.setOpacity(0.7)
                overlay.setGraphicsEffect(effect)
            else:
                ov = QPixmap(bg.width(), bg.height())
                ov.fill(CONST.COLORS["dawn_dust_overlay"])
                overlay = scene.addPixmap(ov)
                effect = QGraphicsOpacityEffect()
                effect.setOpacity(0.3)
                overlay.setGraphicsEffect(effect)

        else:
            # Polygon display mode
            if self.game.theater.landmap is not None:

                for sea_zone in self.game.theater.landmap[2]:
                    print(sea_zone)
                    poly = QPolygonF([QPointF(*self._transform_point(Point(point[0], point[1]))) for point in sea_zone])
                    scene.addPolygon(poly, CONST.COLORS["sea_blue"], CONST.COLORS["sea_blue"])

                for inclusion_zone in self.game.theater.landmap[0]:
                    poly = QPolygonF([QPointF(*self._transform_point(Point(point[0], point[1]))) for point in inclusion_zone])
                    scene.addPolygon(poly, CONST.COLORS["grey"], CONST.COLORS["dark_grey"])

                for exclusion_zone in self.game.theater.landmap[1]:
                    poly = QPolygonF([QPointF(*self._transform_point(Point(point[0], point[1]))) for point in exclusion_zone])
                    scene.addPolygon(poly, CONST.COLORS["grey"], CONST.COLORS["dark_dark_grey"])
예제 #23
0
    def paintEngine(self):
        myGradient = QLinearGradient()
        myPen = QPen()
        myPolygon = QPolygonF()

        myPath = QPainterPath()
        myPath.addPolygon(myPolygon)

        painter = QPainter()
        painter.setBrush(myGradient)
        painter.setPen(myPen)
        painter.drawPath(myPath)
 def drawArrow(self):
     line = QLineF(self._edge2, self.__destPoint)
     v = line.unitVector()
     v.setLength(12)
     v.translate(QPointF(line.dx(), line.dy()))
     n = v.normalVector()
     n.setLength(n.length() * 0.5)
     n2 = n.normalVector().normalVector()
     p1 = v.p2()
     p2 = n.p2()
     p3 = n2.p2()
     return QPolygonF([p1, p2, p3, p1])
예제 #25
0
    def __init__(self, type='genericRoom', p=QPointF(), w=-1, h=-1):
        self.type = type  # corridor, bedroom, kitchen, bathroom, etc
        self.width = w
        self.height = h
        self.initial_point = p
        self.room_qrect = QRectF()
        self.room_qpolygon = QPolygonF()
        self.area = -1
        self.side = None
        self.door_loc = -1  # 0 entre topL y topR, 1 entre topR y bottomR, 2 entre bottomR y bottomL y 3 entr bL y tL

        self.create_room()
예제 #26
0
    def testquadToQuad(self):
        q1 = QPolygonF()
        q1.append(QPointF(10.0, 10.0))
        q1.append(QPointF(20.0, 10.0))
        q1.append(QPointF(10.0, -10.0))
        q1.append(QPointF(20.0, -10.0))

        q2 = QPolygonF()
        q2.append(QPointF(20.0, 20.0))
        q2.append(QPointF(30.0, 20.0))
        q2.append(QPointF(20.0, -20.0))
        q2.append(QPointF(30.0, -20.0))

        t1 = QTransform()
        r1 = QTransform.quadToQuad(q1, q2, t1)
        r2 = QTransform.quadToQuad(q1, q2)

        self.assertTrue(r1)
        self.assertTrue(r2)

        self.assertEqual(t1, r2)
예제 #27
0
 def getNewWindow(cls, targetImage=None, axeSize=500, layer=None, parent=None, curveType='quadric'):
     newWindow = graphicsToneForm(targetImage=targetImage, axeSize=axeSize, layer=layer, parent=parent, curveType=curveType)
     newWindow.setWindowTitle(layer.name)
     # init marker
     triangle = QPolygonF()
     s = 10
     triangle.append(QPointF(-s, s))
     triangle.append(QPointF(0, 0))
     triangle.append(QPointF(s, s))
     newWindow.inputMarker = QGraphicsPolygonItem(triangle)
     newWindow.scene().addItem(newWindow.inputMarker)
     newWindow.inputMarker.setBrush(QBrush(Qt.white))
     return newWindow
예제 #28
0
    def testIt(self):
        points = []
        for i in range(0, 4):
            points.append(QPointF(float(i), float(i)))

        p = QPolygonF(points)
        self.assertEqual(len(p), 4)

        i = 0
        for point in p:
            self.assertEqual(int(point.x()), i)
            self.assertEqual(int(point.y()), i)
            i += 1
예제 #29
0
    def testsquareToQuad(self):
        q1 = QPolygonF()
        q1.append(QPointF(10.0, 10.0))
        q1.append(QPointF(20.0, 10.0))
        q1.append(QPointF(10.0, -10.0))
        q1.append(QPointF(20.0, -10.0))

        t1 = QTransform()
        r1 = QTransform.squareToQuad(q1, t1)
        r2 = QTransform.squareToQuad(q1)

        self.assertTrue(r1)
        self.assertTrue(r2)

        self.assertEqual(t1, r2)
예제 #30
0
    def __init__(self, auto_scroll_row: int, level: Level):
        self.auto_scroll_row = auto_scroll_row
        self.level = level

        self.current_pos = QPointF()
        self.horizontal_speed = 0
        self.vertical_speed = 0

        self.rom = ROM()

        self.pixel_length = 1

        self.acceleration_pen = Qt.NoPen
        self.acceleration_brush = Qt.NoBrush
        self.scroll_pen = Qt.NoPen
        self.scroll_brush = Qt.NoBrush

        self.screen_polygon = QPolygonF()