diff --git a/QtRocket.cpp b/QtRocket.cpp index c077080..eca81cb 100644 --- a/QtRocket.cpp +++ b/QtRocket.cpp @@ -83,6 +83,8 @@ QtRocket::QtRocket() rocket.first = std::make_shared(); + motorDatabase = std::make_shared(); + } int QtRocket::run(int argc, char* argv[]) @@ -105,5 +107,6 @@ void QtRocket::addMotorModels(std::vector& m) { motorModels.push_back(i); } + motorDatabase->addMotorModels(motorModels); // TODO: Now clear any duplicates? } diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 5f32504..0184fd0 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -49,6 +49,10 @@ MainWindow::MainWindow(QtRocket* _qtRocket, QWidget *parent) SLOT(onMenu_Edit_SimulationOptions_triggered())); // Tools Menu Actions + connect(ui->actionSaveMotorDatabase, + SIGNAL(triggered()), + this, + SLOT(onMenu_Tools_SaveMotorDatabase())); // Help Menu Actions connect(ui->actionAbout, @@ -95,6 +99,11 @@ void MainWindow::onMenu_Help_About_triggered() } +void MainWindow::onMenu_Tools_SaveMotorDatabase() +{ + qtRocket->getMotorDatabase()->saveMotorDatabase("qtrocket_motors.qmd"); +} + void MainWindow::onButton_calculateTrajectory_clicked() { diff --git a/gui/MainWindow.h b/gui/MainWindow.h index 7fddc74..2cbf7fc 100644 --- a/gui/MainWindow.h +++ b/gui/MainWindow.h @@ -51,6 +51,8 @@ private slots: void onMenu_File_Quit_triggered(); + void onMenu_Tools_SaveMotorDatabase(); + private: Ui::MainWindow* ui; QtRocket* qtRocket; diff --git a/gui/MainWindow.ui b/gui/MainWindow.ui index 9e91042..dea6248 100644 --- a/gui/MainWindow.ui +++ b/gui/MainWindow.ui @@ -253,6 +253,7 @@ Tools + @@ -345,6 +346,11 @@ Simulation Options + + + Save Motor Database + + diff --git a/model/MotorModel.h b/model/MotorModel.h index cc96314..72b08af 100644 --- a/model/MotorModel.h +++ b/model/MotorModel.h @@ -134,7 +134,7 @@ public: * @brief str Returns a string representation of AVAILABILITY enum * @return string representation */ - std::string str() + std::string str() const { if(availability == AVAILABILITY::REGULAR) return std::string("regular"); @@ -176,7 +176,7 @@ public: * @brief str Returns a string representation of CERTORG enum * @return string representation */ - std::string str() + std::string str() const { if(org == CERTORG::AMRS) return std::string("Austrialian Model Rocket Society Inc."); @@ -235,7 +235,7 @@ public: * @brief str Returns a string representation of MOTORTYPE enum * @return string representation */ - std::string str() + std::string str() const { if(type == MOTORTYPE::SU) return std::string("Single Use"); @@ -253,10 +253,12 @@ public: static MOTORTYPE toEnum(const std::string& name) { if(name == "SU" || - name == "Single Use") + name == "Single Use" || + name == "single-use") return MOTORTYPE::SU; else if(name == "reload" || - name == "Reload") + name == "Reload" || + name == "reloadable") return MOTORTYPE::RELOAD; else // It's a hybrid return MOTORTYPE::HYBRID; @@ -284,7 +286,7 @@ public: * @brief str Returns a string representation of MOTORMANUFACTURER enum * @return string representation */ - std::string str() + std::string str() const { switch(manufacturer) { diff --git a/utils/MotorModelDatabase.cpp b/utils/MotorModelDatabase.cpp index d17427f..23ffa0d 100644 --- a/utils/MotorModelDatabase.cpp +++ b/utils/MotorModelDatabase.cpp @@ -5,6 +5,8 @@ // C headers // C++ headers // 3rd party headers +#include +#include /// \endcond // qtrocket project headers @@ -63,4 +65,75 @@ std::optional MotorModelDatabase::getMotorModel(const std::st } } +void MotorModelDatabase::saveMotorDatabase(const std::string& filename) +{ + +/* + + + 1.0 + + + 10.0 + 123.4 + + + + +*/ + + namespace pt = boost::property_tree; + + // top-level tree + pt::ptree tree; + tree.put("QtRocketMotorDatabase..version", "0.1"); + for(const auto& i : motorModelMap) + { + pt::ptree motor; + const auto& m = i.second; + motor.put(".name", m.data.commonName); + motor.put("availability", m.data.availability.str()); + motor.put("avgThrust", m.data.avgThrust); + motor.put("burnTime", m.data.burnTime); + motor.put("certOrg", m.data.certOrg.str()); + motor.put("commonName", m.data.commonName); + motor.put("designation", m.data.designation); + motor.put("diameter", m.data.diameter); + motor.put("impulseClass", m.data.impulseClass); + motor.put("infoUrl", m.data.infoUrl); + motor.put("length", m.data.length); + motor.put("manufacturer", m.data.manufacturer.str()); + motor.put("maxThrust", m.data.maxThrust); + motor.put("motorIdTC", m.data.motorIdTC); + motor.put("propType", m.data.propType); + motor.put("sparky", m.data.sparky ? "true" : "false"); + motor.put("totalImpulse", m.data.totalImpulse); + motor.put("totalWeight", m.data.totalWeight); + motor.put("type", m.data.type.str()); + motor.put("lastUpdated", m.data.lastUpdated); + + // thrust data + { + pt::ptree tc; + std::vector> thrust = m.getThrustCurve().getThrustCurveData(); + for(const auto& j : thrust) + { + pt::ptree thrustNode; + thrustNode.put(".time", j.first); + thrustNode.put(".force", j.second); + tc.add_child("thrust", thrustNode); + } + motor.add_child("thrustCurve", tc); + } + tree.add_child("QtRocketMotorDatabase.MotorModels.motor", motor); + } + pt::xml_writer_settings settings(' ', 2); + pt::write_xml(filename, tree, std::locale(), settings); +} + +void MotorModelDatabase::loadMotorDatabase(const std::string& filename) +{ + +} + } // namespace utils diff --git a/utils/MotorModelDatabase.h b/utils/MotorModelDatabase.h index 44ca98d..ea22557 100644 --- a/utils/MotorModelDatabase.h +++ b/utils/MotorModelDatabase.h @@ -59,6 +59,9 @@ public: * @return std::optional */ std::optional getMotorModel(const std::string& name); + + void saveMotorDatabase(const std::string& filename); + void loadMotorDatabase(const std::string& filename); private: // The "database" is really just a map. :)