14 namespace swift::misc::simulation
19 if (vPilotModels.
isEmpty() || modelToBeModified.
isEmpty()) {
return false; }
22 if (!force && simModel.hasValidAircraftAndAirlineDesignator()) {
continue; }
28 simModel.updateMissingParts(vPilotModel,
false);
35 if (models.
isEmpty()) {
return {}; }
36 static const QString emptyDesignator =
"----";
37 static const QString colorLiveryDesignator =
"-C-";
46 for (
const CAircraftModel &model : std::as_const(sortedByAircraft))
48 const QString aircraftIcao(model.hasAircraftDesignator() ? model.getAircraftIcaoCodeDesignator() :
50 if (!modelsByDesignator.contains(aircraftIcao))
52 modelsByDesignator.insert(aircraftIcao, emptyAirlineDesignatorMap);
55 const QString airlineIcao(model.getLivery().isColorLivery() ? colorLiveryDesignator :
56 model.hasAirlineDesignator() ? model.getAirlineIcaoCodeDesignator() :
58 if (airlineModels.contains(airlineIcao)) { airlineModels[airlineIcao].push_back(model); }
63 QString html(
"<table>\n");
66 airlineIcaos.push_front(colorLiveryDesignator);
67 airlineIcaos.push_back(emptyDesignator);
68 QStringList aircraftIcaos = modelsByDesignator.keys();
72 html +=
"<thead><tr>\n"
74 for (
const QString &airline : std::as_const(airlineIcaos))
80 html +=
"\n</tr></thead>\n"
84 for (
const QString &aircraftIcao : std::as_const(aircraftIcaos))
92 for (
const QString &airline : std::as_const(airlineIcaos))
94 if (airlineModels.contains(airline))
99 html += QString::number(models.
size());
100 html +=
"</a><div class=\"mouseoverdisplay\">";
105 else { html +=
" <td></td>\n"; }
115 const QString &tempDir)
117 Q_ASSERT_X(!tempDir.isEmpty(), Q_FUNC_INFO,
"Need directory");
118 if (models.
isEmpty()) {
return {}; }
120 if (html.isEmpty()) {
return {}; }
123 SWIFT_VERIFY_X(dir.exists(), Q_FUNC_INFO,
"Directory does not exist");
124 if (!dir.exists()) {
return {}; }
127 const QString fn(
"airlineAircraftMatrix.html");
129 return ok ? dir.absoluteFilePath(fn) :
"";
136 int stopAtFailedFiles, std::atomic_bool &wasStopped,
137 const QString &simulatorDir)
152 QStringLiteral(
"%1 models without DB data, is this intended?").arg(noDb),
156 QStringLiteral(
"Some of the non DB models are: '%1'").arg(ms),
true));
159 const int noExcluded = models.
countByMode(CAircraftModel::Exclude);
164 QStringLiteral(
"%1 models marked as excluded, is this intended?").arg(noExcluded),
true));
167 QStringLiteral(
"Some of the excluded models are: '%1'").arg(ms),
true));
175 models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped);
178 if (simulator.
isP3D())
181 models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
184 else if (simulator.
isFSX())
187 models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
190 else if (simulator.
isMSFS())
193 models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
199 models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
205 specificTests = models.
validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped,
211 models.
validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, {});
static bool writeStringToFile(const QString &content, const QString &fileNameAndPath)
Write string to text file.
static QString readFileToString(const QString &fileNameAndPath)
Read file into string.
static const QString & matching()
Matching.
A sequence of log categories.
size_type size() const
Returns number of elements in the sequence.
void sortBy(K1 key1, Keys... keys)
In-place sort by some particular key(s).
void push_back(const T &value)
Appends an element at the end of the sequence.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
constexpr static auto SeverityError
Status severities.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
static const QString & htmlTemplateFilePath()
HTML template.
int countWithValidDbKey(bool withKey) const
Number of objects with/without key.
bool hasValidDbKey() const
Has valid DB key.
Aircraft model (used by another pilot, my models on disk)
const QString & getAircraftIcaoCodeDesignator() const
Aircraft ICAO code designator.
Value object encapsulating a list of aircraft models.
bool isLikelyFsFamilyModelList() const
Is this here a FS family (P3D/FSX/FS9/MSFS) model list?
int countByMode(CAircraftModel::ModelMode mode) const
Count by mode.
QStringList getModelStringList(bool sort=true) const
Model strings.
CAircraftModelList findAllExcludedModels() const
All included/excluded models.
CAircraftModel findFirstByModelStringOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
QSet< QString > getAirlineVDesignators() const
Airline virtual designators.
CAircraftModelList findWithoutValidDbKey() const
With/without DB key.
CStatusMessageList validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn=false) const
Validate files (file exists etc.)
QString asHtmlSummary() const
As HTML summary.
bool isLikelyXPlaneModelList() const
Is this here a XPlane model list?
static QString createIcaoAirlineAircraftHtmlMatrixFile(const swift::misc::simulation::CAircraftModelList &models, const QString &tempDir)
Matrix airlines/aircraft ICAOs.
static CStatusMessageList validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir)
Validate aircraft.cfg entries.
static bool mergeWithVPilotData(swift::misc::simulation::CAircraftModelList &modelToBeModified, const swift::misc::simulation::CAircraftModelList &vPilotModels, bool force=false)
Merge with vPilot data if possible.
static QString createIcaoAirlineAircraftHtmlMatrix(const swift::misc::simulation::CAircraftModelList &models)
Matrix airlines/aircraft ICAOs.
Simple hardcoded info about the corresponding simulator.
bool isMSFS2024() const
MSFS2024?
bool isXPlane() const
XPlane.
bool isMicrosoftOrPrepare3DSimulator() const
Microsoft Simulator or P3D?
static CStatusMessageList validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped)
Validate aircraft.cfg entries (sometimes also sim.cfg)
static CStatusMessageList validateMSFSSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir)
Validate if known SimObjects path are used.
static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir)
Validate if known SimObjects path are used.
static CStatusMessageList validateMSFS2024SimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir)
Validate if known SimObjects path are used.
static CStatusMessageList validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir)
Validate if known SimObjects path are used.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.