Working model loader for AI aircrafts

This commit is contained in:
Lars Toenning
2019-02-15 20:22:10 +01:00
committed by Mat Sutcliffe
parent fd9712caea
commit 5e65420739
2 changed files with 54 additions and 27 deletions

View File

@@ -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<CAircraftModelList>(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<CAircraftModelList>(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);
}
}

View File

@@ -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<CWorker> m_parserWorker;
CAircraftModelList performParsing(const QStringList &rootDirectories, const QStringList &excludeDirectories);
protected:
void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories);
};
}
}