WimaMeasurementArea.cc 6.25 KB
Newer Older
1 2
#include "WimaMeasurementArea.h"

Valentin Platzgummer's avatar
Valentin Platzgummer committed
3

4
const char* WimaMeasurementArea::settingsGroup =                   "MeasurementArea";
Valentin Platzgummer's avatar
Valentin Platzgummer committed
5 6 7 8
const char* WimaMeasurementArea::bottomLayerAltitudeName =         "BottomLayerAltitude";
const char* WimaMeasurementArea::numberOfLayersName =              "NumberOfLayers";
const char* WimaMeasurementArea::layerDistanceName =               "LayerDistance";
const char* WimaMeasurementArea::borderPolygonOffsetName =         "BorderPolygonOffset";
9
const char* WimaMeasurementArea::WimaMeasurementAreaName =         "Measurement Area";
Valentin Platzgummer's avatar
Valentin Platzgummer committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23


WimaMeasurementArea::WimaMeasurementArea(QObject *parent)
  : WimaArea (parent)
{
    init();
}

WimaMeasurementArea::WimaMeasurementArea(const WimaMeasurementArea &other, QObject *parent)
  : WimaArea(other, parent)
{
    init();
}

24 25 26 27 28 29 30 31 32 33 34 35
/*!
 * \overload operator=()
 *
 * Calls the inherited operator WimaArea::operator=().
 */
WimaMeasurementArea &WimaMeasurementArea::operator=(const WimaMeasurementArea &other)
{
    WimaArea::operator=(other);

    return *this;
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
36 37 38 39 40 41 42 43 44 45 46
void WimaMeasurementArea::saveToJson(QJsonObject &json)
{
    this->WimaArea::saveToJson(json);
    json[bottomLayerAltitudeName]   = _bottomLayerAltitude.rawValue().toDouble();
    json[numberOfLayersName]        = _numberOfLayers.rawValue().toInt();
    json[layerDistanceName]         = _layerDistance.rawValue().toDouble();
    json[borderPolygonOffsetName]   = _borderPolygonOffset.rawValue().toDouble();
    json[areaTypeName]              = WimaMeasurementAreaName;
}

bool WimaMeasurementArea::loadFromJson(const QJsonObject &json, QString& errorString)
47
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    if (this->WimaArea::loadFromJson(json, errorString)) {
        bool retVal = true;

        if ( json.contains(bottomLayerAltitudeName) && json[bottomLayerAltitudeName].isDouble() ) {
            _bottomLayerAltitude.setRawValue(json[bottomLayerAltitudeName].toDouble());
        } else {
            errorString.append(tr("Could not load Bottom Layer Altitude!\n"));
            retVal = false;
        }

        if ( json.contains(numberOfLayersName) && json[numberOfLayersName].isDouble() ) {
            _numberOfLayers.setRawValue(json[numberOfLayersName].toInt());
        } else {
            errorString.append(tr("Could not load Number of Layers!\n"));
            retVal = false;
        }
64

Valentin Platzgummer's avatar
Valentin Platzgummer committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
        if ( json.contains(layerDistanceName) && json[layerDistanceName].isDouble() ) {
            _layerDistance.setRawValue(json[layerDistanceName].toDouble());
        } else {
            errorString.append(tr("Could not load Layer Distance!\n"));
            retVal = false;
        }

        if ( json.contains(borderPolygonOffsetName) && json[borderPolygonOffsetName].isDouble() ) {
            _borderPolygonOffset.setRawValue(json[borderPolygonOffsetName].toDouble());
        } else {
            errorString.append(tr("Could not load Border Polygon Offset!\n"));
            retVal = false;
        }

        return retVal;
    } else {
        return false;
    }
83
}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
84

85 86 87 88 89 90 91 92 93 94
void WimaMeasurementArea::setBottomLayerAltitude(double altitude)
{
    if ( !qFuzzyCompare(_bottomLayerAltitude.rawValue().toDouble(), altitude) ) {
        _bottomLayerAltitude.setRawValue(altitude);

        emit bottomLayerAltitudeChanged();
    }
}

void WimaMeasurementArea::setNumberOfLayers(double numLayers)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
95
{
96 97
    if ( !qFuzzyCompare(_numberOfLayers.rawValue().toDouble(), numLayers) ) {
        _numberOfLayers.setRawValue(numLayers);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
98

99 100 101 102 103 104 105 106
        emit numberOfLayersChanged();
    }
}

void WimaMeasurementArea::setLayerDistance(double layerDistance)
{
    if ( !qFuzzyCompare(_layerDistance.rawValue().toDouble(), layerDistance) ) {
        _layerDistance.setRawValue(layerDistance);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
107

108 109
        emit layerDistanceChanged();
    }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
110 111
}

112
void WimaMeasurementArea::setBorderPolygonOffset(double offset)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
113
{
114 115
    if ( !qFuzzyCompare(_borderPolygonOffset.rawValue().toDouble(), offset) ) {
        _borderPolygonOffset.setRawValue(offset);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
116

117 118
        emit borderPolygonOffsetChanged();
    }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
}

void print(const WimaMeasurementArea &area)
{
    QString message;
    print(area, message);
    qWarning() << message;
}

void print(const WimaMeasurementArea &area, QString outputStr)
{
    print(static_cast<const WimaArea&>(area), outputStr);
    outputStr.append(QString("Bottom Layer Altitude: %1\n").arg(area._bottomLayerAltitude.rawValue().toDouble()));
    outputStr.append(QString("Number of Layers: %1\n").arg(area._numberOfLayers.rawValue().toInt()));
    outputStr.append(QString("Layer Distance: %1\n").arg(area._layerDistance.rawValue().toDouble()));
    outputStr.append(QString("Border Polygon Offset: %1\n").arg(area._borderPolygonOffset.rawValue().toDouble()));

    outputStr.append(QString("Border Polygon Coordinates\n").arg(area._borderPolygonOffset.rawValue().toDouble()));
    for (int i = 0; i < area._borderPolygon.count(); i++) {
        QGeoCoordinate coordinate = area._borderPolygon.vertexCoordinate(i);
        outputStr.append(QString("%1\n").arg(coordinate.toString(QGeoCoordinate::Degrees)));
    }
}

void WimaMeasurementArea::recalcBorderPolygon()
{
145 146
    _borderPolygon = this->toQGCPolygon(*this);
    _borderPolygon.offset(_borderPolygonOffset.rawValue().toDouble());
Valentin Platzgummer's avatar
Valentin Platzgummer committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165

    emit borderPolygonChanged();
}

void WimaMeasurementArea::init()
{

    _metaDataMap            = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/WimaMeasurementArea.SettingsGroup.json"), this /* QObject parent */);
    _bottomLayerAltitude    = SettingsFact(settingsGroup, _metaDataMap[bottomLayerAltitudeName], this /* QObject parent */);
    _numberOfLayers         = SettingsFact(settingsGroup, _metaDataMap[numberOfLayersName], this /* QObject parent */);
    _layerDistance          = SettingsFact(settingsGroup, _metaDataMap[layerDistanceName], this /* QObject parent */);
    _borderPolygonOffset    = SettingsFact(settingsGroup, _metaDataMap[borderPolygonOffsetName], this /* QObject parent */);
    _borderPolygon          = new QGCMapPolygon(this);

    this->setObjectName(WimaMeasurementAreaName);
    connect(this, &WimaMeasurementArea::pathChanged, this, &WimaMeasurementArea::recalcBorderPolygon);
    connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaMeasurementArea::recalcBorderPolygon);
}

166 167 168 169 170 171 172
/*!
 * \class WimaMeasurementArea
 * \brief Class defining the area inside which the actual drone measurements are performed.
 *
 * \sa WimaArea, WimaController, WimaPlaner
 */

Valentin Platzgummer's avatar
Valentin Platzgummer committed
173