def deserializeFromClipboard(self, data): hashmap = {} # calculate mouse pointer - scene position view = self.scene.grScene.views()[0] mouse_scene_pos = view.last_scene_mouse_position # calculate selected objects bbox and center minx, maxx, miny, maxy = 0, 0, 0, 0 for box_data in data['boxes']: x, y = box_data['pos_x'], box_data['pos_y'] if x < minx: minx = x if x > maxx: maxx = x if y < miny: miny = y if y > maxy: maxy = y bbox_center_x = (minx + maxx) / 2 bbox_center_y = (miny + maxy) / 2 # calculate the offset of the newly creating boxes offset_x = mouse_scene_pos.x() - bbox_center_x offset_y = mouse_scene_pos.y() - bbox_center_y # create each box for box_data in data['boxes']: new_box = Box(self.scene) new_box.deserialize(box_data, hashmap, restore_id=False) # readjust the new box's position pos = new_box.pos new_box.setPos(pos.x() + offset_x, pos.y() + offset_y) # create each edge if 'edges' in data: for edge_data in data['edges']: new_edge = Edge(self.scene) new_edge.deserialize(edge_data, hashmap, restore_id=False) # store history self.scene.history.storeHistory("Pasted elements in scene")