Skip to content

Commit

Permalink
Avoid crashing OMEdit when visual xml file is not found.
Browse files Browse the repository at this point in the history
Some other minor changes.
  • Loading branch information
adeas31 committed Jan 10, 2017
1 parent 398fc36 commit ef8bd25
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 102 deletions.
97 changes: 52 additions & 45 deletions OMEdit/OMEditGUI/Animation/AbstractAnimationWindow.cpp
Expand Up @@ -122,27 +122,28 @@ void AbstractAnimationWindow::openAnimationFile(QString fileName)
mPathName = file.substr(0, pos + 1);
mFileName = file.substr(pos + 1, file.length());
//std::cout<<"file "<<mFileName<<" path "<<mPathName<<std::endl;
loadVisualization();
// start the widgets
mpAnimationInitializeAction->setEnabled(true);
mpAnimationPlayAction->setEnabled(true);
mpAnimationPauseAction->setEnabled(true);
mpAnimationSlider->setEnabled(true);
bool state = mpAnimationSlider->blockSignals(true);
mpAnimationSlider->setValue(0);
mpAnimationSlider->blockSignals(state);
mpSpeedComboBox->setEnabled(true);
mpTimeTextBox->setEnabled(true);
mpTimeTextBox->setText(QString::number(mpVisualizer->getTimeManager()->getStartTime()));
/* Only use isometric view as default for csv file type.
* Otherwise use side view as default which suits better for Modelica models.
*/
if (isCSV(mFileName)) {
mpPerspectiveDropDownBox->setCurrentIndex(0);
cameraPositionIsometric();
} else {
mpPerspectiveDropDownBox->setCurrentIndex(1);
cameraPositionSide();
if (loadVisualization()) {
// start the widgets
mpAnimationInitializeAction->setEnabled(true);
mpAnimationPlayAction->setEnabled(true);
mpAnimationPauseAction->setEnabled(true);
mpAnimationSlider->setEnabled(true);
bool state = mpAnimationSlider->blockSignals(true);
mpAnimationSlider->setValue(0);
mpAnimationSlider->blockSignals(state);
mpSpeedComboBox->setEnabled(true);
mpTimeTextBox->setEnabled(true);
mpTimeTextBox->setText(QString::number(mpVisualizer->getTimeManager()->getStartTime()));
/* Only use isometric view as default for csv file type.
* Otherwise use side view as default which suits better for Modelica models.
*/
if (isCSV(mFileName)) {
mpPerspectiveDropDownBox->setCurrentIndex(0);
cameraPositionIsometric();
} else {
mpPerspectiveDropDownBox->setCurrentIndex(1);
cameraPositionSide();
}
}
}
}
Expand Down Expand Up @@ -214,21 +215,12 @@ QWidget* AbstractAnimationWindow::setupViewWidget()
return gw->getGLWidget();
}

/*!
* \brief AbstractAnimationWindow::openFMUSettingsDialog
* opens a dialog to set the settings for the FMU visualization
*/
void AbstractAnimationWindow::openFMUSettingsDialog(VisualizerFMU* fmuVisualizer)
{
FMUSettingsDialog *pFMUSettingsDialog = new FMUSettingsDialog(this, fmuVisualizer);
pFMUSettingsDialog->exec();
}

/*!
* \brief AbstractAnimationWindow::loadVisualization
* loads the data and the xml scene description
* \return
*/
void AbstractAnimationWindow::loadVisualization()
bool AbstractAnimationWindow::loadVisualization()
{
VisType visType = VisType::NONE;
// Get visualization type.
Expand All @@ -241,26 +233,29 @@ void AbstractAnimationWindow::loadVisualization()
} else {
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, tr("Unknown visualization type."),
Helper::scriptingKind, Helper::errorLevel));
}
//init visualizer
if (visType == VisType::MAT) {
mpVisualizer = new VisualizerMAT(mFileName, mPathName);
} else if (visType == VisType::CSV) {
mpVisualizer = new VisualizerCSV(mFileName, mPathName);
} else if (visType == VisType::FMU) {
mpVisualizer = new VisualizerFMU(mFileName, mPathName);
} else {
QString msg = tr("Could not init %1 %2.").arg(QString(mPathName.c_str())).arg(QString(mFileName.c_str()));
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, msg, Helper::scriptingKind,
Helper::errorLevel));
return false;
}
//load the XML File, build osgTree, get initial values for the shapes
bool xmlExists = checkForXMLFile(mFileName, mPathName);
if (!xmlExists) {
QString msg = tr("Could not find the visual XML file %1.").arg(QString(assembleXMLFileName(mFileName, mPathName).c_str()));
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, msg, Helper::scriptingKind,
Helper::errorLevel));
return false;
} else {
//init visualizer
if (visType == VisType::MAT) {
mpVisualizer = new VisualizerMAT(mFileName, mPathName);
} else if (visType == VisType::CSV) {
mpVisualizer = new VisualizerCSV(mFileName, mPathName);
} else if (visType == VisType::FMU) {
mpVisualizer = new VisualizerFMU(mFileName, mPathName);
} else {
QString msg = tr("Could not init %1 %2.").arg(QString(mPathName.c_str())).arg(QString(mFileName.c_str()));
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, msg, Helper::scriptingKind,
Helper::errorLevel));
return false;
}
connect(mpVisualizer->getTimeManager()->getUpdateSceneTimer(), SIGNAL(timeout()), SLOT(updateScene()));
mpVisualizer->initData();
mpVisualizer->setUpScene();
Expand All @@ -272,8 +267,9 @@ void AbstractAnimationWindow::loadVisualization()
this->setWindowTitle(QString::fromStdString(mFileName));
//open settings dialog for FMU simulation
if (visType == VisType::FMU) {
openFMUSettingsDialog(dynamic_cast <VisualizerFMU*>(mpVisualizer));
openFMUSettingsDialog(dynamic_cast<VisualizerFMU*>(mpVisualizer));
}
return true;
}

/*!
Expand Down Expand Up @@ -364,6 +360,17 @@ double AbstractAnimationWindow::computeDistanceToOrigin()
return d;
}

/*!
* \brief AbstractAnimationWindow::openFMUSettingsDialog
* Opens a dialog to set the settings for the FMU visualization
* \param pVisualizerFMU
*/
void AbstractAnimationWindow::openFMUSettingsDialog(VisualizerFMU* pVisualizerFMU)
{
FMUSettingsDialog *pFMUSettingsDialog = new FMUSettingsDialog(this, pVisualizerFMU);
pFMUSettingsDialog->exec();
}

/*!
* \brief AbstractAnimationWindow::renderFrame
* renders the osg viewer
Expand Down
6 changes: 2 additions & 4 deletions OMEdit/OMEditGUI/Animation/AbstractAnimationWindow.h
Expand Up @@ -45,7 +45,6 @@

#include "FMUSettingsDialog.h"


class VisualizerAbstract;
class Label;

Expand All @@ -57,11 +56,10 @@ class AbstractAnimationWindow : public QMainWindow, public osgViewer::CompositeV
void stopRenderFrameTimer() {mRenderFrameTimer.stop();}
void startRenderFrameTimer() {mRenderFrameTimer.start();}
void openAnimationFile(QString fileName);
void openFMUSettingsDialog();
virtual void createActions();
private:
QWidget* setupViewWidget();
void loadVisualization();
bool loadVisualization();
protected:
//to be animated
std::string mPathName;
Expand Down Expand Up @@ -93,7 +91,7 @@ class AbstractAnimationWindow : public QMainWindow, public osgViewer::CompositeV
void cameraPositionFront();
void cameraPositionTop();
double computeDistanceToOrigin();
void openFMUSettingsDialog(VisualizerFMU* fmuVisualizer);
void openFMUSettingsDialog(VisualizerFMU *pVisualizerFMU);
public slots:
void renderFrame();
void updateScene();
Expand Down
83 changes: 44 additions & 39 deletions OMEdit/OMEditGUI/Animation/FMUSettingsDialog.cpp
Expand Up @@ -33,56 +33,62 @@
*/

#include "FMUSettingsDialog.h"


#include "Util/Helper.h"
#include "Util/Utilities.h"

/*!
* \class FMUSettingsDialog
* \brief widget for FMU-simulation settings.
*/
FMUSettingsDialog::FMUSettingsDialog(QWidget *pParent, VisualizerFMU* fmuVisualizer)
/*!
* \brief FMUSettingsDialog::FMUSettingsDialog
* \param pParent
* \param pVisualizerFMU
*/
FMUSettingsDialog::FMUSettingsDialog(QWidget *pParent, VisualizerFMU* pVisualizerFMU)
: QDialog(pParent),
fmu(fmuVisualizer),
stepSize(0.001),
renderFreq(0.1),
solver(Solver::EULER_FORWARD)
mpVisualizerFMU(pVisualizerFMU),
mStepSize(0.001),
mRenderFreq(0.1),
mSolver(Solver::EULER_FORWARD)
{
setAttribute(Qt::WA_DeleteOnClose);
//create dialog
this->setWindowTitle("FMU-Simulation Settings");
this->setWindowIcon(QIcon(":/Resources/icons/animation.svg"));

//the layouts
QVBoxLayout *mainLayout = new QVBoxLayout;
QGridLayout *settingsLayOut = new QGridLayout;
setWindowTitle(QString("%1 - %2").arg(Helper::applicationName, tr("FMU-Simulation Settings")));
//the widgets
mpButtonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
QLabel *solverLabel = new QLabel(tr("Solver"));
mpSolverComboBox = new QComboBox();
mpSolverComboBox->addItem(QString("Explicit Euler"));
QLabel *stepsizeLabel = new QLabel(tr("Step Size [s]"));
mpStepsizeLineEdit = new QLineEdit(QString::number(stepSize));
QLabel *handleEventsLabel = new QLabel(tr("Process Events in FMU"));
Label *stepsizeLabel = new Label(tr("Step Size [s]"));
mpStepSizeLineEdit = new QLineEdit(QString::number(mStepSize));
Label *handleEventsLabel = new Label(tr("Process Events in FMU"));
mpHandleEventsCheck = new QCheckBox();
mpHandleEventsCheck->setCheckState(Qt::Checked);
//assemble
this->setLayout(mainLayout);
mainLayout->addLayout(settingsLayOut);
settingsLayOut->addWidget(solverLabel,0,0);
settingsLayOut->addWidget(mpSolverComboBox,0,1);
settingsLayOut->addWidget(stepsizeLabel,1,0);
settingsLayOut->addWidget(mpStepsizeLineEdit,1,1);
settingsLayOut->addWidget(handleEventsLabel,2,0);
settingsLayOut->addWidget(mpHandleEventsCheck,2,1);
mainLayout->addWidget(mpButtonBox);

// Create the buttons
mpOkButton = new QPushButton(Helper::ok);
mpOkButton->setAutoDefault(true);
connect(mpOkButton, SIGNAL(clicked()), SLOT(saveSimSettings()));
mpCancelButton = new QPushButton(Helper::cancel);
mpCancelButton->setAutoDefault(false);
connect(mpCancelButton, SIGNAL(clicked()), SLOT(reject()));
// create buttons box
mpButtonBox = new QDialogButtonBox(Qt::Horizontal);
mpButtonBox->addButton(mpOkButton, QDialogButtonBox::ActionRole);
mpButtonBox->addButton(mpCancelButton, QDialogButtonBox::ActionRole);
//connections
QObject::connect(mpButtonBox, SIGNAL(accepted()), this,SLOT(saveSimSettings()));
QObject::connect(mpButtonBox, SIGNAL(rejected()), this,SLOT(reject()));
}

FMUSettingsDialog::~FMUSettingsDialog()
{
QObject::connect(mpButtonBox, SIGNAL(accepted()), this, SLOT(saveSimSettings()));
QObject::connect(mpButtonBox, SIGNAL(rejected()), this, SLOT(reject()));
//assemble
QGridLayout *pMainLayout = new QGridLayout;
pMainLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
pMainLayout->addWidget(solverLabel, 0, 0);
pMainLayout->addWidget(mpSolverComboBox, 0, 1);
pMainLayout->addWidget(stepsizeLabel, 1, 0);
pMainLayout->addWidget(mpStepSizeLineEdit, 1, 1);
pMainLayout->addWidget(handleEventsLabel, 2, 0);
pMainLayout->addWidget(mpHandleEventsCheck, 2, 1);
pMainLayout->addWidget(mpButtonBox, 3, 0, 1, 2, Qt::AlignRight);
setLayout(pMainLayout);
}

/*!
Expand All @@ -92,22 +98,21 @@ void FMUSettingsDialog::saveSimSettings()
{
//step size
bool isFloat = true;
double stepSize = mpStepsizeLineEdit->text().toFloat(&isFloat);
double stepSize = mpStepSizeLineEdit->text().toFloat(&isFloat);
if (!isFloat) {
stepSize = 0.0001;
};
}
//handle events
bool handleEvents = true;
if (!mpHandleEventsCheck->isChecked()){
handleEvents = false;
};
//solver
QString s = mpSolverComboBox->currentText();
if (0 == s.compare(QString("explicit euler")))
{
if (0 == s.compare(QString("explicit euler"))) {
Solver solver = Solver::EULER_FORWARD;
}
//store in FMU simulator
fmu->setSimulationSettings(stepSize, solver, handleEvents);
mpVisualizerFMU->setSimulationSettings(stepSize, mSolver, handleEvents);
accept();
}
27 changes: 13 additions & 14 deletions OMEdit/OMEditGUI/Animation/FMUSettingsDialog.h
Expand Up @@ -38,32 +38,31 @@

#include "VisualizerFMU.h"

#include <QMainWindow>
#include <QDialog>
#include <QLineEdit>
#include <QComboBox>
#include <QCheckBox>
#include <QComboBox>
#include <QPushButton>
#include <QLayout>
#include <QLabel>
#include <QDialog>
#include <QDialogButtonBox>


class FMUSettingsDialog : public QDialog
{
Q_OBJECT
public:
FMUSettingsDialog(QWidget *pParent, VisualizerFMU* fmuVisualizer);
~FMUSettingsDialog();
FMUSettingsDialog(QWidget *pParent, VisualizerFMU *pVisualizerFMU);
private:
VisualizerFMU* fmu;
double stepSize;
double renderFreq;
Solver solver;
bool handleEvents;
QLineEdit* mpStepsizeLineEdit;
VisualizerFMU *mpVisualizerFMU;
double mStepSize;
double mRenderFreq;
Solver mSolver;
bool mHandleEvents;
QLineEdit* mpStepSizeLineEdit;
QCheckBox* mpHandleEventsCheck;
QComboBox* mpSolverComboBox;
QDialogButtonBox* mpButtonBox;
QPushButton *mpOkButton;
QPushButton *mpCancelButton;
QDialogButtonBox *mpButtonBox;
public slots:
void saveSimSettings();
};
Expand Down

0 comments on commit ef8bd25

Please sign in to comment.