From 5e65420739409d2cc6deffd838fac60d33275d35 Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Fri, 15 Feb 2019 20:22:10 +0100 Subject: [PATCH] Working model loader for AI aircrafts --- .../aircraftmodelloaderflightgear.cpp | 62 ++++++++++++------- .../aircraftmodelloaderflightgear.h | 19 ++++-- 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp index 3685bcb54..e7b17cbc4 100644 --- a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp +++ b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp @@ -11,8 +11,12 @@ namespace BlackMisc{ } AircraftModelLoaderFlightgear::AircraftModelLoaderFlightgear(QObject *parent) : Simulation::IAircraftModelLoader (Simulation::CSimulatorInfo::fg(), parent) - { - std::cout << "Test"; + { } + + AircraftModelLoaderFlightgear::~AircraftModelLoaderFlightgear() + { + // that should be safe as long as the worker uses deleteLater (which it does) + if (m_parserWorker) { m_parserWorker->waitForFinished(); } } void AircraftModelLoaderFlightgear::updateInstalledModels(const CAircraftModelList &models) @@ -32,22 +36,25 @@ namespace BlackMisc{ QDir searchPath(rootDirectory, fileFilterFlyable()); QDirIterator aircraftIt(searchPath, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); - + int i = 0; while (aircraftIt.hasNext()) { aircraftIt.next(); if (CFileUtils::isExcludedDirectory(aircraftIt.fileInfo(), excludeDirectories, Qt::CaseInsensitive)) { continue; } - + i++; Simulation::CAircraftModel model; model.setAircraftIcaoCode(QString::fromStdString("A320")); model.setDescription(QString::fromStdString("Flyable")); - model.setName(QString::fromStdString("ModelName")); + model.setName(aircraftIt.fileName()); + model.setModelString(QString::fromStdString(std::to_string(i))); + //model.setModelString(aircraftIt.filePath() + aircraftIt.fileName()); model.setModelType(CAircraftModel::TypeOwnSimulatorModel); model.setSimulator(CSimulatorInfo::fg()); + //model.setCG(PhysicalQuantities::CLength()); model.setFileDetailsAndTimestamp(aircraftIt.fileInfo()); model.setModelMode(CAircraftModel::Include); addUniqueModel(model,installedModels); - + //TODO Add livery adding } return installedModels; @@ -74,6 +81,9 @@ namespace BlackMisc{ model.setAircraftIcaoCode(QString::fromStdString("A320")); model.setDescription(QString::fromStdString("AI")); model.setName(QString::fromStdString("ModelName")); + std::string modelString = aircraftIt.filePath().toStdString(); + modelString = modelString.substr(modelString.find("Aircraft")); + model.setModelString(QString::fromStdString(modelString)); model.setModelType(CAircraftModel::TypeOwnSimulatorModel); model.setSimulator(CSimulatorInfo::fg()); model.setFileDetailsAndTimestamp(aircraftIt.fileInfo()); @@ -112,7 +122,7 @@ namespace BlackMisc{ { //TODO Make paths variable allModels.push_back(parseAIAirplanes("X:/Flightsim/Flightgear/2018.3/data/AI/Aircraft", excludeDirectories)); - allModels.push_back(parseFlyableAirplanes("X:/Flightsim/Flightgear/2018.3/data/Aircraft", excludeDirectories)); + //allModels.push_back(parseFlyableAirplanes("X:/Flightsim/Flightgear/2018.3/data/Aircraft", excludeDirectories)); } return allModels; @@ -124,22 +134,30 @@ namespace BlackMisc{ const QStringList modelDirs = this->getInitializedModelDirectories(modelDirectories, simulator); const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy - if (m_parserWorker && !m_parserWorker->isFinished()){ return; } - emit this->diskLoadingStarted(simulator, mode); - m_parserWorker = CWorker::fromTask(this, "CAircraftModelLoaderFlightgear::performParsing", - [this, modelDirs, excludedDirectoryPatterns, modelConsolidation]() - { - auto models = this->performParsing(modelDirs, excludedDirectoryPatterns); - if (modelConsolidation) { modelConsolidation(models, true); } - return models; - }); - m_parserWorker->thenWithResult(this, [ = ](const auto & models) - { - this->updateInstalledModels(models); - m_loadingMessages.freezeOrder(); - emit this->loadingFinished(m_loadingMessages, simulator, ParsedData); - }); + if(mode.testFlag(LoadInBackground)){ + if (m_parserWorker && !m_parserWorker->isFinished()){ return; } + emit this->diskLoadingStarted(simulator, mode); + + m_parserWorker = CWorker::fromTask(this, "CAircraftModelLoaderFlightgear::performParsing", + [this, modelDirs, excludedDirectoryPatterns, modelConsolidation]() + { + auto models = this->performParsing(modelDirs, excludedDirectoryPatterns); + if (modelConsolidation) { modelConsolidation(models, true); } + return models; + }); + m_parserWorker->thenWithResult(this, [ = ](const auto & models) + { + this->updateInstalledModels(models); + m_loadingMessages.freezeOrder(); + emit this->loadingFinished(m_loadingMessages, simulator, ParsedData); + }); + } else if (mode.testFlag(LoadDirectly)){ + emit this->diskLoadingStarted(simulator, mode); + CAircraftModelList models(this->performParsing(modelDirs, excludedDirectoryPatterns)); + this->updateInstalledModels(models); + } + } diff --git a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h index c12d0abb3..9584d20f8 100644 --- a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h +++ b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h @@ -5,15 +5,25 @@ namespace BlackMisc{ namespace Simulation { namespace Flightgear { class AircraftModelLoaderFlightgear : public Simulation::IAircraftModelLoader{ - + Q_OBJECT // IAircraftModelLoader interface public: - bool isLoadingFinished() const; + + + //Constructor AircraftModelLoaderFlightgear(QObject *parent = nullptr); - //! Parsed or injected models + virtual ~AircraftModelLoaderFlightgear() override; + + // Interface functions + // Parsed or injected models void updateInstalledModels(const CAircraftModelList &models); + bool isLoadingFinished() const; + + protected: + // Interface functions + void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories) override; private: Simulation::CAircraftModelList parseFlyableAirplanes(const QString &rootDirectory, const QStringList &excludeDirectories); @@ -24,8 +34,7 @@ namespace BlackMisc{ QPointer m_parserWorker; CAircraftModelList performParsing(const QStringList &rootDirectories, const QStringList &excludeDirectories); - protected: - void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories); + }; } }