qtrocket/gui/MainWindow.cpp

187 lines
4.7 KiB
C++

/// \cond
// C headers
// C++ headers
#include <cmath>
#include <iostream>
#include <memory>
// 3rd party headers
#include <QFileDialog>
/// \endcond
// qtrocket headers
#include "ui_MainWindow.h"
#include "gui/AboutWindow.h"
#include "gui/AnalysisWindow.h"
#include "gui/MainWindow.h"
#include "gui/ThrustCurveMotorSelector.h"
#include "gui/SimOptionsWindow.h"
#include "model/Rocket.h"
#include "utils/RSEDatabaseLoader.h"
MainWindow::MainWindow(QtRocket* _qtRocket, QWidget *parent)
: QMainWindow(parent),
ui(new Ui::MainWindow),
qtRocket(_qtRocket)
{
ui->setupUi(this);
////////////////////////////////
// Menu signal/slot connections
////////////////////////////////
// File Menu Actions
connect(ui->actionQuit,
SIGNAL(triggered()),
this,
SLOT(onMenu_File_Quit_triggered()));
// Edit Menu Actions
connect(ui->actionSimulation_Options,
SIGNAL(triggered()),
this,
SLOT(onMenu_Edit_SimulationOptions_triggered()));
// Tools Menu Actions
// Help Menu Actions
connect(ui->actionAbout,
SIGNAL(triggered()),
this,
SLOT(onMenu_Help_About_triggered()));
////////////////////////////////
// Button signal/slot connections
////////////////////////////////
connect(ui->calculateTrajectory_btn,
SIGNAL(clicked()),
this,
SLOT(onButton_calculateTrajectory_clicked()));
connect(ui->loadRSE_btn,
SIGNAL(clicked()),
this,
SLOT(onButton_loadRSE_button_clicked()));
connect(ui->setMotor_btn,
SIGNAL(clicked()),
this,
SLOT(onButton_setMotor_clicked()));
connect(ui->getTCMotorData_btn,
SIGNAL(clicked()),
this,
SLOT(onButton_getTCMotorData_clicked()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onMenu_Help_About_triggered()
{
AboutWindow about;
about.setModal(true);
about.exec();
}
void MainWindow::onButton_calculateTrajectory_clicked()
{
// Get the initial conditions
double initialVelocity =
ui->rocketPartButtons->findChild<QLineEdit*>(QString("initialVelocity"))->text().toDouble();
double mass =
ui->rocketPartButtons->findChild<QLineEdit*>(QString("mass"))->text().toDouble();
double initialAngle =
ui->rocketPartButtons->findChild<QLineEdit*>(QString("initialAngle"))->text().toDouble();
double dragCoeff =
ui->rocketPartButtons->findChild<QLineEdit*>(QString("dragCoeff"))->text().toDouble();
double initialVelocityX = initialVelocity * std::cos(initialAngle / 57.2958);
double initialVelocityZ = initialVelocity * std::sin(initialAngle / 57.2958);
std::vector<double> initialState = {0.0, 0.0, 0.0, initialVelocityX, 0.0, initialVelocityZ, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
auto rocket = QtRocket::getInstance()->getRocket();
rocket->setInitialState(initialState);
rocket->setMass(mass);
rocket->setDragCoefficient(dragCoeff);
rocket->launch();
AnalysisWindow aWindow;
aWindow.setModal(false);
aWindow.exec();
}
void MainWindow::onButton_loadRSE_button_clicked()
{
QString rseFile = QFileDialog::getOpenFileName(this,
tr("Import RSE Database File"),
"/home",
tr("Rocksim Engine Files (*.rse)"));
if(!rseFile.isEmpty())
{
rseDatabase.reset(new utils::RSEDatabaseLoader(rseFile.toStdString()));
ui->rocketPartButtons->findChild<QLineEdit*>(QString("databaseFileLine"))->setText(rseFile);
QComboBox* engineSelector =
ui->rocketPartButtons->findChild<QComboBox*>(QString("engineSelectorComboBox"));
const std::vector<model::MotorModel>& motors = rseDatabase->getMotors();
for(const auto& motor : motors)
{
std::cout << "Adding: " << motor.data.commonName << std::endl;
engineSelector->addItem(QString(motor.data.commonName.c_str()));
}
}
}
void MainWindow::onButton_getTCMotorData_clicked()
{
ThrustCurveMotorSelector window;
window.setModal(false);
window.exec();
}
void MainWindow::onMenu_Edit_SimulationOptions_triggered()
{
if(!simOptionsWindow)
{
simOptionsWindow = new SimOptionsWindow(this);
}
simOptionsWindow->show();
}
void MainWindow::onButton_setMotor_clicked()
{
QString motorName = ui->engineSelectorComboBox->currentText();
model::MotorModel mm = rseDatabase->getMotorModelByName(motorName.toStdString());
QtRocket::getInstance()->getRocket()->setMotorModel(mm);
QtRocket::getInstance()->addMotorModels(rseDatabase->getMotors());
}
void MainWindow::onMenu_File_Quit_triggered()
{
this->close();
}