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)
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)
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.")
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.")