15 #ifdef BORNAGAIN_PYTHON
30 #include <QApplication>
32 #include <QFileDialog>
33 #include <QTextStream>
40 std::string bornagainDir()
43 return pythonPath.empty() ? BABuild::buildLibDir() :
std::string();
49 QString getCandidate(
const QStringList& funcNames)
51 if (funcNames.isEmpty())
54 for (
auto str : funcNames) {
55 QString
name = str.toLower();
56 if (
name.contains(
"sample") ||
name.contains(
"multilayer"))
60 return funcNames.front();
73 if (fileName.isEmpty())
76 QString snippet =
readFile(fileName);
77 if (snippet.isEmpty())
81 if (funcName.isEmpty())
97 QString result = QFileDialog::getOpenFileName(
m_mainWindow,
"Open python script", dirname,
98 "Python scripts (*.py)");
109 if (fileName.isEmpty())
125 }
catch (
const std::exception& ex) {
126 QString message(
"Can't read the file. \n\n");
127 message += QString::fromStdString(std::string(ex.what()));
139 QStringList funcList;
141 QApplication::setOverrideCursor(Qt::WaitCursor);
146 }
catch (
const std::exception& ex) {
147 QApplication::restoreOverrideCursor();
148 QString message(
"Exception thrown while acquiring functions from Python code.\n\n");
149 QString details = QString::fromStdString(std::string(ex.what()));
154 QApplication::restoreOverrideCursor();
165 if (funcNames.empty()) {
166 QString message(
"Python code doesn't contain any functions.\n\n");
169 }
else if (funcNames.size() == 1) {
170 return funcNames.front();
174 dialog.
addItems(funcNames, getCandidate(funcNames));
175 dialog.
setTextTop(
"Python code contains a few functions. Do you know by chance, "
176 "which one is intended to produce a valid MultiLayer?");
178 "Please select a valid function in combo box and press OK to continue.");
179 if (dialog.exec() == QDialog::Accepted)
190 const QString& funcName)
192 std::unique_ptr<MultiLayer> result;
194 QApplication::setOverrideCursor(Qt::WaitCursor);
199 }
catch (
const std::exception& ex) {
200 QApplication::restoreOverrideCursor();
201 QString message(
"Exception thrown while executing Python code to create multilayer.\n\n");
202 QString details = QString::fromStdString(std::string(ex.what()));
205 QApplication::restoreOverrideCursor();
215 QString
name = sampleName;
216 if (multilayer.
getName() !=
"MultiLayer")
217 name = QString::fromStdString(multilayer.
getName());
222 QString message(
"Seems that import was successfull.\n\n"
223 "Check SampleView for new sample and material editor for new materials.");
226 }
catch (
const std::exception& ex) {
227 QString message(
"Exception thrown while trying to build GUI models.\n"
228 "GUI models might be in unconsistent state.\n\n");
229 QString details = QString::fromStdString(std::string(ex.what()));
Defines class ComboSelectorDialog.
Defines class DetailedMessageBox.
Defines class GUIHelpers functions.
Defines GUIObjectBuilder namespace.
Defines class MainWindow.
Defines class ProjectManager.
Defines class MultiLayer.
Defines ProjectUtils namespace.
Implements class PyImportAssistant.
Defines PyImport namespace.
Defines various stuff in namespace Utils.
static ProjectManager * projectManager()
A dialog similar to standard QMessageBox with combo box selector.
void addItems(const QStringList &selection, const QString ¤tItem="")
void setTextTop(const QString &text)
void setTextBottom(const QString &text)
QString currentText() const
A dialog similar to standard QMessageBox intended for detailed warning messages.
const std::string & getName() const
SampleModel * sampleModel()
MaterialModel * materialModel()
Our sample model: a stack of layers one below the other.
void setImportDir(const QString &dirname)
Sets user import directory in system settings.
QString userImportDir() const
Returns directory name which was used by the user to import files.
QString fileNameToOpen()
Lets user to select Python file on disk.
QString readFile(const QString &fileName)
Read content of text file and returns it as a multi-line string.
QString getPySampleFunctionName(const QString &snippet)
Returns the name of function which might generate a MultiLayer in Python code snippet.
void populateModels(const MultiLayer &multilayer, const QString &sampleName)
Populates GUI models with domain multilayer.
MainWindow * m_mainWindow
PyImportAssistant(MainWindow *mainwin)
void saveImportDir(const QString &fileName)
Saves file location as a future import dir.
std::unique_ptr< MultiLayer > createMultiLayer(const QString &snippet, const QString &funcName)
Creates a multi-layer by executing a funcName in embedded Python.
QString selectPySampleFunction(const QStringList &funcNames)
Lets user select a function name which generates a MultiLayer.
void warning(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
QString baseName(const QString &fileName)
Returns base name of file.
void information(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
QString fileDir(const QString &fileName)
Returns file directory from the full file path.
QStringList fromStdStrings(const std::vector< std::string > &container)
SessionItem * populateSampleModel(SampleModel *sampleModel, MaterialModel *materialModel, const MultiLayer &sample, const QString &sample_name="")
QString readTextFile(const QString &fileName)
Returns multi-lione string representing content of text file.
std::vector< std::string > listOfFunctions(const std::string &script, const std::string &path="")
Returns list of functions defined in the script.
std::unique_ptr< MultiLayer > createFromPython(const std::string &script, const std::string &functionName, const std::string &path="")
Creates a multi layer by running python code in embedded interpreter.
QString const & name(EShape k)
std::string getenv(const std::string &name)
Returns environment variable.