def _connect(self, masteruri, screen_name, nodename, user=None):
     self._masteruri = masteruri
     if self.qfile is not None and self.qfile.isOpen():
         self.qfile.close()
         self.clear_signal.emit()
     host = get_hostname(masteruri)
     if nm.is_local(host):
         self._nodename = nodename
         if screen_name:
             screen_log = screen.get_logfile(node=nodename)
         else:
             screen_log = screen.get_ros_logfile(node=nodename)
         self.qfile = QFile(screen_log)
         self.setWindowTitle(nodename)
         if self.qfile.open(QIODevice.ReadOnly):
             self._first_fill = True
             self.qfile.seek(self.qfile.size() - 1)
             # self.lread()
             self._info = "END"
             self.thread = threading.Thread(target=self._read_log,
                                            kwargs={"filename": screen_log})
             self.thread.setDaemon(True)
             self.thread.start()
         else:
             self._valid = False
     else:
         self._connect_ssh(host, nodename, user)
     self.logger_handler = LoggerHandler(
         nodename,
         masteruri=masteruri,
         layout=self.scrollAreaWidgetContents.layout())
     self.logger_handler.update()
     return False
 def focusInEvent(self, event):
     # check for file changes
     try:
         if self.filename and self.file_info:
             if self.file_info.lastModified() != QFileInfo(
                     self.filename).lastModified():
                 self.file_info = QFileInfo(self.filename)
                 result = MessageBox.question(self,
                                              "File changed",
                                              "File was changed, reload?",
                                              buttons=MessageBox.Yes
                                              | MessageBox.No)
                 if result == MessageBox.Yes:
                     f = QFile(self.filename)
                     if f.open(QIODevice.ReadOnly | QIODevice.Text):
                         self.setText(unicode(f.readAll(), "utf-8"))
                         self.document().setModified(False)
                         self.textChanged.emit()
                     else:
                         MessageBox.critical(
                             self, "Error",
                             "Cannot open launch file%s" % self.filename)
     except:
         pass
     QTextEdit.focusInEvent(self, event)
 def _included_files(self, path):
     '''
     Returns all included files in the given file.
     '''
     result = []
     with open(path, 'r') as f:
         data = f.read()
         reg = QRegExp("=[\s\t]*\".*\"")
         reg.setMinimal(True)
         pos = reg.indexIn(data)
         while pos != -1 and self._isrunning:
             try:
                 pp = interpret_path(reg.cap(0).strip('"'))
                 f = QFile(pp)
                 ext = os.path.splitext(pp)
                 if f.exists() and ext[1] in nm.settings().SEARCH_IN_EXT:
                     result.append(pp)
             except Exception as exp:
                 parsed_text = pp
                 try:
                     parsed_text = reg.cap(0).strip('"')
                 except:
                     pass
                 self.warning_signal.emit("Error while parse '%s': %s" %
                                          (parsed_text, exp))
             pos += reg.matchedLength()
             pos = reg.indexIn(data, pos)
     return result
Example #4
0
 def includedFiles(self):
     '''
     Returns all included files in the document.
     '''
     result = []
     b = self.document().begin()
     while b != self.document().end():
         text = b.text()
         index = self.index(text)
         if index > -1:
             startIndex = text.find('"', index)
             if startIndex > -1:
                 endIndex = text.find('"', startIndex + 1)
                 fileName = text[startIndex + 1:endIndex]
                 if len(fileName) > 0:
                     try:
                         path = interpret_path(fileName)
                         f = QFile(path)
                         ext = os.path.splitext(path)
                         if f.exists() and ext[1] in nm.settings(
                         ).SEARCH_IN_EXT:
                             result.append(path)
                     except:
                         import traceback
                         print traceback.format_exc(1)
         b = b.next()
     return result
Example #5
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 included_files(cls, text_or_path, regexp_list=[QRegExp("\\btextfile\\b"),
                                                    QRegExp("\\bfile\\b"),
                                                    QRegExp("\\bdefault\\b"),
                                                    QRegExp("\\bvalue=.*pkg:\/\/\\b"),
                                                    QRegExp("\\bvalue=.*package:\/\/\\b"),
                                                    QRegExp("\\bvalue=.*\$\(find\\b"),
                                                    QRegExp("\\bargs=.*\$\(find\\b")],
                    recursive=True, unique=True):
     result = []
     lines = []
     pwd = '.'
     f = QFile(text_or_path)
     if f.exists():
         pwd = os.path.dirname(text_or_path)
         with open(text_or_path, 'r') as f:
             content = f.read()
             # remove the comments
             comment_pattern = QRegExp("<!--.*?-->")
             pos = comment_pattern.indexIn(content)
             while pos != -1:
                 content = content[:pos] + content[pos + comment_pattern.matchedLength():]
                 pos = comment_pattern.indexIn(content)
             lines = content.splitlines()
     else:
         lines = [text_or_path]
     line_index = 0
     for line in lines:
         index = cls._index(line, regexp_list)
         if index > -1:
             startIndex = line.find('"', index)
             if startIndex > -1:
                 endIndex = line.find('"', startIndex + 1)
                 fileName = line[startIndex + 1:endIndex]
                 if len(fileName) > 0:
                     try:
                         path = cls.interpretPath(fileName, pwd)
                         if os.path.isfile(path):
                             if not unique:
                                 result.append((line_index, path))
                             else:
                                 result.append(path)
                             ext = os.path.splitext(path)
                             if recursive and ext[1] in nm.settings().SEARCH_IN_EXT:
                                 result += cls.included_files(path, regexp_list)
                     except Exception:
                         import traceback
                         print traceback.format_exc()
         line_index += 1
     if unique:
         return list(set(result))
     return result
Example #7
0
    def __init__(self, filename, parent=None):
        self.parent = parent
        QTextEdit.__init__(self, parent)
        self.setObjectName(' - '.join(['Editor', filename]))
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_custom_context_menu)
        #        self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        self.setAcceptRichText(False)
        font = QFont()
        font.setFamily("Fixed".decode("utf-8"))
        font.setPointSize(12)
        self.setFont(font)
        self.setLineWrapMode(QTextEdit.NoWrap)
        self.setTabStopWidth(25)
        self.setAcceptRichText(False)
        self.setCursorWidth(2)
        self.setFontFamily("courier new")
        self.setProperty("backgroundVisible", True)
        self.regexp_list = [
            QRegExp("\\binclude\\b"),
            QRegExp("\\btextfile\\b"),
            QRegExp("\\bfile\\b"),
            QRegExp("\\bvalue=.*pkg:\/\/\\b"),
            QRegExp("\\bvalue=.*package:\/\/\\b"),
            QRegExp("\\bvalue=.*\$\(find\\b"),
            QRegExp("\\bargs=.*\$\(find\\b"),
            QRegExp("\\bdefault=.*\$\(find\\b")
        ]
        self.filename = filename
        self.file_info = None
        if self.filename:
            f = QFile(filename)
            if f.open(QIODevice.ReadOnly | QIODevice.Text):
                self.file_info = QFileInfo(filename)
                self.setText(unicode(f.readAll(), "utf-8"))

        self.path = '.'
        # enables drop events
        self.setAcceptDrops(True)
        if filename.endswith('.launch'):
            self.hl = XmlHighlighter(self.document())
            self.cursorPositionChanged.connect(self._document_position_changed)
        else:
            self.hl = YamlHighlighter(self.document())
        # variables for threaded search
        self._search_thread = None
        self._stop = False
Example #8
0
 def mouseReleaseEvent(self, event):
     '''
     Opens the new editor, if the user clicked on the included file and sets the
     default cursor.
     '''
     if event.modifiers() == Qt.ControlModifier or event.modifiers(
     ) == Qt.ShiftModifier:
         cursor = self.cursorForPosition(event.pos())
         index = self.index(cursor.block().text())
         if index > -1:
             startIndex = cursor.block().text().find('"', index)
             if startIndex > -1:
                 endIndex = cursor.block().text().find('"', startIndex + 1)
                 fileName = cursor.block().text()[startIndex + 1:endIndex]
                 if len(fileName) > 0:
                     try:
                         qf = QFile(interpret_path(fileName))
                         if not qf.exists():
                             # create a new file, if it does not exists
                             result = QMessageBox.question(
                                 self, "File not found", '\n\n'.join(
                                     ["Create a new file?",
                                      qf.fileName()]),
                                 QMessageBox.Yes | QMessageBox.No)
                             if result == QMessageBox.Yes:
                                 d = os.path.dirname(qf.fileName())
                                 if not os.path.exists(d):
                                     os.makedirs(d)
                                 with open(qf.fileName(), 'w') as f:
                                     if qf.fileName().endswith('.launch'):
                                         f.write('<launch>\n\n</launch>')
                                 event.setAccepted(True)
                                 self.load_request_signal.emit(
                                     qf.fileName())
                         else:
                             event.setAccepted(True)
                             self.load_request_signal.emit(qf.fileName())
                     except Exception, e:
                         WarningMessageBox(QMessageBox.Warning,
                                           "File not found %s" % fileName,
                                           str(e)).exec_()
Example #9
0
    def save(self, force=False):
        '''
        Saves changes to the file.
        :return: saved, errors, msg
        :rtype: bool, bool, str
        '''
        if force or self.document().isModified() or not QFileInfo(
                self.filename).exists():
            f = QFile(self.filename)
            if f.open(QIODevice.WriteOnly | QIODevice.Text):
                f.write(self.toPlainText().encode('utf-8'))
                self.document().setModified(False)
                self.file_info = QFileInfo(self.filename)

                ext = os.path.splitext(self.filename)
                # validate the xml structure of the launch files
                if ext[1] in self.CONTEXT_FILE_EXT:
                    imported = False
                    try:
                        from lxml import etree
                        imported = True
                        parser = etree.XMLParser()
                        etree.fromstring(self.toPlainText().encode('utf-8'),
                                         parser)
                    except Exception as e:
                        if imported:
                            self.markLine(e.position[0])
                            return True, True, "%s" % e
                # validate the yaml structure of yaml files
                elif ext[1] in self.YAML_VALIDATION_FILES:
                    try:
                        import yaml
                        yaml.load(self.toPlainText().encode('utf-8'))
                    except yaml.MarkedYAMLError as e:
                        return True, True, "%s" % e
                return True, False, ''
            else:
                return False, True, "Cannot write XML file"
        return False, False, ''
 def mouseReleaseEvent(self, event):
     '''
     Opens the new editor, if the user clicked on the included file and sets the
     default cursor.
     '''
     if event.modifiers() == Qt.ControlModifier or event.modifiers(
     ) == Qt.ShiftModifier:
         cursor = self.cursorForPosition(event.pos())
         inc_files = LaunchConfig.included_files(cursor.block().text(),
                                                 recursive=False)
         if inc_files:
             try:
                 qf = QFile(inc_files[0])
                 if not qf.exists():
                     # create a new file, if it does not exists
                     result = MessageBox.question(
                         self,
                         "File not found",
                         '\n\n'.join(["Create a new file?",
                                      qf.fileName()]),
                         buttons=MessageBox.Yes | MessageBox.No)
                     if result == MessageBox.Yes:
                         d = os.path.dirname(qf.fileName())
                         if not os.path.exists(d):
                             os.makedirs(d)
                         with open(qf.fileName(), 'w') as f:
                             if qf.fileName().endswith('.launch'):
                                 f.write('<launch>\n\n</launch>')
                         event.setAccepted(True)
                         self.load_request_signal.emit(qf.fileName())
                 else:
                     event.setAccepted(True)
                     self.load_request_signal.emit(qf.fileName())
             except Exception, e:
                 MessageBox.critical(self,
                                     "Error",
                                     "File not found %s" % inc_files[0],
                                     detailed_text=utf8(e))
import sys
from python_qt_binding.QtWidgets import QApplication, QWidget, QVBoxLayout
from python_qt_binding.QtCore import QFile, QIODevice, QObject
from rqt_graph.ros_graph import RosGraph


class FakePluginContext(QObject):
    def __init__(self):
        super(FakePluginContext, self).__init__()
        self.setObjectName('FakePluginContext')

    def serial_number(self):
        return 0

    def add_widget(self, widget):
        pass


if __name__ == "__main__":
    app = QApplication(sys.argv)
    fpc = FakePluginContext()
    r = RosGraph(fpc)

    handle = QFile(sys.argv[1])
    if not handle.open(QIODevice.WriteOnly | QIODevice.Text):
        exit(1)

    handle.write(r._generate_dotcode())
    handle.close()
Example #12
0
    def _save_dataset(self):

        formats = ['CSV', 'PKL', 'H5', 'DLS', 'FANN']
        supported_formats = ''
        for f in formats:
            supported_formats += f + ';;'

        self._data_filename, self._data_format = QFileDialog.getSaveFileName(
            self._widget, self.tr('Save dataset'), 'dataset_name',
            self.tr(supported_formats[:-2]))

        if self._data_filename is None or self._data_filename == '':
            return

        self._data_filename += '.' + self._data_format.lower()

        if self._data_format == 'CSV':

            # fill up the list of selected data leaves
            self._fill_selected_leaves_list()

            # create new stream file
            data_file = QFile(self._data_filename)
            if not data_file.open(QIODevice.WriteOnly | QIODevice.Text):
                return
            self._file_stream = QTextStream(data_file)

            # fill up single line record dictionary with topic keys
            self._line_record['timestamp'] = 0
            for leaf in self._selected_leaves:  #self._get_selected_items_list():
                self._line_record[leaf] = 0

            # write out header
            for key in self._line_record:
                self._file_stream << key << ','
            self._file_stream << '\n'

            # open bag file
            bag = rosbag.Bag(self._bag_filename)
            # cycle through selected base topics
            for topic, message, time in bag.read_messages(
                    self._get_selected_topics()):
                # traverse down the message slots
                # print('Traversing: ' + topic)
                self._line_record['timestamp'] = str(time)
                self._export_leaf_instance(message, '', '', topic, [])

            data_file.close()
            print('File saved: ' + self._data_filename)

        elif self._data_format == 'PKL':
            df = rosbag_pandas.bag_to_dataframe(self._bag_filename,
                                                self._get_selected_topics())
            df.to_pickle(self._data_filename)
            print('File saved: ' + self._data_filename)

        elif self._data_format == 'H5':
            df = rosbag_pandas.bag_to_dataframe(self._bag_filename,
                                                self._get_selected_topics())
            hdf_store = HDFStore(self._data_filename)
            hdf_store['df'] = df
            hdf_store.close()
            print('File saved: ' + self._data_filename)

        elif self._data_format == 'DLS':
            self._no_support_warning()

        elif self._data_format == 'FANN':
            self._no_support_warning()

        else:
            self._no_support_warning()