# pragma once #include "TransectStyleComplexItem.h" #include "PolygonCalculus.h" #include "PlanimetryCalculus.h" #include "GeoUtilities.h" #include "QVector" #include "Circle.h" #include "SettingsFact.h" class CircularSurveyComplexItem :public TransectStyleComplexItem { Q_OBJECT 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 CircularSurveyComplexItem(Vehicle* vehicle, bool flyView, const QString& kmlOrShpFile, QObject* parent); Q_PROPERTY(QGeoCoordinate refPoint READ refPoint WRITE setRefPoint NOTIFY refPointChanged) Q_PROPERTY(Fact* deltaR READ deltaR CONSTANT) Q_PROPERTY(Fact* deltaAlpha READ deltaAlpha CONSTANT) Q_PROPERTY(Fact* transectMinLength READ transectMinLength CONSTANT) Q_PROPERTY(Fact* isSnakePath READ isSnakePath CONSTANT) Q_PROPERTY(bool autoGenerated READ autoGenerated NOTIFY autoGeneratedChanged) Q_INVOKABLE void resetReference(void); // Property setters void setRefPoint(const QGeoCoordinate &refPt); // Set this to true if survey was automatically generated, prevents initialisation from gui. void setAutoGenerated(bool autoGen); // Property getters QGeoCoordinate refPoint() const; Fact *deltaR(); Fact *deltaAlpha(); Fact *transectMinLength(); Fact *isSnakePath(); // Is true if survey was automatically generated, prevents initialisation from gui. bool autoGenerated(); // Overrides from ComplexMissionItem bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; QString mapVisualQML (void) const final { return QStringLiteral("SpericalSurveyMapVisual.qml"); } // Overrides from TransectStyleComplexItem void save (QJsonArray& planItems) final; bool specifiesCoordinate (void) const final { return true; } void appendMissionItems (QList& items, QObject* missionItemParent) final; void applyNewAltitude (double newAltitude) final; double timeBetweenShots (void) final; // Overrides from VisualMissionionItem QString commandDescription (void) const final { return tr("Circular Survey"); } QString commandName (void) const final { return tr("Circular Survey"); } QString abbreviation (void) const final { return tr("C.S."); } bool readyForSave (void) const final; double additionalTimeDelay (void) const final; static const char* settingsGroup; static const char* deltaRName; static const char* deltaAlphaName; static const char* transectMinLengthName; static const char* isSnakePathName; static const char* jsonComplexItemTypeValue; static const char* jsonDeltaRKey; static const char* jsonDeltaAlphaKey; static const char* jsonTransectMinLengthKey; static const char* jsonIsSnakePathKey; static const char* jsonReferencePointLongKey; static const char* jsonReferencePointLatKey; static const char* jsonReferencePointAltKey; signals: void refPointChanged(); void autoGeneratedChanged(); private slots: // Overrides from TransectStyleComplexItem void _rebuildTransectsPhase1 (void) final; void _recalcComplexDistance (void) final; void _recalcCameraShots (void) final; signals: private: void _appendLoadedMissionItems(QList& items, QObject* missionItemParent); void _buildAndAppendMissionItems(QList& items, QObject* missionItemParent); QGeoCoordinate _referencePoint; // center of the circular lanes, e.g. base station QMap _metaDataMap; SettingsFact _deltaR; // distance between two neighbour circles SettingsFact _deltaAlpha; // angle discretisation of the circles SettingsFact _transectMinLength; // minimal transect lenght, transects are rejected if they are shorter than this value SettingsFact _isSnakePath; // bool value, determining if transects are connected in a snake like or zig zag like manner QTimer _updateTimer; bool _autoGenerated; // set to true if survey was automatically generated, prevents initialisation from gui };