WimaArea.h 3.75 KB
Newer Older
1
#pragma once
2

3
#include "QGCGeo.h"
4
#include "QGCMapPolygon.h"
5
#include "QGCMapPolyline.h"
6 7
#include "Vehicle.h"
#include "qobject.h"
8
#include <QLineF>
9
#include <QPair>
10
#include <QPointF>
11

12
#include "GeoUtilities.h"
13
#include "PlanimetryCalculus.h"
14
#include "PolygonCalculus.h"
15

16
class WimaArea : public QGCMapPolygon // abstract base class for all WimaAreas
17
{
18
  Q_OBJECT
19
public:
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  WimaArea(QObject *parent = nullptr);
  WimaArea(const WimaArea &other, QObject *parent = nullptr);
  WimaArea &operator=(const WimaArea &other);

  Q_PROPERTY(double maxAltitude READ maxAltitude WRITE setMaxAltitude NOTIFY
                 maxAltitudeChanged)
  Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT)
  Q_PROPERTY(QString editorQML READ editorQML CONSTANT)
  Q_PROPERTY(Fact *borderPolygonOffset READ borderPolygonOffsetFact CONSTANT)
  Q_PROPERTY(QGCMapPolygon *borderPolygon READ borderPolygon NOTIFY
                 borderPolygonChanged)
  Q_PROPERTY(Fact *showBorderPolygon READ showBorderPolygon CONSTANT)
  Q_PROPERTY(bool wimaAreaInteractive READ wimaAreaInteractive WRITE
                 setWimaAreaInteractive NOTIFY wimaAreaInteractiveChanged)

  // Property accessors
  double maxAltitude(void) const { return _maxAltitude; }
  Fact *borderPolygonOffsetFact(void) { return &_borderPolygonOffset; }
  Fact *showBorderPolygon(void) { return &_showBorderPolygon; }
  double borderPolygonOffset(void) const {
    return _borderPolygonOffset.rawValue().toDouble();
  }
  QGCMapPolygon *borderPolygon(void) { return &_borderPolygon; }
  bool wimaAreaInteractive(void) const { return _wimaAreaInteractive; }

  void setWimaAreaInteractive(bool interactive);

  // overrides from WimaArea
  virtual QString mapVisualQML(void) const { return ""; }
  virtual QString editorQML(void) const { return ""; }

  // Member Methodes
  int getClosestVertexIndex(const QGeoCoordinate &coordinate) const;
  QGeoCoordinate getClosestVertex(const QGeoCoordinate &coordinate) const;
  QGCMapPolygon toQGCPolygon() const;
  bool join(WimaArea &area);
  bool join(WimaArea &area, QString &errorString);
  int nextVertexIndex(int index) const;
  int previousVertexIndex(int index) const;
  bool isSimplePolygon() const;
  bool containsCoordinate(const QGeoCoordinate &coordinate) const;

  void saveToJson(QJsonObject &jsonObject);
  bool loadFromJson(const QJsonObject &jsonObject, QString &errorString);

  // static Methodes
  static QGCMapPolygon toQGCPolygon(const WimaArea &area);
  static bool join(const WimaArea &area1, const WimaArea &area2,
                   WimaArea &joinedArea, QString &errorString);
  static bool join(const WimaArea &area1, const WimaArea &area2,
                   WimaArea &joinedArea);

  // Friends
  friend void print(const WimaArea &area, QString &outputString);
  friend void print(const WimaArea &area);

  // static Members
  // Accurracy used to compute isDisjunct
  static const double epsilonMeter;
  static const char *maxAltitudeName;
  static const char *wimaAreaName;
  static const char *areaTypeName;
  static const char *borderPolygonOffsetName;
  static const char *showBorderPolygonName;
  static const char *settingsGroup;
85 86

signals:
87 88 89 90
  void maxAltitudeChanged(void);
  void borderPolygonChanged(void);
  void borderPolygonOffsetChanged(void);
  void wimaAreaInteractiveChanged(void);
91

92
public slots:
93 94 95
  void setMaxAltitude(double altitude);
  void setShowBorderPolygon(bool showBorderPolygon);
  void setBorderPolygonOffset(double offset);
96

97
private slots:
98 99 100
  void recalcPolygons(void);
  void updatePolygonConnections(QVariant value);
  void recalcInteractivity(void);
101 102

private:
103
  void init();
104

105
  double _maxAltitude;
106

107 108 109
  QMap<QString, FactMetaData *> _metaDataMap;
  SettingsFact _borderPolygonOffset;
  SettingsFact _showBorderPolygon;
110

111
  QGCMapPolygon _borderPolygon;
112

113
  bool _wimaAreaInteractive;
114
};