LCOV - code coverage report
Current view: top level - src/guisim - GUINet.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 6 30 20.0 %
Date: 2024-04-27 15:34:54 Functions: 2 16 12.5 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
       4             : // This program and the accompanying materials are made available under the
       5             : // terms of the Eclipse Public License 2.0 which is available at
       6             : // https://www.eclipse.org/legal/epl-2.0/
       7             : // This Source Code may also be made available under the following Secondary
       8             : // Licenses when the conditions for such availability set forth in the Eclipse
       9             : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10             : // or later which is available at
      11             : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12             : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13             : /****************************************************************************/
      14             : /// @file    GUINet.h
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Jakob Erdmann
      17             : /// @author  Michael Behrisch
      18             : /// @date    Sept 2002
      19             : ///
      20             : // A MSNet extended by some values for usage within the gui
      21             : /****************************************************************************/
      22             : #pragma once
      23             : #include <config.h>
      24             : 
      25             : #include <string>
      26             : #include <utility>
      27             : #include <microsim/MSNet.h>
      28             : #include <microsim/devices/MSDevice_Tripinfo.h>
      29             : #include <utils/geom/Boundary.h>
      30             : #include <utils/geom/Position.h>
      31             : #include <utils/xml/SUMOSAXHandler.h>
      32             : #include <utils/xml/SAXWeightsHandler.h>
      33             : #include <foreign/rtree/SUMORTree.h>
      34             : #include <foreign/rtree/LayeredRTree.h>
      35             : #include <utils/geom/PositionVector.h>
      36             : #include <utils/gui/globjects/GUIGlObjectStorage.h>
      37             : #include <utils/gui/globjects/GUIGLObjectPopupMenu.h>
      38             : #include <utils/gui/globjects/GUIGlObject.h>
      39             : #include <utils/gui/globjects/GUIGlObject_AbstractAdd.h>
      40             : 
      41             : 
      42             : // ===========================================================================
      43             : // class declarations
      44             : // ===========================================================================
      45             : class MSEdgeControl;
      46             : class MSJunctionControl;
      47             : class MSTLLogicControl;
      48             : class MSTrafficLightLogic;
      49             : class MSLink;
      50             : class GUIJunctionWrapper;
      51             : class GUIDetectorWrapper;
      52             : class GUICalibrator;
      53             : class GUITrafficLightLogicWrapper;
      54             : class RGBColor;
      55             : class GUIEdge;
      56             : class OutputDevice;
      57             : class GUIVehicle;
      58             : class GUIVehicleControl;
      59             : class MSVehicleControl;
      60             : class GUIMEVehicleControl;
      61             : class Command;
      62             : 
      63             : 
      64             : // ===========================================================================
      65             : // class definitions
      66             : // ===========================================================================
      67             : /**
      68             :  * @class GUINet
      69             :  * @brief A MSNet extended by some values for usage within the gui
      70             :  *
      71             :  * This gui version of the network allows the retrieval of some more
      72             :  * information than the normal network version does. Due to this, not only
      73             :  * these retrieval, but also some further initialisation methods must have
      74             :  * been implemented. Nonethenless, this class has almost the same functions
      75             :  * as the MSNet-class.
      76             :  *
      77             :  * Some microsimulation items are wrapped in certain classes to allow their
      78             :  * drawing and their enumerated access. This enumeration is realised by
      79             :  * inserting the wrapped items into vectors and is needed to fasten the
      80             :  * network's drawing as only visible items are being drawn.
      81             :  */
      82             : class GUINet : public MSNet, public GUIGlObject {
      83             : 
      84             :     friend class GUITrafficLightLogicWrapper; // see createTLWrapper
      85             : 
      86             : public:
      87             :     /** @brief Constructor
      88             :      * @param[in] vc The vehicle control to use
      89             :      * @param[in] beginOfTimestepEvents The event control to use for simulation step begin events
      90             :      * @param[in] endOfTimestepEvents The event control to use for simulation step end events
      91             :      * @param[in] insertionEvents The event control to use for insertion events
      92             :      * @exception ProcessError If a network was already constructed
      93             :      */
      94             :     GUINet(MSVehicleControl* vc, MSEventControl* beginOfTimestepEvents,
      95             :            MSEventControl* endOfTimestepEvents,
      96             :            MSEventControl* insertionEvents);
      97             : 
      98             : 
      99             :     /// @brief Destructor
     100             :     ~GUINet();
     101             : 
     102             : 
     103             :     /**
     104             :      * @brief Returns whether this is a GUI Net
     105             :      */
     106          35 :     bool isGUINet() const override {
     107          35 :         return true;
     108             :     }
     109             : 
     110             : 
     111             :     /// @name inherited from GUIGlObject
     112             :     //@{
     113             : 
     114             :     /** @brief Returns an own popup-menu
     115             :      *
     116             :      * @param[in] app The application needed to build the popup-menu
     117             :      * @param[in] parent The parent window needed to build the popup-menu
     118             :      * @return The built popup-menu
     119             :      * @see GUIGlObject::getPopUpMenu
     120             :      */
     121             :     GUIGLObjectPopupMenu* getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) override;
     122             : 
     123             :     /** @brief Returns an own parameter window
     124             :      *
     125             :      * @param[in] app The application needed to build the parameter window
     126             :      * @param[in] parent The parent window needed to build the parameter window
     127             :      * @return The built parameter window
     128             :      * @see GUIGlObject::getParameterWindow
     129             :      */
     130             :     GUIParameterTableWindow* getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& parent) override;
     131             : 
     132             :     /** @brief Returns the boundary to which the view shall be centered in order to show the object
     133             :      *
     134             :      * @return The boundary the object is within
     135             :      * @see GUIGlObject::getCenteringBoundary
     136             :      */
     137             :     Boundary getCenteringBoundary() const override;
     138             : 
     139             :     /** @brief Draws the object
     140             :      * @param[in] s The settings for the current view (may influence drawing)
     141             :      * @see GUIGlObject::drawGL
     142             :      */
     143             :     void drawGL(const GUIVisualizationSettings& s) const override;
     144             :     //@}
     145             : 
     146             : 
     147             :     /// returns the bounder of the network
     148             :     const Boundary& getBoundary() const;
     149             : 
     150             :     /// returns the position of a junction
     151             :     Position getJunctionPosition(const std::string& name) const;
     152             : 
     153             :     /// returns the information whether the vehicle still exists
     154             :     bool vehicleExists(const std::string& name) const;
     155             : 
     156             :     /// Some further steps needed for gui processing
     157             :     void guiSimulationStep();
     158             : 
     159             :     /** @brief Performs a single simulation step (locking the simulation)
     160             :      */
     161             :     void simulationStep();
     162             : 
     163             :     /// @name functions for performance measurements
     164             :     /// @{
     165             : 
     166             :     /** @brief Returns the duration of the last step (sim+visualisation+idle) (in ms)
     167             :      * @return How long it took to compute and display the last step
     168             :      */
     169             :     int getWholeDuration() const;
     170             : 
     171             : 
     172             :     /** @brief Returns the duration of the last step's simulation part (in ms)
     173             :      * @return How long it took to compute the last step
     174             :      */
     175             :     int getSimDuration() const;
     176             : 
     177             : 
     178             :     /// Returns the simulation speed as a factor to real time
     179             :     double getRTFactor() const;
     180             : 
     181             :     /// Returns the update per seconds rate
     182             :     double getUPS() const;
     183             : 
     184             :     /// Returns the simulation speed as a factor to real time
     185             :     double getMeanRTFactor(int duration) const;
     186             : 
     187             :     /// Returns the update per seconds rate
     188             :     double getMeanUPS() const;
     189             : 
     190             :     // Returns the duration of the last step's visualisation part (in ms)
     191             :     //int getVisDuration() const;
     192             : 
     193             :     /// Returns the duration of the last step's idle part (in ms)
     194             :     int getIdleDuration() const;
     195             : 
     196             :     /// Sets the duration of the last step's simulation part
     197             :     void setSimDuration(int val);
     198             : 
     199             :     // Sets the duration of the last step's visualisation part
     200             :     //void setVisDuration(int val);
     201             : 
     202             :     /// Sets the duration of the last step's idle part
     203             :     void setIdleDuration(int val);
     204             :     //}
     205             : 
     206           0 :     double getAvgRouteLength() const {
     207           0 :         return MSDevice_Tripinfo::getAvgRouteLength();
     208             :     }
     209           0 :     double getAvgDuration() const {
     210           0 :         return MSDevice_Tripinfo::getAvgDuration();
     211             :     }
     212           0 :     double getAvgWaitingTime() const {
     213           0 :         return MSDevice_Tripinfo::getAvgWaitingTime();
     214             :     }
     215           0 :     double getAvgTimeLoss() const {
     216           0 :         return MSDevice_Tripinfo::getAvgTimeLoss();
     217             :     }
     218           0 :     double getAvgDepartDelay() const {
     219           0 :         return MSDevice_Tripinfo::getAvgDepartDelay();
     220             :     }
     221           0 :     double getAvgTripSpeed() const {
     222           0 :         return MSDevice_Tripinfo::getAvgDuration() != 0 ? MSDevice_Tripinfo::getAvgRouteLength() / MSDevice_Tripinfo::getAvgDuration() : 0;
     223             :     }
     224           0 :     double getAvgWalkRouteLength() const {
     225           0 :         return MSDevice_Tripinfo::getAvgWalkRouteLength();
     226             :     }
     227           0 :     double getAvgWalkDuration() const {
     228           0 :         return MSDevice_Tripinfo::getAvgWalkDuration();
     229             :     }
     230           0 :     double getAvgWalkTimeLoss() const {
     231           0 :         return MSDevice_Tripinfo::getAvgWalkTimeLoss();
     232             :     }
     233             : 
     234             :     /** @brief Returns the person control
     235             :      *
     236             :      * If the person control does not exist, yet, it is created.
     237             :      *
     238             :      * @return The person control
     239             :      * @see MSPersonControl
     240             :      * @see myPersonControl
     241             :      */
     242             :     MSTransportableControl& getPersonControl() override;
     243             : 
     244             : 
     245             :     /** @brief Returns the container control
     246             :      *
     247             :      * If the container control does not exist, yet, it is created.
     248             :      *
     249             :      * @return The container control
     250             :      * @see MSContainerControl
     251             :      * @see myContainerControl
     252             :      */
     253             :     MSTransportableControl& getContainerControl() override;
     254             : 
     255             : 
     256             :     /** Returns the gl-id of the traffic light that controls the given link
     257             :      * valid only if the link is controlled by a tls */
     258             :     int getLinkTLID(const MSLink* const link) const;
     259             : 
     260             :     /** Returns the index of the link within the junction that controls the given link;
     261             :      * Returns -1 if the link is not controlled by a tls */
     262             :     int getLinkTLIndex(const MSLink* const link) const;
     263             : 
     264             : 
     265             :     /// @name locator-methods
     266             :     //@{
     267             : 
     268             :     /* @brief Returns the gl-ids of all junctions within the net
     269             :      * @param[in] includeInternal Whether to include ids of internal junctions
     270             :      */
     271             :     std::vector<GUIGlID> getJunctionIDs(bool includeInternal) const;
     272             : 
     273             :     /// Returns the gl-ids of all traffic light logics within the net
     274             :     std::vector<GUIGlID> getTLSIDs() const;
     275             :     //@}
     276             : 
     277             : 
     278             :     /// Initialises gui wrappers
     279             :     void initGUIStructures();
     280             : 
     281             : 
     282             :     /** @brief Returns the RTree used for visualisation speed-up
     283             :      * @return The visualisation speed-up
     284             :      */
     285             :     SUMORTree& getVisualisationSpeedUp() {
     286       10393 :         return myGrid;
     287             :     }
     288             : 
     289             : 
     290             :     /** @brief Returns the RTree used for visualisation speed-up
     291             :      * @return The visualisation speed-up
     292             :      */
     293             :     const SUMORTree& getVisualisationSpeedUp(bool secondary = false) const {
     294      555500 :         return secondary ? myGrid2 : myGrid;
     295             :     }
     296             : 
     297             :     /// @brief add object into rtree
     298             :     void registerRenderedObject(GUIGlObject* o);
     299             : 
     300             :     /** @brief Returns the vehicle control
     301             :      * @return The vehicle control
     302             :      * @see MSVehicleControl
     303             :      * @see myVehicleControl
     304             :      */
     305             :     GUIVehicleControl* getGUIVehicleControl();
     306             : 
     307             :     /** @brief Returns the vehicle control
     308             :      * @return The vehicle control
     309             :      * @see MSVehicleControl
     310             :      * @see myVehicleControl
     311             :      */
     312             :     GUIMEVehicleControl* getGUIMEVehicleControl();
     313             : 
     314             :     /// @brief retrieve loaded edged weight for the given attribute and the current simulation time
     315             :     double getEdgeData(const MSEdge* edge, const std::string& attr);
     316             : 
     317             :     /// @brief retrieve live lane/edge weight for the given meanData id and attribute
     318             :     double getMeanData(const MSLane* lane, const std::string& id, const std::string& attr);
     319             : 
     320             :     /// @brief load edgeData from file
     321             :     bool loadEdgeData(const std::string& file);
     322             : 
     323             :     /// @brief return list of loaded edgeData attributes
     324             :     std::vector<std::string> getEdgeDataAttrs() const;
     325             : 
     326             :     /// @brief return list of loaded edgeData ids (being computed in the current simulation)
     327             :     std::vector<std::string> getMeanDataIDs() const;
     328             : 
     329             :     /// @brief return list of available attributes for the given meanData id
     330             :     std::vector<std::string> getMeanDataAttrs(const std::string& meanDataID) const;
     331             : 
     332             : #ifdef HAVE_OSG
     333             :     void updateColor(const GUIVisualizationSettings& s);
     334             : #endif
     335             : 
     336             :     /// @brief grant exclusive access to the simulation state
     337             :     void lock();
     338             : 
     339             :     /// @brief release exclusive access to the simulation state
     340             :     void unlock();
     341             : 
     342             :     /** @brief Returns the pointer to the unique instance of GUINet (singleton).
     343             :      * @return Pointer to the unique GUINet-instance
     344             :      * @exception ProcessError If a network was not yet constructed
     345             :      */
     346             :     static GUINet* getGUIInstance();
     347             : 
     348             :     /// @brief creates a wrapper for the given logic
     349             :     void createTLWrapper(MSTrafficLightLogic* tll) override;
     350             : 
     351             :     /// @brief return wheter the given logic (or rather it's wrapper) is selected in the GUI
     352             :     bool isSelected(const MSTrafficLightLogic* tll) const override;
     353             : 
     354             :     /// @brief update view after simulation.loadState
     355             :     void updateGUI() const override;
     356             : 
     357             :     /// @brief register custom hotkey action
     358             :     void addHotkey(int key, Command* press, Command* release = nullptr);
     359             : 
     360             :     /// @brief flush outputs once the simulation has reached its end
     361             :     void flushOutputsAtEnd();
     362             : 
     363     1406103 :     virtual bool skipFinalReset() const override {
     364     1406103 :         return mySkipFinalReset;
     365             :     }
     366             : 
     367             : private:
     368             :     /// @brief Initialises the tl-logic map and wrappers
     369             :     void initTLMap();
     370             : 
     371             :     friend class GUIOSGBuilder;
     372             : 
     373             : protected:
     374             :     /// @brief The visualization speed-up
     375             :     LayeredRTree myGrid;
     376             : 
     377             :     /// @brief The visualization speed-up for secondary shapes
     378             :     SUMORTree myGrid2;
     379             : 
     380             :     /// @brief The networks boundary
     381             :     Boundary myBoundary;
     382             : 
     383             :     /// @brief Wrapped MS-edges
     384             :     std::vector<GUIEdge*> myEdgeWrapper;
     385             : 
     386             :     /// @brief Wrapped MS-junctions
     387             :     std::vector<GUIJunctionWrapper*> myJunctionWrapper;
     388             : 
     389             :     /// @brief A detector dictionary
     390             :     std::vector<GUIDetectorWrapper*> myDetectorWrapper;
     391             : 
     392             :     /// @brief A calibrator dictionary
     393             :     std::vector<GUICalibrator*> myCalibratorWrapper;
     394             : 
     395             :     /// @brief Definition of a link-to-logic-id map
     396             :     typedef std::map<const MSLink*, std::string> Links2LogicMap;
     397             :     /// @brief The link-to-logic-id map
     398             :     Links2LogicMap myLinks2Logic;
     399             : 
     400             : 
     401             :     /// @brief Definition of a traffic light-to-wrapper map
     402             :     typedef std::map<MSTrafficLightLogic*, GUITrafficLightLogicWrapper*> Logics2WrapperMap;
     403             :     /// @brief The traffic light-to-wrapper map
     404             :     Logics2WrapperMap myLogics2Wrapper;
     405             : 
     406             : 
     407             :     /// @brief The step durations (simulation, /*visualisation, */idle)
     408             :     int myLastSimDuration, /*myLastVisDuration, */myLastIdleDuration;
     409             : 
     410             :     long myLastVehicleMovementCount, myOverallVehicleCount;
     411             :     long myOverallSimDuration;
     412             : 
     413             :     /// @brief loaded edge data for visualization
     414             :     std::map<std::string, MSEdgeWeightsStorage*> myLoadedEdgeData;
     415             : 
     416             :     bool mySkipFinalReset = false;
     417             : 
     418             :     /// @brief class for discovering edge attributes
     419             :     class DiscoverAttributes : public SUMOSAXHandler {
     420             :     public:
     421           0 :         DiscoverAttributes(const std::string& file):
     422           0 :             SUMOSAXHandler(file), firstIntervalBegin(SUMOTime_MAX), lastIntervalEnd(0), numIntervals(0) {};
     423           0 :         ~DiscoverAttributes() {};
     424             :         void myStartElement(int element, const SUMOSAXAttributes& attrs);
     425             :         std::vector<std::string> getEdgeAttrs();
     426             :         SUMOTime firstIntervalBegin;
     427             :         SUMOTime lastIntervalEnd;
     428             :         int numIntervals;
     429             :     private:
     430             :         std::set<std::string> edgeAttrs;
     431             :     };
     432             : 
     433           0 :     class EdgeFloatTimeLineRetriever_GUI : public SAXWeightsHandler::EdgeFloatTimeLineRetriever {
     434             :     public:
     435             :         /// @brief Constructor
     436           0 :         EdgeFloatTimeLineRetriever_GUI(MSEdgeWeightsStorage* weightStorage) : myWeightStorage(weightStorage) {}
     437             : 
     438             :         /// @brief Destructor
     439           0 :         ~EdgeFloatTimeLineRetriever_GUI() { }
     440             : 
     441             :         /** @brief Adds an effort for a given edge and time period
     442             :          *
     443             :          * @param[in] id The id of the object to add a weight for
     444             :          * @param[in] val The effort
     445             :          * @param[in] beg The begin of the interval the weight is valid for
     446             :          * @param[in] end The end of the interval the weight is valid for
     447             :          * @see SAXWeightsHandler::EdgeFloatTimeLineRetriever::addEdgeWeight
     448             :          */
     449             :         void addEdgeWeight(const std::string& id, double val, double beg, double end) const;
     450             :         void addEdgeRelWeight(const std::string& from, const std::string& to, double val, double beg, double end) const;
     451             : 
     452             :     private:
     453             :         /// @brief The storage that  edges shall be added to
     454             :         MSEdgeWeightsStorage* myWeightStorage;
     455             : 
     456             :     };
     457             : 
     458             : private:
     459             :     /// The mutex used to avoid concurrent updates of the vehicle buffer
     460             :     mutable FXMutex myLock;
     461             : 
     462             : };

Generated by: LCOV version 1.14