diff --git a/IndoorMap.pro b/IndoorMap.pro index baf8d75..692ea49 100644 --- a/IndoorMap.pro +++ b/IndoorMap.pro @@ -49,7 +49,8 @@ SOURCES += \ mapview/3D/misc/Handrail.cpp \ mapview/3D/navMesh/QNavMeshSettings.cpp \ params/ToolBoxWidget.cpp \ - mapview/2D/MV2DElementFloorObstacleDoor.cpp + mapview/2D/MV2DElementFloorObstacleDoor.cpp \ + mapview/2D/MV2DElementFloorObstacleObject.cpp HEADERS += MainWindow.h \ @@ -177,7 +178,11 @@ HEADERS += MainWindow.h \ mapview/3D/misc/TriangleData.h \ mapview/3D/floorplan/FloorplanRendererModel.h \ mapview/3D/floorplan/FloorplanRenderer.h \ - mapview/3D/floorplan/RenderTriangle.h + mapview/3D/floorplan/RenderTriangle.h \ + mapview/2D/MV2DElementFloorObstacleObject.h \ + mapview/model/MMFloorObstacleObject.h \ + mapview/3D/MV3DElementFloorObstacleObject.h \ + mapview/2D/tools/ToolNewObject.h FORMS += MainWindow.ui diff --git a/MainController.cpp b/MainController.cpp index bfe0710..b609756 100644 --- a/MainController.cpp +++ b/MainController.cpp @@ -28,6 +28,7 @@ #include "mapview/3D/grid/GridRenderer.h" +#include @@ -102,6 +103,8 @@ MainController::MainController() { connect(mw, &MainWindow::onGridNodeColorType, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_TYPE);} ); connect(mw, &MainWindow::onGridShowEdges, [&] (const bool show) {mw->getMapView3D()->getGridRenderer()->setShowEdges(show);} ); + Ray3D::OBJPool::get().init("/mnt/vm/paper/diss/code/IndoorMap/res/mdl/"); + //mapModel->load("../IndoorMap/maps/SHL36_noel.xml"); //mapModel->load("../IndoorMap/maps/SHL38_no_elev.xml"); //mapModel->load("/apps/testmap.xml"); @@ -110,7 +113,8 @@ MainController::MainController() { //mapModel->load("/mnt/vm/paper/diss/data/maps/test_in_out_overlap.xml"); - mapModel->load("/mnt/vm/paper/diss/data/maps/SHL42_nm.xml"); + mapModel->load("/mnt/vm/paper/diss/data/maps/walkmodel_stairs3.xml"); + //mapModel->load("/mnt/vm/paper/diss/data/maps/SHL42_nm.xml"); //mapModel->load("/apps/paper/diss/data/maps/SHL41_nm.xml"); //mapModel->load("/mnt/sdcard/SHL41_nm.xml"); diff --git a/UIHelper.h b/UIHelper.h index 909c7e7..4fc2edd 100644 --- a/UIHelper.h +++ b/UIHelper.h @@ -6,6 +6,7 @@ #include #include #include +#include #include diff --git a/mapview/2D/MV2DElementAccessPoint.h b/mapview/2D/MV2DElementAccessPoint.h index 8c6b132..3afc9b3 100644 --- a/mapview/2D/MV2DElementAccessPoint.h +++ b/mapview/2D/MV2DElementAccessPoint.h @@ -38,6 +38,11 @@ public: /** repaint me */ void paint(Painter& p) override { + // invisible? -> leave + if (!p.isVisible(ap->pos.xy())) { + return; + } + static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("wifi", CFG::UNFOCUS_COLOR, 16); static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("wifi", CFG::FOCUS_COLOR, 16); static const QPixmap& pixmapSel = UIHelper::getPixmapColored("wifi", CFG::SEL_COLOR, 16); diff --git a/mapview/2D/MV2DElementFingerprintLocation.h b/mapview/2D/MV2DElementFingerprintLocation.h index 5a978d3..89eea4e 100644 --- a/mapview/2D/MV2DElementFingerprintLocation.h +++ b/mapview/2D/MV2DElementFingerprintLocation.h @@ -38,6 +38,11 @@ public: /** repaint me */ void paint(Painter& p) override { + // invisible? -> leave + if (!p.isVisible(fpl->posOnFloor)) { + return; + } + static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("fingerprint", CFG::UNFOCUS_COLOR, 16); static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("fingerprint", CFG::FOCUS_COLOR, 16); static const QPixmap& pixmapSel = UIHelper::getPixmapColored("fingerprint", CFG::SEL_COLOR, 16); diff --git a/mapview/2D/MV2DElementFloorObstacleDoor.cpp b/mapview/2D/MV2DElementFloorObstacleDoor.cpp index c7a0f1b..18c82a5 100644 --- a/mapview/2D/MV2DElementFloorObstacleDoor.cpp +++ b/mapview/2D/MV2DElementFloorObstacleDoor.cpp @@ -23,6 +23,11 @@ ClickDist MV2DElementFloorObstacleDoor::getMinDistanceXY(const Point2 p) const { void MV2DElementFloorObstacleDoor::paint(Painter& p) { + // invisible? -> leave + if (!p.isVisible( (fo->from+fo->to)/2 )) { + return; + } + // selected endpoints? if (hasFocus()) { p.setPenBrush(Qt::NoPen, CFG::SEL_COLOR); diff --git a/mapview/2D/MV2DElementFloorObstacleObject.cpp b/mapview/2D/MV2DElementFloorObstacleObject.cpp new file mode 100644 index 0000000..33f34e1 --- /dev/null +++ b/mapview/2D/MV2DElementFloorObstacleObject.cpp @@ -0,0 +1,134 @@ +#include "MV2DElementFloorObstacleObject.h" + +#include "MapViewElementHelper.h" +#include +#include + +#include "../../UIHelper.h" + + + +MV2DElementFloorObstacleObject::MV2DElementFloorObstacleObject(Floorplan::FloorObstacleObject* fo) : fo(fo) { + ; +} + + +BBox2 MV2DElementFloorObstacleObject::getBoundingBox() const { + BBox2 bbox; + bbox.add(Point2(fo->pos.x, fo->pos.y)); + bbox.grow(Point2(0.1, 0.1)); + return bbox; +} + +ClickDist MV2DElementFloorObstacleObject::getMinDistanceXY(const Point2 p) const { + return ClickDist(p.getDistance(fo->pos.xy()), ClickDistType::DIRECT); +} + +//#include +//struct Cache { +// struct Line { +// Point2 p1; +// Point2 p2; +// Line(Point2 p1, Point2 p2) : p1(p1), p2(p2) {;} +// }; +// struct Entry { +// const Floorplan::FloorObstacleObject* obj = nullptr; +// std::vector lines; +// }; +// Entry e; +// const Entry& get(const Floorplan::FloorObstacleObject* obj) { +// if (e.obj == nullptr || e.obj->file != obj->file || e.obj->pos != obj->pos || e.obj->rot != obj->rot) { +// e.obj = obj; +// e.lines.clear(); +// const Ray3D::Obstacle3D obs = Ray3D::OBJPool::get().getObject(obj->file).rotated_deg(obj->rot).translated(obj->pos); +// for (const Triangle3& tria : obs.triangles) { +// if (tria.p1.xy() != tria.p2.xy()) { +// e.lines.push_back( Line (tria.p1.xy(), tria.p2.xy()) ); +// } +// } +// return e; +// } +// } +//} cache; + + +void MV2DElementFloorObstacleObject::paint(Painter& p) { + + static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("objects", CFG::UNFOCUS_COLOR, 16); + static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("objects", CFG::FOCUS_COLOR, 16); + static const QPixmap& pixmapSel = UIHelper::getPixmapColored("objects", CFG::SEL_COLOR, 16); + + // invisible? -> leave + if (!p.isVisible(fo->pos.xy())) { + return; + } + + if (p.getScaler().getScale() >= 40) { + // TODO: quite costly... cache?? + p.setPenBrush(Qt::black, Qt::NoBrush); +// const Cache::Entry& e = cache.get(fo); +// for (const Cache::Line& l : e.lines) { +// p.drawLine(l.p1, l.p2); +// } + const Ray3D::Obstacle3D obs = Ray3D::OBJPool::get().getObject(fo->file).rotated_deg(fo->rot).translated(fo->pos); + for (const Triangle3& tria : obs.triangles) { + if (tria.p1.xy() != tria.p2.xy()) { + p.drawLine( tria.p1.xy(), tria.p2.xy() ); + } + } + } + + if (p.getScaler().getScale() >= 20) { + if (selectedUserIdx == 0) { + p.drawPixmap(fo->pos.xy(), pixmapSel); + } else if (hasFocus()) { + p.drawPixmap(fo->pos.xy(), pixmapFocused); + } else { + p.drawPixmap(fo->pos.xy(), pixmapUnfocused); + } + } + + //p.setPenBrush(Qt::black, Qt::NoBrush); + //p.drawDot(fo->pos.xy()); + +} + +std::vector MV2DElementFloorObstacleObject::getMoveableNodes() const { + return { MoveableNode(0, fo->pos.xy()) }; +} + +void MV2DElementFloorObstacleObject::onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) { + (void) v; + if (userIdx == 0) {fo->pos.x = newPos.x; fo->pos.y = newPos.y;} +} + + +void MV2DElementFloorObstacleObject::mousePressed(MapView2D* v, const Point2 p) { + (void) v; + (void) p; +} + +void MV2DElementFloorObstacleObject::mouseMove(MapView2D* v, const Point2 p) { + (void) v; + (void) p; +} + +void MV2DElementFloorObstacleObject::mouseReleased(MapView2D* v, const Point2 p) { + (void) v; + (void) p; +} + +bool MV2DElementFloorObstacleObject::keyPressEvent(MapView2D* v, QKeyEvent *e) { + (void) v; + (void) e; + return false; +} + +void MV2DElementFloorObstacleObject::onFocus() { + ; +} + +void MV2DElementFloorObstacleObject::onUnfocus() { + ; +} + diff --git a/mapview/2D/MV2DElementFloorObstacleObject.h b/mapview/2D/MV2DElementFloorObstacleObject.h new file mode 100644 index 0000000..de64f52 --- /dev/null +++ b/mapview/2D/MV2DElementFloorObstacleObject.h @@ -0,0 +1,51 @@ +#ifndef MV2DELEMENTFLOOROBSTACLEOBJECT_H +#define MV2DELEMENTFLOOROBSTACLEOBJECT_H + +#include "MV2DElement.h" +#include "HasMoveableNodes.h" + +//#include "MapViewElementHelper.h" +#include +//#include + +//#include "../../UIHelper.h" + +class MV2DElementFloorObstacleObject : public MV2DElement, public HasMoveableNodes { + +private: + + //bool sel = false; + Floorplan::FloorObstacleObject* fo; + +public: + + /** ctor with the AP to render/edit */ + MV2DElementFloorObstacleObject(Floorplan::FloorObstacleObject* fo); + + BBox2 getBoundingBox() const override; + + /** get the element's minimal distance (nearest whatsoever) to the given point */ + ClickDist getMinDistanceXY(const Point2 p) const override; + + /** repaint me */ + void paint(Painter& p) override; + + virtual std::vector getMoveableNodes() const override; + + virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) override; + + virtual void mousePressed(MapView2D* v, const Point2 p) override; + + virtual void mouseMove(MapView2D* v, const Point2 p) override; + + virtual void mouseReleased(MapView2D* v, const Point2 p) override; + + virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override; + + virtual void onFocus() override; + + virtual void onUnfocus() override; + +}; + +#endif // MV2DELEMENTFLOOROBSTACLELINE_H diff --git a/mapview/2D/MV2DElementGroundTruthPoint.h b/mapview/2D/MV2DElementGroundTruthPoint.h index 8fd00ad..e5abacf 100644 --- a/mapview/2D/MV2DElementGroundTruthPoint.h +++ b/mapview/2D/MV2DElementGroundTruthPoint.h @@ -37,6 +37,11 @@ public: /** repaint me */ void paint(Painter& p) override { + // invisible? -> leave + if (!p.isVisible(gtp->pos.xy())) { + return; + } + 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); diff --git a/mapview/2D/MV2DElementPOI.h b/mapview/2D/MV2DElementPOI.h index aee6d92..a3f6bc9 100644 --- a/mapview/2D/MV2DElementPOI.h +++ b/mapview/2D/MV2DElementPOI.h @@ -37,6 +37,11 @@ public: /** repaint me */ void paint(Painter& p) override { + // invisible? -> leave + if (!p.isVisible(poi->pos)) { + return; + } + static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("poi", CFG::UNFOCUS_COLOR, 16); static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("poi", CFG::FOCUS_COLOR, 16); static const QPixmap& pixmapSel = UIHelper::getPixmapColored("poi", CFG::SEL_COLOR, 16); diff --git a/mapview/2D/MV2DElementRegistrationPoint.h b/mapview/2D/MV2DElementRegistrationPoint.h index 9e70f30..2e56a03 100644 --- a/mapview/2D/MV2DElementRegistrationPoint.h +++ b/mapview/2D/MV2DElementRegistrationPoint.h @@ -40,6 +40,11 @@ public: /** repaint me */ void paint(Painter& p) override { + // invisible? -> leave + if (!p.isVisible(reg->posOnMap_m.xy())) { + return; + } + static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("registration", CFG::UNFOCUS_COLOR, 16); static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("registration", CFG::FOCUS_COLOR, 16); static const QPixmap& pixmapSel = UIHelper::getPixmapColored("registration", CFG::SEL_COLOR, 16); diff --git a/mapview/2D/MV2DElementStair.h b/mapview/2D/MV2DElementStair.h index 816d152..f0465f7 100644 --- a/mapview/2D/MV2DElementStair.h +++ b/mapview/2D/MV2DElementStair.h @@ -95,6 +95,18 @@ public: std::vector parts = stair->getParts(); std::vector quads = Floorplan::getQuads(parts, floor); + // skip drawing? + BBox2 bbox; + for (const Floorplan::Quad3& q : quads) { + bbox.add(q.p1.xy()); + bbox.add(q.p2.xy()); + bbox.add(q.p3.xy()); + bbox.add(q.p4.xy()); + } + if (!p.isVisible(bbox)) { + return; + } + for (int i = 0; i < (int) parts.size(); ++i) { const Floorplan::StairPart& part = parts[i]; diff --git a/mapview/2D/Painter.h b/mapview/2D/Painter.h index 5be62f5..fdb502d 100644 --- a/mapview/2D/Painter.h +++ b/mapview/2D/Painter.h @@ -6,6 +6,7 @@ #include #include +#include #include "Scaler.h" @@ -30,6 +31,22 @@ public: int height() {return h;} + /** is the given point visible on screen? */ + bool isVisible(const Point2 p) { + const float x = s.xms(p.x); + const float y = s.yms(p.y); + return (x >= 0 && y >= 0 && x < w && y < h); + } + + /** is the given volume visible on screen? */ + bool isVisible(const BBox2 bb) { + const BBox2 bbt(0,0,w,h); + BBox2 bbs; + bbs.add(s.xms(bb.getMin().x), s.yms(bb.getMin().y)); // y might be inverted! -> use the add() method to address this + bbs.add(s.xms(bb.getMax().x), s.yms(bb.getMax().y)); // y might be inverted! -> use the add() method to address this + return bbt.intersects(bbs); + } + void drawLine(const Point2 p1, const Point2 p2) { p->drawLine(s.xms(p1.x), s.yms(p1.y), s.xms(p2.x), s.yms(p2.y)); } diff --git a/mapview/2D/tools/ToolNewObject.h b/mapview/2D/tools/ToolNewObject.h new file mode 100644 index 0000000..a6b085d --- /dev/null +++ b/mapview/2D/tools/ToolNewObject.h @@ -0,0 +1,49 @@ +#ifndef TOOLNEWOBJECT_H +#define TOOLNEWOBJECT_H + + +#include "ToolNewElement.h" +#include "../../model/MMFloorObstacles.h" +#include "../../model/MMFloorObstacleObject.h" + +class ToolNewObject : public ToolNewElement { + +public: + + ToolNewObject(Tools& tools, MapLayer* layer) : ToolNewElement(tools, layer) { + ; + } + + void becomesActive() override { + emit onHelpTextChange("left-click where to place a new object. right-click to end."); + } + + void becomesInactive() override { + ; + } + + const std::string getName() const override { + return "new Object/Furniture/..."; + } + + void moving(const Point2 mapPoint) override { + (void) mapPoint; + } + + /** next point */ + void leftMouse(const Point2 mapPoint) override { + foEL = new Floorplan::FloorObstacleObject("", Point3(mapPoint.x, mapPoint.y, 0.0), Point3(0,0,0)); + MMFloorObstacles* obs = (MMFloorObstacles*)layer; + mmEL = obs->createObject(foEL); + } + + void rightMouse(const Point2 mapPoint) override { + (void) mapPoint; + finalizeCurrent(); + disableMe(); + } + +}; + + +#endif // TOOLNEWOBJECT_H diff --git a/mapview/3D/MV3DElementFloorObstacleObject.h b/mapview/3D/MV3DElementFloorObstacleObject.h new file mode 100644 index 0000000..7f0fac1 --- /dev/null +++ b/mapview/3D/MV3DElementFloorObstacleObject.h @@ -0,0 +1,42 @@ +#ifndef MV3DELEMENTFLOOROBSTACLEOBJECT_H +#define MV3DELEMENTFLOOROBSTACLEOBJECT_H + +#include +#include + +#include "misc/Cube.h" +#include "misc/Window.h" +#include "misc/Handrail.h" + +#include "MV3DElement.h" + +class MV3DElementFloorObstacleObject : public MV3DElement { + + Floorplan::Floor* f; + Floorplan::FloorObstacleObject* fo; + +public: + + /** ctor */ + MV3DElementFloorObstacleObject(Floorplan::Floor* f, Floorplan::FloorObstacleObject* fo) : f(f), fo(fo) { + ; + } + +protected: + + + /** repaint me */ + void render(const RenderSettings& rs) override { + + // TODO + + } + + bool isTransparent() const override { + return false; + } + + +}; + +#endif // MV3DELEMENTFLOOROBSTACLEOBJECT_H diff --git a/mapview/3D/MapView3D.cpp b/mapview/3D/MapView3D.cpp index 7a90f03..5695fd2 100644 --- a/mapview/3D/MapView3D.cpp +++ b/mapview/3D/MapView3D.cpp @@ -65,6 +65,18 @@ MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) { emit update(); }); + QPushButton* btnExp3D = new QPushButton(UIHelper::getIcon("save"), "", this); + btnExp3D->setStyleSheet(style); + btnExp3D->setGeometry(16, 16+8+32+8+32+8+32, 32, 32); + connect(btnExp3D, &QPushButton::clicked, [this] () { + floorplanRendererModel->getMesh().exportOBJsimple("/tmp/map.obj"); + floorplanRendererModel->getMesh().exportOBJcomplex("/tmp/map_complex", "map_complex"); + floorplanRendererModel->getMesh().exportPLY("/tmp/map.ply"); + }); + + + + QPushButton* btnGrid = new QPushButton(UIHelper::getIcon("grid"), "", this); btnGrid->setCheckable(true); btnGrid->setChecked(false); diff --git a/mapview/3D/floorplan/FloorplanRendererModel.h b/mapview/3D/floorplan/FloorplanRendererModel.h index 8334340..2e1d20e 100644 --- a/mapview/3D/floorplan/FloorplanRendererModel.h +++ b/mapview/3D/floorplan/FloorplanRendererModel.h @@ -39,8 +39,10 @@ private: Material(128,128,128,255), // concrete Material(200,200,255,96), // glass + Material(170,120,60,255), // wood + Material(200,200,200,255), // drywall - Material(200,200,200,255), // default + Material(250,250,250,255), // default }; @@ -56,8 +58,10 @@ private: if (o.mat == Floorplan::Material::CONCRETE) {return 6;} if (o.mat == Floorplan::Material::GLASS) {return 7;} + if (o.mat == Floorplan::Material::WOOD) {return 8;} + if (o.mat == Floorplan::Material::DRYWALL) {return 9;} - return 8; + return 10; } diff --git a/mapview/model/MMFloorObstacleObject.h b/mapview/model/MMFloorObstacleObject.h new file mode 100644 index 0000000..38071f0 --- /dev/null +++ b/mapview/model/MMFloorObstacleObject.h @@ -0,0 +1,79 @@ +#ifndef MMFLOOROBSTACLEOBJECT_H +#define MMFLOOROBSTACLEOBJECT_H + + +#include "MapModelElement.h" +#include "../2D/MapViewElementHelper.h" + +#include "IHasMaterial.h" +#include "IHasDoorType.h" +#include "IHasParams.h" + +#include "../2D/MV2DElementFloorObstacleObject.h" +#include "../3D/MV3DElementFloorObstacleObject.h" + +#include + + +class MMFloorObstacleObject : public MapModelElement, public IHasParams { + +public: + + Floorplan::Floor* mf; + Floorplan::FloorObstacleObject* fo; + MV2DElementFloorObstacleObject mv2d; + MV3DElementFloorObstacleObject mv3d; + +public: + + MMFloorObstacleObject(MapLayer* parent, Floorplan::Floor* mf, Floorplan::FloorObstacleObject* fo) : + MapModelElement(parent), mf(mf), fo(fo), mv2d(fo), mv3d(mf,fo) { + + } + + MV2DElement* getMV2D() const override {return (MV2DElement*) &mv2d;} + MV3DElement* getMV3D() const override {return (MV3DElement*) &mv3d;} + + void deleteMe() const override { + parent->removeElement(this); + mf->obstacles.erase(std::remove(mf->obstacles.begin(), mf->obstacles.end(), fo), mf->obstacles.end()); + } + + /** get the number of parameters */ + int getNumParams() const override { + return 3; + } + + /** get the description of the idx-th parameter */ + virtual Param getParamDesc(const int idx) const override { + switch (idx) { + case 0: return Param("file", ParamType::STRING); + case 1: return Param("pos", ParamType::POINT3); + case 2: return Param("rot", ParamType::POINT3); + default: throw Exception("out of bounds"); + } + } + + /** get the idx-th param's value */ + virtual ParamValue getParamValue(const int idx) const override { + switch(idx) { + case 0: return fo->file; + case 1: return fo->pos; + case 2: return fo->rot; + default: throw Exception("out of bounds"); + } + } + + /** set the idx-th param's value */ + virtual void setParamValue(const int idx, const ParamValue& val) override { + switch (idx) { + case 0: fo->file = val.toString(); break; + case 1: fo->pos = val.toPoint3(); break; + case 2: fo->rot = val.toPoint3(); break; + default: throw Exception("out of bounds"); + } + } + +}; + +#endif // MMFLOOROBSTACLEOBJECT_H diff --git a/mapview/model/MMFloorObstacles.h b/mapview/model/MMFloorObstacles.h index ef8da91..14c192e 100644 --- a/mapview/model/MMFloorObstacles.h +++ b/mapview/model/MMFloorObstacles.h @@ -5,6 +5,7 @@ #include "MMFloorObstacleCircle.h" #include "MMFloorObstacleLine.h" #include "MMFloorObstacleDoor.h" +#include "MMFloorObstacleObject.h" #include @@ -28,6 +29,8 @@ public: addElement(new MMFloorObstacleCircle(this, floor, (Floorplan::FloorObstacleCircle*)o)); } else if (dynamic_cast(o)) { addElement(new MMFloorObstacleDoor(this, floor, (Floorplan::FloorObstacleDoor*)o)); + } else if (dynamic_cast(o)) { + addElement(new MMFloorObstacleObject(this, floor, (Floorplan::FloorObstacleObject*)o)); } else { throw new Exception("todo: not yet implemented obstacle type"); } @@ -84,6 +87,19 @@ public: } + //TODO: check + MMFloorObstacleObject* createObject(Floorplan::FloorObstacleObject* obs) { + + // add to underlying model + floor->obstacles.push_back(obs); + + // add to myself as element + MMFloorObstacleObject* mm = new MMFloorObstacleObject(this, floor, obs); + addElement(mm); + return mm; + + } + std::string getLayerName() const override {return "obstacles";} diff --git a/params/ToolBoxWidget.cpp b/params/ToolBoxWidget.cpp index 35bf4fc..f10ffdb 100644 --- a/params/ToolBoxWidget.cpp +++ b/params/ToolBoxWidget.cpp @@ -30,6 +30,7 @@ #include "../mapview/2D/tools/ToolNewAccessPoint.h" #include "../mapview/2D/tools/ToolNewBeacon.h" #include "../mapview/2D/tools/ToolNewPOI.h" +#include "../mapview/2D/tools/ToolNewObject.h" #include "../UIHelper.h" @@ -89,6 +90,11 @@ ToolBoxWidget::ToolBoxWidget(MapView2D* view, QWidget *parent) : QWidget(parent) lay->addWidget(btnDoor, r++, 0, 1,1,Qt::AlignTop); connect(btnDoor, SIGNAL(clicked(bool)), this, SLOT(onNewDoor())); + btnObject = new QPushButton(UIHelper::getIcon("objects"), ""); + btnObject->setMinimumSize(s,s); + lay->addWidget(btnObject, r++, 0, 1,1,Qt::AlignTop); + connect(btnObject, SIGNAL(clicked(bool)), this, SLOT(onNewObject())); + btnStair = new QPushButton(UIHelper::getIcon("stair"), ""); btnStair->setMinimumSize(s,s); lay->addWidget(btnStair, r++, 0, 1,1,Qt::AlignTop); @@ -133,11 +139,11 @@ 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())); + // 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())); @@ -179,6 +185,7 @@ void ToolBoxWidget::onMainToolChanged() { btnDoor->setStyleSheet( dynamic_cast(t) ? styleSel : styleNor ); btnWall->setStyleSheet( dynamic_cast(t) ? styleSel : styleNor ); + btnObject->setStyleSheet( dynamic_cast(t) ? styleSel : styleNor ); btnElevator->setStyleSheet( dynamic_cast(t) ? styleSel : styleNor ); btnStair->setStyleSheet( dynamic_cast(t) ? styleSel : styleNor ); @@ -199,6 +206,7 @@ void ToolBoxWidget::setSelectedLayer(MapLayer *ml) { btnWall->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES)); btnPillar->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES)); btnDoor->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES)); + btnObject->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES)); btnStair->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_STAIRS)); btnElevator->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_ELEVATORS)); @@ -207,7 +215,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)); + btnGTP->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_GROUND_TRUTH_POINTS)); btnImage->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_UNDERLAYS)); @@ -255,6 +263,10 @@ void ToolBoxWidget::onNewDoor() { view->getTools().setMain(new ToolNewDoor(view->getTools(), curLayer)); } +void ToolBoxWidget::onNewObject() { + view->getTools().setMain(new ToolNewObject(view->getTools(), curLayer)); +} + void ToolBoxWidget::onNewPillar() { const Point2 center = view->getScaler().getCenter(); diff --git a/params/ToolBoxWidget.h b/params/ToolBoxWidget.h index ef81aa4..2ecc967 100644 --- a/params/ToolBoxWidget.h +++ b/params/ToolBoxWidget.h @@ -42,6 +42,7 @@ private: QPushButton* btnWall; QPushButton* btnPillar; QPushButton* btnDoor; + QPushButton* btnObject; QPushButton* btnStair; QPushButton* btnElevator; @@ -64,6 +65,7 @@ private slots: void onNewWall(); void onNewPillar(); void onNewDoor(); + void onNewObject(); void onNewStair(); void onNewElevator(); @@ -71,7 +73,7 @@ private slots: void onNewBeacon(); void onNewFingerprintLocation(); void onNewPOI(); - void onNewGTP(); + void onNewGTP(); void onNewImage(); diff --git a/res.qrc b/res.qrc index 2371e34..0870d68 100644 --- a/res.qrc +++ b/res.qrc @@ -25,5 +25,8 @@ res/icons/floorplan.svg res/icons/grid.svg res/icons/wireframe.svg + res/icons/save.svg + res/icons/load.svg + res/icons/objects.svg diff --git a/res/icons/load.svg b/res/icons/load.svg new file mode 100644 index 0000000..e78b646 --- /dev/null +++ b/res/icons/load.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/res/icons/objects.svg b/res/icons/objects.svg new file mode 100644 index 0000000..bd53493 --- /dev/null +++ b/res/icons/objects.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/icons/save.svg b/res/icons/save.svg new file mode 100644 index 0000000..d383f09 --- /dev/null +++ b/res/icons/save.svg @@ -0,0 +1 @@ + \ No newline at end of file