Skip to content
CircularSurvey.h 4.35 KiB
Newer Older
#pragma once

#include <QFutureWatcher>
#include <QVector>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#include <memory>

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

#include "Geometry/WimaJoinedAreaData.h"
#include "Geometry/WimaMeasurementAreaData.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#include "WimaPlanData.h"
class RoutingData;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
class GeneratorBase;
class CircularSurvey : public TransectStyleComplexItem {
  Q_OBJECT
  using PtrGenerator = std::shared_ptr<routing::GeneratorBase>;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  using PtrRoutingData = std::shared_ptr<RoutingData>;
  using PtrWorker = std::shared_ptr<RoutingThread>;
Valentin Platzgummer's avatar
Valentin Platzgummer committed

public:
  /// @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);
  ~CircularSurvey();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  Q_PROPERTY(Fact *variant READ variant CONSTANT)
      QStringList variantNames READ variantNames NOTIFY variantNamesChanged)
  Q_PROPERTY(QStringList generatorNameList READ generatorNameList NOTIFY
Valentin Platzgummer's avatar
Valentin Platzgummer committed
                 generatorNameListChanged)
  Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
  Q_PROPERTY(
      routing::GeneratorBase *generator READ generator NOTIFY generatorChanged)
  Q_PROPERTY(int generatorIndex READ generatorIndex NOTIFY generatorChanged)
  Q_INVOKABLE void reverse(void);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  void setPlanData(const WimaPlanData &d);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  const WimaPlanData &planData() const;
  WimaPlanData &planData();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  Fact *variant();
  QStringList variantNames() const;
  bool calculating() const;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  // Overrides
  bool load(const QJsonObject &complexObject, int sequenceNumber,
Valentin Platzgummer's avatar
Valentin Platzgummer committed
            QString &errorString) override final;
  QString mapVisualQML(void) const override final;
  void save(QJsonArray &planItems) override final;
  bool specifiesCoordinate(void) const override final;
  void appendMissionItems(QList<MissionItem *> &items,
Valentin Platzgummer's avatar
Valentin Platzgummer committed
                          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;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  // Generator
  bool registerGenerator(const QString &name,
                         std::shared_ptr<routing::GeneratorBase> g);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  bool unregisterGenerator(const QString &name);
  bool unregisterGenerator(int index);
  Q_INVOKABLE bool switchToGenerator(const QString &name);
  Q_INVOKABLE bool switchToGenerator(int index);
  QStringList generatorNameList();
  routing::GeneratorBase *generator();
  int generatorIndex();
  static const char *settingsGroup;
  static const char *variantName;
  static const char *CircularSurveyName;

signals:
  void calculatingChanged();
  void variantNamesChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  void generatorNameListChanged();
  void generatorChanged();

private slots:
  // Overrides from TransectStyleComplexItem
  void _rebuildTransectsPhase1(void) final;
  void _recalcComplexDistance(void) final;
  void _recalcCameraShots(void) final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed

  // Worker functions.
  void _setTransects(PtrRoutingData pRoute);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  void _changeVariant();
  void _updateWorker();
  void _changeVariantWorker();
  void _reverseWorker();

private:
  void _appendLoadedMissionItems(QList<MissionItem *> &items,
                                 QObject *missionItemParent);
  void _buildAndAppendMissionItems(QList<MissionItem *> &items,
                                   QObject *missionItemParent);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  bool _switchToGenerator(const PtrGenerator &newG);

  // State.
  enum class STATE {
    IDLE,
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    REVERSE,
    VARIANT_CHANGE,
    RUN_CHANGE,
  };
  STATE _state;

  // center of the circular lanes, e.g. base station
  QMap<QString, FactMetaData *> _metaDataMap;
  SettingsFact _variant;
  QStringList _variantNames;
  // Area data
  std::shared_ptr<WimaPlanData> _pAreaData;
Valentin Platzgummer's avatar
Valentin Platzgummer committed

  // Generators
  QList<PtrGenerator> _generatorList;
  QStringList _generatorNameList;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  PtrGenerator _pGenerator;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  using Variant = Transects;
  QVector<Variant> _variantVector;