示例#1
0
    def __export(self):
        """Export annotations to a file."""

        try:

            if conf.PYFORMS_DIALOGS_OPTIONS:
                filename, ffilter = QFileDialog.getSaveFileName(
                    parent=self,
                    caption="Export annotations file",
                    directory="untitled.csv",
                    filter="CSV Files (*.csv);;CSV Matrix Files (*.csv)",
                    options=conf.PYFORMS_DIALOGS_OPTIONS)
            else:
                filename, ffilter = QFileDialog.getSaveFileName(
                    parent=self,
                    caption="Export annotations file",
                    directory="untitled.csv",
                    filter="CSV Files (*.csv);;CSV Matrix Files (*.csv)")

            filename = str(filename)
            ffilter = str(ffilter)
            if filename != "":
                with open(filename, 'w') as csvfile:
                    spamwriter = csv.writer(csvfile, dialect='excel')
                    if ffilter == 'CSV Files (*.csv)':
                        self._time.export_events_to_csvwriter(spamwriter)
                    elif ffilter == 'CSV Matrix Files (*.csv)':
                        self._time.exportmatrix_events_to_csvwriter(spamwriter)

        except Exception as e:
            traceback.print_exc()
            m = QMessageBox(QMessageBox.Critical, 'Error', str(e))
            m.exec_()
示例#2
0
    def save_image_as(self):
        img = self.get_selection().toImage()
        if img.isNull():
            QMessageBox.critical(self, self.tr('Error'), self.tr('No image was selected!'))
            return

        self.hide()

        formats = {
            self.tr('Portable Network Graphics (*.png)'): 'png',
            self.tr('Joint Photographic Experts Group (*.jpg *.jpeg)'): 'jpg',
            self.tr('Graphics Interchange Format (*.gif)'): 'gif',
            self.tr('Bitmap (*.bmp)'): 'bmp',
            self.tr('All Images (*.png *.jpg *.gif *.bmp)'): 'all'
        }

        file_format = None
        destination = QFileDialog.getSaveFileName(self, 'Save image', '', ';;'.join(formats.keys()))
        if isinstance(destination, tuple):
            destination, file_format = destination
            file_format = formats[file_format]
            if file_format == 'all':
                file_format = None

        if not file_format:
            file_format = destination.rsplit('.', 1)[-1]

        if destination:
            if file_format not in formats.values():
                file_format = 'png'
            if not destination.endswith('.' + file_format):
                destination += '.' + file_format
            img.save(destination, file_format, 0 if file_format == 'png' else 90)
        self.reject()
示例#3
0
    def save_report(self):
        """Save report"""
        filename, _ = QFileDialog.getSaveFileName(
            self, "Save Report", self.save_dir,
            "HTML (*.html);;PDF (*.pdf);;Report (*.report)")
        if not filename:
            return QDialog.Rejected

        self.save_dir = os.path.dirname(filename)
        self.saveSettings()
        _, extension = os.path.splitext(filename)
        if extension == ".pdf":
            printer = QPrinter()
            printer.setPageSize(QPrinter.A4)
            printer.setOutputFormat(QPrinter.PdfFormat)
            printer.setOutputFileName(filename)
            self.report_view.print_(printer)
        elif extension == ".report":
            self.save(filename)
        else:
            def save_html(contents):
                try:
                    with open(filename, "w", encoding="utf-8") as f:
                        f.write(contents)
                except PermissionError:
                    self.permission_error(filename)

            save_html(self.report_view.html())
        self.report_changed = False
        return QDialog.Accepted
    def save_network(self):
        # TODO: this was never reviewed since Orange2
        if self.view is None or self.graph is None:
            return

        filename = QFileDialog.getSaveFileName(
            self, 'Save Network', '',
            'NetworkX graph as Python pickle (*.gpickle)\n'
            'NetworkX edge list (*.edgelist)\n'
            'Pajek network (*.net *.pajek)\n'
            'GML network (*.gml)')
        if filename:
            _, ext = os.path.splitext(filename)
            if not ext: filename += ".net"
            items = self.graph.items()
            for i in range(self.graph.number_of_nodes()):
                graph_node = self.graph.node[i]
                plot_node = self.networkCanvas.networkCurve.nodes()[i]

                if items is not None:
                    ex = items[i]
                    if 'x' in ex.domain: ex['x'] = plot_node.x()
                    if 'y' in ex.domain: ex['y'] = plot_node.y()

                graph_node['x'] = plot_node.x()
                graph_node['y'] = plot_node.y()

            network.readwrite.write(self.graph, filename)
    def save_report(self):
        """Save report"""
        filename, _ = QFileDialog.getSaveFileName(
            self, "Save Report", self.save_dir,
            "HTML (*.html);;PDF (*.pdf);;Report (*.report)")
        if not filename:
            return QDialog.Rejected

        self.save_dir = os.path.dirname(filename)
        self.saveSettings()
        _, extension = os.path.splitext(filename)
        if extension == ".pdf":
            printer = QPrinter()
            printer.setPageSize(QPrinter.A4)
            printer.setOutputFormat(QPrinter.PdfFormat)
            printer.setOutputFileName(filename)
            self.report_view.print_(printer)
        elif extension == ".report":
            self.save(filename)
        else:

            def save_html(contents):
                try:
                    with open(filename, "w", encoding="utf-8") as f:
                        f.write(contents)
                except PermissionError:
                    self.permission_error(filename)

            save_html(self.report_view.html())
        self.report_changed = False
        return QDialog.Accepted
 def export_clicked(self):
     filename = str(QFileDialog.getSaveFileName(self, 'Choose a file', ''))
     if filename != "":
         output = open(filename, 'w')
         for values in self._polygons.value:
             output.write((';'.join(values) + '\n'))
         output.close()
示例#7
0
    def saveScript(self):
        index = self.selectedScriptIndex()
        if index is not None:
            script = self.libraryList[index]
            filename = script.filename
        else:
            filename = os.path.expanduser("~/")

        filename, _ = QFileDialog.getSaveFileName(
            self, 'Save Python Script',
            filename,
            'Python files (*.py)\nAll files(*.*)'
        )

        if filename:
            fn = ""
            head, tail = os.path.splitext(filename)
            if not tail:
                fn = head + ".py"
            else:
                fn = filename

            f = open(fn, 'w')
            f.write(self.text.toPlainText())
            f.close()
示例#8
0
    def export_tracking_file(self):

        filename, _ = QFileDialog.getSaveFileName(self,
                                                  'Select a file',
                                                  selectedFilter='*.csv')
        if not filename: return
        filename = str(filename)

        if not filename.lower().endswith('.csv'): filename += '.csv'

        #Export only the selected bounds
        lower = 0 if self._boundings.value[0] < 0 else self._boundings.value[0]
        higher = len(self._data) if self._boundings.value[1] > (
            len(self._data) + 1) else self._boundings.value[1]

        self._progress.min = lower
        self._progress.max = higher

        with open(filename, 'wb') as csvfile:
            spamwriter = csv.writer(csvfile, delimiter=',')

            for i in range(int(lower), int(higher)):
                self._progress.value = i
                if self._data[i] != None:
                    spamwriter.writerow(self._data[i].row)
示例#9
0
    def save_window(self):
        allparams = self.controls
        data = {}
        self.save_form(data)

        filename, _ = QFileDialog.getSaveFileName(self, 'Select file')
        with open(filename, 'w') as output_file:
            json.dump(data, output_file)
示例#10
0
 def create_project_remote_repo(self):
     out = QFileDialog.getSaveFileName(self, \
                                       'Choose a bare git repository', \
                                       self.local_proj_name+'.git', \
                                       'Bare git repo (*.git)')
     remote_loc = self.rgit.polish_url(out[0])
     self.repo.clone(remote_loc, bare=True)
     self.rgit.remote('add', self.remote_name, remote_loc)
示例#11
0
文件: owcolor.py 项目: zyblx/orange3
 def save(self):
     fname, _ = QFileDialog.getSaveFileName(
         self, "File name", self._start_dir(),
         "Variable definitions (*.colors)")
     if not fname:
         return
     QSettings().setValue("colorwidget/last-location",
                          os.path.split(fname)[0])
     self._save_var_defs(fname)
示例#12
0
 def __prompt_save_file_evt(self):
     """
     Opens a window for the user to select where to save the Harp sound file (.bin extension by default)
     """
     self._filename.value, _ = QFileDialog.getSaveFileName()
     if self._filename.value:
         self._gen_btn.enabled = True
     else:
         self._gen_btn.enabled = False
示例#13
0
	def __export(self):
		"""Export annotations to a file."""
		filename, _ = QFileDialog.getSaveFileName(parent=self,
		                                       caption="Export annotations file",
		                                       directory=self.get_export_filename(),
		                                       filter="CSV Files (*.csv)",
		                                       options=QFileDialog.DontUseNativeDialog)
		if filename != '':
			self.export_csv(filename)
示例#14
0
 def __prompt_savig_evt(self):
     '''
     Opens a window for user to select where to save the csv file
     '''
     self._filename.value, _ = QFileDialog.getSaveFileName()
     if self._filename.value:
         self._stream_file.enabled = True
     else:
         self._stream_file.value = False
         self._stream_file.enabled = False
示例#15
0
 def save_file_as(self):
     file_name = self.filename or self.last_dir or os.path.expanduser("~")
     filename, _ = QFileDialog.getSaveFileName(
         self, "Select file", file_name, 'Distance files (*.dst)')
     if not filename:
         return
     self.filename = filename
     self.unconditional_save_file()
     self.last_dir = os.path.split(self.filename)[0]
     self.adjust_label()
示例#16
0
    def click(self):
        value = QFileDialog.getSaveFileName(self.parent, self._label,
                                            self.value, self.filter)

        if conf.PYFORMS_USE_QT5:
            value = value[0]
        else:
            value = str(value)

        if value and len(value) > 0: self.value = value
示例#17
0
 def save_file_as(self):
     file_name = self.filename or self.last_dir or os.path.expanduser("~")
     filename, _ = QFileDialog.getSaveFileName(self, "Select file",
                                               file_name,
                                               'Distance files (*.dst)')
     if not filename:
         return
     self.filename = filename
     self.unconditional_save_file()
     self.last_dir = os.path.split(self.filename)[0]
     self.adjust_label()
示例#18
0
 def click(self):
     if self.saved_file_type == 'txt':
         value, _ = QFileDialog.getSaveFileName(
             self.parent, self._label, self.value,
             "Text Files (*.txt);;All Files (*)")
     elif self.saved_file_type == 'xlsx':
         value, _ = QFileDialog.getSaveFileName(
             self.parent, self._label, self.value,
             "Excel Files (*.xlsx);;All Files (*)")
     elif self.saved_file_type == 'json':
         value, _ = QFileDialog.getSaveFileName(
             self.parent, self._label, self.value,
             "Config Files (*.json);;All Files (*)")
     else:
         value, _ = QFileDialog.getSaveFileName(self.parent, self._label,
                                                self.value)
     if value and len(value) > 0:
         self.value = value if value[-1 - len(
             self.saved_file_type
         ):] == '.' + self.saved_file_type else value + '.' + self.saved_file_type
示例#19
0
def get_file_name(start_dir, start_filter, file_formats):
    """
    Get filename for the given possible file formats

    The function uses the standard save file dialog with filters from the
    given file formats. Extension is added automatically, if missing. If the
    user enters file extension that does not match the file format, (s)he is
    given a dialog to decide whether to fix the extension or the format.

    Function also returns the writer and filter to cover the case where the
    same extension appears in multiple filters. Although `file_format` is a
    dictionary that associates its extension with one writer, writers can
    still have other extensions that are allowed.

    Args:
        start_dir (str): initial directory, optionally including the filename
        start_filter (str): initial filter
        file_formats (list of Orange.data.io.FileFormat): file formats
    Returns:
        (filename, filter, writer), or `(None, None, None)` on cancel
    """
    writers = sorted(set(file_formats.values()), key=lambda w: w.PRIORITY)
    filters = [format_filter(w) for w in writers]
    if start_filter not in filters:
        start_filter = filters[0]

    while True:
        filename, filter = QFileDialog.getSaveFileName(None, 'Save As...',
                                                       start_dir,
                                                       ';;'.join(filters),
                                                       start_filter)
        if not filename:
            return None, None, None

        writer = writers[filters.index(filter)]
        base, ext = os.path.splitext(filename)
        if not ext:
            filename += writer.EXTENSIONS[0]
        elif ext not in writer.EXTENSIONS:
            format = writer.DESCRIPTION
            suggested_ext = writer.EXTENSIONS[0]
            suggested_format = \
                ext in file_formats and file_formats[ext].DESCRIPTION
            res = fix_extension(ext, format, suggested_ext, suggested_format)
            if res == fix_extension.CANCEL:
                continue
            if res == fix_extension.CHANGE_EXT:
                filename = base + suggested_ext
            elif res == fix_extension.CHANGE_FORMAT:
                writer = file_formats[ext]
                filter = format_filter(writer)
        return filename, writer, filter
示例#20
0
 def export_2_csvfile_event(self, data_func):
     filename, ffilter = QFileDialog.getSaveFileName(
         parent=self,
         caption="Export data",
         directory="untitled.csv",
         filter="CSV Files (*.csv)")
     if filename is not None and len(filename.strip()) > 0:
         filename = str(filename)
         with open(filename, 'w') as outfile:
             for i in range(len(self)):
                 v = data_func(i)
                 if v is not None:
                     outfile.write((';'.join(map(str, [i, v])) + '\n'))
示例#21
0
def get_file_name(start_dir, start_filter, file_formats):
    """
    Get filename for the given possible file formats

    The function uses the standard save file dialog with filters from the
    given file formats. Extension is added automatically, if missing. If the
    user enters file extension that does not match the file format, (s)he is
    given a dialog to decide whether to fix the extension or the format.

    Function also returns the writer and filter to cover the case where the
    same extension appears in multiple filters. Although `file_format` is a
    dictionary that associates its extension with one writer, writers can
    still have other extensions that are allowed.

    Args:
        start_dir (str): initial directory, optionally including the filename
        start_filter (str): initial filter
        file_formats (dict {extension: Orange.data.io.FileFormat}): file formats
    Returns:
        (filename, writer, filter), or `(None, None, None)` on cancel
    """
    writers = sorted(set(file_formats.values()), key=lambda w: w.PRIORITY)
    filters = [format_filter(w) for w in writers]
    if start_filter not in filters:
        start_filter = filters[0]

    while True:
        filename, filter = QFileDialog.getSaveFileName(
            None, 'Save As...', start_dir, ';;'.join(filters), start_filter)
        if not filename:
            return None, None, None

        writer = writers[filters.index(filter)]
        base, ext = os.path.splitext(filename)
        if not ext:
            filename += writer.EXTENSIONS[0]
        elif ext not in writer.EXTENSIONS:
            format = writer.DESCRIPTION
            suggested_ext = writer.EXTENSIONS[0]
            suggested_format = \
                ext in file_formats and file_formats[ext].DESCRIPTION
            res = fix_extension(ext, format, suggested_ext, suggested_format)
            if res == fix_extension.CANCEL:
                continue
            if res == fix_extension.CHANGE_EXT:
                filename = base + suggested_ext
            elif res == fix_extension.CHANGE_FORMAT:
                writer = file_formats[ext]
                filter = format_filter(writer)
        return filename, writer, filter
示例#22
0
    def click(self):

        if self.use_save_dialog:
            value = QFileDialog.getSaveFileName(self.parent, self._label,
                                                self.value)
        else:
            value = QFileDialog.getOpenFileName(self.parent, self._label,
                                                self.value)

        if _api.USED_API == _api.QT_API_PYQT5:
            value = value[0]
        elif _api.USED_API == _api.QT_API_PYQT4:
            value = str(value)

        if value and len(value) > 0: self.value = value
示例#23
0
    def click(self):

        if self.use_save_dialog:
            value = QFileDialog.getSaveFileName(self.parent, self._label,
                                                self.value)
        else:
            value = QFileDialog.getOpenFileName(self.parent, self._label,
                                                self.value)

        if conf.PYFORMS_USE_QT5:
            value = value[0]
        else:
            value = str(value)

        if value and len(value) > 0: self.value = value
示例#24
0
    def __export_2_csv_matrix(self):
        QMessageBox.warning(
            self, "Important!",
            'Please note that this file cannot be imported after.')

        filename, _ = QFileDialog.getSaveFileName(
            parent=self,
            caption="Export matrix file",
            directory="untitled.csv",
            filter="CSV Files (*.csv)",
            options=QFileDialog.DontUseNativeDialog)
        if filename != "":
            with open(filename, 'w') as csvfile:
                spamwriter = csv.writer(csvfile, dialect='excel')
                self._time.exportmatrix_events_to_csvwriter(spamwriter)
示例#25
0
    def browse(self):
        """Select a filename using a Save file dialog."""
        if self.filename is None:
            startdir = stdpaths.Documents
        else:
            startdir = os.path.dirname(self.filename)

        filename, _ = QFileDialog.getSaveFileName(self, self.tr("Save"), directory=startdir, filter=self.FILTER)
        if filename:
            if not filename.endswith(self.FILE_EXT):
                filename += self.FILE_EXT
            if self.model is not None:
                self.save(filename)
            else:
                self._remember(filename)
示例#26
0
    def click(self):
        if self.use_save_dialog:
            value, _ = QFileDialog.getSaveFileName(self.parent, self._label,
                                                   self.value)
        else:
            value = QFileDialog.getOpenFileName(
                self.parent,
                self._label,
                self.value,
                options=conf.PYFORMS_DIALOGS_OPTIONS)

        if _api.USED_API == _api.QT_API_PYQT5:
            value = value[0]
        elif _api.USED_API == _api.QT_API_PYQT4:
            value = str(value)

        if value and len(value) > 0: self.value = value
示例#27
0
    def browse(self):
        """Select a filename using a Save file dialog."""
        if self.filename is None:
            startdir = stdpaths.Documents
        else:
            startdir = os.path.dirname(self.filename)

        filename, _ = QFileDialog.getSaveFileName(
            self, self.tr("Save"), directory=startdir, filter=self.FILTER
        )
        if filename:
            if not filename.endswith(self.FILE_EXT):
                filename += self.FILE_EXT
            if self.model is not None:
                self.save(filename)
            else:
                self._remember(filename)
示例#28
0
    def __export(self):
        """Export annotations to a file."""

        filename, ffilter = QFileDialog.getSaveFileName(
            parent=self,
            caption="Export annotations file",
            directory="untitled.csv",
            filter="CSV Files (*.csv);;CSV Matrix Files (*.csv)",
            options=conf.PYFORMS_DIALOGS_OPTIONS)

        filename = str(filename)
        ffilter = str(ffilter)
        if filename != "":
            with open(filename, 'w') as csvfile:
                spamwriter = csv.writer(csvfile, dialect='excel')
                if ffilter == 'CSV Files (*.csv)':
                    self._time.export_events_to_csvwriter(spamwriter)
                elif ffilter == 'CSV Matrix Files (*.csv)':
                    self._time.exportmatrix_events_to_csvwriter(spamwriter)
    def __export(self):
        """Export annotations to a file."""

        filename, ffilter = QFileDialog.getSaveFileName(
            parent=self,
            caption="Export annotations file",
            directory="untitled.csv",
            filter="CSV Files (*.csv);;CSV Matrix Files (*.csv)",
            options=QFileDialog.DontUseNativeDialog)

        filename = str(filename)
        ffilter = str(ffilter)
        if filename != "":
            with open(filename, 'w') as csvfile:
                spamwriter = csv.writer(csvfile, dialect='excel')
                if ffilter == 'CSV Files (*.csv)':
                    self._time.export_csv(spamwriter)
                elif ffilter == 'CSV Matrix Files (*.csv)':
                    self._time.export_2_csv_matrix(spamwriter)
示例#30
0
    def __on_save_word_list(self):
        index = self._get_selected_word_list_index()
        if index is not None:
            word_list = self.library_model[index]
            filename = word_list.filename
        else:
            filename = os.path.expanduser("~/")

        filename, _ = QFileDialog.getSaveFileName(
            self, "Save Word List", filename,
            "Text files (*.txt)\nAll files(*.*)")
        if filename:
            head, tail = os.path.splitext(filename)
            if not tail:
                filename = head + ".txt"

            with open(filename, "w", encoding="utf-8") as f:
                for word in self.words_model:
                    f.write(f"{word}\n")
示例#31
0
def save_ontology(parent: OWWidget, filename: str, data: Dict):
    filename, _ = QFileDialog.getSaveFileName(
        parent, "Save Ontology", filename,
        ";;".join(SaveFileFormats)
    )
    if filename:
        assert isinstance(data, dict)

        head, tail = os.path.splitext(filename)

        if tail == ".json":
            with open(filename, "w") as f:
                f.write(json.dumps(data))

        elif tail == ".pkl":
            with open(filename, "wb") as f:
                pickle.dump(data, f)

        else:
            raise NotImplementedError()
    def save_report(self):
        """Save report"""
        formats = OrderedDict((
            ("HTML (*.html)", ".html"),
            ("PDF (*.pdf)", ".pdf"),
            ("Report (*.report)", ".report"),
        ))

        filename, selected_format = QFileDialog.getSaveFileName(
            self, "Save Report", self.save_dir, ";;".join(formats.keys()))
        if not filename:
            return QDialog.Rejected

        # Set appropriate extension if not set by the user
        expect_ext = formats[selected_format]
        if not filename.endswith(expect_ext):
            filename += expect_ext

        self.save_dir = os.path.dirname(filename)
        self.saveSettings()
        _, extension = os.path.splitext(filename)
        if extension == ".pdf":
            printer = QPrinter()
            printer.setPageSize(QPrinter.A4)
            printer.setOutputFormat(QPrinter.PdfFormat)
            printer.setOutputFileName(filename)
            self._print_to_printer(printer)
        elif extension == ".report":
            self.save(filename)
        else:

            def save_html(contents):
                try:
                    with open(filename, "w", encoding="utf-8") as f:
                        f.write(contents)
                except PermissionError:
                    self.permission_error(filename)

            save_html(self.report_view.html())
        self.report_changed = False
        return QDialog.Accepted
示例#33
0
    def _file_oper_click(self):
        value = None
        if self.use_save_dialog is True:
            # QFileDialog.getSaveFileName returns (path, AllFiles(*))
            value, _ = \
                QFileDialog.getSaveFileName(
                    self.parent, self.label, self.value)
        elif self.use_save_dialog is False:
            # QFileDialog.getOpenFileName returns (path, AllFiles(*))
            value, _ = \
                QFileDialog.getOpenFileName(
                    self.parent, self.label, self.value)

        else:
            raise ValueError(
                """Unsupported value for 'use_save_dialog' parameter""")

        value = str(value)

        # print(value)
        # TODO fix when no load file is provided
        if value:
            if self.use_save_dialog is True:
                self.su2_config.save_path = value
                self.trgt_cfg_editor.saved_config_path_label = \
                    self.su2_config.save_path
                saver = SU2ConfigSaver(su2_cfg_obj=self.su2_config,
                                       vert_tabs_w=self.trgt_tabs_w)
                saver.write_cfg()

            if self.use_save_dialog is False:
                self.su2_config.load_path = value
                self._parse_cfg(tb_prsd_cfg_pth=value)
                self.su2_config.set_sections_labels()
                self.trgt_tabs_w.vert_tab_w_ctrl._set_tabs()
                self.trgt_sect_sel_w.chkbx_list_ctrl._set_sections()
                # tabs must be refreshed

                self.trgt_cfg_editor.loaded_config_path_label = \
                    self.su2_config.load_path
示例#34
0
    def save_report(self):
        """Save report"""
        formats = OrderedDict((('HTML (*.html)', '.html'),
                               ('PDF (*.pdf)', '.pdf'),
                               ('Report (*.report)', '.report')))

        filename, selected_format = QFileDialog.getSaveFileName(
            self, "Save Report", self.save_dir, ';;'.join(formats.keys()))
        if not filename:
            return QDialog.Rejected

        # Set appropriate extension if not set by the user
        expect_ext = formats[selected_format]
        if not filename.endswith(expect_ext):
            filename += expect_ext

        self.save_dir = os.path.dirname(filename)
        self.saveSettings()
        _, extension = os.path.splitext(filename)
        if extension == ".pdf":
            printer = QPrinter()
            printer.setPageSize(QPrinter.A4)
            printer.setOutputFormat(QPrinter.PdfFormat)
            printer.setOutputFileName(filename)
            self._print_to_printer(printer)
        elif extension == ".report":
            self.save(filename)
        else:
            def save_html(contents):
                try:
                    with open(filename, "w", encoding="utf-8") as f:
                        f.write(contents)
                except PermissionError:
                    self.permission_error(filename)

            save_html(self.report_view.html())
        self.report_changed = False
        return QDialog.Accepted
    def export_tracking_file(self):

        filename, _ = QFileDialog.getSaveFileName(self,
                                                  'Select a file',
                                                  selectedFilter='*.csv')
        if not filename: return
        filename = str(filename)
        if not filename.lower().endswith('.csv'): filename += '.csv'

        #Export only the selected bounds
        lower = 0 if self._boundings.value[0] < 0 else self._boundings.value[0]
        higher = len(self._data) if self._boundings.value[1] > (
            len(self._data) + 1) else self._boundings.value[1]

        self._progress.min = lower
        self._progress.max = higher

        which_var = 0 if self._heatmapVarsList.value == 'Velocity' else 1
        try:
            sphere = sphere_x, sphere_y, sphere_z, sphere_r = eval(
                self._sphere.value)
        except:
            sphere = None

        min_var, max_var = self._heatmapVarsBnds.value

        #Calculate the size of the map
        x_diff = self._data.xRange[1] - self._data.xRange[0]
        y_diff = self._data.yRange[1] - self._data.yRange[0]
        z_diff = self._data.zRange[1] - self._data.zRange[0]
        scale = self.fit_scale(x_diff, y_diff,
                               z_diff)  #Fit the best scale value

        with open(filename, 'wb') as csvfile:
            spamwriter = csv.writer(csvfile, delimiter=',')

            for i in range(int(lower), int(higher)):
                self._progress.value = i

                position = self._data[i].position
                x, y, z = position
                x += abs(self._data.xRange[0])
                y += abs(self._data.yRange[0])
                z += abs(self._data.zRange[0])
                x = int(round(x * scale))
                y = int(round(y * scale))
                z = int(round(z * scale))

                if sphere != None and lin_dist3d(
                    (x, y, z), (sphere_x, sphere_y, sphere_z)) > sphere_r:
                    continue

                if self._toggleHeatmapVars.checked:
                    var = self._velocities[
                        i] if which_var == 0 else self._accelerations[i]
                    if not (min_var <= var <= max_var): continue

                if self._data[i] == None: continue

                row2save = self._data[i].row
                if i > lower: row2save = row2save + [self._velocities[i]]
                if (i + 1) > lower:
                    row2save = row2save + [self._accelerations[i]]
                spamwriter.writerow(row2save)