Exemplo n.º 1
0
    def _adjust_html_node_size(self, node):
        if node.get_name() in ('graph', 'node', 'empty'):
            return node

        label = node.get_label()

        if label is None:
            return node

        label = label.strip('\"')

        if not label.startswith('<') and not label.endswith('>'):
            return node

        text = QGraphicsTextItem()
        text.setHtml(label)

        bounding_box = text.boundingRect()
        width = bounding_box.width() / POINTS_PER_INCH
        height = bounding_box.height() / POINTS_PER_INCH

        url = node.get_attributes().get('URL', None)

        return self._create_fixed_size_node(node.get_name(), label, str(width),
                                            str(height), url)
Exemplo n.º 2
0
    def __init__(self,
                 bounding_box,
                 shape,
                 label,
                 label_pos=None,
                 url=None,
                 parent=None,
                 **kwargs):
        super(DmgHtmlNodeItem, self).__init__(parent, **kwargs)
        self.url = url
        self._incoming_edges = set()
        self._outgoing_edges = set()
        self._brush = QBrush(self._color)

        self._label_pen = QPen()
        self._label_pen.setColor(self._color)
        self._label_pen.setJoinStyle(Qt.RoundJoin)
        self._label_pen.setWidthF(self._label_pen_width)

        self._graphics_item_pen = QPen(self._label_pen)
        self._graphics_item_pen.setWidthF(self._pen_width)

        self._label = QGraphicsTextItem()
        self._label.setHtml(label)

        label_rectangle = self._label.boundingRect()
        if label_pos is None:
            label_rectangle.moveCenter(bounding_box.center())
        else:
            label_rectangle.moveCenter(label_pos)
        self._label.setPos(label_rectangle.x(), label_rectangle.y())

        self.addToGroup(self._label)

        self._graphics_item = ShapeFactory.create(shape, bounding_box)
        if ShapeFactory.message is not None:
            print ShapeFactory.message
        self.addToGroup(self._graphics_item)

        self._brush.setColor(self._color)
        self._graphics_item_pen.setColor(self._color)
        self._label_pen.setColor(self._color)

        self._graphics_item.setPen(self._graphics_item_pen)

        self._highlight_level = kwargs.get('highlight_level',
                                           self.HIGHLIGHT_LEVEL)
        self._hovered_color = kwargs.get('hovered_color', self.HOVERED_COLOR)
        self._highlighted_color = kwargs.get('highlighted_color',
                                             self.HIGHLIGHTED_COLOR)
        self._highlighted_pen_width = kwargs.get('highlighted_pen_width',
                                                 self.HIGHLIGHTED_PEN_WIDTH)
        self._highlighted_label_pen_width = kwargs.get(
            'highlighted_label_pen_width', self.HIGHLIGHTED_LABEL_PEN_WIDTH)

        self.hover_shape = None
        self.setAcceptHoverEvents(True)
Exemplo n.º 3
0
    def _handle_add_clicked(self):
        name = self.name_edit.text()
        if len(name) != 0:
            # remove and re-draw it
            if name in self.places_dict.keys():
                self.places_dict.pop(name)
                for item in self._sceneItems[name].keys():
                    self._scene.removeItem(self._sceneItems[name][item])
            try:
                # storing the values in the dict
                x = self.x_spin.value()
                y = self.y_spin.value()
                theta = self.theta_spin.value()
                q = quaternion_from_euler(0.0, 0.0, theta)
                self.places_dict[str(name)] = [
                    x, y, 0.0,
                    float(q[0]),
                    float(q[1]),
                    float(q[2]),
                    float(q[3])
                ]

                # drawing the items
                self._sceneItems[name] = {"text": QGraphicsTextItem()}
                self._sceneItems[name]["text"].setDefaultTextColor(
                    QColor(0, 0, 255))
                self._sceneItems[name]["text"].setFont(QFont("Times", 10))
                self._sceneItems[name]["text"].setPlainText(name)
                scene_pos = self._gridToScene(x, y, q)
                x_c = scene_pos[0] - self._sceneItems[name][
                    "text"].boundingRect().width() / 2.0
                self._sceneItems[name]["text"].setPos(x_c, scene_pos[1])
                self._scene.addItem(self._sceneItems[name]["text"])
                self._sceneItems[name]["rec"] = self._scene.addRect(
                    QRectF((scene_pos[0] - 2), (scene_pos[1] - 2), 4, 4))
                line = QLineF(
                    scene_pos[0], scene_pos[1],
                    (scene_pos[0] - self._mag * cos(radians(scene_pos[3]))),
                    (scene_pos[1] + self._mag * sin(radians(scene_pos[3]))))
                self._sceneItems[name]["line"] = self._scene.addLine(
                    line, pen=QPen(Qt.red, 2))

            except ValueError:
                QMessageBox.critical(self, "Error!",
                                     "You must insert a valid value.")
        else:
            QMessageBox.critical(
                self, "Error!",
                "You have to insert a name and a valid position.")
Exemplo n.º 4
0
    def _handle_load_clicked(self):
        filename = QFileDialog.getOpenFileName(
            self, self.tr('Load from File'), '.',
            self.tr('YAML files {.yaml} (*.yaml)'))
        if filename[0] != '':
            with open(filename[0], 'r') as infile:
                try:
                    self.places_dict = yaml.load(infile)
                    for k in self._sceneItems.keys():
                        for item in self._sceneItems[k].keys():
                            self._scene.removeItem(self._sceneItems[k][item])
                    for name in self.places_dict.keys():
                        #
                        q = numpy.asarray(self.places_dict[name][3:7])
                        scene_pos = self._gridToScene(
                            self.places_dict[name][0],
                            self.places_dict[name][1], q)

                        # drawing the items
                        self._sceneItems[name] = {"text": QGraphicsTextItem()}
                        self._sceneItems[name]["text"].setDefaultTextColor(
                            QColor(0, 0, 255))
                        self._sceneItems[name]["text"].setFont(
                            QFont("Times", 10))
                        self._sceneItems[name]["text"].setPlainText(name)
                        x_c = scene_pos[0] - self._sceneItems[name][
                            "text"].boundingRect().width() / 2.0
                        self._sceneItems[name]["text"].setPos(
                            x_c, scene_pos[1])
                        self._scene.addItem(self._sceneItems[name]["text"])
                        self._sceneItems[name]["rec"] = self._scene.addRect(
                            QRectF((scene_pos[0] - 2), (scene_pos[1] - 2), 4,
                                   4))
                        line = QLineF(scene_pos[0], scene_pos[1],
                                      (scene_pos[0] -
                                       self._mag * cos(radians(scene_pos[3]))),
                                      (scene_pos[1] +
                                       self._mag * sin(radians(scene_pos[3]))))
                        self._sceneItems[name]["line"] = self._scene.addLine(
                            line, pen=QPen(Qt.red, 2))
                except yaml.scanner.ScannerError:
                    QMessageBox.critical(self, "Error!", "Invalid YAML file.")