Eclipse SUMO - Simulation of Urban MObility
GNEDemandElement.h
Go to the documentation of this file.
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 /****************************************************************************/
18 // A abstract class for demand elements
19 /****************************************************************************/
20 #pragma once
21 #include <config.h>
22 
23 #include <netedit/GNEMoveElement.h>
24 #include <netedit/GNEPathManager.h>
31 
33 
34 // ===========================================================================
35 // class declarations
36 // ===========================================================================
37 
38 class GNENet;
39 class GNEAdditional;
40 class GNEDemandElement;
41 class GNENetworkElement;
42 class GNEGenericData;
43 class GNEEdge;
44 class GNELane;
45 class GNEJunction;
46 
47 // ===========================================================================
48 // class definitions
49 // ===========================================================================
50 
52 
53 public:
55  friend class GNERouteHandler;
56  friend class GNEDemandElementFlow;
57  friend class GNEDemandElementPlan;
58 
60  enum class Problem {
61  OK, // There is no problem
62  INVALID_ELEMENT, // Element is invalid (for example, a route without edges)
63  INVALID_PATH, // Path (route, trip... ) is not valid (i.e is empty)
64  DISCONNECTED_PLAN, // Plan element (person, containers) is not connected with the previous or next plan
65  INVALID_STOPPOSITION, // StopPosition is invalid (only used in stops over edges or lanes
66  STOP_DOWNSTREAM, // Stops don't follow their route parent
67  REPEATEDROUTE_DISCONNECTED, // Repeated route is disconnected
68  NO_PLANS // Person or container doesn't have a plan
69  };
70 
84  GNEDemandElement(const std::string& id, GNENet* net, GUIGlObjectType type, SumoXMLTag tag, FXIcon* icon, const int pathOptions,
85  const std::vector<GNEJunction*>& junctionParents,
86  const std::vector<GNEEdge*>& edgeParents,
87  const std::vector<GNELane*>& laneParents,
88  const std::vector<GNEAdditional*>& additionalParents,
89  const std::vector<GNEDemandElement*>& demandElementParents,
90  const std::vector<GNEGenericData*>& genericDataParents);
91 
105  GNEDemandElement(GNEDemandElement* demandElementParent, GNENet* net, GUIGlObjectType type, SumoXMLTag tag, FXIcon* icon, const int pathOptions,
106  const std::vector<GNEJunction*>& junctionParents,
107  const std::vector<GNEEdge*>& edgeParents,
108  const std::vector<GNELane*>& laneParents,
109  const std::vector<GNEAdditional*>& additionalParents,
110  const std::vector<GNEDemandElement*>& demandElementParents,
111  const std::vector<GNEGenericData*>& genericDataParents);
112 
114  virtual ~GNEDemandElement();
115 
120 
122  void removeGeometryPoint(const Position clickedPosition, GNEUndoList* undoList);
123 
126 
128  const GUIGlObject* getGUIGlObject() const;
129 
132 
135 
137  GNEDemandElement* getNextChildDemandElement(const GNEDemandElement* demandElement) const;
138 
140  void updateDemandElementGeometry(const GNELane* lane, const double posOverLane);
141 
143  void updateDemandElementStackLabel(const int stack);
144 
146  void updateDemandElementSpreadGeometry(const GNELane* lane, const double posOverLane);
147 
150 
152  virtual SUMOVehicleClass getVClass() const = 0;
153 
155  virtual const RGBColor& getColor() const = 0;
156 
158 
161 
164  virtual void writeDemandElement(OutputDevice& device) const = 0;
165 
167  virtual Problem isDemandElementValid() const = 0;
168 
170  virtual std::string getDemandElementProblem() const = 0;
171 
173  virtual void fixDemandElementProblem() = 0;
175 
180  virtual void openDemandElementDialog();
181 
184 
186  virtual void updateGeometry() = 0;
187 
189  virtual Position getPositionInView() const = 0;
190 
192  virtual void splitEdgeGeometry(const double splitPosition, const GNENetworkElement* originalElement, const GNENetworkElement* newElement, GNEUndoList* undoList) = 0;
193 
195  const GUIGeometry& getDemandElementGeometry() const;
196 
198 
201 
203  bool checkDrawFromContour() const;
204 
206  bool checkDrawToContour() const;
207 
209  bool checkDrawRelatedContour() const;
210 
212  bool checkDrawOverContour() const;
213 
215  bool checkDrawDeleteContour() const;
216 
218  bool checkDrawSelectContour() const;
219 
221  bool checkDrawMoveContour() const;
222 
224 
227 
236 
245 
250  virtual void drawGL(const GUIVisualizationSettings& s) const = 0;
251 
253  bool isGLObjectLocked() const;
254 
256  void markAsFrontElement();
257 
259  void deleteGLObject();
260 
262  void selectGLObject();
263 
265  void updateGLObject();
266 
268 
272  virtual void computePathElement() = 0;
273 
275  bool isPathElementSelected() const;
276 
282  virtual void drawLanePartialGL(const GUIVisualizationSettings& s, const GNEPathManager::Segment* segment, const double offsetFront) const = 0;
283 
289  virtual void drawJunctionPartialGL(const GUIVisualizationSettings& s, const GNEPathManager::Segment* segment, const double offsetFront) const = 0;
290 
292  virtual GNELane* getFirstPathLane() const = 0;
293 
295  virtual GNELane* getLastPathLane() const = 0;
296 
298 
301  /* @brief method for getting the Attribute of an XML key
302  * @param[in] key The attribute key
303  * @return string with the value associated to key
304  */
305  virtual std::string getAttribute(SumoXMLAttr key) const = 0;
306 
307  /* @brief method for getting the Attribute of an XML key in double format (to avoid unnecessary parse<double>(...) for certain attributes)
308  * @param[in] key The attribute key
309  * @return double with the value associated to key
310  */
311  virtual double getAttributeDouble(SumoXMLAttr key) const = 0;
312 
313  /* @brief method for getting the Attribute of an XML key in Position format (used in person plans)
314  * @param[in] key The attribute key
315  * @return double with the value associated to key
316  */
317  virtual Position getAttributePosition(SumoXMLAttr key) const = 0;
318 
324  virtual void setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) = 0;
325 
331  virtual bool isValid(SumoXMLAttr key, const std::string& value) = 0;
332 
334  virtual const Parameterised::Map& getACParametersMap() const = 0;
335 
337  virtual std::string getPopUpID() const = 0;
338 
340  virtual std::string getHierarchyName() const = 0;
341 
343 
345  std::vector<GNEDemandElement*> getInvalidStops() const;
346 
347 protected:
350 
353 
356 
358  bool isValidDemandElementID(const std::string& value) const;
359 
361  bool isValidDemandElementID(const std::vector<SumoXMLTag>& tags, const std::string& value) const;
362 
364  void setDemandElementID(const std::string& newID);
365 
368 
371 
373  void drawJunctionLine(const GNEDemandElement* element) const;
374 
376  void drawStackLabel(const int number, const std::string& element, const Position& position, const double rotation, const double width, const double length, const double exaggeration) const;
377 
380 
382  void replaceDemandParentEdges(const std::string& value);
383 
385  void replaceDemandParentLanes(const std::string& value);
386 
388  void replaceFirstParentJunction(const std::string& value);
389 
391  void replaceLastParentJunction(const std::string& value);
392 
394  void replaceFirstParentEdge(const std::string& value);
395 
397  void replaceLastParentEdge(const std::string& value);
398 
400  void replaceFirstParentAdditional(SumoXMLTag tag, const std::string& value);
401 
403  void replaceLastParentAdditional(SumoXMLTag tag, const std::string& value);
404 
406  void replaceDemandElementParent(SumoXMLTag tag, const std::string& value, const int parentIndex);
407 
409  void setVTypeDistributionParent(const std::string& value);
410 
412 
414  struct EdgeStopIndex {
415 
418  edge(edge_),
419  stops({stop}) {}
420 
422  const GNEEdge* edge = nullptr;
423 
425  std::vector<GNEDemandElement*> stops;
426 
428  int stopIndex = -1;
429 
430  private:
433  };
434 
436  std::vector<EdgeStopIndex> getEdgeStopIndex() const;
437 
439  RGBColor getColorByScheme(const GUIColorer& c, const SUMOVehicleParameter* parameters) const;
440 
442  std::string getDistributionParents() const;
443 
446 
448  void buildMenuAddReverse(GUIGLObjectPopupMenu* ret) const;
449 
450 private:
454  virtual bool checkChildDemandElementRestriction() const;
455 
457  virtual void setAttribute(SumoXMLAttr key, const std::string& value) = 0;
458 
460  virtual void setMoveShape(const GNEMoveResult& moveResult) = 0;
461 
463  virtual void commitMoveShape(const GNEMoveResult& moveResult, GNEUndoList* undoList) = 0;
464 
467 
470 };
GUIGlObjectType
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
SumoXMLTag
Numbers representing SUMO-XML - element names.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
An Element which don't belong to GNENet but has influence in the simulation.
Definition: GNEAdditional.h:49
void buildMenuCommandRouteLength(GUIGLObjectPopupMenu *ret) const
build menu command route length
void replaceDemandParentEdges(const std::string &value)
replace demand parent edges
virtual GNEMoveOperation * getMoveOperation()=0
get move operation
virtual void updateGeometry()=0
update pre-computed geometry information
GNEDemandElement(const GNEDemandElement &)=delete
Invalidated copy constructor.
virtual void commitMoveShape(const GNEMoveResult &moveResult, GNEUndoList *undoList)=0
commit move shape
std::vector< GNEDemandElement * > getInvalidStops() const
get invalid stops
virtual SUMOVehicleClass getVClass() const =0
obtain VClass related with this demand element
void updateDemandElementGeometry(const GNELane *lane, const double posOverLane)
update element stacked geometry (stacked)
void replaceDemandElementParent(SumoXMLTag tag, const std::string &value, const int parentIndex)
replace demand element parent
void drawStackLabel(const int number, const std::string &element, const Position &position, const double rotation, const double width, const double length, const double exaggeration) const
draw stack label
virtual void setAttribute(SumoXMLAttr key, const std::string &value)=0
method for setting the attribute and nothing else (used in GNEChange_Attribute)
bool checkDrawOverContour() const
check if draw over contour (orange)
std::string getDistributionParents() const
get distribution in which the given element is part
GUIGeometry myDemandElementGeometry
demand element geometry (also called "stacked geometry")
virtual void setMoveShape(const GNEMoveResult &moveResult)=0
set move shape
virtual GNELane * getLastPathLane() const =0
get last path lane
virtual double getAttributeDouble(SumoXMLAttr key) const =0
bool isValidDemandElementID(const std::string &value) const
check if a new demand element ID is valid
GNEDemandElement * getNextChildDemandElement(const GNEDemandElement *demandElement) const
get next child demand element to the given demand element
void updateDemandElementStackLabel(const int stack)
update stack label
virtual void splitEdgeGeometry(const double splitPosition, const GNENetworkElement *originalElement, const GNENetworkElement *newElement, GNEUndoList *undoList)=0
split geometry
GNEDemandElement & operator=(const GNEDemandElement &)=delete
Invalidated assignment operator.
void replaceLastParentEdge(const std::string &value)
replace the last parent edge
void drawJunctionLine(const GNEDemandElement *element) const
draw line between junctions
virtual std::string getAttribute(SumoXMLAttr key) const =0
GUIGlObject * getGUIGlObject()
get GUIGlObject associated with this AttributeCarrier
bool isPathElementSelected() const
check if path element is selected
bool checkDrawToContour() const
check if draw from contour (magenta)
virtual void computePathElement()=0
compute pathElement
virtual Problem isDemandElementValid() const =0
check if current demand element is valid to be written into XML (by default true, can be reimplemente...
void replaceFirstParentAdditional(SumoXMLTag tag, const std::string &value)
replace the first parent additional
virtual void writeDemandElement(OutputDevice &device) const =0
write demand element element into a xml file
virtual std::string getPopUpID() const =0
get PopPup ID (Used in AC Hierarchy)
GNEDemandElement * getRouteParent() const
get route parent (always the second parent demand element)
virtual std::string getDemandElementProblem() const =0
return a string with the current demand element problem (by default empty, can be reimplemented in ch...
void selectGLObject()
select element
bool checkDrawMoveContour() const
check if draw move contour (red)
bool checkDrawDeleteContour() const
check if draw delete contour (pink/white)
void setDemandElementID(const std::string &newID)
set demand element id
GUIGeometry mySpreadGeometry
demand element spread geometry (Only used by vehicles and pedestrians)
void buildMenuAddReverse(GUIGLObjectPopupMenu *ret) const
build menu command route length
virtual const Parameterised::Map & getACParametersMap() const =0
get parameters map
void replaceFirstParentJunction(const std::string &value)
replace the first parent junction
std::vector< EdgeStopIndex > getEdgeStopIndex() const
get edgeStopIndex
bool checkDrawRelatedContour() const
check if draw related contour (cyan)
void setVTypeDistributionParent(const std::string &value)
set VTypeDistribution parent
void updateGLObject()
update GLObject (geometry, ID, etc.)
GNEDemandElement * getTypeParent() const
get type parent (needed because first parent can be either type or typeDistribution)
bool checkDrawSelectContour() const
check if draw select contour (blue)
void replaceDemandParentLanes(const std::string &value)
replace demand parent lanes
virtual GNELane * getFirstPathLane() const =0
get first path lane
void replaceFirstParentEdge(const std::string &value)
replace the first parent edge
int myStackedLabelNumber
stacked label number
virtual void drawLanePartialGL(const GUIVisualizationSettings &s, const GNEPathManager::Segment *segment, const double offsetFront) const =0
Draws partial object over lane.
virtual const RGBColor & getColor() const =0
get color
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
void updateDemandElementSpreadGeometry(const GNELane *lane, const double posOverLane)
update element spread geometry
virtual std::string getHierarchyName() const =0
get Hierarchy Name (Used in AC Hierarchy)
virtual Position getPositionInView() const =0
Returns position of demand element in view.
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
method for setting the attribute and letting the object perform demand element changes
RGBColor getColorByScheme(const GUIColorer &c, const SUMOVehicleParameter *parameters) const
get color by scheme (used by vehicles, persons and containers)
const GUIGeometry & getDemandElementGeometry()
get demand element geometry (stacked)
virtual GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
virtual bool checkChildDemandElementRestriction() const
check restriction with the number of children
virtual void drawJunctionPartialGL(const GUIVisualizationSettings &s, const GNEPathManager::Segment *segment, const double offsetFront) const =0
Draws partial object over junction.
Problem
enum class for demandElement problems
void removeGeometryPoint(const Position clickedPosition, GNEUndoList *undoList)
remove geometry point in the clicked position (Currently unused in shapes)
GNEDemandElement * getPreviousChildDemandElement(const GNEDemandElement *demandElement) const
get previous child demand element to the given demand element
bool isGLObjectLocked() const
check if element is locked
void markAsFrontElement()
mark element as front element
virtual bool isValid(SumoXMLAttr key, const std::string &value)=0
method for checking if the key and their conrrespond attribute are valids
void replaceLastParentAdditional(SumoXMLTag tag, const std::string &value)
replace the last parent additional
virtual void drawGL(const GUIVisualizationSettings &s) const =0
Draws the object.
virtual ~GNEDemandElement()
Destructor.
virtual void openDemandElementDialog()
open DemandElement Dialog
void deleteGLObject()
delete element
void replaceLastParentJunction(const std::string &value)
replace the last parent junction
bool checkDrawFromContour() const
check if draw from contour (green)
virtual Position getAttributePosition(SumoXMLAttr key) const =0
virtual void fixDemandElementProblem()=0
fix demand element problem (by default throw an exception, has to be reimplemented in children)
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:53
An Element which don't belong to GNENet but has influence in the simulation.
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition: GNELane.h:46
move element
move operation
move result
A NBNetBuilder extended by visualisation and editing capabilities.
Definition: GNENet.h:42
class used for path elements
Builds trigger objects for GNENet (busStops, chargingStations, detectors, etc..)
The popup menu of a globject.
A window containing a gl-object's parameter.
Stores the information about how to visualize structures.
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
std::map< std::string, std::string > Map
parameters map
Definition: Parameterised.h:45
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
Structure representing possible vehicle parameter.
auxiliar struct used for calculate pathStopIndex
int stopIndex
stopIndex (-1 menans out of route)
EdgeStopIndex(GNEEdge *edge_, GNEDemandElement *stop)
constructor
EdgeStopIndex()
default constructor (disabled)
const GNEEdge * edge
edge (obtained from segment)
std::vector< GNEDemandElement * > stops
list of stops placed in the edge