Eclipse SUMO - Simulation of Urban MObility
GNEVehicleFrame.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2020 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 // The Widget for add Vehicles/Flows/Trips/etc. elements
19 /****************************************************************************/
20 #include <config.h>
21 
22 #include <netedit/GNENet.h>
23 #include <netedit/GNEViewNet.h>
28 
29 #include "GNEVehicleFrame.h"
30 
31 // ===========================================================================
32 // method definitions
33 // ===========================================================================
34 
35 // ---------------------------------------------------------------------------
36 // GNEVehicleFrame::HelpCreation - methods
37 // ---------------------------------------------------------------------------
38 
40  FXGroupBox(vehicleFrameParent->myContentFrame, "Help", GUIDesignGroupBoxFrame),
41  myVehicleFrameParent(vehicleFrameParent) {
42  myInformationLabel = new FXLabel(this, "", 0, GUIDesignLabelFrameInformation);
43 }
44 
45 
47 
48 
49 void
51  // first update help cration
52  updateHelpCreation();
53  // show modul
54  show();
55 }
56 
57 
58 void
60  hide();
61 }
62 
63 void
65  // create information label
66  std::ostringstream information;
67  // set text depending of selected vehicle type
68  switch (myVehicleFrameParent->myVehicleTagSelector->getCurrentTagProperties().getTag()) {
69  case SUMO_TAG_VEHICLE:
70  information
71  << "- Click over a route to\n"
72  << " create a vehicle.";
73  break;
74  case SUMO_TAG_TRIP:
75  information
76  << "- Select two edges to\n"
77  << " create a Trip.";
78  break;
79  case GNE_TAG_FLOW_ROUTE:
80  information
81  << "- Click over a route to\n"
82  << " create a routeFlow.";
83  break;
84  case SUMO_TAG_FLOW:
85  information
86  << "- Select two edges to\n"
87  << " create a flow.";
88  break;
89  default:
90  break;
91  }
92  // set information label
93  myInformationLabel->setText(information.str().c_str());
94 }
95 
96 // ---------------------------------------------------------------------------
97 // GNEVehicleFrame - methods
98 // ---------------------------------------------------------------------------
99 
100 GNEVehicleFrame::GNEVehicleFrame(FXHorizontalFrame* horizontalFrameParent, GNEViewNet* viewNet) :
101  GNEFrame(horizontalFrameParent, viewNet, "Vehicles") {
102 
103  // Create item Selector modul for vehicles
104  myVehicleTagSelector = new GNEFrameModuls::TagSelector(this, GNETagProperties::TagType::VEHICLE);
105 
106  // Create vehicle type selector
108 
109  // Create vehicle parameters
111 
112  // create PathCreator Modul
114 
115  // Create Help Creation Modul
116  myHelpCreation = new HelpCreation(this);
117 
118  // set Vehicle as default vehicle
120 }
121 
122 
124 
125 
126 void
128  // refresh item selector
130  // show frame
131  GNEFrame::show();
132 }
133 
134 
135 void
137  // reset candidate edges
138  for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
139  edge.second->resetCandidateFlags();
140  }
141  // hide frame
142  GNEFrame::hide();
143 }
144 
145 
146 bool
148  // obtain tag (only for improve code legibility)
150  const bool addEdge = ((vehicleTag == SUMO_TAG_TRIP) || (vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) || (vehicleTag == SUMO_TAG_FLOW) || (vehicleTag == GNE_TAG_FLOW_WITHROUTE));
151  // first check that current selected vehicle is valid
152  if (vehicleTag == SUMO_TAG_NOTHING) {
153  myViewNet->setStatusBarText("Current selected vehicle isn't valid.");
154  return false;
155  }
156  // now check if VType is valid
157  if (myVTypeSelector->getCurrentDemandElement() == nullptr) {
158  myViewNet->setStatusBarText("Current selected vehicle type isn't valid.");
159  return false;
160  }
161  // now check if parameters are valid
164  return false;
165  }
166  // Declare map to keep attributes from Frames from Frame
167  std::map<SumoXMLAttr, std::string> valuesMap = myVehicleAttributes->getAttributesAndValues(false);
168  // Check if ID has to be generated
169  if (valuesMap.count(SUMO_ATTR_ID) == 0) {
170  valuesMap[SUMO_ATTR_ID] = myViewNet->getNet()->generateDemandElementID(vehicleTag);
171  }
172  // add VType
174  // set route or edges depending of vehicle type
175  if ((vehicleTag == SUMO_TAG_VEHICLE) || (vehicleTag == GNE_TAG_FLOW_ROUTE)) {
176  if (objectsUnderCursor.getDemandElementFront() && (objectsUnderCursor.getDemandElementFront()->getTagProperty().isRoute())) {
177  // obtain route
178  valuesMap[SUMO_ATTR_ROUTE] = (objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) ? objectsUnderCursor.getDemandElementFront()->getID() : "embedded";
179  // check if departLane is valid
180  if ((objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) &&
181  (valuesMap.count(SUMO_ATTR_DEPARTLANE) > 0) && GNEAttributeCarrier::canParse<double>(valuesMap[SUMO_ATTR_DEPARTLANE])) {
182  double departLane = GNEAttributeCarrier::parse<double>(valuesMap[SUMO_ATTR_DEPARTLANE]);
183  if (departLane >= objectsUnderCursor.getDemandElementFront()->getParentEdges().front()->getLanes().size()) {
185  return false;
186  }
187  }
188  // check if departSpeed is valid
189  if ((valuesMap.count(SUMO_ATTR_DEPARTSPEED) > 0) && GNEAttributeCarrier::canParse<double>(valuesMap[SUMO_ATTR_DEPARTSPEED])) {
190  double departSpeed = GNEAttributeCarrier::parse<double>(valuesMap[SUMO_ATTR_DEPARTSPEED]);
193  return false;
194  }
195  }
196  // check if we're creating a vehicle or a flow
197  if (vehicleTag == SUMO_TAG_VEHICLE) {
198  // Add parameter departure
199  if (valuesMap[SUMO_ATTR_DEPART].empty()) {
200  valuesMap[SUMO_ATTR_DEPART] = "0";
201  }
202  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
203  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
204  // obtain vehicle parameters in vehicleParameters
205  SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
206  // check if vehicle was sucesfully created)
207  if (vehicleParameters) {
208  // check if we're creating a vehicle over a existent route or over a embedded route
209  if (objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) {
210  GNERouteHandler::buildVehicleOverRoute(myViewNet->getNet(), true, *vehicleParameters);
211  }
212  // delete vehicleParameters
213  delete vehicleParameters;
214  }
215  } else {
216  // set begin and end attributes
217  if (valuesMap[SUMO_ATTR_BEGIN].empty()) {
218  valuesMap[SUMO_ATTR_BEGIN] = "0";
219  }
220  if (valuesMap[SUMO_ATTR_END].empty()) {
221  valuesMap[SUMO_ATTR_END] = "3600";
222  }
223  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
224  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
225  // obtain routeFlow parameters in routeFlowParameters
226  SUMOVehicleParameter* routeFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, 0, SUMOTime_MAX);
227  // check if flow was sucesfully created)
228  if (routeFlowParameters) {
229  // check if we're creating a vehicle over a existent route or over a embedded route
230  if (objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) {
231  GNERouteHandler::buildFlowOverRoute(myViewNet->getNet(), true, *routeFlowParameters);
232  }
233  // delete routeFlowParameters
234  delete routeFlowParameters;
235  }
236  }
237  // refresh myVehicleAttributes
239  // all ok, then return true;
240  return true;
241  } else {
242  myViewNet->setStatusBarText(toString(vehicleTag) + " has to be placed within a route.");
243  return false;
244  }
245  } else if (addEdge && objectsUnderCursor.getEdgeFront()) {
246  // add clicked edge in PathCreator
247  return myPathCreator->addEdge(objectsUnderCursor.getEdgeFront(), mouseButtonKeyPressed.shiftKeyPressed(), mouseButtonKeyPressed.controlKeyPressed());
248  } else {
249  return false;
250  }
251 }
252 
253 
256  return myPathCreator;
257 }
258 
259 // ===========================================================================
260 // protected
261 // ===========================================================================
262 
263 void
266  // show vehicle type selector modul
268  // show path creator modul
270  } else {
271  // hide all moduls if vehicle isn't valid
275  }
276 }
277 
278 
279 void
282  // show vehicle attributes modul
284  // set current VTypeClass in TripCreator
286  // show help creation
288  } else {
289  // hide all moduls if selected item isn't valid
291  // hide help creation
293 
294  }
295 }
296 
297 
298 void
300  // obtain tag (only for improve code legibility)
302  const bool embebbedRoute = ((vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) || (vehicleTag == GNE_TAG_FLOW_WITHROUTE));
303  // check number of edges
304  if ((myPathCreator->getSelectedEdges().size() > 1) || (myPathCreator->getSelectedEdges().size() > 0 && embebbedRoute)) {
305  // Declare map to keep attributes from Frames from Frame
306  std::map<SumoXMLAttr, std::string> valuesMap = myVehicleAttributes->getAttributesAndValues(false);
307  // Check if ID has to be generated
308  if (valuesMap.count(SUMO_ATTR_ID) == 0) {
309  valuesMap[SUMO_ATTR_ID] = myViewNet->getNet()->generateDemandElementID(vehicleTag);
310  }
311  // add VType
313  // extract via attribute
314  std::vector<GNEEdge*> viaEdges;
315  for (int i = 1; i < ((int)myPathCreator->getSelectedEdges().size() - 1); i++) {
316  viaEdges.push_back(myPathCreator->getSelectedEdges().at(i));
317  }
318  // continue depending of tag
319  if (vehicleTag == SUMO_TAG_TRIP) {
320  // Add parameter departure
321  if (valuesMap[SUMO_ATTR_DEPART].empty()) {
322  valuesMap[SUMO_ATTR_DEPART] = "0";
323  }
324  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
325  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
326  // obtain trip parameters
327  SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
328  // build trip in GNERouteHandler
329  GNERouteHandler::buildTrip(myViewNet->getNet(), true, *tripParameters, myPathCreator->getSelectedEdges().front(), myPathCreator->getSelectedEdges().back(), viaEdges);
330  // delete tripParameters
331  delete tripParameters;
332  } else if (vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) {
333  // Add parameter departure
334  if (valuesMap[SUMO_ATTR_DEPART].empty()) {
335  valuesMap[SUMO_ATTR_DEPART] = "0";
336  }
337  // get route edges
338  std::vector<GNEEdge*> routeEdges;
339  for (const auto& subPath : myPathCreator->getPath()) {
340  for (const auto& edge : subPath.getSubPath()) {
341  routeEdges.push_back(edge);
342  }
343  }
344  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
345  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
346  // obtain vehicle parameters
347  SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);
348  // build vehicle with embebbed route in GNERouteHandler
349  GNERouteHandler::buildVehicleEmbeddedRoute(myViewNet->getNet(), true, *vehicleParameters, routeEdges);
350  // delete vehicleParamters
351  delete vehicleParameters;
352  } else if (vehicleTag == SUMO_TAG_FLOW) {
353  // Add parameter departure
354  if (valuesMap[SUMO_ATTR_DEPART].empty()) {
355  valuesMap[SUMO_ATTR_DEPART] = "0";
356  }
357  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
358  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
359  // obtain flow parameters
360  SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, 0, SUMOTime_MAX);
361  // build trip in GNERouteHandler
362  GNERouteHandler::buildFlow(myViewNet->getNet(), true, *flowParameters, myPathCreator->getSelectedEdges().front(), myPathCreator->getSelectedEdges().back(), viaEdges);
363  // delete tripParameters
364  delete flowParameters;
365  } else if (vehicleTag == GNE_TAG_FLOW_WITHROUTE) {
366  // set begin and end attributes
367  if (valuesMap[SUMO_ATTR_BEGIN].empty()) {
368  valuesMap[SUMO_ATTR_BEGIN] = "0";
369  }
370  // get route edges
371  std::vector<GNEEdge*> routeEdges;
372  for (const auto& subPath : myPathCreator->getPath()) {
373  for (const auto& edge : subPath.getSubPath()) {
374  routeEdges.push_back(edge);
375  }
376  }
377  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
378  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
379  // obtain flow parameters
380  SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, 0, SUMOTime_MAX);
381  // build flow with embebbed route in GNERouteHandler
382  GNERouteHandler::buildFlowEmbeddedRoute(myViewNet->getNet(), true, *flowParameters, routeEdges);
383  // delete flowParameters
384  delete flowParameters;
385  }
386  // abort path creation
388  // refresh myVehicleAttributes
390  }
391 }
392 
393 
394 /****************************************************************************/
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:278
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition: GUIDesigns.h:223
#define SUMOTime_MAX
Definition: SUMOTime.h:32
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_VTYPE
description of a vehicle type
@ SUMO_TAG_NOTHING
invalid tag
@ SUMO_TAG_VEHICLE
description of a vehicle
@ GNE_TAG_FLOW_ROUTE
a flow definition using a route instead of a from-to edges route (used in NETEDIT)
@ GNE_TAG_FLOW_WITHROUTE
description of a vehicle with an embedded route (used in NETEDIT)
@ SUMO_TAG_FLOW
a flow definitio nusing a from-to edges instead of a route (used by router)
@ SUMO_TAG_ROUTE
begin/end of the description of a route
@ GNE_TAG_VEHICLE_WITHROUTE
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_DEPARTSPEED
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_DEPARTLANE
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ROUTE
@ SUMO_ATTR_MAXSPEED
@ SUMO_ATTR_ID
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:44
const GNETagProperties & getTagProperty() const
get Tag Property assigned to this object
virtual SUMOVehicleClass getVClass() const =0
virtual double getAttributeDouble(SumoXMLAttr key) const =0
const std::string & getID() const
get ID
void refreshRows()
refresh rows (called after creating an element)
void showAttributesCreatorModul(const GNETagProperties &tagProperties, const std::vector< SumoXMLAttr > &hiddenAttributes)
show AttributesCreator modul
std::map< SumoXMLAttr, std::string > getAttributesAndValues(bool includeAll) const
get attributes and their values
bool areValuesValid() const
check if parameters of attributes are valid
void showWarningMessage(std::string extra="") const
show warning message with information about non-valid attributes
GNEViewNet * myViewNet
View Net.
Definition: GNEFrame.h:113
virtual void show()
show Frame
Definition: GNEFrame.cpp:108
virtual void hide()
hide Frame
Definition: GNEFrame.cpp:117
const std::vector< std::string > & getPredefinedTagsMML() const
get predefinedTagsMML
Definition: GNEFrame.cpp:269
GNEDemandElement * getCurrentDemandElement() const
get current demand element
void showDemandElementSelector()
show demand element selector
void hideDemandElementSelector()
hide demand element selector
std::vector< GNEEdge * > getSelectedEdges() const
get current selected additionals
const std::vector< Path > & getPath() const
get path route
void abortPathCreation()
abort path creation
void showPathCreatorModul(SumoXMLTag tag, const bool firstElement, const bool consecutives)
show PathCreator for the given tag
bool addEdge(GNEEdge *edge, const bool shiftKeyPressed, const bool controlKeyPressed)
add edge
void setVClass(SUMOVehicleClass vClass)
set vClass
void refreshTagProperties()
due myCurrentTagProperties is a Reference, we need to refresh it when frameParent is show
const GNETagProperties & getCurrentTagProperties() const
get current type tag
void setCurrentTag(SumoXMLTag newTag)
set current type manually
const std::vector< GNEEdge * > & getParentEdges() const
get parent edges
const std::map< std::string, GNEEdge * > & getEdges() const
map with the ID and pointer to edges of net
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
retrieve all attribute carriers of Net
Definition: GNENet.cpp:130
std::string generateDemandElementID(SumoXMLTag tag) const
generate demand element id
Definition: GNENet.cpp:2539
static void buildVehicleOverRoute(GNENet *net, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters)
build a vehicle over an existent route
static void buildFlowEmbeddedRoute(GNENet *net, bool undoDemandElements, SUMOVehicleParameter vehicleParameters, const std::vector< GNEEdge * > &edges)
build flow with a embedded route
static void buildVehicleEmbeddedRoute(GNENet *net, bool undoDemandElements, SUMOVehicleParameter vehicleParameters, const std::vector< GNEEdge * > &edges)
build vehicle with a embedded route
static void buildFlowOverRoute(GNENet *net, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters)
build a flow over an existent route
static void buildFlow(GNENet *net, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters, GNEEdge *fromEdge, GNEEdge *toEdge, const std::vector< GNEEdge * > &via)
build flow
static void buildTrip(GNENet *net, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters, GNEEdge *fromEdge, GNEEdge *toEdge, const std::vector< GNEEdge * > &via)
build trip
bool isRoute() const
return true if tag correspond to a route element
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
void showHelpCreation()
show HelpCreation
void hideHelpCreation()
hide HelpCreation
void updateHelpCreation()
update HelpCreation
HelpCreation(GNEVehicleFrame *vehicleFrameParent)
constructor
FXLabel * myInformationLabel
Label with creation information.
GNEFrameModuls::TagSelector * myVehicleTagSelector
vehicle tag selector (used to select diffent kind of vehicles)
void hide()
hide Frame
GNEFrameModuls::PathCreator * getPathCreator() const
get PathCreator modul
~GNEVehicleFrame()
Destructor.
void show()
show Frame
void createPath()
create path
bool addVehicle(const GNEViewNetHelper::ObjectsUnderCursor &objectsUnderCursor, const GNEViewNetHelper::MouseButtonKeyPressed &mouseButtonKeyPressed)
add vehicle element
void tagSelected()
Tag selected in TagSelector.
GNEFrameModuls::DemandElementSelector * myVTypeSelector
Vehicle Type selectors.
GNEVehicleFrame(FXHorizontalFrame *horizontalFrameParent, GNEViewNet *viewNet)
Constructor.
GNEFrameAttributesModuls::AttributesCreator * myVehicleAttributes
internal vehicle attributes
HelpCreation * myHelpCreation
Help creation.
GNEFrameModuls::PathCreator * myPathCreator
edge path creator (used for trips and flows)
void demandElementSelected()
selected vehicle type in DemandElementSelector
class used to group all variables related with objects under cursor after a click over view
GNEDemandElement * getDemandElementFront() const
get front demand element or a pointer to nullptr
GNEEdge * getEdgeFront() const
get front edge or a pointer to nullptr
GNENet * getNet() const
get the net object
void setStatusBarText(const std::string &text)
set staturBar text
Definition: GNEViewNet.cpp:575
Encapsulated Xerces-SAX-attributes.
Structure representing possible vehicle parameter.
static SUMOVehicleParameter * parseFlowAttributes(SumoXMLTag tag, const SUMOSAXAttributes &attrs, const bool hardFail, const SUMOTime beginDefault, const SUMOTime endDefault, bool isPerson=false)
Parses a flow's attributes.
static SUMOVehicleParameter * parseVehicleAttributes(int element, const SUMOSAXAttributes &attrs, const bool hardFail, const bool optionalID=false, const bool skipDepart=false)
Parses a vehicle's attributes.
class used to group all variables related with mouse buttons and key pressed after certain events
bool shiftKeyPressed() const
check if SHIFT is pressed during current event
bool controlKeyPressed() const
check if CONTROL is pressed during current event