diff --git a/IndoorMap.pro b/IndoorMap.pro index df031da..dcae3b4 100644 --- a/IndoorMap.pro +++ b/IndoorMap.pro @@ -22,12 +22,12 @@ INCLUDEPATH += \ SOURCES += \ - lib/gpc/gpc.cpp \ - main.cpp \ - MainWindow.cpp \ + lib/gpc/gpc.cpp \ + main.cpp \ + MainWindow.cpp \ MainController.cpp \ - mapview/2D/tools/ToolSelector.cpp \ - mapview/2D/tools/Tool.cpp \ + mapview/2D/tools/ToolSelector.cpp \ + mapview/2D/tools/Tool.cpp \ mapview/MapView2D.cpp \ params/ElementParamWidget.cpp \ params/LayerParamWidget.cpp \ @@ -35,7 +35,7 @@ SOURCES += \ params/ToolBox.cpp \ mapview/model/MapModel.cpp \ tree/MapTreeModel.cpp \ - mapview/3D/MapView3D.cpp \ + mapview/3D/MapView3D.cpp \ params/StairBuilder.cpp \ mapview/2D/tools/Tools.cpp \ params/LayerTree.cpp \ @@ -62,24 +62,24 @@ HEADERS += MainWindow.h \ mapview/model/IHasName.h \ mapview/model/IHasObstacleType.h \ mapview/model/IHasPosition3D.h \ - mapview/2D/MV2DElementFloorObstacleLine.h \ - mapview/2D/MV2DElement.h \ - mapview/2D/MV2DElementFloorOutlinePolygon.h \ - mapview/2D/MV2DElementBeacon.h \ - mapview/2D/MV2DElementAccessPoint.h \ - mapview/2D/MV2DElementFloorObstacleCircle.h \ - mapview/2D/MV2DElementFloorObstacleDoor.h \ - mapview/2D/MapViewElementHelper.h \ - mapview/2D/MV2DElementFloorUnderlay.h \ - mapview/2D/MV2DElementPOI.h \ - mapview/2D/MV2DElementStair.h \ - mapview/2D/tools/ToolMoveMap.h \ - mapview/2D/tools/Tools.h \ - mapview/2D/tools/ToolRuler.h \ - mapview/2D/tools/ToolMapZoom.h \ - mapview/2D/tools/ToolSelector.h \ - mapview/2D/tools/ToolMapGrid.h \ - mapview/2D/tools/Tool.h \ + mapview/2D/MV2DElementFloorObstacleLine.h \ + mapview/2D/MV2DElement.h \ + mapview/2D/MV2DElementFloorOutlinePolygon.h \ + mapview/2D/MV2DElementBeacon.h \ + mapview/2D/MV2DElementAccessPoint.h \ + mapview/2D/MV2DElementFloorObstacleCircle.h \ + mapview/2D/MV2DElementFloorObstacleDoor.h \ + mapview/2D/MapViewElementHelper.h \ + mapview/2D/MV2DElementFloorUnderlay.h \ + mapview/2D/MV2DElementPOI.h \ + mapview/2D/MV2DElementStair.h \ + mapview/2D/tools/ToolMoveMap.h \ + mapview/2D/tools/Tools.h \ + mapview/2D/tools/ToolRuler.h \ + mapview/2D/tools/ToolMapZoom.h \ + mapview/2D/tools/ToolSelector.h \ + mapview/2D/tools/ToolMapGrid.h \ + mapview/2D/tools/Tool.h \ mapview/model/MMFloorObstacleCircle.h \ mapview/model/MMFloorObstacleLine.h \ mapview/model/MMFloorOutlinePolygon.h \ @@ -109,7 +109,7 @@ HEADERS += MainWindow.h \ mapview/3D/misc/Polygon.h \ mapview/grid/MapView3DGrid.h \ mapview/grid/MapModelGrid.h \ - mapview/3DGrid/GridModel.h \ + mapview/3DGrid/GridModel.h \ mapview/3DGrid/GridRenderer.h \ mapview/3DGrid/MyNode.h \ mapview/3D/MV3DElementStair.h \ @@ -126,8 +126,8 @@ HEADERS += MainWindow.h \ mapview/3D/misc/Plane.h \ mapview/elements/HasMoveableNodes.h \ mapview/2D/MapView2D.h \ - mapview/2D/Painter.h \ - mapview/2D/Scaler.h \ + mapview/2D/Painter.h \ + mapview/2D/Scaler.h \ mapview/2D/MV2DElementElevator.h \ mapview/model/MMFloorElevators.h \ mapview/model/MMFloorElevator.h \ @@ -144,7 +144,10 @@ HEADERS += MainWindow.h \ mapview/model/MMFloorFingerprints.h \ mapview/model/MMFloorFingerprintLocation.h \ mapview/2D/MV2DElementFingerprintLocation.h \ - mapview/3D/MV3DElementFingerprintLocation.h + mapview/3D/MV3DElementFingerprintLocation.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 e389245..c88a85f 100644 --- a/MainController.cpp +++ b/MainController.cpp @@ -27,6 +27,7 @@ + MainController::MainController() { // Floorplan::Meta* meta = new Floorplan::Meta(); @@ -93,101 +94,94 @@ MainController::MainController() { connect(mw, &MainWindow::onGridShowEdges, [&] (const bool show) {mw->getMapView3D()->getGridRenderer()->setShowEdges(show);} ); - mapModel->load("../IndoorMap/maps/SHL28.xml"); + mapModel->load("../IndoorMap/maps/SHL32.xml"); + //mapModel->resize(0.983, 0.983, 1, -0.2, -0.3, 0); + + //mapModel->load("../IndoorMap/maps/test.xml"); //mapModel->load("../IndoorMap/maps/APs.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("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UAH/UAH9.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("/mnt/data/workspaces/Indoor/tests/data/WalkHeadingMap.xml"); //mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/test.xml"); - //mapModel->load("/mnt/vm/workspace/IRGame/IndoorServer/maps/map6.xml"); - //mapModel->load("/mnt/vm/workspace/IRGame/IndoorServer/maps/keller1.xml"); - //mapModel->load("/mnt/vm/workspace/IRGame/IndoorServer/maps/wohnung4.xml"); - //mapModel->startEmpty(); + // mapModel->startEmpty(); } - void MainController::onLayerChanged(MapLayer* layer) { - (void) layer; - mw->getMapView2D()->update(); - mw->getMapView3D()->update(); + (void) layer; + mw->getMapView2D()->update(); + mw->getMapView3D()->update(); } void MainController::onLayerElementAdded(MapLayer* layer, MapModelElement* elem) { - (void) layer; - mapSelector->focus(mw->getMapView2D(), elem); + (void) layer; + mapSelector->focus(mw->getMapView2D(), elem); } void MainController::onLayerElementRemoved(MapLayer* layer, const MapModelElement* elem) { - (void) layer; - (void) elem; + (void) layer; + (void) elem; } void MainController::onLayerVisibilityChanged(MapLayer *layer, const bool visible) { - (void) layer; - (void) visible; + (void) layer; + (void) visible; } void MainController::onShow3DFloorplan() { - mw->getMapView3D()->showFloorplan(); + mw->getMapView3D()->showFloorplan(); } void MainController::onShow3DGrid() { - mw->getMapView3D()->showGrid(); + mw->getMapView3D()->showGrid(); } void MainController::layerSelected(QModelIndex idx) { - mw->getMapView2D()->layerChange(); - MapLayer* ml = static_cast(idx.internalPointer()); - mapModel->setSelectedLayer(ml); - mw->getMapView2D()->layerChange(); - mw->getMapView3D()->layerChange(); - mw->getLayerParamWidget()->setElement(ml); - mw->getToolBoxWidget()->setSelectedLayer(ml); + mw->getMapView2D()->layerChange(); + MapLayer* ml = static_cast(idx.internalPointer()); + mapModel->setSelectedLayer(ml); + mw->getMapView2D()->layerChange(); + mw->getMapView3D()->layerChange(); + mw->getLayerParamWidget()->setElement(ml); + mw->getToolBoxWidget()->setSelectedLayer(ml); } - void MainController::curMapElementChanged() { - mw->getElementParamWidget()->refresh(); + mw->getElementParamWidget()->refresh(); } void MainController::mapElementSelected(MapModelElement* el) { - mw->getElementParamWidget()->setElement(el); + mw->getElementParamWidget()->setElement(el); } void MainController::onMapModelAboutToReset() { - mw->getLayerParamWidget()->setElement(nullptr); - mw->getToolBoxWidget()->setSelectedLayer(nullptr); - mw->getMapView2D()->update(); + mw->getLayerParamWidget()->setElement(nullptr); + mw->getToolBoxWidget()->setSelectedLayer(nullptr); + mw->getMapView2D()->update(); } void MainController::onMapModelNeedsRepaint() { - mw->getMapView2D()->update(); + mw->getMapView2D()->update(); } void MainController::onMapModelReset() { - mw->getTree()->expandAll(); + mw->getTree()->expandAll(); } void MainController::onLoad() { - - QString file = QFileDialog::getOpenFileName(mw, "open a map"); - if (file != "") { - mapModel->load(file.toStdString()); - } + QString file = QFileDialog::getOpenFileName(mw, "open a map"); + if (file != "") { + mapModel->load(file.toStdString()); + } } void MainController::onSave() { - - QString file = QFileDialog::getSaveFileName(mw, "save the map"); - if (file != "") { - mapModel->save(file.toStdString()); - } - + QString file = QFileDialog::getSaveFileName(mw, "save the map"); + if (file != "") { + mapModel->save(file.toStdString()); + } } - - diff --git a/mapview/2D/MV2DElementFloorOutlinePolygon.h b/mapview/2D/MV2DElementFloorOutlinePolygon.h index aaa655b..53637d4 100644 --- a/mapview/2D/MV2DElementFloorOutlinePolygon.h +++ b/mapview/2D/MV2DElementFloorOutlinePolygon.h @@ -53,13 +53,14 @@ public: switch (fo.method) { case Floorplan::OutlineMethod::ADD: brush.setStyle(Qt::BrushStyle::SolidPattern); - brush.setColor(QColor(0,0,0,24)); + brush.setColor( fo.outdoor ? QColor(0,255,0,32) : QColor(0,0,0,24) ); // outdoor = green break; case Floorplan::OutlineMethod::REMOVE: brush.setStyle(Qt::BrushStyle::DiagCrossPattern); brush.setColor(QColor(0,0,0)); break; default: + // should not happen brush.setStyle(Qt::BrushStyle::SolidPattern); brush.setColor(QColor(255,0,0)); } diff --git a/mapview/2D/MV2DElementFloorUnderlay.h b/mapview/2D/MV2DElementFloorUnderlay.h index bf324dd..77be436 100644 --- a/mapview/2D/MV2DElementFloorUnderlay.h +++ b/mapview/2D/MV2DElementFloorUnderlay.h @@ -92,7 +92,7 @@ public: // if the to-be-displayed image is smaller than the input-one, use a pre-computed downscaled version - if (scaledArea < origArea) { + if (scaledArea < origArea*0.75) { // does the cached downscaled image needs rebuild? (size changed) if (imgScaled.width() != sw || imgScaled.height() != sh) { imgScaled = img.scaled(sw, sh, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); diff --git a/mapview/2D/MV2DElementGroundTruthPoint.h b/mapview/2D/MV2DElementGroundTruthPoint.h new file mode 100644 index 0000000..39631cf --- /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 */ + ClickDist getMinDistanceXY(const Point2 p) const override { + return ClickDist(p.getDistance(gtp->pos), ClickDistType::DIRECT); + } + + /** 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/2D/tools/ToolSelector.h b/mapview/2D/tools/ToolSelector.h index 07d09b1..d86f000 100644 --- a/mapview/2D/tools/ToolSelector.h +++ b/mapview/2D/tools/ToolSelector.h @@ -299,12 +299,47 @@ private: return true; } + if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Down || e->key() == Qt::Key_Left || e->key() == Qt::Key_Right) { + moveNodes(m, focused, e->key()); + } + } return false; } + void moveNodes(MapView2D* v, MapModelElement* focused, const int key) { + + MV2DElement* me = focused->getMV2D(); + if (!me) {return;} + + HasMoveableNodes* elem = dynamic_cast(me); + if (!elem) {return;} + + // no node selected? -> done + if (elem->getSelectedNode() == -1) {return;} + + // get current value + MoveableNode& node = elem->getMoveableNodes()[elem->getSelectedNode()]; + Point2 pos = node.pos; + + // adjust the node + switch(key) { + case Qt::Key_Up: pos.y += 0.1; break; + case Qt::Key_Down: pos.y -= 0.1; break; + case Qt::Key_Left: pos.x -= 0.1; break; + case Qt::Key_Right: pos.x += 0.1; break; + } + + // snap the position + pos = v->getScaler().snap(pos); + + // move + elem->onNodeMove(v, elem->getSelectedNode(), pos); + + } + signals: /** map element was selected */ diff --git a/mapview/3DGrid/GridRenderer.h b/mapview/3DGrid/GridRenderer.h index 3e668ec..ea42aea 100644 --- a/mapview/3DGrid/GridRenderer.h +++ b/mapview/3DGrid/GridRenderer.h @@ -21,18 +21,25 @@ private: struct Color { float r,g,b; + Color() : r(1), g(0), b(0) {;} Color(float r, float g, float b) : r(r), g(g), b(b) {;} }; - Color colors[4] = { - Color(0.3, 0.3, 0.3), Color(0,0,1), Color(0,0,1), Color(0,0.65,0) - }; + /** node color depending on the node's type. see ctor */ + Color colors[200]; public: /** ctor */ GridRenderer() { - ; + + colors[GridNode::TYPE_FLOOR] = Color(0.4, 0.4, 0.4); + colors[GridNode::TYPE_STAIR] = Color(0,0,1); + colors[GridNode::TYPE_ELEVATOR] = Color(0,0,1); + colors[GridNode::TYPE_DOOR] = Color(0.0, 0.0, 0.0); + + colors[GridNode::TYPE_OUTDOOR] = Color(0.0, 0.5, 0.0); + } 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 3f2218a..778ee4d 100644 --- a/mapview/model/MMFloor.h +++ b/mapview/model/MMFloor.h @@ -11,6 +11,7 @@ #include "MMFloorPOIs.h" #include "MMFloorStairs.h" #include "MMFloorElevators.h" +#include "MMFloorGroundTruthPoints.h" #include "IHasParams.h" @@ -45,6 +46,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..38ec3a6 --- /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) { + addElement(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 + addElement(new MMFloorGroundTruthPoint(this, floor, gtp)); + + } + + std::string getLayerName() const override {return "GroundTruthPoints";} + +}; + +#endif // MMFLOORGROUNDTRUTHPOINTS_H diff --git a/mapview/model/MMFloorOutlinePolygon.h b/mapview/model/MMFloorOutlinePolygon.h index df57e19..9f20541 100644 --- a/mapview/model/MMFloorOutlinePolygon.h +++ b/mapview/model/MMFloorOutlinePolygon.h @@ -39,12 +39,13 @@ public: //MV3DElement* getMV3D() const override {return (MV3DElement*) &mv3d;} virtual int getNumParams() const override { - return 1; + return 2; } virtual Param getParamDesc(const int idx) const override { switch(idx) { case 0: return Param("name", ParamType::STRING); + case 1: return Param("outdoor", ParamType::BOOL); } throw 1; } @@ -52,6 +53,7 @@ public: virtual ParamValue getParamValue(const int idx) const override { switch(idx) { case 0: return fo->name; + case 1: return fo->outdoor; } throw 1; } @@ -59,6 +61,7 @@ public: virtual void setParamValue(const int idx, const ParamValue& val) const override { switch(idx) { case 0: fo->name = val.toString(); break; + case 1: fo->outdoor = val.toBool(); break; } } diff --git a/mapview/model/MapLayer.h b/mapview/model/MapLayer.h index 6251262..72331f7 100644 --- a/mapview/model/MapLayer.h +++ b/mapview/model/MapLayer.h @@ -24,6 +24,7 @@ enum class MapLayerType { FLOOR_UNDERLAYS, FLOOR_POIS, FLOOR_STAIRS, + FLOOR_GROUND_TRUTH_POINTS }; diff --git a/mapview/model/MapModel.h b/mapview/model/MapModel.h index 19a9be2..fc0e3c4 100644 --- a/mapview/model/MapModel.h +++ b/mapview/model/MapModel.h @@ -86,6 +86,82 @@ public: } + float snap(const float val) { + const float s = 0.1; + return std::round(val / s) * s; + } + + /** resize everything within the floorplay by the given factor */ + void resize(const float sx, const float sy, const float sz, const float ox, const float oy, const float oz) { + + for (Floorplan::Floor* f : im->floors) { + f->atHeight = snap(f->atHeight * sz); + f->height = snap(f->height * sz); + for (Floorplan::FloorOutlinePolygon* poly : f->outline) { + for (Point2& p : poly->poly.points) { + p.x = snap(p.x * sx + ox); + p.y = snap(p.y * sy + oy); + } + } + for (Floorplan::AccessPoint* ap : f->accesspoints) { + ap->pos.x = snap(ap->pos.x * sx + ox); + ap->pos.y = snap(ap->pos.y * sy + oy); + ap->pos.z = snap(ap->pos.z * sz + oz); + } + for (Floorplan::Beacon* b : f->beacons) { + b->pos.x = snap(b->pos.x * sx + ox); + b->pos.y = snap(b->pos.y * sy + oy); + b->pos.z = snap(b->pos.z * sz + oz); + } + for (Floorplan::POI* p : f->pois) { + p->pos.x = snap(p->pos.x * sx + ox); + p->pos.y = snap(p->pos.y * sy + oy); + } + for (Floorplan::FingerprintLocation* fpl : f->fpLocations) { + fpl->posOnFloor.x = snap(fpl->posOnFloor.x * sx + ox); + fpl->posOnFloor.y = snap(fpl->posOnFloor.y * sy + oy); + fpl->heightAboveFloor = snap(fpl->heightAboveFloor * sz + oz); + } + for (Floorplan::FloorObstacle* o : f->obstacles) { + Floorplan::FloorObstacleLine* line = dynamic_cast(o); + Floorplan::FloorObstacleDoor* door = dynamic_cast(o); + if (line) { + line->from.x = snap(line->from.x * sx + ox); + line->from.y = snap(line->from.y * sy + oy); + line->to.x = snap(line->to.x * sx + ox); + line->to.y = snap(line->to.y * sy + oy); + } else if (door) { + door->from.x = snap(door->from.x * sx + ox); + door->from.y = snap(door->from.y * sy + oy); + door->to.x = snap(door->to.x * sx + ox); + door->to.y = snap(door->to.y * sy + oy); + } + } + for (Floorplan::Stair* s : f->stairs) { + Floorplan::StairFreeform* stair = dynamic_cast(s); + for (Floorplan::StairPart& sp : stair->parts) { + sp.width = snap(sp.width * sx); + sp.end.x = snap(sp.end.x * sx + ox); + sp.end.y = snap(sp.end.y * sy + oy); + sp.end.z = snap(sp.end.z * sz + oz); + sp.start.x = snap(sp.start.x * sx + ox); + sp.start.y = snap(sp.start.y * sy + oy); + sp.start.z = snap(sp.start.z * sz + oz); + } + } + for (Floorplan::Elevator* e : f->elevators) { + e->center.x = snap(e->center.x * sx + ox); + e->center.y = snap(e->center.y * sy + oy); + e->width = snap(e->width * sx); + e->depth = snap(e->depth * sx); + } + + } + + + } + + void onLayerChanged(MapLayer* layer) override { for (MapModelListener* l : listeners) {l->onLayerChanged(layer);} } diff --git a/params/ToolBox.cpp b/params/ToolBox.cpp index ba2cbf9..61ea732 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 "../mapview/2D/tools/ToolMeasure.h" @@ -117,6 +118,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); @@ -142,6 +149,7 @@ void ToolBoxWidget::setSelectedLayer(MapLayer *ml) { btnBeacon->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_BEACONS)); btnFingerprintLocation->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_FINGERPRINTS)); 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)); @@ -495,6 +503,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 37b4bfc..177578a 100644 --- a/params/ToolBoxWidget.h +++ b/params/ToolBoxWidget.h @@ -47,6 +47,7 @@ private: QPushButton* btnBeacon; QPushButton* btnFingerprintLocation; QPushButton* btnPOI; + QPushButton* btnGTP; QPushButton* btnImage; @@ -66,6 +67,7 @@ private slots: void onNewBeacon(); void onNewFingerprintLocation(); void onNewPOI(); + void onNewGTP(); void onNewImage(); diff --git a/res.qrc b/res.qrc index babfafb..4900f24 100644 --- a/res.qrc +++ b/res.qrc @@ -18,5 +18,6 @@ res/icons/remove.svg res/icons/ruler.svg res/icons/fingerprint.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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +