From 1da9d916b30c17ac0cf534a4ef0e6a2ccceaac28 Mon Sep 17 00:00:00 2001 From: toni Date: Thu, 1 Dec 2016 19:42:13 +0100 Subject: [PATCH] added support for ground truth points: \n -layer for gt points \n -button with icon -saving and loading support --- IndoorMap.pro | 5 +- MainController.cpp | 9 +- mapview/2D/MV2DElementGroundTruthPoint.h | 119 +++++++++++++++++++++++ mapview/3DGrid/MyNode.h | 2 + mapview/model/MMFloor.h | 2 + mapview/model/MMFloorGroundTruthPoint.h | 61 ++++++++++++ mapview/model/MMFloorGroundTruthPoints.h | 46 +++++++++ mapview/model/MapLayer.h | 1 + params/ToolBox.cpp | 20 ++++ params/ToolBoxWidget.h | 2 + res.qrc | 1 + res/icons/gtp.svg | 77 +++++++++++++++ 12 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 mapview/2D/MV2DElementGroundTruthPoint.h create mode 100644 mapview/model/MMFloorGroundTruthPoint.h create mode 100644 mapview/model/MMFloorGroundTruthPoints.h create mode 100644 res/icons/gtp.svg diff --git a/IndoorMap.pro b/IndoorMap.pro index 2f5936e..5b94665 100644 --- a/IndoorMap.pro +++ b/IndoorMap.pro @@ -125,7 +125,10 @@ HEADERS += MainWindow.h \ mapview/2D/Scaler.h \ mapview/2D/MV2DElementElevator.h \ mapview/model/MMFloorElevators.h \ - mapview/model/MMFloorElevator.h + mapview/model/MMFloorElevator.h \ + mapview/model/MMFloorGroundTruthPoints.h \ + mapview/model/MMFloorGroundTruthPoint.h \ + mapview/2D/MV2DElementGroundTruthPoint.h FORMS += MainWindow.ui diff --git a/MainController.cpp b/MainController.cpp index 03dd1ae..daa954d 100644 --- a/MainController.cpp +++ b/MainController.cpp @@ -84,10 +84,13 @@ MainController::MainController() { //mapModel->load("../IndoorMap/maps/SHL21.xml"); //mapModel->load("../IndoorMap/maps/test.xml"); - //mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/CAR/CAR9.xml"); - mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UAH/UAH9.xml"); + //mapModel->load("/home/toni/Documents/programme/localization/IPIN2016/competition/src/competition/map/CAR/CAR10.xml"); + mapModel->load("/home/toni/Documents/programme/localization/IPIN2016/competition/src/competition/map/UAH/UAH12_rawObstacles.xml"); + //mapModel->load("/home/toni/Documents/programme/localization/IPIN2016/competition/src/competition/map/SHL/SHL25.xml"); + //mapModel->load("/home/toni/Documents/programme/localization/IPIN2016/competition/src/competition/map/UJI-UB/UJI-UB5.xml"); + //mapModel->load("/home/toni/Documents/programme/localization/IPIN2016/competition/src/competition/map/UJI-TI/UJI-TI4.xml"); //mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UJI-TI/UJI-TI4.xml"); - //mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UJI-UB/UJI-UB4.xml"); + //mapModel->load("/home/toni/Documents/programme/localization/IPIN2016/competition/src/competition/map/UJI-UB/UJI-UB5.xml"); //mapModel->load("/mnt/data/workspaces/Indoor/tests/data/WalkHeadingMap.xml"); //mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/test.xml"); diff --git a/mapview/2D/MV2DElementGroundTruthPoint.h b/mapview/2D/MV2DElementGroundTruthPoint.h new file mode 100644 index 0000000..7821366 --- /dev/null +++ b/mapview/2D/MV2DElementGroundTruthPoint.h @@ -0,0 +1,119 @@ +#ifndef MV2DELEMENTGROUNDTRUTHPOINT_H +#define MV2DELEMENTGROUNDTRUTHPOINT_H + +#include "MV2DElement.h" +#include "HasMoveableNodes.h" +#include "MapViewElementHelper.h" +#include + +#include "../../UIHelper.h" + +class MV2DElementGroundTruthPoint : public MV2DElement, public HasMoveableNodes { + +private: + + //bool sel = false; + Floorplan::GroundTruthPoint* gtp; + +public: + + /** ctor with the AP to render/edit */ + MV2DElementGroundTruthPoint(Floorplan::GroundTruthPoint* gtp) : gtp(gtp) {;} + + + /** get the element's 3D bounding box */ + BBox2 getBoundingBox() const override { + BBox2 bbox; + bbox.add(Point2(gtp->pos.x, gtp->pos.y)); + bbox.grow(Point2(0.1, 0.1)); + return bbox; + } + + /** get the element's minimal distance (nearest whatsoever) to the given point */ + float getMinDistanceXY(const Point2 p) const override { + return p.getDistance(gtp->pos); + } + + /** repaint me */ + void paint(Painter& p) override { + + static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("gtp", CFG::UNFOCUS_COLOR, 16); + static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("gtp", CFG::FOCUS_COLOR, 16); + static const QPixmap& pixmapSel = UIHelper::getPixmapColored("gtp", CFG::SEL_COLOR, 16); + + + if (selectedUserIdx == 0) { +// p.setPenBrush(Qt::black, CFG::SEL_COLOR); +// p.drawCircle(gtp->pos); + p.drawPixmap(gtp->pos, pixmapSel); + } else if (hasFocus()) { +// p.setPenBrush(Qt::black, Qt::NoBrush); +// p.drawCircle(gtp->pos); + p.drawPixmap(gtp->pos, pixmapFocused); + } else { +// p.setPenBrush(Qt::gray, Qt::NoBrush); +// p.drawCircle(gtp->pos); + p.drawPixmap(gtp->pos, pixmapUnfocused); + } + + // label + p.setPenBrush(Qt::black, Qt::NoBrush); + p.drawDot(gtp->pos); + if (p.getScaler().getScale() >= 10) { + const std::string str = std::to_string(gtp->id); + p.p->drawText(p.getScaler().xms(gtp->pos.x) + 10, p.getScaler().yms(gtp->pos.y) + 5, str.c_str()); + } + + } + + + virtual std::vector getMoveableNodes() const override { + return { MoveableNode(0, gtp->pos) }; + } + + virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) override { + (void) v; + if (userIdx == 0) {gtp->pos = newPos;} + } + + + /** mouse pressed at the given point */ + virtual void mousePressed(MapView2D* v, const Point2 p) override { + (void) v; + (void) p; + } + + /** mouse moved to the given point */ + virtual void mouseMove(MapView2D* v, const Point2 p) override { + (void) v; + (void) p; +// if (sel) { +// const Point2 p = v->getScaler().snap(_p); +// gtp->pos.x = p.x; +// gtp->pos.y = p.y; +// } + } + + /** mouse released */ + virtual void mouseReleased(MapView2D* v, const Point2 p) override { + (void) v; + (void) p; + } + + virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override { + (void) v; + (void) e; + return false; + } + + virtual void onFocus() override { + ; + } + + virtual void onUnfocus() override { + ; + } + +}; + +#endif // MV2DELEMENTGROUNDTRUTHPOINT_H diff --git a/mapview/3DGrid/MyNode.h b/mapview/3DGrid/MyNode.h index 05c10b3..f3b66b2 100644 --- a/mapview/3DGrid/MyNode.h +++ b/mapview/3DGrid/MyNode.h @@ -8,6 +8,8 @@ struct MyNode : public GridNode, public GridPoint, public GridNodeImportance { MyNode(float x, float y, float z) : GridPoint(x,y,z) {;} + float walkImportance; + }; #endif // MYNODE_H diff --git a/mapview/model/MMFloor.h b/mapview/model/MMFloor.h index 010e35b..acad39b 100644 --- a/mapview/model/MMFloor.h +++ b/mapview/model/MMFloor.h @@ -10,6 +10,7 @@ #include "MMFloorPOIs.h" #include "MMFloorStairs.h" #include "MMFloorElevators.h" +#include "MMFloorGroundTruthPoints.h" #include "IHasParams.h" @@ -41,6 +42,7 @@ public: new MMFloorPOIs(this, floor); new MMFloorStairs(this, floor); new MMFloorElevators(this, floor); + new MMFloorGroundTruthPoints(this, floor); } diff --git a/mapview/model/MMFloorGroundTruthPoint.h b/mapview/model/MMFloorGroundTruthPoint.h new file mode 100644 index 0000000..9faab3f --- /dev/null +++ b/mapview/model/MMFloorGroundTruthPoint.h @@ -0,0 +1,61 @@ +#ifndef MMFLOORGROUNDTRUTHPOINT_H +#define MMFLOORGROUNDTRUTHPOINT_H + +#include "MapModelElement.h" +#include "IHasParams.h" + +#include "../2D/MV2DElementGroundTruthPoint.h" + +#include + +class MMFloorGroundTruthPoint : public MapModelElement, public IHasParams { + +private: + + Floorplan::Floor* floor; + Floorplan::GroundTruthPoint* gtp; + MV2DElementGroundTruthPoint mv2d; + +public: + + MMFloorGroundTruthPoint(MapLayer* parent, Floorplan::Floor* floor, Floorplan::GroundTruthPoint* gtp) : MapModelElement(parent), floor(floor), gtp(gtp), mv2d(gtp) { + ; + } + + virtual int getNumParams() const override { + return 2; + } + + virtual Param getParamDesc(const int idx) const override { + switch(idx) { + case 0: return Param("id", ParamType::INT); + case 1: return Param("position", ParamType::POINT2); + } + throw 1; + } + + virtual ParamValue getParamValue(const int idx) const override { + switch(idx) { + case 0: return gtp->id; //TODO: this value can be changed and isn't set incremental within the indoormap + case 1: return gtp->pos; + } + throw 1; + } + + virtual void setParamValue(const int idx, const ParamValue& val) const override { + switch(idx) { + case 0: gtp->id = val.toInt(); break; + case 1: gtp->pos = val.toPoint2(); break; + } + } + + MV2DElement* getMV2D() const override {return (MV2DElement*) &mv2d;} + + void deleteMe() const override { + parent->removeElement(this); + floor->gtpoints.erase(std::remove(floor->gtpoints.begin(), floor->gtpoints.end(), gtp), floor->gtpoints.end()); + } + +}; + +#endif // MMFLOORGROUNDTRUTHPOINT_H diff --git a/mapview/model/MMFloorGroundTruthPoints.h b/mapview/model/MMFloorGroundTruthPoints.h new file mode 100644 index 0000000..48831b7 --- /dev/null +++ b/mapview/model/MMFloorGroundTruthPoints.h @@ -0,0 +1,46 @@ +#ifndef MMFLOORGROUNDTRUTHPOINTS_H +#define MMFLOORGROUNDTRUTHPOINTS_H + +#include "MapLayer.h" +#include "MMFloorGroundTruthPoint.h" + +#include + +/** + * layer that contains all of one floor's GroundTruthPoints + */ +class MMFloorGroundTruthPoints : public MapLayer { + + Floorplan::Floor* floor; + +public: + + /** ctor with the floor */ + MMFloorGroundTruthPoints(MapLayer* parent, Floorplan::Floor* floor) : MapLayer(parent, MapLayerType::FLOOR_GROUND_TRUTH_POINTS), floor(floor) { + + // the POIs + for (Floorplan::GroundTruthPoint* gtp : floor->gtpoints) { + elements.push_back(new MMFloorGroundTruthPoint(this, floor, gtp)); + } + + } + + /** get the corresponding floor from the underlying model */ + Floorplan::Floor* getFloor() {return floor;} + + //TODO: check + void createGroundTruthPoint(Floorplan::GroundTruthPoint* gtp) { + + // add to underlying model + floor->gtpoints.push_back(gtp); + + // add to myself as element + elements.push_back(new MMFloorGroundTruthPoint(this, floor, gtp)); + + } + + std::string getLayerName() const override {return "GroundTruthPoints";} + +}; + +#endif // MMFLOORGROUNDTRUTHPOINTS_H diff --git a/mapview/model/MapLayer.h b/mapview/model/MapLayer.h index b5be0dc..d61382f 100644 --- a/mapview/model/MapLayer.h +++ b/mapview/model/MapLayer.h @@ -21,6 +21,7 @@ enum class MapLayerType { FLOOR_UNDERLAYS, FLOOR_POIS, FLOOR_STAIRS, + FLOOR_GROUND_TRUTH_POINTS }; diff --git a/params/ToolBox.cpp b/params/ToolBox.cpp index 080375c..58b27a4 100644 --- a/params/ToolBox.cpp +++ b/params/ToolBox.cpp @@ -12,6 +12,7 @@ #include "../mapview/model/MapModel.h" #include "../mapview/model/MMFloorAccessPoint.h" #include "../mapview/model/MMFloorBeacon.h" +#include "../mapview/model/MMFloorGroundTruthPoints.h" #include "../UIHelper.h" @@ -86,6 +87,12 @@ ToolBoxWidget::ToolBoxWidget(MapView2D* view, QWidget *parent) : QWidget(parent) lay->addWidget(btnPOI, r++, 0, 1,1,Qt::AlignTop); connect(btnPOI, SIGNAL(clicked(bool)), this, SLOT(onNewPOI())); + // GROUNDTRUTH + btnGTP = new QPushButton(UIHelper::getIcon("gtp"), ""); + btnGTP->setMinimumSize(s,s); + lay->addWidget(btnGTP, r++, 0, 1,1,Qt::AlignTop); + connect(btnGTP, SIGNAL(clicked(bool)), this, SLOT(onNewGTP())); + // FILL lay->addItem(new QSpacerItem(0,0,QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), r, 0); @@ -110,6 +117,7 @@ void ToolBoxWidget::setSelectedLayer(MapLayer *ml) { btnWifi->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_ACCESS_POINTS)); btnBeacon->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_BEACONS)); btnPOI->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_POIS)); + btnGTP->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_GROUND_TRUTH_POINTS)); btnImage->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_UNDERLAYS)); @@ -557,6 +565,18 @@ void ToolBoxWidget::onNewPOI() { } +void ToolBoxWidget::onNewGTP() { + + const Point2 center = view->getScaler().getCenter(); + Floorplan::GroundTruthPoint* gtp = new Floorplan::GroundTruthPoint( + 0, Point2(center.x, center.y) + ); + + MMFloorGroundTruthPoints* gtps = (MMFloorGroundTruthPoints*) curLayer; + gtps->createGroundTruthPoint(gtp); + +} + void ToolBoxWidget::onNewImage() { const Point2 center = view->getScaler().getCenter(); diff --git a/params/ToolBoxWidget.h b/params/ToolBoxWidget.h index be020a9..f8d4c9b 100644 --- a/params/ToolBoxWidget.h +++ b/params/ToolBoxWidget.h @@ -43,6 +43,7 @@ private: QPushButton* btnWifi; QPushButton* btnBeacon; QPushButton* btnPOI; + QPushButton* btnGTP; QPushButton* btnImage; @@ -60,6 +61,7 @@ private slots: void onNewAccessPoint(); void onNewBeacon(); void onNewPOI(); + void onNewGTP(); void onNewImage(); diff --git a/res.qrc b/res.qrc index 73ca53d..ac3722c 100644 --- a/res.qrc +++ b/res.qrc @@ -14,5 +14,6 @@ res/icons/door.svg res/icons/cursor.svg res/icons/elevator.svg + res/icons/gtp.svg diff --git a/res/icons/gtp.svg b/res/icons/gtp.svg new file mode 100644 index 0000000..3dd8c6e --- /dev/null +++ b/res/icons/gtp.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +