CircularSurvey.h 5.68 KB
Newer Older
1 2 3 4 5 6 7 8
#pragma once

#include <QFutureWatcher>
#include <QVector>

#include "SettingsFact.h"
#include "TransectStyleComplexItem.h"

9 10 11
#include "Geometry/WimaJoinedAreaData.h"
#include "Geometry/WimaMeasurementAreaData.h"

12
class RoutingThread;
13
class RoutingData;
14

15 16 17
class CircularSurvey : public TransectStyleComplexItem {
  Q_OBJECT
public:
18
  using PtrRoutingData = QSharedPointer<RoutingData>;
19 20 21 22 23
  enum class Type {
    Circular = 0,
    Linear = 1,
    Count = 2 // Must me last, onyl for counting
  };
24

25 26 27 28 29 30 31
  /// @param vehicle Vehicle which this is being contructed for
  /// @param flyView true: Created for use in the Fly View, false: Created for
  /// use in the Plan View
  /// @param kmlOrShpFile Polygon comes from this file, empty for default
  /// polygon
  CircularSurvey(Vehicle *vehicle, bool flyView, const QString &kmlOrShpFile,
                 QObject *parent);
32
  ~CircularSurvey();
33 34 35

  Q_PROPERTY(QGeoCoordinate refPoint READ refPoint WRITE setRefPoint NOTIFY
                 refPointChanged)
36 37 38 39
  Q_PROPERTY(Fact *transectDistance READ transectDistance CONSTANT)
  Q_PROPERTY(Fact *alpha READ alpha CONSTANT)
  Q_PROPERTY(Fact *minLength READ minLength CONSTANT)
  Q_PROPERTY(Fact *type READ type CONSTANT)
40
  Q_PROPERTY(Fact *variant READ variant CONSTANT)
41 42
  Q_PROPERTY(Fact *numRuns READ numRuns CONSTANT)
  Q_PROPERTY(Fact *run READ run CONSTANT)
43
  Q_PROPERTY(int typeCount READ typeCount CONSTANT)
44
  Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
45
  Q_PROPERTY(bool hidePolygon READ hidePolygon NOTIFY hidePolygonChanged)
46 47
  Q_PROPERTY(
      QList<QString> variantNames READ variantNames NOTIFY variantNamesChanged)
48
  Q_PROPERTY(QList<QString> runNames READ runNames NOTIFY runNamesChanged)
49 50

  Q_INVOKABLE void resetReference(void);
51
  Q_INVOKABLE void reverse(void);
52 53 54

  // Property setters
  void setRefPoint(const QGeoCoordinate &refPt);
55
  void setHidePolygon(bool hide);
56 57 58 59
  void setMeasurementArea(const WimaMeasurementAreaData &mArea);
  void setJoinedArea(const WimaJoinedAreaData &jArea);
  void setMeasurementArea(const WimaMeasurementArea &mArea);
  void setJoinedArea(const WimaJoinedArea &jArea);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
60
  void setDepot(const QGeoCoordinate &depot);
61 62 63

  // Property getters
  QGeoCoordinate refPoint() const;
64 65 66 67
  Fact *transectDistance();
  Fact *alpha();
  Fact *minLength();
  Fact *type();
68
  Fact *variant();
69 70
  Fact *numRuns();
  Fact *run();
71
  int typeCount() const;
72 73
  bool calculating() const;
  bool hidePolygon() const;
74
  QList<QString> variantNames() const;
75
  QList<QString> runNames() const;
76
  QGeoCoordinate depot() const;
77
  const QList<QList<QGeoCoordinate>> &rawTransects() const;
78

79
  // Overrides
80
  bool load(const QJsonObject &complexObject, int sequenceNumber,
81 82 83 84
            QString &errorString) override final;
  QString mapVisualQML(void) const override final;
  void save(QJsonArray &planItems) override final;
  bool specifiesCoordinate(void) const override final;
85
  void appendMissionItems(QList<MissionItem *> &items,
86 87 88 89 90 91 92 93
                          QObject *missionItemParent) override final;
  void applyNewAltitude(double newAltitude) override final;
  double timeBetweenShots(void) override final;
  QString commandDescription(void) const override final;
  QString commandName(void) const override final;
  QString abbreviation(void) const override final;
  bool readyForSave(void) const override final;
  double additionalTimeDelay(void) const override final;
94 95

  static const char *settingsGroup;
96 97 98 99
  static const char *transectDistanceName;
  static const char *alphaName;
  static const char *minLengthName;
  static const char *typeName;
100
  static const char *variantName;
101 102
  static const char *numRunsName;
  static const char *runName;
103 104 105 106 107 108 109 110
  static const char *CircularSurveyName;
  static const char *refPointLongitudeName;
  static const char *refPointLatitudeName;
  static const char *refPointAltitudeName;

signals:
  void refPointChanged();
  void calculatingChanged();
111 112
  void hidePolygonChanged();
  void depotChanged();
113
  void variantNamesChanged();
114
  void runNamesChanged();
115 116
  void measurementAreaChanged();
  void joinedAreaChanged();
117 118 119 120 121 122

private slots:
  // Overrides from TransectStyleComplexItem
  void _rebuildTransectsPhase1(void) final;
  void _recalcComplexDistance(void) final;
  void _recalcCameraShots(void) final;
123
  void _setTransects(PtrRoutingData pRoute);
124 125 126 127 128 129

private:
  void _appendLoadedMissionItems(QList<MissionItem *> &items,
                                 QObject *missionItemParent);
  void _buildAndAppendMissionItems(QList<MissionItem *> &items,
                                   QObject *missionItemParent);
130
  void _changeVariant();
131 132
  void _changeRun();

133
  void _updateWorker();
134
  void _changeVariantRunWorker();
135 136
  void _reverseWorker();
  void _storeWorker();
137
  void _changeRunWorker();
138 139 140 141 142

  // center of the circular lanes, e.g. base station
  QGeoCoordinate _referencePoint;
  QMap<QString, FactMetaData *> _metaDataMap;
  // distance between two neighbour circles
143
  SettingsFact _transectDistance;
144
  // angle discretisation of the circles
145
  SettingsFact _alpha;
146 147 148
  // minimal transect lenght, transects are rejected if they are shorter than
  // this value
  SettingsFact _minLength;
149
  SettingsFact _type;
150 151
  SettingsFact _variant;
  QList<QString> _variantNames;
152 153 154
  SettingsFact _numRuns;
  SettingsFact _run;
  QList<QString> _runNames;
155

156 157 158
  // Area data
  WimaMeasurementAreaData _mArea;
  WimaJoinedAreaData _jArea;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
159
  QGeoCoordinate _depot;
160

161
  // Worker
162
  using PtrWorker = std::shared_ptr<RoutingThread>;
163
  PtrWorker _pWorker;
164
  PtrRoutingData _pRoutingData;
165

166
  // Routing data.
167
  QList<QList<QGeoCoordinate>> _rawTransects;
168 169 170 171
  using Runs = QVector<Transects>;
  QVector<Runs> _variantVector;

  // State.
172 173 174 175 176
  enum class STATE {
    DEFAULT,
    STORE,
    REVERSE,
    VARIANT_CHANGE,
177
    RUN_CHANGE,
178 179 180 181
  };
  STATE _state;

  bool _hidePolygon;
182
};