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-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
15 // The Widget for add Vehicles/Flows/Trips/etc. elements
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <netedit/GNENet.h>
24 #include <netedit/GNEViewNet.h>
31 
32 #include "GNEVehicleFrame.h"
33 
34 // ===========================================================================
35 // method definitions
36 // ===========================================================================
37 
38 // ---------------------------------------------------------------------------
39 // GNEVehicleFrame::HelpCreation - methods
40 // ---------------------------------------------------------------------------
41 
43  FXGroupBox(vehicleFrameParent->myContentFrame, "Help", GUIDesignGroupBoxFrame),
44  myVehicleFrameParent(vehicleFrameParent) {
45  myInformationLabel = new FXLabel(this, "", 0, GUIDesignLabelFrameInformation);
46 }
47 
48 
50 
51 
52 void
54  // first update help cration
56  // show modul
57  show();
58 }
59 
60 
61 void
63  hide();
64 }
65 
66 void
68  // create information label
69  std::ostringstream information;
70  // set text depending of selected vehicle type
72  case SUMO_TAG_VEHICLE:
73  information
74  << "- Click over a route to\n"
75  << " create a vehicle.";
76  break;
77  case SUMO_TAG_TRIP:
78  information
79  << "- Select two edges to\n"
80  << " create a Trip.";
81  break;
82  case SUMO_TAG_ROUTEFLOW:
83  information
84  << "- Click over a route to\n"
85  << " create a routeFlow.";
86  break;
87  case SUMO_TAG_FLOW:
88  information
89  << "- Select two edges to\n"
90  << " create a flow.";
91  break;
92  default:
93  break;
94  }
95  // set information label
96  myInformationLabel->setText(information.str().c_str());
97 }
98 
99 // ---------------------------------------------------------------------------
100 // GNEVehicleFrame - methods
101 // ---------------------------------------------------------------------------
102 
103 GNEVehicleFrame::GNEVehicleFrame(FXHorizontalFrame* horizontalFrameParent, GNEViewNet* viewNet) :
104  GNEFrame(horizontalFrameParent, viewNet, "Vehicles") {
105 
106  // Create item Selector modul for vehicles
107  myVehicleTagSelector = new GNEFrameModuls::TagSelector(this, GNEAttributeCarrier::TagType::TAGTYPE_VEHICLE);
108 
109  // Create vehicle type selector
111 
112  // Create vehicle parameters
114 
115  // create EdgePathCreator Modul
116  myEdgePathCreator = new GNEFrameModuls::EdgePathCreator(this, GNEFrameModuls::EdgePathCreator::EdgePathCreatorModes::GNE_EDGEPATHCREATOR_FROM_TO_VIA);
117 
118  // Create Help Creation Modul
119  myHelpCreation = new HelpCreation(this);
120 
121  // set Vehicle as default vehicle
123 }
124 
125 
127 
128 
129 void
131  // refresh item selector
133  // show frame
134  GNEFrame::show();
135 }
136 
137 
138 bool
140  // obtain tag (only for improve code legibility)
142  // first check that current selected vehicle is valid
143  if (vehicleTag == SUMO_TAG_NOTHING) {
144  myViewNet->setStatusBarText("Current selected vehicle isn't valid.");
145  return false;
146  }
147  // now check if VType is valid
148  if (myVTypeSelector->getCurrentDemandElement() == nullptr) {
149  myViewNet->setStatusBarText("Current selected vehicle type isn't valid.");
150  return false;
151  }
152  // now check if parameters are valid
155  return false;
156  }
157  // Declare map to keep attributes from Frames from Frame
158  std::map<SumoXMLAttr, std::string> valuesMap = myVehicleAttributes->getAttributesAndValues(false);
159  // add ID parameter
160  valuesMap[SUMO_ATTR_ID] = myViewNet->getNet()->generateDemandElementID("", vehicleTag);
161  // add VType
163  // set route or edges depending of vehicle type
164  if ((vehicleTag == SUMO_TAG_VEHICLE) || (vehicleTag == SUMO_TAG_ROUTEFLOW)) {
165  if (objectsUnderCursor.getDemandElementFront() && (objectsUnderCursor.getDemandElementFront()->getTagProperty().isRoute())) {
166  // obtain route
167  valuesMap[SUMO_ATTR_ROUTE] = (objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) ? objectsUnderCursor.getDemandElementFront()->getID() : "embedded";
168  // check if departLane is valid
169  if ((objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) &&
170  (valuesMap.count(SUMO_ATTR_DEPARTLANE) > 0) && GNEAttributeCarrier::canParse<double>(valuesMap[SUMO_ATTR_DEPARTLANE])) {
171  double departLane = GNEAttributeCarrier::parse<double>(valuesMap[SUMO_ATTR_DEPARTLANE]);
172  if (departLane >= objectsUnderCursor.getDemandElementFront()->getEdgeParents().front()->getLanes().size()) {
173  myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTLANE));
174  return false;
175  }
176  }
177  // check if departSpeed is valid
178  if ((valuesMap.count(SUMO_ATTR_DEPARTSPEED) > 0) && GNEAttributeCarrier::canParse<double>(valuesMap[SUMO_ATTR_DEPARTSPEED])) {
179  double departSpeed = GNEAttributeCarrier::parse<double>(valuesMap[SUMO_ATTR_DEPARTSPEED]);
181  myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTSPEED));
182  return false;
183  }
184  }
185  // check if we're creating a vehicle or a flow
186  if (vehicleTag == SUMO_TAG_VEHICLE) {
187  // Add parameter departure
188  if (valuesMap[SUMO_ATTR_DEPART].empty()) {
189  valuesMap[SUMO_ATTR_DEPART] = "0";
190  }
191  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
192  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
193  // obtain vehicle parameters in vehicleParameters
194  SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(SUMOSAXAttrs, false);
195  // check if vehicle was sucesfully created)
196  if (vehicleParameters) {
197  // check if we're creating a vehicle over a existent route or over a embedded route
198  if (objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) {
199  GNERouteHandler::buildVehicleOverRoute(myViewNet, true, *vehicleParameters);
200  } else {
201  GNERouteHandler::buildVehicleWithEmbeddedRoute(myViewNet, true, *vehicleParameters, objectsUnderCursor.getDemandElementFront());
202  }
203  // delete vehicleParameters
204  delete vehicleParameters;
205  }
206  } else {
207  // set begin and end attributes
208  if (valuesMap[SUMO_ATTR_BEGIN].empty()) {
209  valuesMap[SUMO_ATTR_BEGIN] = "0";
210  }
211  if (valuesMap[SUMO_ATTR_END].empty()) {
212  valuesMap[SUMO_ATTR_END] = "3600";
213  }
214  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
215  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
216  // obtain routeFlow parameters in routeFlowParameters
217  SUMOVehicleParameter* routeFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(SUMOSAXAttrs, false, 0, SUMOTime_MAX);
218  // check if flow was sucesfully created)
219  if (routeFlowParameters) {
220  // check if we're creating a vehicle over a existent route or over a embedded route
221  if (objectsUnderCursor.getDemandElementFront()->getTagProperty().getTag() == SUMO_TAG_ROUTE) {
222  GNERouteHandler::buildFlowOverRoute(myViewNet, true, *routeFlowParameters);
223  } else {
224  GNERouteHandler::buildFlowWithEmbeddedRoute(myViewNet, true, *routeFlowParameters, objectsUnderCursor.getDemandElementFront());
225  }
226  // delete routeFlowParameters
227  delete routeFlowParameters;
228  }
229  }
230  // all ok, then return true;
231  return true;
232  } else {
233  myViewNet->setStatusBarText(toString(vehicleTag) + " has to be placed within a route.");
234  return false;
235  }
236  } else if (((vehicleTag == SUMO_TAG_TRIP) || (vehicleTag == SUMO_TAG_FLOW)) && objectsUnderCursor.getEdgeFront()) {
237  // add clicked edge in EdgePathCreator
238  return myEdgePathCreator->addEdge(objectsUnderCursor.getEdgeFront());
239  } else {
240  return false;
241  }
242 }
243 
244 
247  return myEdgePathCreator;
248 }
249 
250 // ===========================================================================
251 // protected
252 // ===========================================================================
253 
254 void
257  // show vehicle type selector modul
259  // show AutoRute creator if we're editing a trip
263  } else {
265  }
266  } else {
267  // hide all moduls if vehicle isn't valid
271  }
272 }
273 
274 
275 void
278  // show vehicle attributes modul
280  // set current VTypeClass in TripCreator
282  // show help creation
284  } else {
285  // hide all moduls if selected item isn't valid
287  // hide help creation
289 
290  }
291 }
292 
293 
294 void
296  // obtain tag (only for improve code legibility)
298  // Declare map to keep attributes from Frames from Frame
299  std::map<SumoXMLAttr, std::string> valuesMap = myVehicleAttributes->getAttributesAndValues(false);
300  // add ID parameter
301  valuesMap[SUMO_ATTR_ID] = myViewNet->getNet()->generateDemandElementID("", vehicleTag);
302  // add VType
304  // check if we're creating a trip or flow
305  if (vehicleTag == SUMO_TAG_TRIP) {
306  // Add parameter departure
307  if (valuesMap[SUMO_ATTR_DEPART].empty()) {
308  valuesMap[SUMO_ATTR_DEPART] = "0";
309  }
310  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
311  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
312  // obtain trip parameters
313  SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(SUMOSAXAttrs, false);
314  // build trip in GNERouteHandler
316  // delete tripParameters
317  delete tripParameters;
318  } else {
319  // set begin and end attributes
320  if (valuesMap[SUMO_ATTR_BEGIN].empty()) {
321  valuesMap[SUMO_ATTR_BEGIN] = "0";
322  }
323  if (valuesMap[SUMO_ATTR_END].empty()) {
324  valuesMap[SUMO_ATTR_END] = "3600";
325  }
326  // declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
327  SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(valuesMap, getPredefinedTagsMML(), toString(vehicleTag));
328  // obtain flow parameters
329  SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(SUMOSAXAttrs, false, 0, SUMOTime_MAX);
330  // build flow in GNERouteHandler
332  // delete flowParameters
333  delete flowParameters;
334  }
335 }
336 
337 /****************************************************************************/
SumoXMLTag
Numbers representing SUMO-XML - element names.
description of a vehicle type
GNEFrameModuls::EdgePathCreator * getEdgePathCreator() const
get EdgePathCreator modul
HelpCreation(GNEVehicleFrame *vehicleFrameParent)
constructor
GNEFrameAttributesModuls::AttributesCreator * myVehicleAttributes
internal vehicle attributes
void edgePathCreated()
finish edge path creation
a flow definitio nusing a from-to edges instead of a route (used by router)
void setVClass(SUMOVehicleClass vClass)
set SUMOVehicleClass
void show()
show Frame
static void buildTrip(GNEViewNet *viewNet, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters, const std::vector< GNEEdge *> &edges)
build trip
GNEFrameModuls::EdgePathCreator * myEdgePathCreator
edge path creator (used for trips and flows)
a flow definition nusing a route instead of a from-to edges route (used in NETEDIT) ...
GNEFrameModuls::DemandElementSelector * myVTypeSelector
Vehicle Type selectors.
void showAttributesCreatorModul(const GNEAttributeCarrier::TagProperties &myTagProperties)
show AttributesCreator modul
static SUMOVehicleParameter * parseVehicleAttributes(const SUMOSAXAttributes &attrs, const bool hardFail, const bool optionalID=false, const bool skipDepart=false, const bool isPerson=false)
Parses a vehicle&#39;s attributes.
void showEdgePathCreator()
show EdgePathCreator
~GNEVehicleFrame()
Destructor.
weights: time range begin
void showDemandElementSelector()
show demand element selector
virtual double getAttributeDouble(SumoXMLAttr key) const =0
bool addEdge(GNEEdge *edge)
add edge to route
Encapsulated Xerces-SAX-attributes.
static void buildFlow(GNEViewNet *viewNet, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters, const std::vector< GNEEdge *> &edges)
build flow
std::map< SumoXMLAttr, std::string > getAttributesAndValues(bool includeAll) const
get attributes and their values
const std::map< int, std::string > & getPredefinedTagsMML() const
get predefinedTagsMML
Definition: GNEFrame.cpp:276
begin/end of the description of a route
bool areValuesValid() const
check if parameters of attributes are valid
const std::vector< GNEEdge * > & getEdgeParents() const
get edge parents
GNEViewNet * myViewNet
View Net.
Definition: GNEFrame.h:120
FXLabel * myInformationLabel
Label with creation information.
GNEDemandElement * getDemandElementFront() const
get front net element element (or a pointer to nullptr if there isn&#39;t)
virtual SUMOVehicleClass getVClass() const =0
obtain VClass related with this demand element
GNEDemandElement * getCurrentDemandElement() const
get current demand element
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:48
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
void hideEdgePathCreator()
show EdgePathCreator
GNEFrameModuls::TagSelector * myVehicleTagSelector
vehicle tag selector (used to select diffent kind of vehicles)
void refreshTagProperties()
due myCurrentTagProperties is a Reference, we need to refresh it when frameParent is show ...
static SUMOVehicleParameter * parseFlowAttributes(const SUMOSAXAttributes &attrs, const bool hardFail, const SUMOTime beginDefault, const SUMOTime endDefault, bool isPerson=false)
Parses a flow&#39;s attributes.
bool isRoute() const
return true if tag correspond to a route element
class used to group all variables related with objects under cursor after a click over view ...
GNEEdge * getEdgeFront() const
get front edge (or a pointer to nullptr if there isn&#39;t)
const std::string getID() const
function to support debugging
void tagSelected()
Tag selected in TagSelector.
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition: GUIDesigns.h:210
std::string generateDemandElementID(const std::string &prefix, SumoXMLTag type) const
generate demand element id
Definition: GNENet.cpp:2411
GNEVehicleFrame * myVehicleFrameParent
pointer to Vehicle Frame Parent
Structure representing possible vehicle parameter.
virtual void show()
show Frame
Definition: GNEFrame.cpp:108
#define SUMOTime_MAX
Definition: SUMOTime.h:36
GNEVehicleFrame(FXHorizontalFrame *horizontalFrameParent, GNEViewNet *viewNet)
Constructor.
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:255
void showHelpCreation()
show HelpCreation
weights: time range end
const GNEAttributeCarrier::TagProperties & getCurrentTagProperties() const
get current type tag
bool addVehicle(const GNEViewNetHelper::ObjectsUnderCursor &objectsUnderCursor)
add vehicle element
virtual void hide()
hide Frame
Definition: GNEFrame.cpp:117
void showWarningMessage(std::string extra="") const
show warning message with information about non-valid attributes
GNENet * getNet() const
get the net object
Definition: GNEViewNet.cpp:927
description of a vehicle
void setStatusBarText(const std::string &text)
set staturBar text
Definition: GNEViewNet.cpp:482
static void buildVehicleWithEmbeddedRoute(GNEViewNet *viewNet, bool undoDemandElements, SUMOVehicleParameter vehicleParameters, GNEDemandElement *embeddedRouteCopy)
build vehicle with a embedded route
const TagProperties & getTagProperty() const
get Tag Property assigned to this object
HelpCreation * myHelpCreation
Help creation.
static void buildFlowOverRoute(GNEViewNet *viewNet, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters)
build a flow over an existent route
a single trip definition (used by router)
void hideDemandElementSelector()
hide demand element selector
void setCurrentTag(SumoXMLTag newTag)
set current type manually
std::vector< GNEEdge * > getClickedEdges() const
get current clicked edges
void hideHelpCreation()
hide HelpCreation
void updateHelpCreation()
update HelpCreation
static void buildVehicleOverRoute(GNEViewNet *viewNet, bool undoDemandElements, const SUMOVehicleParameter &vehicleParameters)
build functions
void demandElementSelected()
selected vehicle type in DemandElementSelector
static void buildFlowWithEmbeddedRoute(GNEViewNet *viewNet, bool undoDemandElements, SUMOVehicleParameter vehicleParameters, GNEDemandElement *embeddedRouteCopy)
build flow with a embedded route