/** * Exercise object * $Id$ * $HeadURL$ * $Author$ */ #pragma once #include "aes_db.h" #include "object_base.h" #include #include namespace AreaEffectSimulation { class ObjectMineArea final : public ObjectBaseTmpl { Q_OBJECT public: explicit ObjectMineArea(MainHandler *mainHandler, QObject *parent = nullptr); ~ObjectMineArea(); Core::FunctionReplyObject createObject(const Database::AesMineArea &data, const std::vector &segments = std::vector()); Core::FunctionReplyObject createObject(const Database::AesMineArea &data, const std::vector &segments); Core::FunctionReplyObject updateObject(const Database::AesMineArea &data, const std::vector &segments); Core::FunctionReplyObject updateObject(const Database::AesMineArea &data, const std::vector &segments); Core::FunctionReplyObject createObjectFromMineData(const Database::AesMineArea &data, const std::vector &segment, const std::vector &mineData); Core::FunctionReplyObject updateObjectFromMineData(const Database::AesMineArea &data, const std::vector &segments, const std::vector &mineData); /*! * \brief removeObjectFromDb * \details Removes the object from db, Used if the object is created but there are too much objects (amount border) * \author Niklas Schmidt * \return bool if the deletion was working */ bool removeObjectFromDb(); Database::AesMineArea get() const { return m_data; } QVector segments() const { return m_segments; } QRectF boundingRect() const { return m_mineAreaPolygon.boundingRect(); } bool hasMine(int mineId) const { return m_triggeredMines.contains(mineId); } int getMineIdByIndex(int index) const; int lastMineNo() const; bool canHandleMine(int mineId, int chargeTypeId, const QPointF &position) const; bool triggerMine(int mineId, bool trigger = true, const QPointF &position = QPointF()); bool updateMine(Database::AesMineAreaTriggeredMines &mine); void updateMineByOldMineId(Database::AesMineAreaTriggeredMines &mine, qint32 oldMineId); bool resetMine(int mineId); bool resetMines(); Database::AesMineAreaTriggeredMines takeMine(int mineId); bool isDusMineArea() const; bool isConcreteMine() const; bool isSingleVirtual() const; bool isVirtualMine() const; bool isReactivatableDusMineArea() const; void clearCorridor(const AesItemView &aiv); void clearBuildings(); QVector unpairedMines() const; std::vector form() const override { return m_aiv.form(); } QPolygonF generateForm() override; AesType aesType() const override { return AesType::AtMineArea; } bool isCentral() const override { return m_data.isCentral; } int mineCount(); void removeTopics(); Core::FunctionReplyObject createGeoSegmentsFromMineData(double &newWidth, const std::vector &mineData, std::vector &outSegments); Core::FunctionReplyObject createSegments( const std::vector &inSegments, int mineAreaId, QVector &outSegments, const double &totalLengthOut); // const double &totalLengthOut since totalLengthOut is unused and exits just for signature purpose Core::FunctionReplyObject createSegments(const std::vector &inSegments, int mineAreaId, QVector &outSegments, double &totalLengthOut); // for concrete mines only Core::FunctionReplyObject changeSegmentsToLine(bool sortMines); Core::FunctionReplyObject checkDensity(double &densityOut, const double totalLength, int maxMineCount); signals: void releaseMines(int aesId, const QList &mines); void shapeChanged(int aesId); public slots: void onEffectStateChanged(); protected Q_SLOTS: void onPublishData() override final; private: template Core::FunctionReplyObject createObjectTmpl(const Database::AesMineArea &data, const std::vector &segments); template Core::FunctionReplyObject updateObjectTmpl(const Database::AesMineArea &data, const std::vector &segments); bool containsPointInExpandedMinefield(const QPointF &positionGeo) const; double distancePointLine(const QPointF &pUtm, const QPointF &l1Utm, const QPointF &l2Utm) const; double squareLen(const QPointF &p1, const QPointF &p2) const; double singleMineRadius() const; void publishAiv(); bool publishTriggeredImpacts(); bool publishDusMineStatus(); bool triggerMines(const QVector &mineIds, bool trigger, const QPointF &position); bool removeTriggeredMines(const QVector &mineIds); void generateVirtualMines(); bool addMineData(const std::vector &mineData); bool selectMineFromDb(QMap &outTriggerMines); void removeDusMineStateTopic(); int msGetIndexMine(const QVector &box, const QVector &minen); double msGetDistanceFromLine(double px, double py, double px0, double py0, double px1, double py1); QVector m_segments; QMap m_triggeredMines; bool m_triggeredMinesChanged; QPolygonF m_mineAreaPolygon; AesItemView m_aiv; AesItemView m_aiv2; TriggeredImpacts m_tis; DusMineState m_dms; }; } // namespace AreaEffectSimulation