feat: the export writes an MDF 3.30 file, so a window loads in ScryLab
A third format beside `.npy` and `.csv`, written by hand in `src/export.cpp` -- MF4 is HDF5 and would mean a library, MF3 is a handful of fixed blocks. The layout is the asammdf 8.8.27 reader's own field list, byte-diffed against a known-good 3.30 file it wrote; the shape is the one ScryLab's data-source contract asks for: one channel group, record-interleaved, the master as the x axis, and the unit in the channel's conversion block. So in MDF the master is `abs_seconds`, named `time` -- the clock that is the same in every display mode -- and the plotted axis goes out as an ordinary channel, `time_relative`. `ExportTable::Column` gained the CONFIG's unit, which only this writer spells out; the `.npy`/`.csv` bytes are unchanged, and `write_export()` now picks the writer for both the dialog and the probe.
This commit is contained in:
1 parent
761615c2fe
commit
908286ee89
10 files changed
+505
-28
No files matched your search
+11
-3
@@ -2371,10 +2371,10 @@ void on_export_response(GObject* source, GAsyncResult* result, gpointer user) {
|
||||
}
|
||||
|
||||
// The extension picks the writer, so the filter the user chose is honoured by way of
|
||||
// the name it put in the entry rather than by a second piece of state.
|
||||
const bool csv = path.size() >= 4 && path.compare(path.size() - 4, 4, ".csv") == 0;
|
||||
// the name it put in the entry rather than by a second piece of state. `.npy` is what an
|
||||
// unknown extension gets, which is the dialog's default filter too.
|
||||
std::string error;
|
||||
const bool ok = csv ? write_csv(path, ctx->table, error) : write_npy(path, ctx->table, error);
|
||||
const bool ok = write_export(path, ctx->table, error);
|
||||
if (!ok) {
|
||||
set_notice(*ctx->app, "export failed: " + error);
|
||||
return;
|
||||
@@ -2411,10 +2411,18 @@ void on_export_clicked(GtkButton*, gpointer user) {
|
||||
gtk_file_filter_set_name(csv, "CSV (*.csv)");
|
||||
gtk_file_filter_add_pattern(csv, "*.csv");
|
||||
g_list_store_append(filters, csv);
|
||||
// MDF 3.30, which is what ScryLab (and every MDF reader) opens: offered by both of the
|
||||
// extensions the format is stored under.
|
||||
GtkFileFilter* mdf = gtk_file_filter_new();
|
||||
gtk_file_filter_set_name(mdf, "MDF 3.30 (*.mf3, *.mdf)");
|
||||
gtk_file_filter_add_pattern(mdf, "*.mf3");
|
||||
gtk_file_filter_add_pattern(mdf, "*.mdf");
|
||||
g_list_store_append(filters, mdf);
|
||||
gtk_file_dialog_set_filters(dialog, G_LIST_MODEL(filters));
|
||||
gtk_file_dialog_set_default_filter(dialog, npy);
|
||||
g_object_unref(npy);
|
||||
g_object_unref(csv);
|
||||
g_object_unref(mdf);
|
||||
g_object_unref(filters);
|
||||
|
||||
gtk_file_dialog_save(dialog, GTK_WINDOW(app->window), nullptr, on_export_response,
|
||||
|
||||
Reference in new issue
Block a user