diff --git a/plotview.cpp b/plotview.cpp index 5888c81..ef6e86d 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -19,11 +19,18 @@ #include "plotview.h" #include +#include #include #include #include #include #include +#include +#include +#include +#include +#include +#include #include "plots.h" PlotView::PlotView(InputSource *input) : cursors(this), viewRange({0, 0}) @@ -94,6 +101,17 @@ void PlotView::contextMenuEvent(QContextMenuEvent * event) extract->setEnabled(cursorsEnabled && (src->sampleType() == typeid(float))); menu.addAction(extract); + // Add action to export the selected samples into a file + auto save = new QAction("Export samples to file...", &menu); + connect( + save, &QAction::triggered, + this, [=]() { + exportSamples(src); + } + ); + save->setEnabled(src->sampleType() == typeid(std::complex)); + menu.addAction(save); + if (menu.exec(event->globalPos())) updateView(false); } @@ -193,6 +211,74 @@ void PlotView::extractSymbols(std::shared_ptr src) std::cout << std::endl << std::flush; } +void PlotView::exportSamples(std::shared_ptr src) +{ + auto complexSrc = std::dynamic_pointer_cast>>(src); + if (!complexSrc) { + return; + } + + QFileDialog dialog(this); + dialog.setFileMode(QFileDialog::AnyFile); + dialog.setOption(QFileDialog::DontUseNativeDialog, true); + + QGroupBox groupBox("Selection To Export", &dialog); + QVBoxLayout vbox(&groupBox); + + QRadioButton cursorSelection("Cursor Selection", &groupBox); + QRadioButton currentView("Current View", &groupBox); + QRadioButton completeFile("Complete File", &groupBox); + + if (cursorsEnabled) { + cursorSelection.setChecked(true); + } else { + currentView.setChecked(true); + cursorSelection.setEnabled(false); + } + + vbox.addWidget(&cursorSelection); + vbox.addWidget(¤tView); + vbox.addWidget(&completeFile); + vbox.addStretch(1); + + groupBox.setLayout(&vbox); + + QGridLayout *l = dialog.findChild(); + l->addWidget(&groupBox, 4, 1); + + QGroupBox groupBox2("Decimation"); + QSpinBox decimation(&groupBox2); + decimation.setValue(1); + + QVBoxLayout vbox2; + vbox2.addWidget(&decimation); + + groupBox2.setLayout(&vbox2); + l->addWidget(&groupBox2, 4, 2); + + if (dialog.exec()) { + QStringList fileNames = dialog.selectedFiles(); + + off_t start, length; + if(cursorSelection.isChecked()) { + start = selectedSamples.minimum; + length = selectedSamples.length(); + } else if(currentView.isChecked()) { + start = viewRange.minimum; + length = viewRange.length(); + } else { + start = 0; + length = complexSrc->count(); + } + + auto samples = complexSrc->getSamples(start, length); + std::ofstream os (fileNames[0].toStdString(), std::ios::binary); + for (auto i = 0; i < length; i += decimation.value()) { + os.write((const char*)&samples[i], 8); + } + } +} + void PlotView::invalidateEvent() { horizontalScrollBar()->setMinimum(0); diff --git a/plotview.h b/plotview.h index 61398de..32922b3 100644 --- a/plotview.h +++ b/plotview.h @@ -80,6 +80,7 @@ private: void addPlot(Plot *plot); void emitTimeSelection(); void extractSymbols(std::shared_ptr src); + void exportSamples(std::shared_ptr src); int plotsHeight(); off_t samplesPerLine(); void updateView(bool reCenter = false);