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

            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           29 :     bool isGUINet() const override {
     107           29 :         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        11007 :         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       538498 :         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      1413611 :     virtual bool skipFinalReset() const override {
     364      1413611 :         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 2.0-1