Commit c8170647 authored by Valentin Platzgummer's avatar Valentin Platzgummer

my first c.

parent 86388db3
...@@ -23,10 +23,18 @@ Rectangle { ...@@ -23,10 +23,18 @@ Rectangle {
// The following properties must be available up the hierarchy chain // The following properties must be available up the hierarchy chain
//property real availableWidth ///< Width for control //property real availableWidth ///< Width for control
//property var missionItem ///< Mission Item for editor //property var areaItem ///< Mission Item for editor
property real _margin: ScreenTools.defaultFontPixelWidth / 2 property real _margin: ScreenTools.defaultFontPixelWidth / 2
property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 10.5 property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 10.5
property var polyline: areaItem.polyline
property var operatingPolygon: areaItem.polygon
property bool initNecesarry: true
function editPolyline(){
polyline.setInteractive(true);
}
...@@ -42,7 +50,7 @@ Rectangle { ...@@ -42,7 +50,7 @@ Rectangle {
SectionHeader { SectionHeader {
id: scanHeader id: scanHeader
text: qsTr("Scan") text: qsTr("Settings")
} }
Column { Column {
...@@ -58,55 +66,48 @@ Rectangle { ...@@ -58,55 +66,48 @@ Rectangle {
rowSpacing: _margin rowSpacing: _margin
columns: 2 columns: 2
FactComboBox {
fact: missionItem.startFromTop
indexModel: true
model: [ qsTr("Start Scan From Bottom"), qsTr("Start Scan From Top") ]
Layout.columnSpan: 2
Layout.fillWidth: true
}
QGCLabel { QGCLabel {
text: qsTr("Structure Height") text: qsTr("Bottom Layer Altitude")
} }
FactTextField { FactTextField {
fact: missionItem.structureHeight fact: areaItem.bottomLayerAltitude
Layout.fillWidth: true Layout.fillWidth: true
} }
QGCLabel { text: qsTr("Scan Bottom Alt") } QGCLabel { text: qsTr("Number of Layers") }
FactTextField { FactTextField {
fact: missionItem.scanBottomAlt fact: areaItem.numberOfLayers
Layout.fillWidth: true Layout.fillWidth: true
} }
QGCLabel { text: qsTr("Entrance/Exit Alt") } QGCLabel { text: qsTr("Layer Distance") }
FactTextField { FactTextField {
fact: missionItem.entranceAlt fact: areaItem.layerDistance
LayoWimaGlobalMeasurementPolygonEditor.qmlut.fillWidth: true
}
QGCLabel {
text: qsTr("Gimbal Pitch")
visible: missionItem.cameraCalc.isManualCamera
}
FactTextField {
fact: missionItem.gimbalPitch
Layout.fillWidth: true Layout.fillWidth: true
visible: missionItem.cameraCalc.isManualCamera
} }
} }
Item { Item {
height: ScreenTools.defaultFontPixelHeight / 2 height: ScreenTools.defaultFontPixelHeight / 2
width: 1 width: 1
} }
QGCButton {
text: qsTr("Rotate entry point")
onClicked: missionItem.rotateEntryPoint()
}
} // Column - Scan } // Column - Scan
SectionHeader {
id: polylineHeader
text: qsTr("Gateway Poly Line")
}
QGCButton {
id: polylineEditor
anchors.topMargin: _margin / 2
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2
anchors.rightMargin: ScreenTools.defaultFontPixelWidth
text: "Edit Polyline"
onClicked: editPolyline()
}
SectionHeader { SectionHeader {
id: statsHeader id: statsHeader
...@@ -118,26 +119,9 @@ Rectangle { ...@@ -118,26 +119,9 @@ Rectangle {
columnSpacing: ScreenTools.defaultFontPixelWidth columnSpacing: ScreenTools.defaultFontPixelWidth
visible: statsHeader.checked visible: statsHeader.checked
QGCLabel { text: qsTr("Layers") } /*QGCLabel { text: qsTr("Layers") }
QGCLabel { text: missionItem.layers.valueString } QGCLabel { text: areaItem.layers.valueString }*/
QGCLabel { text: qsTr("Layer Height") }
QGCLabel { text: missionItem.cameraCalc.adjustedFootprintFrontal.valueString + " " + QGroundControl.appSettingsDistanceUnitsString }
QGCLabel { text: qsTr("Top Layer Alt") } }
QGCLabel { text: QGroundControl.metersToAppSettingsDistanceUnits(missionItem.topFlightAlt).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString }
QGCLabel { text: qsTr("Bottom Layer Alt") }
QGCLabel { text: QGroundControl.metersToAppSettingsDistanceUnits(missionItem.bottomFlightAlt).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString }
QGCLabel { text: qsTr("Photo Count") }
QGCLabel { text: missionItem.cameraShots }
QGCLabel { text: qsTr("Photo Interval") }
QGCLabel { text: missionItem.timeBetweenShots.toFixed(1) + " " + qsTr("secs") }
QGCLabel { text: qsTr("Trigger Distance") }
QGCLabel { text: missionItem.cameraCalc.adjustedFootprintSide.valueString + " " + QGroundControl.appSettingsDistanceUnitsString }
}
} // Column } // Column
} // Rectangle } // Rectangle
...@@ -27,6 +27,7 @@ Item { ...@@ -27,6 +27,7 @@ Item {
property var _missionItem: object property var _missionItem: object
property var _polygon: object.polygon property var _polygon: object.polygon
property var _polyline: object.polyline
signal clicked(int sequenceNumber) signal clicked(int sequenceNumber)
...@@ -77,9 +78,19 @@ Item { ...@@ -77,9 +78,19 @@ Item {
borderWidth: 1 borderWidth: 1
borderColor: "black" borderColor: "black"
interiorColor: "green" interiorColor: "green"
interiorOpacity: 0.25 interiorOpacity: 1
}
1
QGCMapPolylineVisuals {
id: mapPolylineVisuals
qgcView: _root.qgcView
mapControl: map
mapPolyline: _polyline
interactive: true
lineWidth: 3
lineColor: "blue"
} }
......
if polygon vertex clicked: remove circle option
can't switch between polygons on first insert
...@@ -413,7 +413,8 @@ HEADERS += \ ...@@ -413,7 +413,8 @@ HEADERS += \
src/MissionManager/WimaVehicleCorridor.h \ src/MissionManager/WimaVehicleCorridor.h \
src/MissionManager/WimaVehicleMeasurementPolygon.h \ src/MissionManager/WimaVehicleMeasurementPolygon.h \
src/MissionManager/WimaGlobalMeasurementPolygon.h \ src/MissionManager/WimaGlobalMeasurementPolygon.h \
src/MissionManager/WimaVehicle.h src/MissionManager/WimaVehicle.h \
src/MissionManager/WimaPolyline.h
SOURCES += \ SOURCES += \
src/api/QGCCorePlugin.cc \ src/api/QGCCorePlugin.cc \
...@@ -427,7 +428,8 @@ SOURCES += \ ...@@ -427,7 +428,8 @@ SOURCES += \
src/MissionManager/WimaVehicleCorridor.cc \ src/MissionManager/WimaVehicleCorridor.cc \
src/MissionManager/WimaVehicleMeasurementPolygon.cc \ src/MissionManager/WimaVehicleMeasurementPolygon.cc \
src/MissionManager/WimaGlobalMeasurementPolygon.cc \ src/MissionManager/WimaGlobalMeasurementPolygon.cc \
src/MissionManager/WimaVehicle.cc src/MissionManager/WimaVehicle.cc \
src/MissionManager/WimaPolyline.cc
# #
# Unit Test specific configuration goes here (requires full debug build with all plugins) # Unit Test specific configuration goes here (requires full debug build with all plugins)
......
...@@ -259,7 +259,7 @@ ...@@ -259,7 +259,7 @@
<file alias="Vehicle/VibrationFact.json">src/Vehicle/VibrationFact.json</file> <file alias="Vehicle/VibrationFact.json">src/Vehicle/VibrationFact.json</file>
<file alias="Vehicle/WindFact.json">src/Vehicle/WindFact.json</file> <file alias="Vehicle/WindFact.json">src/Vehicle/WindFact.json</file>
<file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file> <file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file>
<file>src/MissionManager/WimaGlobalMeasurementPolygon.SettingsGroup.json</file> <file alias="WimaGlobalMeasurementPolygon.SettingsGroup.json">src/MissionManager/WimaGlobalMeasurementPolygon.SettingsGroup.json</file>
</qresource> </qresource>
<qresource prefix="/MockLink"> <qresource prefix="/MockLink">
<file alias="APMArduCopterMockLink.params">src/comm/APMArduCopterMockLink.params</file> <file alias="APMArduCopterMockLink.params">src/comm/APMArduCopterMockLink.params</file>
......
...@@ -43,7 +43,7 @@ void WimaController::addGlobalMeasurementArea() ...@@ -43,7 +43,7 @@ void WimaController::addGlobalMeasurementArea()
void WimaController::removeArea(int index) void WimaController::removeArea(int index)
{ {
if(index > 0 && index < _visualItems->count()){ if(index >= 0 && index < _visualItems->count()){
_visualItems->removeAt(index); _visualItems->removeAt(index);
emit visualItemsChanged(); emit visualItemsChanged();
...@@ -63,7 +63,7 @@ void WimaController::addServiceArea() ...@@ -63,7 +63,7 @@ void WimaController::addServiceArea()
{ {
resetAllIsCurrentPolygon(); resetAllIsCurrentPolygon();
WimaServicePolygon* newPoly = new WimaServicePolygon(this); WimaServicePolygon* newPoly = new WimaServicePolygon(this);
newPoly->setIsCurrentPolygon(true); newPoly->setInteractive(true);
_visualItems->append(newPoly); _visualItems->append(newPoly);
emit visualItemsChanged(); emit visualItemsChanged();
...@@ -118,7 +118,7 @@ void WimaController::recalcPolygonInteractivity(int index) ...@@ -118,7 +118,7 @@ void WimaController::recalcPolygonInteractivity(int index)
{ {
resetAllIsCurrentPolygon(); resetAllIsCurrentPolygon();
WimaPolygon* interactivePoly = qobject_cast<WimaPolygon*>(_visualItems->get(index)); WimaPolygon* interactivePoly = qobject_cast<WimaPolygon*>(_visualItems->get(index));
interactivePoly->setIsCurrentPolygon(true); interactivePoly->setInteractive(true);
} }
void WimaController::resetAllIsCurrentPolygon() void WimaController::resetAllIsCurrentPolygon()
...@@ -126,7 +126,7 @@ void WimaController::resetAllIsCurrentPolygon() ...@@ -126,7 +126,7 @@ void WimaController::resetAllIsCurrentPolygon()
int itemCount = _visualItems->count(); int itemCount = _visualItems->count();
for (int i = 0; i < itemCount; i++) { for (int i = 0; i < itemCount; i++) {
WimaPolygon* iteratorPoly = qobject_cast<WimaPolygon*>(_visualItems->get(i)); WimaPolygon* iteratorPoly = qobject_cast<WimaPolygon*>(_visualItems->get(i));
iteratorPoly->setIsCurrentPolygon(false); iteratorPoly->setInteractive(false);
} }
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
{ {
"name": "NumberOfLayers", "name": "NumberOfLayers",
"shortDescription": "The number of layers", "shortDescription": "The number of layers",
"type": "unint32", "type": "uint32",
"min": 1, "min": 1,
"defaultValue": 1 "defaultValue": 1
}, },
......
#include "WimaGlobalMeasurementPolygon.h" #include "WimaGlobalMeasurementPolygon.h"
const char* WimaGlobalMeasurementPolygon::settingsGroup = "OperatingArea"; const char* WimaGlobalMeasurementPolygon::settingsGroup = "OperatingArea";
const char* WimaGlobalMeasurementPolygon::bottomLayerAltitudeName = "BottomLayerAltitude"; const char* WimaGlobalMeasurementPolygon::bottomLayerAltitudeName = "BottomLayerAltitude";
const char* WimaGlobalMeasurementPolygon::numberOfLayersName = "NumberOfLayers"; const char* WimaGlobalMeasurementPolygon::numberOfLayersName = "NumberOfLayers";
const char* WimaGlobalMeasurementPolygon::layerDistanceName = "LayerDistance"; const char* WimaGlobalMeasurementPolygon::layerDistanceName = "LayerDistance";
...@@ -12,14 +12,24 @@ WimaGlobalMeasurementPolygon::WimaGlobalMeasurementPolygon(QObject *parent) ...@@ -12,14 +12,24 @@ WimaGlobalMeasurementPolygon::WimaGlobalMeasurementPolygon(QObject *parent)
, _bottomLayerAltitude (settingsGroup, _metaDataMap[bottomLayerAltitudeName]) , _bottomLayerAltitude (settingsGroup, _metaDataMap[bottomLayerAltitudeName])
, _numberOfLayers (settingsGroup, _metaDataMap[numberOfLayersName]) , _numberOfLayers (settingsGroup, _metaDataMap[numberOfLayersName])
, _layerDistance (settingsGroup, _metaDataMap[layerDistanceName]) , _layerDistance (settingsGroup, _metaDataMap[layerDistanceName])
, _vehicleList (new QmlObjectListModel(this))
, _vehiclePolygons (new QmlObjectListModel(this))
{ {
this->setObjectName("Operating Area"); this->setObjectName("Operating Area");
_polyline.bindPolygon(this->polygon());
} }
WimaGlobalMeasurementPolygon::WimaGlobalMeasurementPolygon(QGCMapPolygon *other, QObject *parent): WimaGlobalMeasurementPolygon::WimaGlobalMeasurementPolygon(QGCMapPolygon *other, QObject *parent)
WimaPolygon (other, parent) : WimaPolygon (other, parent)
, _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/WimaGlobalMeasurementPolygon.SettingsGroup.json"), this /* QObject parent */))
, _bottomLayerAltitude (settingsGroup, _metaDataMap[bottomLayerAltitudeName])
, _numberOfLayers (settingsGroup, _metaDataMap[numberOfLayersName])
, _layerDistance (settingsGroup, _metaDataMap[layerDistanceName])
, _vehicleList (new QmlObjectListModel(this))
, _vehiclePolygons (new QmlObjectListModel(this))
{ {
this->setObjectName("Operating Area");
_polyline.bindPolygon(this->polygon());
} }
void WimaGlobalMeasurementPolygon::addVehicle(Vehicle *vehicle) void WimaGlobalMeasurementPolygon::addVehicle(Vehicle *vehicle)
...@@ -44,23 +54,60 @@ void WimaGlobalMeasurementPolygon::recalculatesubPolygons() ...@@ -44,23 +54,60 @@ void WimaGlobalMeasurementPolygon::recalculatesubPolygons()
QScopedPointer<QList<QGCMapPolygon*>> listQGCPoly(this->splitPolygonArea(vehicleCount)); QScopedPointer<QList<QGCMapPolygon*>> listQGCPoly(this->splitPolygonArea(vehicleCount));
int polyCount = listQGCPoly->size(); int polyCount = listQGCPoly->size();
_subPolygons->clear(); _vehiclePolygons->clear();
for(int i = 0; i < polyCount; i++){ for(int i = 0; i < polyCount; i++){
WimaVehicleMeasurementPolygon* subPoly = new WimaVehicleMeasurementPolygon(listQGCPoly->takeAt(i), this); WimaVehicleMeasurementPolygon* subPoly = new WimaVehicleMeasurementPolygon(listQGCPoly->takeAt(i), this);
_subPolygons->append(subPoly); _vehiclePolygons->append(subPoly);
} }
} }
void WimaGlobalMeasurementPolygon::removeAllVehicles() void WimaGlobalMeasurementPolygon::removeAllVehicles()
{ {
int counter = _vehicleList->count()-1; int count = _vehicleList->count();
while(counter >= 0){ if(count > 0){
_vehicleList->removeAt(0); do{
counter--; _vehicleList->removeAt(0);
count--;
}while(count > 0);
emit vehicleListChanged();
} }
emit vehicleListChanged();
} }
void WimaGlobalMeasurementPolygon::addVehiclePolygon()
{
_vehiclePolygons->append(new WimaVehicleMeasurementPolygon(this));
emit vehiclePolygonsChanged();
}
void WimaGlobalMeasurementPolygon::removeVehiclePolygon(int polygonIndex)
{
if(polygonIndex >= 0 && polygonIndex < _vehiclePolygons->count()){
_vehiclePolygons->removeAt(polygonIndex);
emit vehiclePolygonsChanged();
}else {
qWarning("Index out of bounds!");
}
}
void WimaGlobalMeasurementPolygon::removeVehiclePolygon(WimaVehicleMeasurementPolygon *wimaPolygon)
{
if(wimaPolygon != nullptr){
QObject* removedPolygon = _vehiclePolygons->removeOne(wimaPolygon);
if(removedPolygon){
emit vehiclePolygonsChanged();
}else {
qWarning("Polygon not inside polygon list.");
}
}else {
qWarning("Not a valid Polygon.");
}
}
#pragma once #pragma once
#include <QObject> #include <QObject>
#include "WimaPolygon.h" #include "WimaPolygon.h"
...@@ -20,12 +20,17 @@ public: ...@@ -20,12 +20,17 @@ public:
Q_PROPERTY(Fact* numberOfLayers READ numberOfLayers CONSTANT) Q_PROPERTY(Fact* numberOfLayers READ numberOfLayers CONSTANT)
Q_PROPERTY(Fact* layerDistance READ layerDistance CONSTANT) Q_PROPERTY(Fact* layerDistance READ layerDistance CONSTANT)
Q_PROPERTY(QmlObjectListModel* vehicleList READ vehicleList NOTIFY vehicleListChanged) Q_PROPERTY(QmlObjectListModel* vehicleList READ vehicleList NOTIFY vehicleListChanged)
Q_PROPERTY(QGCMapPolyline* entryPolyline READ entryPolyline NOTIFY entryPolylineChanged) Q_PROPERTY(QmlObjectListModel* vehiclePolygons READ vehiclePolygons NOTIFY vehiclePolygonsChanged)
Q_PROPERTY(WimaPolyline* polyline READ polyline NOTIFY polylineChanged)
Q_INVOKABLE void addVehicle(Vehicle *vehicle);
Q_INVOKABLE void removeVehicle(int vehicleIndex); Q_INVOKABLE void addVehicle (Vehicle *vehicle);
Q_INVOKABLE void recalculatesubPolygons(); Q_INVOKABLE void removeVehicle (int vehicleIndex);
Q_INVOKABLE void removeAllVehicles(); Q_INVOKABLE void recalculatesubPolygons ();
Q_INVOKABLE void removeAllVehicles ();
Q_INVOKABLE void addVehiclePolygon ();
Q_INVOKABLE void removeVehiclePolygon (int polygonIndex);
Q_INVOKABLE void removeVehiclePolygon (WimaVehicleMeasurementPolygon *wimaPolygon);
// Overrides from WimaPolygon // Overrides from WimaPolygon
...@@ -33,11 +38,12 @@ public: ...@@ -33,11 +38,12 @@ public:
QString editorQML (void) const { return "WimaGlobalMeasurementPolygonEditor.qml";} QString editorQML (void) const { return "WimaGlobalMeasurementPolygonEditor.qml";}
// Property accessors // Property accessors
Fact* bottomLayerAltitude (void) { return &_bottomLayerAltitude;} Fact* bottomLayerAltitude (void) { return &_bottomLayerAltitude;}
Fact* numberOfLayers (void) { return &_numberOfLayers;} Fact* numberOfLayers (void) { return &_numberOfLayers;}
Fact* layerDistance (void) { return &_layerDistance;} Fact* layerDistance (void) { return &_layerDistance;}
QmlObjectListModel* vehicleList (void) const { return _vehicleList;} QmlObjectListModel* vehicleList (void) const { return _vehicleList;}
QGCMapPolyline* entryPolyline (void) const { return _entryPolyline;} QmlObjectListModel* vehiclePolygons (void) const { return _vehiclePolygons;}
WimaPolyline* polyline (void) { return &_polyline;}
static const char* settingsGroup; static const char* settingsGroup;
...@@ -51,8 +57,8 @@ signals: ...@@ -51,8 +57,8 @@ signals:
void numberOfLayersChanged (void); void numberOfLayersChanged (void);
void layerDistanceChanged (void); void layerDistanceChanged (void);
void vehicleListChanged (void); void vehicleListChanged (void);
void entryPolylineChanged (void); void gatewayPolylinesChanged (void);
void subPolygonsChanged (void); void vehiclePolygonsChanged (void);
private: private:
...@@ -64,8 +70,11 @@ private: ...@@ -64,8 +70,11 @@ private:
QmlObjectListModel* _vehicleList; QmlObjectListModel* _vehicleList;
QGCMapPolyline* _entryPolyline; QmlObjectListModel* _vehiclePolygons;
WimaPolyline _polyline;
}; };
...@@ -5,15 +5,22 @@ WimaPolygon::WimaPolygon(QObject *parent) : ...@@ -5,15 +5,22 @@ WimaPolygon::WimaPolygon(QObject *parent) :
,_maxAltitude (30) ,_maxAltitude (30)
,_vehicle (parent) ,_vehicle (parent)
,_polygon (new QGCMapPolygon(this)) ,_polygon (new QGCMapPolygon(this))
,_subPolygons (new QmlObjectListModel(this))
,_subPolylines (new QmlObjectListModel(this))
{ {
connect(_polygon, &QGCMapPolygon::interactiveChanged, this, &WimaPolygon::interactiveChanged);
connect(_polygon, &QGCMapPolygon::countChanged, this, &WimaPolygon::countChanged);
} }
WimaPolygon::WimaPolygon(QGCMapPolygon *other, QObject *parent): WimaPolygon::WimaPolygon(QGCMapPolygon *other, QObject *parent):
WimaPolygon(parent) WimaPolygon(parent)
{ {
*_polygon = *other; *_polygon = *other;
connect(_polygon, &QGCMapPolygon::interactiveChanged, this, &WimaPolygon::interactiveChanged);
connect(_polygon, &QGCMapPolygon::countChanged, this, &WimaPolygon::countChanged);
}
WimaPolygon::~WimaPolygon()
{
} }
...@@ -34,19 +41,16 @@ void WimaPolygon::setVehicle(Vehicle *vehicle) ...@@ -34,19 +41,16 @@ void WimaPolygon::setVehicle(Vehicle *vehicle)
} }
} }
void WimaPolygon::setIsCurrentPolygon(bool isCurrentPolygon)
{
if(_isCurrentPolygon != isCurrentPolygon){
_isCurrentPolygon = isCurrentPolygon;
emit isCurrentPolygonChanged();
}
void WimaPolygon::setInteractive(bool interactive)
{
_polygon->setInteractive(interactive);
} }
QList<QGCMapPolygon*>* WimaPolygon::splitPolygonArea(int numberOfFractions) QList<QGCMapPolygon *> *WimaPolygon::splitPolygonArea(QGCMapPolygon *polygonToSplitt, int numberOfFractions)
{ {
if(numberOfFractions > 0){ if(numberOfFractions > 0 && polygonToSplitt != nullptr){
QGCMapPolygon* poly = new QGCMapPolygon(this->polygon(), this); QGCMapPolygon* poly = new QGCMapPolygon(polygonToSplitt, this);
QList<QGCMapPolygon*>* list = new QList<QGCMapPolygon*>(); QList<QGCMapPolygon*>* list = new QList<QGCMapPolygon*>();
list->append(poly); list->append(poly);
return list; return list;
...@@ -55,3 +59,9 @@ QList<QGCMapPolygon*>* WimaPolygon::splitPolygonArea(int numberOfFractions) ...@@ -55,3 +59,9 @@ QList<QGCMapPolygon*>* WimaPolygon::splitPolygonArea(int numberOfFractions)
} }
QList<QGCMapPolygon*>* WimaPolygon::splitPolygonArea(int numberOfFractions)
{
return splitPolygonArea(_polygon, numberOfFractions);
}
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "Vehicle.h" #include "Vehicle.h"
#include "qobject.h" #include "qobject.h"
#include "WimaVehicle.h" #include "WimaVehicle.h"
#include "WimaPolyline.h"
...@@ -17,6 +18,7 @@ class WimaPolygon : public QObject //abstract base class for all WimaPolygons ...@@ -17,6 +18,7 @@ class WimaPolygon : public QObject //abstract base class for all WimaPolygons
public: public:
WimaPolygon(QObject* parent = nullptr); WimaPolygon(QObject* parent = nullptr);
WimaPolygon(QGCMapPolygon* other, QObject* parent = nullptr); WimaPolygon(QGCMapPolygon* other, QObject* parent = nullptr);
~WimaPolygon();
...@@ -25,46 +27,46 @@ public: ...@@ -25,46 +27,46 @@ public:
Q_PROPERTY(QString editorQML READ editorQML CONSTANT) Q_PROPERTY(QString editorQML READ editorQML CONSTANT)
Q_PROPERTY(Vehicle* vehicle READ vehicle WRITE setVehicle NOTIFY vehicleChanged) Q_PROPERTY(Vehicle* vehicle READ vehicle WRITE setVehicle NOTIFY vehicleChanged)
Q_PROPERTY(QGCMapPolygon* polygon READ polygon NOTIFY polygonChanged) Q_PROPERTY(QGCMapPolygon* polygon READ polygon NOTIFY polygonChanged)
Q_PROPERTY(QmlObjectListModel* subPolygons READ subPolygons NOTIFY subPolygonsChanged) Q_PROPERTY(bool interactive READ interactive WRITE setInteractive NOTIFY interactiveChanged)
Q_PROPERTY(QmlObjectListModel* subPolylines READ subPolylines NOTIFY subPolylinesChanged) Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(bool isCurrentPolygon READ isCurrentPolygon WRITE setIsCurrentPolygon NOTIFY isCurrentPolygonChanged)
//Property accessors //Property accessors
double maxAltitude (void) const { return _maxAltitude;} double maxAltitude (void) const { return _maxAltitude;}
Vehicle* vehicle (void) const { return _vehicle.vehicle();} Vehicle* vehicle (void) const { return _vehicle.vehicle();}
QGCMapPolygon* polygon (void) const { return _polygon;} QGCMapPolygon* polygon (void) const { return _polygon;}
QmlObjectListModel* subPolygons (void) const { return _subPolygons;} bool interactive (void) const { return _polygon->interactive();}
QmlObjectListModel* subPolylines (void) const { return _subPolylines;} int count (void) const { return _polygon->count();}
bool isCurrentPolygon (void) const { return _isCurrentPolygon;}
virtual QString mapVisualQML (void) const = 0; virtual QString mapVisualQML (void) const = 0;
virtual QString editorQML (void) const = 0; virtual QString editorQML (void) const = 0;
//Property setters //Property setters
void setMaxAltitude (double alt); void setMaxAltitude (double alt);
void setVehicle (Vehicle* vehicle); void setVehicle (Vehicle* vehicle);
void setIsCurrentPolygon(bool isCurrentPolygon); void setInteractive (bool interactive);
// Member Methodes
QList<QGCMapPolygon*>* splitPolygonArea(QGCMapPolygon *polygonToSplitt, int numberOfFractions); // use QScopedPointer to store return value
QList<QGCMapPolygon*>* splitPolygonArea(int numberOfFractions); // use QScopedPointer to store return value QList<QGCMapPolygon*>* splitPolygonArea(int numberOfFractions); // use QScopedPointer to store return value
signals: signals:
void maxAltitudeChanged (void); void maxAltitudeChanged (void);
void vehicleChanged (void); void vehicleChanged (void);
void polygonChanged (void); void polygonChanged (void);
void subPolygonsChanged (void); void interactiveChanged (void);
void subPolylinesChanged (void); void polylineChanged (void);
void isCurrentPolygonChanged (void); void countChanged (void);
protected: protected:
double _maxAltitude; double _maxAltitude;
WimaVehicle _vehicle; WimaVehicle _vehicle;
QGCMapPolygon* _polygon; QGCMapPolygon* _polygon;
QmlObjectListModel* _subPolygons;
QmlObjectListModel* _subPolylines;
bool _isCurrentPolygon;
}; };
#include "WimaPolyline.h"
WimaPolyline::WimaPolyline(QObject *parent)
: QObject (parent)
, _boundPolygon (nullptr)
, _startVertexIndex(0)
, _endVertexIndex(1)
{
connect(&_polyline, &QGCMapPolyline::interactiveChanged, this, &WimaPolyline::interactiveChanged);
}
WimaPolyline::WimaPolyline(QGCMapPolyline *polyline, QObject *parent)
:WimaPolyline(parent)
{
_polyline = *polyline;
}
void WimaPolyline::bindPolygon(QGCMapPolygon *polygon)
{
if(polygon != nullptr){
_boundPolygon = polygon;
connect(polygon, &QGCMapPolygon::pathChanged, this, &WimaPolyline::recalcPolyline);
}else{
qWarning("Invalid Object!");
}
}
void WimaPolyline::unbindPolygon()
{
if(_boundPolygon != nullptr){
disconnect(_boundPolygon, &QGCMapPolygon::pathChanged, this, &WimaPolyline::recalcPolyline);
_boundPolygon = nullptr;
}else{
qWarning("No Object bound!");
}
}
void WimaPolyline::swapLimits()
{
int storage = _startVertexIndex;
_startVertexIndex = _endVertexIndex;
_endVertexIndex = storage;
}
void WimaPolyline::setInteractive(bool interactive)
{
_polyline.setInteractive(interactive);
}
void WimaPolyline::setStartVertexIndex(int PolygonVertexIndex)
{
if(PolygonVertexIndex >= 0 && PolygonVertexIndex < _boundPolygon->count()){
_startVertexIndex = PolygonVertexIndex;
recalcPolyline();
}else{
qWarning("Index out of bounds!");
}
}
void WimaPolyline::setEndVertexIndex(int PolygonVertexIndex)
{
if(PolygonVertexIndex >= 0 && PolygonVertexIndex < _boundPolygon->count()){
_endVertexIndex = PolygonVertexIndex;
recalcPolyline();
}else{
qWarning("Index out of bounds!");
}
}
void WimaPolyline::recalcPolyline()
{
if (_boundPolygon != nullptr && _boundPolygon->count() > 0){
if (_startVertexIndex >= _boundPolygon->count()){
_startVertexIndex = 0;
}
if (_endVertexIndex >= _boundPolygon->count()){
_startVertexIndex = _boundPolygon->count()-1;
}
_polyline.clear();
int i = _startVertexIndex;
while(1){
_polyline.appendVertex(_boundPolygon->vertexCoordinate(i));
if (i == _boundPolygon->count()-1){
i = 0;
}else if (i == _endVertexIndex) {
break;
}
i++;
}
emit polylineChanged();
}else{
qWarning("No object bound!");
}
}
#ifndef WIMAPOLYLINE_H
#define WIMAPOLYLINE_H
#include <QObject>
#include "QGCMapPolyline.h"
#include "QGCMapPolygon.h"
class WimaPolyline : public QObject
{
Q_OBJECT
public:
WimaPolyline(QObject *parent = nullptr);
WimaPolyline(QGCMapPolyline *polyline, QObject *parent = nullptr);
Q_PROPERTY(QGCMapPolyline const* polyline READ polyline NOTIFY polylineChanged)
Q_PROPERTY(int startVertexIndex READ startVertexIndex WRITE setStartVertexIndex NOTIFY startVertexIndexChanged)
Q_PROPERTY(int endVertexIndex READ endVertexIndex WRITE setEndVertexIndex NOTIFY endVertexIndexChanged)
Q_PROPERTY(bool interactive READ interactive WRITE setInteractive NOTIFY interactiveChanged)
// Property accessors
QGCMapPolyline const* polyline (void) const { return &_polyline;}
int startVertexIndex (void) const { return _startVertexIndex;}
int endVertexIndex (void) const { return _endVertexIndex;}
bool interactive (void) const { return _polyline.interactive();}
//Property setters
Q_INVOKABLE void bindPolygon (QGCMapPolygon* polygon);
Q_INVOKABLE void unbindPolygon ();
Q_INVOKABLE void swapLimits ();
Q_INVOKABLE void setInteractive (bool interactive);
void setStartVertexIndex (int PolygonVertexIndex);
void setEndVertexIndex (int PolygonVertexIndex);
signals:
void polylineChanged (void);
void startVertexIndexChanged (void);
void endVertexIndexChanged (void);
void interactiveChanged (void);
public slots:
void recalcPolyline(void);
private:
QGCMapPolyline _polyline;
QGCMapPolygon* _boundPolygon;
int _startVertexIndex;
int _endVertexIndex;
};
#endif // WIMAPOLYLINE_H
...@@ -327,7 +327,7 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) ...@@ -327,7 +327,7 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)
QGCLoggingCategoryRegister::instance()->setFilterRulesFromSettings(loggingOptions); QGCLoggingCategoryRegister::instance()->setFilterRulesFromSettings(loggingOptions);
// Initialize Bluetooth // Initialize Bluetooth
#ifdef QGC_ENABLE_BLUETOOTH #ifdef QGC_ENABLE_BLUETOOTHsubPolylines
QBluetoothLocalDevice localDevice; QBluetoothLocalDevice localDevice;
if (localDevice.isValid()) if (localDevice.isValid())
{ {
...@@ -446,7 +446,6 @@ void QGCApplication::_initCommon(void) ...@@ -446,7 +446,6 @@ void QGCApplication::_initCommon(void)
qmlRegisterType<ESP8266ComponentController> (kQGCControllers, 1, 0, "ESP8266ComponentController"); qmlRegisterType<ESP8266ComponentController> (kQGCControllers, 1, 0, "ESP8266ComponentController");
qmlRegisterType<ScreenToolsController> (kQGCControllers, 1, 0, "ScreenToolsController"); qmlRegisterType<ScreenToolsController> (kQGCControllers, 1, 0, "ScreenToolsController");
qmlRegisterType<PlanMasterController> (kQGCControllers, 1, 0, "PlanMasterController"); qmlRegisterType<PlanMasterController> (kQGCControllers, 1, 0, "PlanMasterController");
qmlRegisterType<WimaController> (kQGCControllers, 1, 0, "WimaController"); //custom
qmlRegisterType<ValuesWidgetController> (kQGCControllers, 1, 0, "ValuesWidgetController"); qmlRegisterType<ValuesWidgetController> (kQGCControllers, 1, 0, "ValuesWidgetController");
qmlRegisterType<QGCFileDialogController> (kQGCControllers, 1, 0, "QGCFileDialogController"); qmlRegisterType<QGCFileDialogController> (kQGCControllers, 1, 0, "QGCFileDialogController");
qmlRegisterType<RCChannelMonitorController> (kQGCControllers, 1, 0, "RCChannelMonitorController"); qmlRegisterType<RCChannelMonitorController> (kQGCControllers, 1, 0, "RCChannelMonitorController");
......
...@@ -25,8 +25,10 @@ Item { ...@@ -25,8 +25,10 @@ Item {
property var map ///< Map control to place item in property var map ///< Map control to place item in
property var qgcView ///< QGCView to use for popping dialogs property var qgcView ///< QGCView to use for popping dialogs
property var _missionItem: object property var areaItem: object
property var _polygon: object.polygon property var _polygon: areaItem.polygon
property var subPolylines: areaItem.subPolylines
property var subPolygons: areaItem.subPolygons
signal clicked(int sequenceNumber) signal clicked(int sequenceNumber)
...@@ -62,8 +64,19 @@ Item { ...@@ -62,8 +64,19 @@ Item {
} }
} }
function _addInitialPolyline() {
if (subPolylines.count < 1) {
areaItem.addSubPolyline()
console.log("SubPolylines count: ", subPolylines.count)
var newPolyline = subPolylines.get(0)
newPolyline.appendVertex(_polygon.vertexCoordinate(0))
newPolyline.appendVertex(_polygon.vertexCoordinate(1))
}
}
Component.onCompleted: { Component.onCompleted: {
_addInitialPolygon() _addInitialPolygon()
_addInitialPolyline()// always call _addInitialPolyline() after _addInitialPolygon()
} }
Component.onDestruction: { Component.onDestruction: {
...@@ -73,13 +86,26 @@ Item { ...@@ -73,13 +86,26 @@ Item {
qgcView: _root.qgcView qgcView: _root.qgcView
mapControl: map mapControl: map
mapPolygon: _polygon mapPolygon: _polygon
interactive: _missionItem.isCurrentPolygon
borderWidth: 1 borderWidth: 1
borderColor: "black" borderColor: "black"
interiorColor: "green" interiorColor: "green"
interiorOpacity: 0.25 interiorOpacity: 0.25
} }
Repeater {
model: subPolylines
delegate: QGCMapPolylineVisuals {
qgcView: _root.qgcView
mapControl: map
mapPolyline: object
lineWidth: 4
lineColor: interactive ? "yellow" : "white"
}
}
......
...@@ -12,11 +12,11 @@ import QGroundControl.FactControls 1.0 ...@@ -12,11 +12,11 @@ import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0 import QGroundControl.Palette 1.0
/// Fly Area Item edit control /// Wima Item edit control
Rectangle { Rectangle {
id: _root id: _root
height: editorLoader.visible ? (editorLoader.y + editorLoader.height + (_margin * 2)) : (commandPicker.y + commandPicker.height + _margin / 2) height: editorLoader.visible ? (editorLoader.y + editorLoader.height + (_margin * 2)) : (commandPicker.y + commandPicker.height + _margin / 2)
color: _currentItem ? qgcPal.missionItemEditor : qgcPal.windowShade color: interactive ? qgcPal.missionItemEditor : qgcPal.windowShade
radius: _radius radius: _radius
property var map ///< Map control property var map ///< Map control
...@@ -25,15 +25,16 @@ Rectangle { ...@@ -25,15 +25,16 @@ Rectangle {
property bool readOnly ///< true: read only view, false: full editing view property bool readOnly ///< true: read only view, false: full editing view
property var rootQgcView property var rootQgcView
property int _index property int _index
property var areaItem
signal clicked signal clicked
signal remove signal remove
property var _masterController: masterController property var _masterController: masterController
property var _missionController: _masterController.missionController property var _missionController: _masterController.missionController
property var _polygon: object.polygon property var _polygon: areaItem.polygon
property bool _currentItem: object.isCurrentPolygon property bool interactive: areaItem.interactive
property color _outerTextColor: _currentItem ? qgcPal.primaryButtonText : qgcPal.text property color _outerTextColor: interactive ? qgcPal.primaryButtonText : qgcPal.text
property real _sectionSpacer: ScreenTools.defaultFontPixelWidth / 2 // spacing between section headings property real _sectionSpacer: ScreenTools.defaultFontPixelWidth / 2 // spacing between section headings
readonly property real _editFieldWidth: Math.min(width - _margin * 2, ScreenTools.defaultFontPixelWidth * 12) readonly property real _editFieldWidth: Math.min(width - _margin * 2, ScreenTools.defaultFontPixelWidth * 12)
...@@ -78,7 +79,7 @@ Rectangle { ...@@ -78,7 +79,7 @@ Rectangle {
height: _hamburgerSize height: _hamburgerSize
sourceSize.height: _hamburgerSize sourceSize.height: _hamburgerSize
source: "qrc:/qmlimages/Hamburger.svg" source: "qrc:/qmlimages/Hamburger.svg"
visible: _currentItem visible: interactive
color: qgcPal.text color: qgcPal.text
} }
...@@ -124,14 +125,14 @@ Rectangle { ...@@ -124,14 +125,14 @@ Rectangle {
anchors.rightMargin: ScreenTools.defaultFontPixelWidth anchors.rightMargin: ScreenTools.defaultFontPixelWidth
anchors.left: label.right anchors.left: label.right
anchors.top: parent.top anchors.top: parent.top
visible: _currentItem visible: interactive
text: object.objectName; text: areaItem.objectName;
Component { Component {
id: commandDialog id: commandDialog
MissionCommandDialog { MissionCommandDialog {
missionItem: object missionItem: areaItem
} }
} }
...@@ -141,9 +142,9 @@ Rectangle { ...@@ -141,9 +142,9 @@ Rectangle {
QGCLabel { QGCLabel {
id: commandLabel id: commandLabel
anchors.fill: commandPicker anchors.fill: commandPicker
visible: !_currentItem visible: !interactive
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: object.objectName; text: areaItem.objectName;
color: _outerTextColor color: _outerTextColor
} }
...@@ -153,8 +154,8 @@ Rectangle { ...@@ -153,8 +154,8 @@ Rectangle {
anchors.topMargin: _margin anchors.topMargin: _margin
anchors.left: parent.left anchors.left: parent.left
anchors.top: commandPicker.bottom anchors.top: commandPicker.bottom
source: object.editorQml source: areaItem.editorQML
visible: _currentItem visible: interactive
property var masterController: _masterController property var masterController: _masterController
property real availableWidth: _root.width - (_margin * 2) ///< How wide the editor should be property real availableWidth: _root.width - (_margin * 2) ///< How wide the editor should be
......
...@@ -413,7 +413,7 @@ QGCView { ...@@ -413,7 +413,7 @@ QGCView {
planView: true planView: true
qgcView: _qgcView qgcView: _qgcView
// This is the center rectangle of the map which is not_layerWimaPlan obscured by tools // This is the center rectangle of the map which is not obscured by tools
property rect centerViewport: Qt.rect(_leftToolWidth, _toolbarHeight, editorMap.width - _leftToolWidth - _rightPanelWidth, editorMap.height - _statusHeight - _toolbarHeight) property rect centerViewport: Qt.rect(_leftToolWidth, _toolbarHeight, editorMap.width - _leftToolWidth - _rightPanelWidth, editorMap.height - _statusHeight - _toolbarHeight)
property real _leftToolWidth: toolStrip.x + toolStrip.width property real _leftToolWidth: toolStrip.x + toolStrip.width
...@@ -495,7 +495,7 @@ QGCView { ...@@ -495,7 +495,7 @@ QGCView {
} }
onItemAdded: { onItemAdded: {
console.log("Item added") //console.log("Item added")
} }
} }
...@@ -810,6 +810,7 @@ QGCView { ...@@ -810,6 +810,7 @@ QGCView {
masterController: _planMasterController masterController: _planMasterController
wimaController: _wimaController wimaController: _wimaController
_index: index _index: index
areaItem: object
width: parent.width width: parent.width
readOnly: false readOnly: false
rootQgcView: _qgcView rootQgcView: _qgcView
...@@ -966,7 +967,7 @@ QGCView { ...@@ -966,7 +967,7 @@ QGCView {
id: clearVehicleMissionDialog id: clearVehicleMissionDialog
QGCViewMessage { QGCViewMessage {
message: qsTr("Are you sure you want to remove all mission items and clear the mission from the vehicle?") message: qsTr("Are you sure you want to remove all mission items and clear the mission from the vehicle?")
function accept() {_layerWimaPlan function accept() {
masterController.removeAllFromVehicle() masterController.removeAllFromVehicle()
hideDialog() hideDialog()
} }
...@@ -1061,7 +1062,7 @@ QGCView { ...@@ -1061,7 +1062,7 @@ QGCView {
} }
QGCButton { QGCButton {
text: qsTr("Save Mission Waypoints As K_layerWimaPlanML...") text: qsTr("Save Mission Waypoints As KML...")
Layout.columnSpan: 2 Layout.columnSpan: 2
enabled: !masterController.syncInProgress && _visualItems.count > 1 enabled: !masterController.syncInProgress && _visualItems.count > 1
onClicked: { onClicked: {
...@@ -1153,7 +1154,7 @@ QGCView { ...@@ -1153,7 +1154,7 @@ QGCView {
color: "lightsteelblue" color: "lightsteelblue"
radius: 1 radius: 1
Text { Text {
text: object.isCurrentPolygon text: "Hello World!"
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment