BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SavePlotAssistant.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.cpp
6 //! @brief Implements class SavePlotAssistant
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include "Base/Utils/Assert.h"
19 #include <QFileDialog>
20 #include <QMessageBox>
21 
22 namespace {
23 const QString png_extension = ".png";
24 const QString jpg_extension = ".jpg";
25 const QString pdf_extension = ".pdf";
26 const QString int_extension = ".int";
27 const QString tif_extension = ".tif";
28 const QString txt_extension = ".txt";
29 
30 QVector<SavePlotAssistant::Format> initializeFormats()
31 {
32  QVector<SavePlotAssistant::Format> result;
33  result.push_back(SavePlotAssistant::Format(png_extension, "png Image (*.png)"));
34  result.push_back(SavePlotAssistant::Format(jpg_extension, "jpg Image (*.jpg)"));
35  result.push_back(SavePlotAssistant::Format(pdf_extension, "pdf File (*.pdf)"));
36  result.push_back(SavePlotAssistant::Format(int_extension, "BornAgain ASCII format (*.int)"));
37  result.push_back(SavePlotAssistant::Format(txt_extension, "Simple ASCII table (*.txt)"));
38 #ifdef BORNAGAIN_TIFF_SUPPORT
39  result.push_back(SavePlotAssistant::Format(tif_extension, "32-bits TIFF files (*.tif)"));
40 #endif
41  return result;
42 }
43 
44 } // namespace
45 
46 QVector<SavePlotAssistant::Format> SavePlotAssistant::m_formats = initializeFormats();
47 
48 SavePlotAssistant::Format::Format(const QString& file_extention, const QString& filter)
49  : m_file_extention(file_extention), m_filter(filter)
50 {
51 }
52 
53 void SavePlotAssistant::savePlot(const QString& dirname, QCustomPlot* plot,
54  OutputData<double>* output_data)
55 
56 {
57  QString selectedFilter("*.png");
58  QString defaultName = dirname + "/untitled";
59  QString fileName = QFileDialog::getSaveFileName(0, "Save Plot", defaultName, getFilterString(),
60  &selectedFilter);
61 
62  QString nameToSave = composeFileName(fileName, selectedFilter);
63 
64  if (!nameToSave.isEmpty()) {
65  try {
66  saveToFile(nameToSave, plot, output_data);
67  } catch (const std::exception& ex) {
68  QString message = "Attempt to save file with the name '";
69  message.append(nameToSave);
70  message.append("' has failed with following error message\n\n");
71  message.append(QString::fromStdString(ex.what()));
72  QMessageBox::warning(0, "Houston, we have a problem.", message);
73  }
74  }
75 }
76 
77 void SavePlotAssistant::saveToFile(const QString& fileName, QCustomPlot* plot,
78  OutputData<double>* output_data)
79 {
80  if (isPngFile(fileName)) {
81  plot->savePng(fileName);
82  }
83 
84  else if (isJpgFile(fileName)) {
85  plot->saveJpg(fileName);
86  }
87 
88  else if (isPdfFile(fileName)) {
89  plot->savePdf(fileName, plot->width(), plot->height());
90  }
91 
92  else {
93  ASSERT(output_data);
94  IntensityDataIOFactory::writeOutputData(*output_data, fileName.toStdString());
95  }
96 }
97 
98 //! Returns string contraining all defined filters in the format suitable for QFileDialog
100 {
101  QString result;
102  for (int i = 0; i < m_formats.size(); ++i) {
103  result.append(m_formats[i].m_filter);
104  if (i != m_formats.size() - 1)
105  result.append(";;");
106  }
107  return result;
108 }
109 
110 //! Compose file name to save plot from information provided by QFileDialog
111 QString SavePlotAssistant::composeFileName(const QString& fileName, const QString& filterName) const
112 {
113  QString result;
114  if (!fileName.isEmpty() && !filterName.isEmpty()) {
115  if (isValidExtension(fileName)) {
116  result = fileName;
117  } else {
118  result = fileName + getExtensionFromFilterName(filterName);
119  }
120  }
121  return result;
122 }
123 
124 bool SavePlotAssistant::isValidExtension(const QString& fileName) const
125 {
126  for (int i = 0; i < m_formats.size(); ++i) {
127  if (fileName.endsWith(m_formats[i].m_file_extention, Qt::CaseInsensitive)) {
128  return true;
129  }
130  }
131  return false;
132 }
133 
134 QString SavePlotAssistant::getExtensionFromFilterName(const QString& filterName) const
135 {
136  for (int i = 0; i < m_formats.size(); ++i) {
137  if (m_formats[i].m_filter == filterName) {
138  return m_formats[i].m_file_extention;
139  }
140  }
141  return "";
142 }
143 
144 bool SavePlotAssistant::isPngFile(const QString& fileName) const
145 {
146  return fileName.endsWith(png_extension, Qt::CaseInsensitive);
147 }
148 
149 bool SavePlotAssistant::isJpgFile(const QString& fileName) const
150 {
151  return fileName.endsWith(jpg_extension, Qt::CaseInsensitive);
152 }
153 
154 bool SavePlotAssistant::isPdfFile(const QString& fileName) const
155 {
156  return fileName.endsWith(pdf_extension, Qt::CaseInsensitive);
157 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:31
Defines class ColorMap.
Defines class IntensityDataIOFactory.
Defines class SavePlotAssistant.
static void writeOutputData(const OutputData< double > &data, const std::string &file_name)
Writes OutputData in file.
QString getExtensionFromFilterName(const QString &filterName) const
bool isPdfFile(const QString &fileName) const
QString composeFileName(const QString &fileName, const QString &filterName) const
Compose file name to save plot from information provided by QFileDialog.
bool isJpgFile(const QString &fileName) const
QString getFilterString() const
Returns string contraining all defined filters in the format suitable for QFileDialog.
bool isPngFile(const QString &fileName) const
void saveToFile(const QString &dirname, QCustomPlot *plot, OutputData< double > *output_data)
static QVector< Format > m_formats
bool isValidExtension(const QString &fileName) const
void savePlot(const QString &dirname, QCustomPlot *plot, OutputData< double > *output_data)
void warning(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
Definition: GUIHelpers.cpp:74