Esempio n. 1
0
 def _on_path_select_clicked(self):
     # Workaround for QFileDialog.getExistingDirectory because it do not
     # select the configuration folder in the dialog
     self.dialog = QFileDialog(self, caption='Select a new settings folder')
     self.dialog.setOption(QFileDialog.HideNameFilterDetails, True)
     self.dialog.setFileMode(QFileDialog.Directory)
     self.dialog.setDirectory(self.path)
     if self.dialog.exec_():
         fileNames = self.dialog.selectedFiles()
         path = fileNames[0]
         if os.path.isfile(path):
             path = os.path.basename(path)
         self._lineedit.setText(path)
         self.path = dir
         self.editing_finished_signal.emit()
 def load_file(self):
     filename = QFileDialog.getOpenFileName(self, self.tr("Open File"),
                                            "../", self.tr("Yaml (*.yaml)"))
     self.filelist.append(filename[0])
     self.filenames.append(os.path.basename(filename[0]))
     self.fileLabel.setText('Files: ' + str(self.filenames))
     self.fileLabel.setWordWrap(True)
Esempio n. 3
0
    def _load_dot(self, file_name=None):
        if file_name is None:
            file_name, _ = QFileDialog.getOpenFileName(self._widget, self.tr('Open graph from file'), None, self.tr('DOT graph (*.dot)'))
            if file_name is None or file_name == '':
                return

        try:
            fh = open(file_name, 'rb')
            dotcode = fh.read()
            fh.close()
        except IOError:
            return

        # disable controls customizing fetched ROS graph
        self._widget.depth_combo_box.setEnabled(False)
        self._widget.directions_combo_box.setEnabled(False)
        self._widget.package_type_combo_box.setEnabled(False)
        self._widget.filter_line_edit.setEnabled(False)
        self._widget.with_stacks_check_box.setEnabled(False)
        self._widget.mark_check_box.setEnabled(False)
        self._widget.colorize_check_box.setEnabled(False)
        self._widget.hide_transitives_check_box.setEnabled(False)

        self._update_graph(dotcode)
        self._redraw_graph_scene()
    def browseForLocation(self):
        location = QFileDialog.getOpenFileName(filter="*.bag;;*", directory=os.path.dirname(self.demoLocation.text()))[0]
        if len(location) == 0:
            return

        self.demoLocation.setText(location)
        self.loadLocation()
Esempio n. 5
0
    def _handle_record_clicked(self):
        if self._recording:
            self._timeline.toggle_recording()
            return
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(
            self, self.tr('Select prefix for new Bag File'), '.',
            self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag',
                                            time.localtime(time.time()))
            if prefix.endswith('.bag'):
                prefix = prefix[:-len('.bag')]
            if prefix:
                record_filename = '%s_%s' % (prefix, record_filename)

            rospy.loginfo('Recording to %s.' % record_filename)

            #TODO Implement recording of topic subsets, regex limiting and by number of messages per topic
            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename)
Esempio n. 6
0
 def get_profile_file(self):
     # save the profile
     (path, _) = QFileDialog.getSaveFileName(
         self, "New profile file",
         nm.settings().current_dialog_path,
         "node manager profile files (*.nmprofile);;All files (*)"
     )  # _:=filter
     if path:
         if not path.endswith('.nmprofile'):
             path = "%s.nmprofile" % path
         nm.settings().current_dialog_path = os.path.dirname(path)
         try:
             (pkg, _) = package_name(os.path.dirname(path))  # _:=pkg_path
             if pkg is None:
                 ret = WarningMessageBox(
                     QMessageBox.Warning,
                     "New File Error",
                     'The new file is not in a ROS package',
                     buttons=QMessageBox.Ok | QMessageBox.Cancel).exec_()
                 if ret == QMessageBox.Cancel:
                     return None
             return path
         except EnvironmentError as e:
             WarningMessageBox(QMessageBox.Warning, "New File Error",
                               'Error while create a new file',
                               str(e)).exec_()
     return None
    def _on_import_perspective(self):
        file_name, _ = QFileDialog.getOpenFileName(
            self._menu_manager.menu, self.tr('Import perspective from file'),
            None, self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return

        perspective_name = os.path.basename(file_name)
        suffix = '.perspective'
        if perspective_name.endswith(suffix):
            perspective_name = perspective_name[:-len(suffix)]
        if perspective_name in self.perspectives:
            perspective_name = self._choose_new_perspective_name(False)
            if perspective_name is None:
                return

        self._create_perspective(perspective_name, clone_perspective=False)

        # read perspective from file
        file_handle = open(file_name, 'r')
        #data = eval(file_handle.read())
        data = json.loads(file_handle.read())
        self._convert_values(data, self._import_value)

        new_settings = self._get_perspective_settings(perspective_name)
        self._set_dict_on_settings(data, new_settings)

        self.switch_perspective(perspective_name,
                                settings_changed=True,
                                save_before=True)
Esempio n. 8
0
    def get_profile_file(self):
        '''
        Opens file manager dialog to save to select a new file for node manager profile.

        :return: path to profile file
        :rtype: str
        '''
        # save the profile
        (path, _) = QFileDialog.getSaveFileName(
            self, "New profile file",
            nm.settings().current_dialog_path,
            "node manager profile files (*.nmprofile);;All files (*)"
        )  # _:=filter
        if path:
            if not path.endswith('.nmprofile'):
                path = "%s.nmprofile" % path
            nm.settings().current_dialog_path = os.path.dirname(path)
            try:
                # we need a grpc url for local node manager daemon
                nmd_url = nmdurl.nmduri()
                (pkg, _) = package_name(
                    nmdurl.join(nmd_url, os.path.dirname(path)))  # _:=pkg_path
                if pkg is None:
                    ret = MessageBox.warning(
                        self,
                        "New File Error",
                        'The new file is not in a ROS package',
                        buttons=MessageBox.Ok | MessageBox.Cancel)
                    if ret == MessageBox.Cancel:
                        return None
                return path
            except EnvironmentError as e:
                MessageBox.warning(self, "New File Error",
                                   'Error while create a new file', utf8(e))
        return None
    def browseForFolder(self):
        location = QFileDialog.getExistingDirectory(directory=os.path.dirname(self.demoLocation.text()))
        if len(location) == 0:
            return

        self.demoLocation.setText(location)
        self.loadLocation()
 def _handle_save_clicked(self, checked):
     filename = QFileDialog.getSaveFileName(self, 'Save to File', '.', self.tr('rqt_console msg file {.csv} (*.csv)'))
     if filename[0] != '':
         filename = filename[0]
         if filename[-4:] != '.csv':
             filename += '.csv'
         try:
             handle = open(filename, 'w')
         except IOError as e:
             qWarning(str(e))
             return
         try:
             handle.write(';'.join(MessageDataModel.columns) + '\n')
             for index in range(self._proxy_model.rowCount()):
                 row = self._proxy_model.mapToSource(self._proxy_model.index(index, 0)).row()
                 msg = self._model._messages[row]
                 data = {}
                 data['message'] = msg.message.replace('"', '\\"')
                 data['severity'] = str(msg.severity)
                 data['node'] = msg.node
                 data['stamp'] = str(msg.stamp[0]) + '.' + str(msg.stamp[1]).zfill(9)
                 data['topics'] = ','.join(msg.topics)
                 data['location'] = msg.location
                 line = []
                 for column in MessageDataModel.columns:
                     line.append('"%s"' % data[column])
                 handle.write(';'.join(line) + '\n')
         except Exception as e:
             qWarning('File save failed: %s' % str(e))
             return False
         finally:
             handle.close()
         return True
Esempio n. 11
0
    def _load_dot(self, file_name=None):
        if file_name is None:
            file_name, _ = QFileDialog.getOpenFileName(
                self._widget, self.tr('Open graph from file'), None,
                self.tr('DOT graph (*.dot)'))
            if file_name is None or file_name == '':
                return

        try:
            fh = open(file_name, 'rb')
            dotcode = fh.read()
            fh.close()
        except IOError:
            return

        # disable controls customizing fetched ROS graph
        self._widget.graph_type_combo_box.setEnabled(False)
        self._widget.filter_line_edit.setEnabled(False)
        self._widget.topic_filter_line_edit.setEnabled(False)
        self._widget.namespace_cluster_check_box.setEnabled(False)
        self._widget.actionlib_check_box.setEnabled(False)
        self._widget.dead_sinks_check_box.setEnabled(False)
        self._widget.leaf_topics_check_box.setEnabled(False)
        self._widget.quiet_check_box.setEnabled(False)

        self._update_graph_view(dotcode)
    def save_trajectory_callback(self):
        self.blockSignals(True)
        print "Save gains"
        # Save data to file that we can read in
        # TODO - invalid file names

        fileName = QFileDialog.getSaveFileName()

        #if fileName[0] checks to ensure that the file dialog has not been canceled
        if fileName[0]:
            if self.calculate_trajectory():
                print self.robot_command;
                newFileptr = open(fileName[0], 'w')
                # Suggested format for files to make it easy to combine different outputs
                newFileptr.write('# Trajectory \n')
                newFileptr.write(self.robot_command)
                newFileptr.write('\n')
                newFileptr.close()
            else:
                print "Trajectory calculation failure - do not save!"
        else:
            print "Save cancelled."

        newFilePtr.close()

        self.blockSignals(False)
    def load_directory(self):
        directory = QFileDialog.getExistingDirectory(self, self.tr("Open Directory"), "../")
	self.filenames.extend(os.listdir(directory))
	temp = [directory + '/' + filepath for filepath in os.listdir(directory)]
	self.filelist.extend(temp)
	self.fileLabel.setText('Files: ' + str(self.filenames))
        self.fileLabel.setWordWrap(True)	
    def newLocation(self):
        location = QFileDialog.getSaveFileName(filter="*.bag;;*", directory=os.path.dirname(self.demoLocation.text()))[0]
        if len(location) == 0:
            return
        self.demoLocation.setText(location)
        self.playDemoButton.setEnabled(False)
        self.zeroMarker.clear()
        self.zeroMarker.setEnabled(False)
        self.startTrajectoryButton.setEnabled(True)
        self.startButton.setEnabled(True)
        self.addButton.setEnabled(True)
        self.openHandButton.setEnabled(True)
        self.closeHandButton.setEnabled(True)
        self.endButton.setEnabled(True)

        try:
            os.remove(location)
            self._showStatus("Deleted existing save file.")
        except OSError:
            pass

        if not self.kinesthetic_interaction:
            self._showWarning("Record keyframe demo server unreachable", "Record keyframe demo server isn't loaded. Run `roslaunch hlpr_record_demonstration start_record_services.launch` and restart the GUI.")
            return

        saveFile = self.kinesthetic_interaction.init_demo(location=location, timestamp=self.shouldTimestamp.isChecked())
        self.demoLocation.setText(saveFile)
        self.demoName.setText(os.path.basename(saveFile))
        self.keyframeCount.setText("")
        self.playbackTree.clear()
Esempio n. 15
0
 def loadDatabase(self, unused=None):
     # Load database
     filename = QFileDialog.getOpenFileName(
         self.widget,
         caption="Load track database",
         filter="*.tracks",
         directory=self.defaultDatabaseDirectory)[0]
     self.loadGivenDatabase(filename)
    def browseForFolder(self):
        location = QFileDialog.getExistingDirectory(
            directory=os.path.dirname(self.demoLocation.text()))
        if len(location) == 0:
            return

        self.demoLocation.setText(location)
        self.loadLocation()
Esempio n. 17
0
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(
         self, self.tr('Save to file...'), '.',
         self.tr('YAML files {.yaml} (*.yaml)'))
     if filename[0] != '':
         with open(filename[0], 'w') as outfile:
             outfile.write(
                 yaml.dump(self.places_dict, default_flow_style=False))
Esempio n. 18
0
 def on_open_xml_clicked(self):
     (fileName, _) = QFileDialog.getOpenFileName(
         self, "Load launch file", self.__current_path,
         "Config files (*.launch);;All files (*)")
     if fileName:
         self.__current_path = os.path.dirname(fileName)
         nm.settings().launch_history_add(fileName)
         self.load_signal.emit(fileName, [], None)
 def on_open_xml_clicked(self):
     (fileName, _) = QFileDialog.getOpenFileName(self,
                                                 "Load launch file",
                                                 self.__current_path,
                                                 "Config files (*.launch);;All files (*)")
     if fileName:
         self.__current_path = os.path.dirname(fileName)
         nm.settings().launch_history_add(fileName)
         self.load_signal.emit(fileName, [], None)
    def load_file(self):
        filename = QFileDialog.getOpenFileName(self, self.tr("Open File"), "../", self.tr("Yaml (*.yaml)"))
	if os.path.basename(filename[0].encode("ascii")) == "":
	    return

	self.filelist.append(filename[0])
	self.filenames.append(os.path.basename(filename[0].encode("ascii")))
	self.fileLabel.setText('Files: ' + str(self.filenames))
        self.fileLabel.setWordWrap(True)	
    def browseForLocation(self):
        location = QFileDialog.getOpenFileName(
            filter="*.bag;;*",
            directory=os.path.dirname(self.demoLocation.text()))[0]
        if len(location) == 0:
            return

        self.demoLocation.setText(location)
        self.loadLocation()
Esempio n. 22
0
    def _on_export_perspective(self):
        file_name, _ = QFileDialog.getSaveFileName(self._menu_manager.menu, self.tr('Export perspective to file'), self._current_perspective + '.perspective', self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return

        # trigger save of perspective before export
        self._callback = self._on_export_perspective_continued
        self._callback_args = [file_name]
        self.save_settings_signal.emit(self._global_settings, self._perspective_settings)
Esempio n. 23
0
 def on_open_xml_clicked(self):
     (fileName, _) = QFileDialog.getOpenFileName(self,
                                                 "Load launch file",
                                                 self.__current_path,
                                                 "Config files (*.launch);;All files (*)")
     if fileName:
         self.__current_path = os.path.dirname(fileName)
         self.launchlist_model.add2LoadHistory(fileName)
         self.load_signal.emit(fileName)
 def save_FileDialog(self):
     filename = QFileDialog.getSaveFileName(self.parent, 'Save file',
                                            os.path.expanduser('~'))
     self.parent.filename = filename[0]
     if self.parent.jpeg_data is None:
         print 'no image data'
     else:
         f = open(self.parent.filename.encode(), 'wb')
         f.write(self.parent.jpeg_data)
         f.close()
Esempio n. 25
0
    def _save_image(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as image'), 'rosgraph.png', self.tr('Image (*.bmp *.jpg *.png *.tiff)'))
        if file_name is None or file_name == '':
            return

        img = QImage((self._scene.sceneRect().size() * 2.0).toSize(), QImage.Format_ARGB32_Premultiplied)
        painter = QPainter(img)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
        img.save(file_name)
Esempio n. 26
0
    def _save_dot(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as DOT'), 'rosgraph.dot', self.tr('DOT graph (*.dot)'))
        if file_name is None or file_name == '':
            return

        handle = QFile(file_name)
        if not handle.open(QIODevice.WriteOnly | QIODevice.Text):
            return

        handle.write(self._current_dotcode)
        handle.close()
    def _save_dot(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as DOT'), 'rospackgraph.dot', self.tr('DOT graph (*.dot)'))
        if file_name is None or file_name == '':
            return

        handle = QFile(file_name)
        if not handle.open(QIODevice.WriteOnly | QIODevice.Text):
            return

        handle.write(self._current_dotcode)
        handle.close()
Esempio n. 28
0
 def saveDatabaseAs(self, unused=None):
     self.databaseFilename = QFileDialog.getSaveFileName(
         self.widget,
         caption="Save track database",
         filter="*.tracks",
         directory=self.defaultDatabaseDirectory)[0]
     if self.databaseFilename:
         if not self.databaseFilename.endswith(".tracks"):
             self.databaseFilename += ".tracks"
         self._onDatabaseFilenameChanged()
         self.saveDatabase()
    def _save_image(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as image'), 'rospackgraph.png', self.tr('Image (*.bmp *.jpg *.png *.tiff)'))
        if file_name is None or file_name == '':
            return

        img = QImage((self._scene.sceneRect().size() * 2.0).toSize(), QImage.Format_ARGB32_Premultiplied)
        painter = QPainter(img)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
        img.save(file_name)
 def load_directory(self):
     directory = QFileDialog.getExistingDirectory(self,
                                                  self.tr("Open Directory"),
                                                  "../")
     self.filenames.extend(os.listdir(directory))
     temp = [
         directory + '/' + filepath for filepath in os.listdir(directory)
     ]
     self.filelist.extend(temp)
     self.fileLabel.setText('Files: ' + str(self.filenames))
     self.fileLabel.setWordWrap(True)
Esempio n. 31
0
    def _import(self):
        file_path, _ = QFileDialog.getOpenFileName(self, self.tr('Import custom graph'),
                                                   None, self.tr('DOT graph (*.dot)'))

        if file_path is None or file_path == '':
            return

        custom_graph = Graph(self._dot_processor, file_path, file_path)
        self.decision_graphs[custom_graph.source] = custom_graph
        self._current_graph = custom_graph

        self.decision_graphs_combo_box.addItem(custom_graph.source)
        self.decision_graphs_combo_box.setCurrentIndex(self.decision_graphs_combo_box.findText(custom_graph.source))
Esempio n. 32
0
    def _on_export_perspective(self):
        file_name, _ = QFileDialog.getSaveFileName(
            self._menu_manager.menu, self.tr('Export perspective to file'),
            self._current_perspective + '.perspective',
            self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return

        # trigger save of perspective before export
        self._callback = self._on_export_perspective_continued
        self._callback_args = [file_name]
        self.save_settings_signal.emit(self._global_settings,
                                       self._perspective_settings)
Esempio n. 33
0
    def _import(self):
        file_path, _ = QFileDialog.getOpenFileName(self, self.tr('Import custom graph'),
                                                   None, self.tr('DOT graph (*.dot)'))

        if file_path is None or file_path == '':
            return

        custom_graph = Graph(self._dot_processor, file_path, file_path)
        self.decision_graphs[custom_graph.source] = custom_graph
        self._current_graph = custom_graph

        self.decision_graphs_combo_box.addItem(custom_graph.source)
        self.decision_graphs_combo_box.setCurrentIndex(self.decision_graphs_combo_box.findText(custom_graph.source))
 def _handle_load_clicked(self, checked):
     filename = QFileDialog.getOpenFileName(self, self.tr('Load from File'), '.', self.tr('rqt_console message file {.csv} (*.csv)'))
     if filename[0] != '':
         try:
             handle = open(filename[0])
         except IOError as e:
             qWarning(str(e))
             return
         self.pause_button.setChecked(True)
         self._handle_pause_clicked(True)
         self._datamodel.load_from_file(handle)
         handle.close()
         self.update_status()
Esempio n. 35
0
    def _save_svg(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as SVG'), 'rosgraph.svg', self.tr('Scalable Vector Graphic (*.svg)'))
        if file_name is None or file_name == '':
            return

        generator = QSvgGenerator()
        generator.setFileName(file_name)
        generator.setSize((self._scene.sceneRect().size() * 2.0).toSize())

        painter = QPainter(generator)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
    def _save_svg(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as SVG'), 'rospackgraph.svg', self.tr('Scalable Vector Graphic (*.svg)'))
        if file_name is None or file_name == '':
            return

        generator = QSvgGenerator()
        generator.setFileName(file_name)
        generator.setSize((self._scene.sceneRect().size() * 2.0).toSize())

        painter = QPainter(generator)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
 def _handle_save_clicked(self, checked):
     filename = QFileDialog.getSaveFileName(self, 'Save to File', '.', self.tr('rqt_console msg file {.csv} (*.csv)'))
     if filename[0] != '':
         filename = filename[0]
         if filename[-4:] != '.csv':
             filename += '.csv'
         try:
             handle = open(filename, 'w')
         except IOError as e:
             qWarning(str(e))
             return
         self._proxymodel.save_to_file(handle)
         handle.close()
         self.update_status()
Esempio n. 38
0
    def _export(self):
        file_name, _ = QFileDialog.getSaveFileName(
            self, self.tr("Save as image"), "graph.png", self.tr("Image (*.bmp *.jpg *.png *.tiff)")
        )

        if file_name is None or file_name == "":
            return

        img = QImage((self._scene.sceneRect().size() * 2.0).toSize(), QImage.Format_ARGB32_Premultiplied)
        painter = QPainter(img)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
        img.save(file_name)
Esempio n. 39
0
 def _on_path_select_clicked(self):
     # Workaround for QFileDialog.getExistingDirectory because it do not
     # select the configuration folder in the dialog
     self.dialog = QFileDialog(self, caption='Select a new settings folder')
     self.dialog.setOption(QFileDialog.HideNameFilterDetails, True)
     self.dialog.setFileMode(QFileDialog.Directory)
     self.dialog.setDirectory(self.path)
     if self.dialog.exec_():
         fileNames = self.dialog.selectedFiles()
         path = fileNames[0]
         if os.path.isfile(path):
             path = os.path.basename(path)
         self._lineedit.setText(path)
         self.path = dir
         self.editing_finished_signal.emit()
Esempio n. 40
0
    def _on_import_perspective(self):
        file_name, _ = QFileDialog.getOpenFileName(self._menu_manager.menu, self.tr('Import perspective from file'), None, self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return

        perspective_name = os.path.basename(file_name)
        suffix = '.perspective'
        if perspective_name.endswith(suffix):
            perspective_name = perspective_name[:-len(suffix)]
        if perspective_name in self.perspectives:
            perspective_name = self._choose_new_perspective_name(False)
            if perspective_name is None:
                return

        self.import_perspective_from_file(file_name, perspective_name)
Esempio n. 41
0
    def _load_dot(self, file_name=None):
        if file_name is None:
            file_name, _ = QFileDialog.getOpenFileName(
                self._widget, self.tr('Open tree from DOT file'), None,
                self.tr('DOT graph (*.dot)'))
            if file_name is None or file_name == '':
                return

        try:
            fhandle = open(file_name, 'rb')
            dotcode = fhandle.read()
            fhandle.close()
        except IOError:
            return
        self._update_graph_view(dotcode)
Esempio n. 42
0
class PathEditor(QWidget):
    '''
    This is a path editor used as ItemDeligate in settings view. This editor
    provides an additional button for directory selection dialog.
    '''

    editing_finished_signal = Signal()

    def __init__(self, path, parent=None):
        QWidget.__init__(self, parent)
        self.path = path
        self._layout = QHBoxLayout(self)
        self._layout.setContentsMargins(0, 0, 0, 0)
        self._layout.setSpacing(0)
        self._button = QPushButton('...')
        self._button.setMaximumSize(QSize(24, 20))
        self._button.clicked.connect(self._on_path_select_clicked)
        self._layout.addWidget(self._button)
        self._lineedit = QLineEdit(path)
        self._lineedit.returnPressed.connect(self._on_editing_finished)
        self._layout.addWidget(self._lineedit)
        self.setLayout(self._layout)
        self.setFocusProxy(self._button)
        self.setAutoFillBackground(True)

    def _on_path_select_clicked(self):
        # Workaround for QFileDialog.getExistingDirectory because it do not
        # select the configuration folder in the dialog
        self.dialog = QFileDialog(self, caption='Select a new settings folder')
        self.dialog.setOption(QFileDialog.HideNameFilterDetails, True)
        self.dialog.setFileMode(QFileDialog.Directory)
        self.dialog.setDirectory(self.path)
        if self.dialog.exec_():
            fileNames = self.dialog.selectedFiles()
            path = fileNames[0]
            if os.path.isfile(path):
                path = os.path.basename(path)
            self._lineedit.setText(path)
            self.path = dir
            self.editing_finished_signal.emit()

    def _on_editing_finished(self):
        if self._lineedit.text():
            self.path = self._lineedit.text()
            self.editing_finished_signal.emit()
Esempio n. 43
0
class PathEditor(QWidget):
    '''
    This is a path editor used as ItemDeligate in settings view. This editor
    provides an additional button for directory selection dialog.
    '''

    editing_finished_signal = Signal()

    def __init__(self, path, parent=None):
        QWidget.__init__(self, parent)
        self.path = path
        self._layout = QHBoxLayout(self)
        self._layout.setContentsMargins(0, 0, 0, 0)
        self._layout.setSpacing(0)
        self._button = QPushButton('...')
        self._button.setMaximumSize(QSize(24, 20))
        self._button.clicked.connect(self._on_path_select_clicked)
        self._layout.addWidget(self._button)
        self._lineedit = QLineEdit(path)
        self._lineedit.returnPressed.connect(self._on_editing_finished)
        self._layout.addWidget(self._lineedit)
        self.setLayout(self._layout)
        self.setFocusProxy(self._button)
        self.setAutoFillBackground(True)

    def _on_path_select_clicked(self):
        # Workaround for QFileDialog.getExistingDirectory because it do not
        # select the configuration folder in the dialog
        self.dialog = QFileDialog(self, caption='Select a new settings folder')
        self.dialog.setOption(QFileDialog.HideNameFilterDetails, True)
        self.dialog.setFileMode(QFileDialog.Directory)
        self.dialog.setDirectory(self.path)
        if self.dialog.exec_():
            fileNames = self.dialog.selectedFiles()
            path = fileNames[0]
            if os.path.isfile(path):
                path = os.path.basename(path)
            self._lineedit.setText(path)
            self.path = dir
            self.editing_finished_signal.emit()

    def _on_editing_finished(self):
        if self._lineedit.text():
            self.path = self._lineedit.text()
            self.editing_finished_signal.emit()
Esempio n. 44
0
    def _on_import_perspective(self):
        file_name, _ = QFileDialog.getOpenFileName(
            self._menu_manager.menu, self.tr('Import perspective from file'),
            None, self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return

        perspective_name = os.path.basename(file_name)
        suffix = '.perspective'
        if perspective_name.endswith(suffix):
            perspective_name = perspective_name[:-len(suffix)]
        if perspective_name in self.perspectives:
            perspective_name = self._choose_new_perspective_name(False)
            if perspective_name is None:
                return

        self.import_perspective_from_file(file_name, perspective_name)
Esempio n. 45
0
    def _load_bag(self, file_name=None):
        """Load a bag from file. If no file name is given, a dialogue will pop up and
        the user will be asked to select a file. If the bag file selected
        doesn't have any valid topic, nothing will happen. If there are valid
        topics, we load the bag and add a timeline for managing it.

        """
        if file_name is None:
            file_name, _ = QFileDialog.getOpenFileName(
                self._widget, self.tr('Open trees from bag file'), None,
                self.tr('ROS bag (*.bag)'))
        if file_name is None or file_name == "":
            return

        rospy.loginfo("Reading bag from {0}".format(file_name))
        bag = rosbag.Bag(file_name, 'r')
        # ugh...
        topics = list(bag.get_type_and_topic_info()[1].keys())
        types = []
        for i in range(0, len(bag.get_type_and_topic_info()[1].values())):
            types.append(list(bag.get_type_and_topic_info()[1].values())[i][0])

        tree_topics = []  # only look at the first matching topic
        for ind, tp in enumerate(types):
            if tp == 'py_trees_msgs/BehaviourTree':
                tree_topics.append(topics[ind])

        if len(tree_topics) == 0:
            rospy.logerr('Requested bag did not contain any valid topics.')
            return

        self.message_list = []
        self._viewing_bag = True
        rospy.loginfo('Reading behaviour trees from topic {0}'.format(
            tree_topics[0]))
        for unused_topic, msg, unused_t in bag.read_messages(
                topics=[tree_topics[0]]):
            self.message_list.append(msg)

        self.current_topic = tree_topics[0]
        self._set_timeline_buttons(first_snapshot=True,
                                   previous_snapshot=True,
                                   next_snapshot=False,
                                   last_snapshot=False)
        self._set_bag_timeline(bag)
        self._refresh_view.emit()
Esempio n. 46
0
    def accept(self):
        if self.textedit.isVisible():
            try:
                tmp_file = os.path.join(nm.screen().LOG_PATH,
                                        'tmp_sync_interface.sync')
                with open(tmp_file, 'w+') as f:
                    f.write(self.textedit.toPlainText())
                from master_discovery_fkie.common import read_interface
                read_interface(tmp_file)
                if not self._new_iface and self.interface_field.currentText(
                ) in self._interfaces_files:
                    fileName = self._interfaces_files[
                        self.interface_field.currentText()]
                else:
                    fileName, _ = QFileDialog.getSaveFileName(
                        self, 'Save sync interface', '/home',
                        "Sync Files (*.sync)")
                if fileName:
                    with open(fileName, 'w+') as f:
                        self._interface_filename = fileName
                        f.write(self.textedit.toPlainText())
                        if self._new_iface:
                            self.interface_field.clear()
                            self._interfaces_files = None
                        self._on_select_interface_clicked()


#        QDialog.accept(self)
#        self.resetView()
            except Exception as e:
                WarningMessageBox(QMessageBox.Warning, "Create sync interface",
                                  "Error while create interface",
                                  str(e)).exec_()
        elif self.interface_field.isVisible():
            interface = self.interface_field.currentText()
            if self._interfaces_files and interface in self._interfaces_files:
                self._interface_filename = self._interfaces_files[interface]
                self._sync_args = []
                self._sync_args.append(''.join(['_interface_url:=',
                                                interface]))
                QDialog.accept(self)
                self.resetView()
        else:
            QDialog.accept(self)
            self.resetView()
Esempio n. 47
0
 def _handle_load_clicked(self):
     filename = QFileDialog.getOpenFileName(
         self, self.tr('Load from File'), '.',
         self.tr('Bag files {.bag} (*.bag)'))
     if filename[0] != '':
         bag = rosbag.Bag(filename[0])
         self.play_button.setEnabled(True)
         self.thumbs_button.setEnabled(True)
         self.zoom_in_button.setEnabled(True)
         self.zoom_out_button.setEnabled(True)
         self.zoom_all_button.setEnabled(True)
         self.faster_button.setEnabled(True)
         self.slower_button.setEnabled(True)
         self.begin_button.setEnabled(True)
         self.end_button.setEnabled(True)
         self.save_button.setEnabled(True)
         self.record_button.setEnabled(False)
         self._timeline.add_bag(bag)
Esempio n. 48
0
    def _load_dot(self, file_name=None):
        if file_name is None:
            file_name, _ = QFileDialog.getOpenFileName(
                self._widget,
                self.tr('Open graph from file'),
                None,
                self.tr('DOT graph (*.dot)'))
            if file_name is None or file_name == '':
                return

        try:
            fhandle = open(file_name, 'rb')
            dotcode = fhandle.read()
            fhandle.close()
        except IOError:
            return

        self._update_graph_view(dotcode)
Esempio n. 49
0
    def _on_record_settings_selected(self, all_topics, selected_topics):
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(self, self.tr('Select prefix for new Bag File'), '.', self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag', time.localtime(time.time()))
            if prefix.endswith('.bag'):
                prefix = prefix[:-len('.bag')]
            if prefix:
                record_filename = '%s_%s' % (prefix, record_filename)

            rospy.loginfo('Recording to %s.' % record_filename)

            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename, all_topics, selected_topics)
Esempio n. 50
0
    def _on_record_settings_selected(self, all_topics, selected_topics):
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(
            self, self.tr("Select prefix for new Bag File"), ".", self.tr("Bag files {.bag} (*.bag)")
        )
        if filename[0] != "":
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime("%Y-%m-%d-%H-%M-%S.bag", time.localtime(time.time()))
            if prefix.endswith(".bag"):
                prefix = prefix[: -len(".bag")]
            if prefix:
                record_filename = "%s_%s" % (prefix, record_filename)

            rospy.loginfo("Recording to %s." % record_filename)

            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename, all_topics, selected_topics)
Esempio n. 51
0
    def _handle_record_clicked(self):
        if self._recording:
            self._timeline.toggle_recording()
            return
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(self, self.tr('Select prefix for new Bag File'), '.', self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag', time.localtime(time.time()))
            if prefix.endswith('.bag'):
                prefix = prefix[:-len('.bag')]
            if prefix:
                record_filename = '%s_%s' % (prefix, record_filename)

            rospy.loginfo('Recording to %s.' % record_filename)

            #TODO Implement recording of topic subsets, regex limiting and by number of messages per topic
            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename)
Esempio n. 52
0
 def on_new_xml_clicked(self):
     '''
     Creates a new launch file.
     '''
     # get new file from open dialog, use last path if one exists
     open_path = self.__current_path
     if self.launchlist_model.currentPath is not None:
         open_path = self.launchlist_model.currentPath
     (fileName, _) = QFileDialog.getSaveFileName(self,
                                                 "New launch file",
                                                 open_path,
                                                 "Config files (*.launch *.yaml);;All files (*)")
     if fileName:
         try:
             (pkg, _) = package_name(os.path.dirname(fileName))  # _:=pkg_path
             if pkg is None:
                 WarningMessageBox(QMessageBox.Warning, "New File Error",
                                   'The new file is not in a ROS package').exec_()
                 return
             with open(fileName, 'w+') as f:
                 f.write("<launch>\n"
                         "  <arg name=\"robot_ns\" default=\"my_robot\"/>\n"
                         "  <group ns=\"$(arg robot_ns)\">\n"
                         "    <param name=\"tf_prefix\" value=\"$(arg robot_ns)\"/>\n"
                         "\n"
                         "    <node pkg=\"my_pkg\" type=\"my_node\" name=\"my_name\" >\n"
                         "      <param name=\"capability_group\" value=\"MY_GROUP\"/>\n"
                         "    </node>\n"
                         "  </group>\n"
                         "</launch>\n"
                         )
             self.__current_path = os.path.dirname(fileName)
             self.launchlist_model.setPath(self.__current_path)
             self.edit_signal.emit([fileName])
         except EnvironmentError as e:
             WarningMessageBox(QMessageBox.Warning, "New File Error",
                               'Error while create a new file',
                               '%s' % e).exec_()
 def get_profile_file(self):
     # save the profile
     (path, _) = QFileDialog.getSaveFileName(self,
                                             "New profile file",
                                             nm.settings().current_dialog_path,
                                             "node manager profile files (*.nmprofile);;All files (*)")  # _:=filter
     if path:
         if not path.endswith('.nmprofile'):
             path = "%s.nmprofile" % path
         nm.settings().current_dialog_path = os.path.dirname(path)
         try:
             (pkg, _) = package_name(os.path.dirname(path))  # _:=pkg_path
             if pkg is None:
                 ret = MessageBox.warning(self, "New File Error",
                                          'The new file is not in a ROS package', buttons=MessageBox.Ok | MessageBox.Cancel)
                 if ret == MessageBox.Cancel:
                     return None
             return path
         except EnvironmentError as e:
             MessageBox.warning(self, "New File Error",
                                'Error while create a new file',
                                utf8(e))
     return None
    def accept(self):
        if self.textedit.isVisible():
            try:
                tmp_file = os.path.join(nm.screen().LOG_PATH, 'tmp_sync_interface.sync')
                with open(tmp_file, 'w+') as f:
                    f.write(self.textedit.toPlainText())
                from master_discovery_fkie.common import read_interface
                read_interface(tmp_file)
                if not self._new_iface and self.interface_field.currentText() in self._interfaces_files:
                    fileName = self._interfaces_files[self.interface_field.currentText()]
                else:
                    fileName, _ = QFileDialog.getSaveFileName(self, 'Save sync interface', '/home', "Sync Files (*.sync)")
                if fileName:
                    with open(fileName, 'w+') as f:
                        self._interface_filename = fileName
                        f.write(self.textedit.toPlainText())
                        if self._new_iface:
                            self.interface_field.clear()
                            self._interfaces_files = None
                        self._on_select_interface_clicked()
#        QDialog.accept(self)
#        self.resetView()
            except Exception as e:
                MessageBox.warning(self, "Create sync interface",
                                   "Error while create interface",
                                   utf8(e))
        elif self.interface_field.isVisible():
            interface = self.interface_field.currentText()
            if self._interfaces_files and interface in self._interfaces_files:
                self._interface_filename = self._interfaces_files[interface]
                self._sync_args = []
                self._sync_args.append(''.join(['_interface_url:=', interface]))
                QDialog.accept(self)
                self.resetView()
        else:
            QDialog.accept(self)
            self.resetView()
Esempio n. 55
0
    def _load_dot(self, file_name=None):
        if file_name is None:
            file_name, _ = QFileDialog.getOpenFileName(self._widget, self.tr('Open graph from file'), None, self.tr('DOT graph (*.dot)'))
            if file_name is None or file_name == '':
                return

        try:
            fh = open(file_name, 'rb')
            dotcode = fh.read()
            fh.close()
        except IOError:
            return

        # disable controls customizing fetched ROS graph
        self._widget.graph_type_combo_box.setEnabled(False)
        self._widget.filter_line_edit.setEnabled(False)
        self._widget.topic_filter_line_edit.setEnabled(False)
        self._widget.namespace_cluster_check_box.setEnabled(False)
        self._widget.actionlib_check_box.setEnabled(False)
        self._widget.dead_sinks_check_box.setEnabled(False)
        self._widget.leaf_topics_check_box.setEnabled(False)
        self._widget.quiet_check_box.setEnabled(False)

        self._update_graph_view(dotcode)
Esempio n. 56
0
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(
         self, self.tr("Save selected region to file..."), ".", self.tr("Bag files {.bag} (*.bag)")
     )
     if filename[0] != "":
         self._timeline.copy_region_to_bag(filename[0])
Esempio n. 57
0
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(self, self.tr('Save selected region to file...'), '.', self.tr('Bag files {.bag} (*.bag)'))
     if filename[0] != '':
         self._timeline.copy_region_to_bag(filename[0])
Esempio n. 58
0
 def _handle_load_clicked(self):
     filename = QFileDialog.getOpenFileName(self, self.tr('Load from File'), '.', self.tr('Bag files {.bag} (*.bag)'))
     if filename[0] != '':
         self.load_bag(filename[0])