swift
aircraftmatchersetup.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QStringBuilder>
7 
8 #include "misc/stringutils.h"
9 
10 SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::simulation, CAircraftMatcherSetup)
11 
12 namespace swift::misc::simulation
13 {
15 
17  {
18  this->reset(algorithm);
19  }
20 
22  PickSimilarStrategy pickStrategy)
23  {
24  this->setPickStrategy(pickStrategy);
25  this->setMatchingAlgorithm(algorithm, false);
26  this->setMatchingMode(mode);
27  }
28 
30  {
31  if (this->getMatchingAlgorithm() == algorithm) { return false; }
32  if (reset) { this->reset(algorithm); }
33  else { m_algorithm = static_cast<int>(algorithm); }
34  return true;
35  }
36 
38  {
39  return this->getMatchingMode().testFlag(ReverseLookupModelString);
40  }
41 
43  {
44  return this->getMatchingMode().testFlag(ReverseLookupSwiftLiveryIds);
45  }
46 
48  {
49  MatchingMode m = this->getMatchingMode();
50  m.setFlag(ReverseLookupDefault);
51  this->setMatchingMode(m);
52  }
53 
55  {
56  return m_msReverseEnabled && !m_msReverseLookupFile.isEmpty();
57  }
58 
60  {
61  return m_msMatchingEnabled && !m_msMatchingStageFile.isEmpty();
62  }
63 
65  {
66  MatchingMode m = this->getMatchingMode();
67  m.setFlag(ModelVerificationAtStartup, verify);
68  this->setMatchingMode(m);
69  }
70 
72  {
73  MatchingMode m = this->getMatchingMode();
74  m.setFlag(ModelVerificationOnlyWarnError, only);
75  this->setMatchingMode(m);
76  }
77 
78  void CAircraftMatcherSetup::setAirlineGroupBehaviour(bool ifNoAirline, bool sameAsAirline)
79  {
80  MatchingMode m = this->getMatchingMode();
81  const bool icao = m.testFlag(ByIcaoData);
82  m.setFlag(ByAirlineGroupIfNoAirline, ifNoAirline);
83  m.setFlag(ByAirlineGroupSameAsAirline, sameAsAirline);
84  m.setFlag(ByIcaoData, icao);
85  this->setMatchingMode(m);
86  }
87 
88  QString CAircraftMatcherSetup::convertToQString(bool i18n) const
89  {
90  Q_UNUSED(i18n)
91  return u"algorithm: '" % this->getMatchingAlgorithmAsString() % u"' mode: '" % this->getMatchingModeAsString() %
92  u"' force: '" % this->getForceModeAsString() % u"' strategy: '" % this->getPickStrategyAsString() %
93  u"\' matching script: " % boolToOnOff(m_msReverseEnabled) % u'/' % boolToOnOff(m_msMatchingEnabled);
94  }
95 
97  {
98  if (index.isMyself()) { return QVariant::fromValue(*this); }
99  const ColumnIndex i = index.frontCasted<ColumnIndex>();
100  switch (i)
101  {
102  case IndexMatchingAlgorithm: return QVariant::fromValue(m_algorithm);
103  case IndexMatchingMode: return QVariant::fromValue(m_mode);
104  case IndexPickStrategy: return QVariant::fromValue(m_strategy);
105  case IndexForceMode: return QVariant::fromValue(m_force);
106  case IndexMsNetworkEntryFile: return QVariant::fromValue(m_msReverseLookupFile);
107  case IndexMsMatchingStageFile: return QVariant::fromValue(m_msMatchingStageFile);
108  case IndexMsNetworkEnabled: return QVariant::fromValue(m_msReverseEnabled);
109  case IndexMsMatchingStageEnabled: return QVariant::fromValue(m_msMatchingEnabled);
110  default: break;
111  }
112  return CValueObject::propertyByIndex(index);
113  }
114 
116  {
117  if (index.isMyself())
118  {
119  (*this) = variant.value<CAircraftMatcherSetup>();
120  return;
121  }
122  const ColumnIndex i = index.frontCasted<ColumnIndex>();
123  switch (i)
124  {
125  case IndexMatchingAlgorithm: m_algorithm = variant.toInt(); break;
126  case IndexMatchingMode: m_mode = variant.toInt(); break;
127  case IndexForceMode: m_force = variant.toInt(); break;
128  case IndexPickStrategy: m_strategy = variant.toInt(); break;
129  case IndexMsNetworkEntryFile: m_msReverseLookupFile = variant.toString(); break;
130  case IndexMsMatchingStageFile: m_msMatchingStageFile = variant.toString(); break;
131  case IndexMsNetworkEnabled: m_msReverseEnabled = variant.toBool(); break;
132  case IndexMsMatchingStageEnabled: m_msReverseEnabled = variant.toBool(); break;
133  default: break;
134  }
135  CValueObject::setPropertyByIndex(index, variant);
136  }
137 
139  {
140  this->reset(MatchingStepwiseReducePlusScoreBased);
141  m_msReverseLookupFile.clear();
142  m_msMatchingStageFile.clear();
143  m_msReverseEnabled = false;
144  m_msMatchingEnabled = false;
145  }
146 
148  {
149  m_algorithm = static_cast<int>(algorithm);
150  MatchingMode mode = ModeNone;
151  switch (algorithm)
152  {
153  case MatchingStepwiseReduce: mode = ModeDefaultReduce; break;
154  case MatchingScoreBased: mode = ModeDefaultScore; break;
155  case MatchingStepwiseReducePlusScoreBased:
156  default: mode = ModeDefaultReducePlusScore; break;
157  }
158  mode |= ModeDefaultSet; // add set default
159 
160  this->setMatchingMode(mode);
161  this->setPickStrategy(PickByOrder);
162  }
163 
165  {
166  const MatchingMode mm = this->getMatchingMode();
167  return mm.testFlag(ByCategoryGlider) || mm.testFlag(ByCategoryMilitary);
168  }
169 
171  {
172  static const QString rs("reduce + score based");
173  static const QString s("score based");
174  static const QString r("stepwise reduce");
175  switch (algorithm)
176  {
177  case MatchingStepwiseReduce: return r;
178  case MatchingScoreBased: return s;
179  case MatchingStepwiseReducePlusScoreBased:
180  default: break;
181  }
182  return rs;
183  }
184 
186  {
187  static const QString ms("by model string");
188  static const QString icao("by ICAO");
189  static const QString icaoAircraft("by ICAO aircraft first");
190  static const QString icaoAirline("by ICAO airline first");
191  static const QString family("by family");
192  static const QString military("by military");
193  static const QString civilian("by civilian");
194  static const QString vtol("VTOL");
195  static const QString livery("by livery");
196  static const QString combined("by combined code");
197  static const QString noZeros("scoring, ignore zero scores");
198  static const QString preferColorLiveries("scoring, prefer color liveries");
199  static const QString exNoDb("excl.without DB data");
200  static const QString exExcl("excl.excluded");
201  static const QString removeFromModelSet("rem.from model set");
202  static const QString verification("Verify models at startup");
203  static const QString verificationWarn("Show only validation warnings/errors");
204  static const QString modelFailedAdded("Replace models failed to be added");
205  static const QString categoryGlider("glider categories");
206  static const QString categoryMilitary("military categories");
207  static const QString categorySmallAircraft("small aircraft categories");
208  static const QString revModelString("reverse model lookup");
209  static const QString revLiveryIds("reverse livery ids");
210  static const QString agSameAsAirline("group as airline");
211  static const QString agIfNoAirline("group if no airline");
212 
213  switch (modeFlag)
214  {
215  case ReverseLookupModelString: return revModelString;
216  case ReverseLookupSwiftLiveryIds: return revLiveryIds;
217  case ByModelString: return ms;
218  case ByIcaoData: return icao;
219  case ByFamily: return family;
220  case ByLivery: return livery;
221  case ByCombinedType: return combined;
222  case ByIcaoOrderAircraftFirst: return icaoAircraft;
223  case ByIcaoOrderAirlineFirst: return icaoAirline;
224  case ByCivilian: return civilian;
225  case ByMilitary: return military;
226  case ByVtol: return vtol;
227  case ByCategoryGlider: return categoryGlider;
228  case ByCategoryMilitary: return categoryMilitary;
229  case ByCategorySmallAircraft: return categorySmallAircraft;
230  case ScoreIgnoreZeros: return noZeros;
231  case ScorePreferColorLiveries: return preferColorLiveries;
232  case ExcludeNoDbData: return exNoDb;
233  case ExcludeNoExcluded: return exExcl;
234  case ModelSetRemoveFailedModel: return removeFromModelSet;
235  case ModelVerificationAtStartup: return verification;
236  case ByAirlineGroupIfNoAirline: return agIfNoAirline;
237  case ByAirlineGroupSameAsAirline: return agSameAsAirline;
238  case ModelVerificationOnlyWarnError: return verificationWarn;
239  case ModelFailoverIfNoModelCanBeAdded: return modelFailedAdded;
240  default: break;
241  }
242 
243  static const QString unknown("unknown");
244  return unknown;
245  }
246 
247  QString CAircraftMatcherSetup::modeToString(MatchingMode mode)
248  {
249  QStringList modes;
250  if (mode.testFlag(ReverseLookupModelString)) { modes << modeFlagToString(ReverseLookupModelString); }
251  if (mode.testFlag(ReverseLookupSwiftLiveryIds)) { modes << modeFlagToString(ReverseLookupSwiftLiveryIds); }
252  if (mode.testFlag(ByModelString)) { modes << modeFlagToString(ByModelString); }
253  if (mode.testFlag(ByIcaoData)) { modes << modeFlagToString(ByIcaoData); }
254  if (mode.testFlag(ByIcaoOrderAircraftFirst)) { modes << modeFlagToString(ByIcaoOrderAircraftFirst); }
255  if (mode.testFlag(ByIcaoOrderAirlineFirst)) { modes << modeFlagToString(ByIcaoOrderAirlineFirst); }
256  if (mode.testFlag(ByFamily)) { modes << modeFlagToString(ByFamily); }
257  if (mode.testFlag(ByLivery)) { modes << modeFlagToString(ByLivery); }
258  if (mode.testFlag(ByCombinedType)) { modes << modeFlagToString(ByCombinedType); }
259  if (mode.testFlag(ByCivilian)) { modes << modeFlagToString(ByCivilian); }
260  if (mode.testFlag(ByMilitary)) { modes << modeFlagToString(ByMilitary); }
261  if (mode.testFlag(ByCategoryGlider)) { modes << modeFlagToString(ByCategoryGlider); }
262  if (mode.testFlag(ByCategoryMilitary)) { modes << modeFlagToString(ByCategoryMilitary); }
263  if (mode.testFlag(ByCategorySmallAircraft)) { modes << modeFlagToString(ByCategorySmallAircraft); }
264  if (mode.testFlag(ByVtol)) { modes << modeFlagToString(ByVtol); }
265  if (mode.testFlag(ScoreIgnoreZeros)) { modes << modeFlagToString(ScoreIgnoreZeros); }
266  if (mode.testFlag(ScorePreferColorLiveries)) { modes << modeFlagToString(ScorePreferColorLiveries); }
267  if (mode.testFlag(ModelSetRemoveFailedModel)) { modes << modeFlagToString(ModelSetRemoveFailedModel); }
268  if (mode.testFlag(ModelVerificationAtStartup)) { modes << modeFlagToString(ModelVerificationAtStartup); }
269  if (mode.testFlag(ByAirlineGroupIfNoAirline)) { modes << modeFlagToString(ByAirlineGroupIfNoAirline); }
270  if (mode.testFlag(ByAirlineGroupSameAsAirline)) { modes << modeFlagToString(ByAirlineGroupSameAsAirline); }
271  if (mode.testFlag(ModelVerificationOnlyWarnError))
272  {
273  modes << modeFlagToString(ModelVerificationOnlyWarnError);
274  }
275  if (mode.testFlag(ModelFailoverIfNoModelCanBeAdded))
276  {
277  modes << modeFlagToString(ModelFailoverIfNoModelCanBeAdded);
278  }
279  return modes.join(", ");
280  }
281 
283  {
284  static const QString t("type");
285  static const QString ec("engine count");
286  static const QString e("engine");
287  static const QString n("nothing");
288 
289  switch (forceFlag)
290  {
291  case ForceType: return t;
292  case ForceEnginecount: return ec;
293  case ForceEngine: return e;
294  case ForceNothing:
295  default: break;
296  }
297  return n;
298  }
299 
300  QString CAircraftMatcherSetup::forceToString(ForceMode force)
301  {
302  if (force.testFlag(ForceNothing)) { return QStringLiteral("nothing"); }
303 
304  QStringList forces;
305  if (force.testFlag(ForceType)) { forces << forceFlagToString(ForceType); }
306  if (force.testFlag(ForceEnginecount)) { forces << forceFlagToString(ForceEnginecount); }
307  if (force.testFlag(ForceEngine)) { forces << forceFlagToString(ForceEngine); }
308  return forces.join(", ");
309  }
310 
312  {
313  static const QString f("first");
314  static const QString o("order");
315  static const QString r("random");
316 
317  switch (strategy)
318  {
319  case PickFirst: return f;
320  case PickByOrder: return o;
321  case PickRandom: return r;
322  default: break;
323  }
324 
325  static const QString unknown("unknown");
326  return unknown;
327  }
328 
329  CAircraftMatcherSetup::MatchingMode CAircraftMatcherSetup::matchingMode(
330  bool revModelString, bool revLiveryIds, bool byModelString, bool byIcaoDataAircraft1st,
331  bool byIcaoDataAirline1st, bool byFamily, bool byLivery, bool byCombinedType, bool byMilitary, bool byCivilian,
332  bool byVtol, bool byGliderCategory, bool byMilitaryCategory, bool bySmallAircraftCategory,
333  bool scoreIgnoreZeros, bool scorePreferColorLiveries, bool excludeNoDbData, bool excludeNoExcluded,
334  bool modelVerification, bool modelVerificationWarnError, bool modelSetRemoveFailedModel, bool modelFailover)
335  {
336  if (modelFailover) { modelSetRemoveFailedModel = true; } // otherwise this does not make sense
337 
338  MatchingMode mode = byModelString ? ByModelString : ModeNone;
339  if (byIcaoDataAircraft1st) { mode |= ByIcaoOrderAircraftFirst; }
340  if (byIcaoDataAirline1st) { mode |= ByIcaoOrderAirlineFirst; }
341  if (byFamily) { mode |= ByFamily; }
342  if (byLivery) { mode |= ByLivery; }
343  if (byCombinedType) { mode |= ByCombinedType; }
344  if (byMilitary) { mode |= ByMilitary; }
345  if (byCivilian) { mode |= ByCivilian; }
346  if (byVtol) { mode |= ByVtol; }
347  if (byGliderCategory) { mode |= ByCategoryGlider; }
348  if (byMilitaryCategory) { mode |= ByCategoryMilitary; }
349  if (bySmallAircraftCategory) { mode |= ByCategorySmallAircraft; }
350  if (scoreIgnoreZeros) { mode |= ScoreIgnoreZeros; }
351  if (scorePreferColorLiveries) { mode |= ScorePreferColorLiveries; }
352  if (excludeNoDbData) { mode |= ExcludeNoDbData; }
353  if (excludeNoExcluded) { mode |= ExcludeNoExcluded; }
354  if (modelSetRemoveFailedModel) { mode |= ModelSetRemoveFailedModel; }
355  if (modelVerification) { mode |= ModelVerificationAtStartup; }
356  if (modelVerificationWarnError) { mode |= ModelVerificationOnlyWarnError; }
357  if (modelFailover) { mode |= ModelFailoverIfNoModelCanBeAdded; }
358  if (revModelString) { mode |= ReverseLookupModelString; }
359  if (revLiveryIds) { mode |= ReverseLookupSwiftLiveryIds; }
360  return mode;
361  }
362 } // namespace swift::misc::simulation
Non-owning reference to a CPropertyIndex with a subset of its features.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
ColumnIndex
Base class enums.
Definition: mixinindex.h:44
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: mixinindex.h:160
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:167
static const QString & forceFlagToString(ForceModeFlag forceFlag)
Force flag to string.
static MatchingMode matchingMode(bool revModelString, bool revLiveryIds, bool byModelString, bool byIcaoDataAircraft1st, bool byIcaoDataAirline1st, bool byFamily, bool byLivery, bool byCombinedType, bool byForceMilitary, bool byForceCivilian, bool byVtol, bool byGliderCategory, bool byMilitaryCategory, bool bySmallAircraftCategory, bool scoreIgnoreZeros, bool scorePreferColorLiveries, bool excludeNoDbData, bool excludeNoExcluded, bool modelVerification, bool modelVerificationWarnError, bool modelSetRemoveFailedModel, bool modelFailover)
Mode by flags.
void setOnlyShowVerificationWarningsAndErrors(bool only)
Set the "show only errors" mode.
static const QString & algorithmToString(MatchingAlgorithm algorithm)
Algorithm to string.
QString getForceModeAsString() const
Force mode as string.
QString convertToQString(bool i18n=false) const
Cast as QString.
MatchingMode getMatchingMode() const
Matching mode.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
static QString forceToString(ForceMode force)
Force to string.
bool useCategoryMatching() const
Use category matching.
static QString modeToString(MatchingMode mode)
Enumeration as string.
PickSimilarStrategy
How to pick among similar candiates.
@ ByIcaoData
ICAO airline and aircraft codes.
@ ByMilitary
military (in) will only search in military
@ ByCivilian
civilian (in) will only search in civilian
void setVerificationAtStartup(bool verify)
Set startup verification.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
void setAirlineGroupBehaviour(bool ifNoAirline, bool sameAsAirline)
Airline group behaviour.
void setPickStrategy(PickSimilarStrategy strategy)
Set the strategy.
bool setMatchingAlgorithm(MatchingAlgorithm algorithm, bool reset=true)
Algorithm.
QString getMatchingModeAsString() const
Matching mode as string.
void setMatchingMode(MatchingMode mode)
Dynamic offset values?
MatchingAlgorithm getMatchingAlgorithm() const
Algorithm.
static const QString & modeFlagToString(MatchingModeFlag modeFlag)
Enumeration as string.
const QString & getMatchingAlgorithmAsString() const
Algorithm as string.
static const QString & strategyToString(PickSimilarStrategy strategy)
Strategy to string.
const QString & getPickStrategyAsString() const
Strategy as string.
SWIFT_MISC_EXPORT const QString & boolToOnOff(bool v)
Bool to on/off.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67