WimaGOperationArea.cc 5.63 KB
Newer Older
1 2
#include "WimaGOperationArea.h"

3

4
const char* WimaGOperationArea::settingsGroup =                   "OperationArea";
5 6 7
const char* WimaGOperationArea::bottomLayerAltitudeName =         "BottomLayerAltitude";
const char* WimaGOperationArea::numberOfLayersName =              "NumberOfLayers";
const char* WimaGOperationArea::layerDistanceName =               "LayerDistance";
8
const char* WimaGOperationArea::borderPolygonOffsetName =         "BorderPolygonOffset";
9
const char* WimaGOperationArea::wimaGOperationAreaName =          "Operation Area";
10 11


Valentin Platzgummer's avatar
Valentin Platzgummer committed
12 13
WimaGOperationArea::WimaGOperationArea(QObject *parent)
  : WimaArea (parent)
14
{
15
    init();
16 17
}

18
WimaGOperationArea::WimaGOperationArea(const WimaGOperationArea &other, QObject *parent)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
19 20
  : WimaArea(other, parent)
{
21
    init();
22
}
23

24
WimaGOperationArea &WimaGOperationArea::operator=(WimaGOperationArea other)
25
{
26
    swap(*this, other);
27

28
    return *this;
29 30
}

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
void WimaGOperationArea::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]              = wimaGOperationAreaName;
}

bool WimaGOperationArea::loadFromJson(const QJsonObject &json, QString& errorString)
{
    if (this->WimaArea::loadFromJson(json, errorString)) {
        bool retVal = true;

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

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

        if ( json.contains(layerDistanceName) && json[layerDistanceName].isDouble() ) {
            _layerDistance.setRawValue(json[layerDistanceName].toDouble());
        } else {
63
            errorString.append(tr("Could not load Layer Distance!\n"));
64 65 66 67 68 69
            retVal = false;
        }

        if ( json.contains(borderPolygonOffsetName) && json[borderPolygonOffsetName].isDouble() ) {
            _borderPolygonOffset.setRawValue(json[borderPolygonOffsetName].toDouble());
        } else {
70
            errorString.append(tr("Could not load Border Polygon Offset!\n"));
71 72 73 74 75 76 77 78 79
            retVal = false;
        }

        return retVal;
    } else {
        return false;
    }
}

80
void print(const WimaGOperationArea &area)
81
{
82 83 84
    QString message;
    print(area, message);
    qWarning() << message;
85 86
}

87
void print(const WimaGOperationArea &area, QString outputStr)
88
{
89 90 91 92 93 94 95 96 97 98
    print(static_cast<const WimaArea&>(area), outputStr);
    outputStr.append(QString("Bottom Layer Altitude: %.3f\n").arg(area._bottomLayerAltitude.rawValue().toDouble()));
    outputStr.append(QString("Number of Layers: %i\n").arg(area._numberOfLayers.rawValue().toInt()));
    outputStr.append(QString("Layer Distance: %.3f\n").arg(area._layerDistance.rawValue().toDouble()));
    outputStr.append(QString("Border Polygon Offset: %.3f\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("%s\n").arg(coordinate.toString(QGeoCoordinate::Degrees)));
99 100 101
    }
}

102
void swap(WimaGOperationArea &area1, WimaGOperationArea &area2)
103
{
104 105 106 107 108 109 110 111
    using std::swap;

    swap(area1._metaDataMap,            area2._metaDataMap);
    swap(area1._bottomLayerAltitude,    area2._bottomLayerAltitude);
    swap(area1._numberOfLayers,         area2._numberOfLayers);
    swap(area1._layerDistance,          area2._layerDistance);
    swap(area1._borderPolygonOffset,    area2._borderPolygonOffset);
    swap(area1._borderPolygon,          area2._borderPolygon);
112 113
}

114
void WimaGOperationArea::recalcBorderPolygon()
115
{
116 117 118 119 120
    //qWarning("WimaGOperationArea::recalcBorderPolygon() %f", _borderPolygonOffset.rawValue().toDouble());
    QGCMapPolygon polyCopy = this->toQGCPolygon(*this);
    polyCopy.offset(_borderPolygonOffset.rawValue().toDouble());
    _borderPolygon.setPath(polyCopy.path());
    polyCopy.deleteLater();
121

122
    emit borderPolygonChanged();
123 124
}

125
void WimaGOperationArea::init()
126 127
{

128 129 130 131 132 133
    _metaDataMap            = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/WimaGOperationArea.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);
134

135 136 137 138
    this->setObjectName(wimaGOperationAreaName);
    connect(this, &WimaGOperationArea::pathChanged, this, &WimaGOperationArea::recalcBorderPolygon);
    connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaGOperationArea::recalcBorderPolygon);
}
139 140