Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEPersonFrame.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 GNEPersonFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date May 2019
17
///
18
// The Widget for add Person elements
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNEUndoList.h>
24
#include <netedit/GNEViewParent.h>
25
#include <netedit/elements/additional/GNETAZ.h>
26
#include <netedit/elements/demand/GNERouteHandler.h>
27
#include <netedit/frames/GNEAttributesEditor.h>
28
#include <netedit/frames/GNEDemandSelector.h>
29
#include <netedit/frames/GNEPlanCreator.h>
30
#include <netedit/frames/GNEPlanCreatorLegend.h>
31
#include <utils/vehicle/SUMOVehicleParserHelper.h>
32
#include <utils/xml/SUMOSAXAttributesImpl_Cached.h>
33
34
#include "GNEPersonFrame.h"
35
36
// ===========================================================================
37
// method definitions
38
// ===========================================================================
39
40
GNEPersonFrame::GNEPersonFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
41
GNEFrame(viewParent, viewNet, TL("Persons")),
42
myPersonBaseObject(new CommonXMLStructure::SumoBaseObject(nullptr)) {
43
44
// create tag Selector module for persons
45
myPersonTagSelector = new GNETagSelector(this, GNETagProperties::Type::PERSON, SUMO_TAG_PERSON);
46
47
// create person types selector module and set DEFAULT_PEDTYPE_ID as default element
48
myTypeSelector = new GNEDemandElementSelector(this, SUMO_TAG_VTYPE, GNETagProperties::Type::PERSON);
49
50
// create person attributes
51
myPersonAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
52
53
// create plan selector module for person plans
54
myPlanSelector = new GNEPlanSelector(this, SUMO_TAG_PERSON);
55
56
// create person plan attributes
57
myPersonPlanAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
58
59
// create GNEPlanCreator Module
60
myPlanCreator = new GNEPlanCreator(this, viewNet->getNet()->getDemandPathManager());
61
62
// create plan creator legend
63
myPlanCreatorLegend = new GNEPlanCreatorLegend(this);
64
}
65
66
67
GNEPersonFrame::~GNEPersonFrame() {
68
delete myPersonBaseObject;
69
}
70
71
72
void
73
GNEPersonFrame::show() {
74
// refresh tag selector
75
myPersonTagSelector->refreshTagSelector();
76
myTypeSelector->refreshDemandElementSelector();
77
myPlanSelector->refreshPlanSelector();
78
// show frame
79
GNEFrame::show();
80
}
81
82
83
void
84
GNEPersonFrame::hide() {
85
// reset candidate edges
86
for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
87
edge.second->resetCandidateFlags();
88
}
89
// hide frame
90
GNEFrame::hide();
91
}
92
93
94
bool
95
GNEPersonFrame::addPerson(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {
96
// first check that we clicked over an AC
97
if (viewObjects.getAttributeCarrierFront() == nullptr) {
98
return false;
99
}
100
// obtain tags (only for improve code legibility)
101
SumoXMLTag personTag = myPersonTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();
102
// first check that current selected person is valid
103
if (personTag == SUMO_TAG_NOTHING) {
104
myViewNet->setStatusBarText(TL("Current selected person isn't valid."));
105
return false;
106
}
107
// now check that pType is valid
108
if (myTypeSelector->getCurrentDemandElement() == nullptr) {
109
myViewNet->setStatusBarText(TL("Current selected person type isn't valid."));
110
return false;
111
}
112
// finally check that person plan selected is valid
113
if (myPlanSelector->getCurrentPlanTemplate() == nullptr) {
114
myViewNet->setStatusBarText(TL("Current selected person plan isn't valid."));
115
return false;
116
}
117
for (GNEAdditional* o : viewObjects.getAdditionals()) {
118
if (o->getTagProperty()->isStoppingPlace()) {
119
return myPlanCreator->addStoppingPlace(o);
120
}
121
}
122
for (GNEDemandElement* o : viewObjects.getDemandElements()) {
123
if (o->getTagProperty()->getTag() == SUMO_TAG_ROUTE) {
124
return myPlanCreator->addRoute(o);
125
}
126
}
127
if (viewObjects.getAttributeCarrierFront() == viewObjects.getJunctionFront()) {
128
return myPlanCreator->addJunction(viewObjects.getJunctions().front());
129
}
130
if (viewObjects.getAttributeCarrierFront() == viewObjects.getLaneFront()) {
131
return myPlanCreator->addEdge(viewObjects.getLanes().front());
132
}
133
if (viewObjects.getAttributeCarrierFront() == viewObjects.getTAZFront()) {
134
return myPlanCreator->addTAZ(viewObjects.getTAZs().front());
135
}
136
return false;
137
}
138
139
140
GNEPlanCreator*
141
GNEPersonFrame::getPlanCreator() const {
142
return myPlanCreator;
143
}
144
145
146
GNEDemandElementSelector*
147
GNEPersonFrame::getTypeSelector() const {
148
return myTypeSelector;
149
}
150
151
152
GNEPlanSelector*
153
GNEPersonFrame::getPlanSelector() const {
154
return myPlanSelector;
155
}
156
157
158
GNEAttributesEditor*
159
GNEPersonFrame::getPersonAttributesEditor() const {
160
return myPersonAttributesEditor;
161
}
162
163
// ===========================================================================
164
// protected
165
// ===========================================================================
166
167
void
168
GNEPersonFrame::tagSelected() {
169
// first check if person is valid
170
if (myPersonTagSelector->getCurrentTemplateAC()) {
171
// show PType selector and person plan selector
172
myTypeSelector->showDemandElementSelector();
173
// check if current person type selected is valid
174
if (myTypeSelector->getCurrentDemandElement()) {
175
// show person attributes depending of myPlanSelector
176
myPersonAttributesEditor->showAttributesEditor(myPersonTagSelector->getCurrentTemplateAC(), true);
177
// show person plan tag selector
178
myPlanSelector->showPlanSelector();
179
// check current plan template
180
if (myPlanSelector->getCurrentPlanTemplate()) {
181
// show person plan attributes
182
myPersonPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), false);
183
// show edge path creator module
184
myPlanCreator->showPlanCreatorModule(myPlanSelector, nullptr);
185
// show path legend
186
myPlanCreatorLegend->showPlanCreatorLegend();
187
} else {
188
// hide modules
189
myPersonPlanAttributesEditor->hideAttributesEditor();
190
myPlanCreator->hidePathCreatorModule();
191
myPlanCreatorLegend->hidePlanCreatorLegend();
192
}
193
} else {
194
// hide modules
195
myPlanSelector->hidePlanSelector();
196
myPersonAttributesEditor->hideAttributesEditor();
197
myPersonPlanAttributesEditor->hideAttributesEditor();
198
myPlanCreator->hidePathCreatorModule();
199
myPlanCreatorLegend->hidePlanCreatorLegend();
200
}
201
} else {
202
// hide all modules if person isn't valid
203
myTypeSelector->hideDemandElementSelector();
204
myPlanSelector->hidePlanSelector();
205
myPersonPlanAttributesEditor->hideAttributesEditor();
206
myPersonPlanAttributesEditor->hideAttributesEditor();
207
myPlanCreator->hidePathCreatorModule();
208
myPlanCreatorLegend->hidePlanCreatorLegend();
209
}
210
}
211
212
213
void
214
GNEPersonFrame::demandElementSelected() {
215
if (myTypeSelector->getCurrentDemandElement() && myPlanSelector->getCurrentPlanTemplate()) {
216
// show person attributes
217
myPersonAttributesEditor->showAttributesEditor(myPersonTagSelector->getCurrentTemplateAC(), true);
218
// show person plan tag selector
219
myPlanSelector->showPlanSelector();
220
// now check if person plan selected is valid
221
if (myPlanSelector->getCurrentPlanTagProperties()->getTag() != SUMO_TAG_NOTHING) {
222
// show person plan attributes
223
myPersonPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), false);
224
// show edge path creator module
225
myPlanCreator->showPlanCreatorModule(myPlanSelector, nullptr);
226
// show legend
227
myPlanCreatorLegend->showPlanCreatorLegend();
228
} else {
229
// hide modules
230
myPersonPlanAttributesEditor->hideAttributesEditor();
231
myPlanCreator->hidePathCreatorModule();
232
}
233
} else {
234
// hide modules
235
myPlanSelector->hidePlanSelector();
236
myPersonAttributesEditor->hideAttributesEditor();
237
myPersonPlanAttributesEditor->hideAttributesEditor();
238
myPlanCreator->hidePathCreatorModule();
239
}
240
}
241
242
243
bool
244
GNEPersonFrame::createPath(const bool /*useLastRoute*/) {
245
// first check that all attributes are valid
246
if (!myPersonAttributesEditor->checkAttributes(true) || !myPersonPlanAttributesEditor->checkAttributes(true)) {
247
return false;
248
} else if (myPlanCreator->planCanBeCreated(myPlanSelector->getCurrentPlanTemplate())) {
249
// begin undo-redo operation
250
myViewNet->getUndoList()->begin(myPersonTagSelector->getCurrentTemplateAC(), "create " +
251
myPersonTagSelector->getCurrentTemplateAC()->getTagProperty()->getTagStr() + " and " +
252
myPlanSelector->getCurrentPlanTagProperties()->getTagStr());
253
// create person
254
GNEDemandElement* person = buildPerson();
255
// declare route handler
256
GNERouteHandler routeHandler(myViewNet->getNet(), person->getAttribute(GNE_ATTR_DEMAND_FILE),
257
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
258
// check if person and person plan can be created
259
if (routeHandler.buildPersonPlan(myPlanSelector->getCurrentPlanTemplate(),
260
person, myPersonPlanAttributesEditor, myPlanCreator, true)) {
261
// end undo-redo operation
262
myViewNet->getUndoList()->end();
263
// abort path creation
264
myPlanCreator->abortPathCreation();
265
// refresh person and personPlan attributes
266
myPersonAttributesEditor->refreshAttributesEditor();
267
myPersonPlanAttributesEditor->refreshAttributesEditor();
268
// compute person
269
person->computePathElement();
270
// enable show all person plans
271
myViewNet->getDemandViewOptions().menuCheckShowAllPersonPlans->setChecked(TRUE);
272
return true;
273
} else {
274
// abort person creation
275
myViewNet->getUndoList()->abortAllChangeGroups();
276
return false;
277
}
278
} else {
279
return false;
280
}
281
}
282
283
// ---------------------------------------------------------------------------
284
// GNEPersonFrame - private methods
285
// ---------------------------------------------------------------------------
286
287
GNEDemandElement*
288
GNEPersonFrame::buildPerson() {
289
// first person base object
290
myPersonBaseObject->clear();
291
// obtain person tag (only for improve code legibility)
292
SumoXMLTag personTag = myPersonTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();
293
// set tag
294
myPersonBaseObject->setTag(personTag);
295
// get attribute ad values
296
myPersonAttributesEditor->fillSumoBaseObject(myPersonBaseObject);
297
// add pType parameter
298
myPersonBaseObject->addStringAttribute(SUMO_ATTR_TYPE, myTypeSelector->getCurrentDemandElement()->getID());
299
// declare route handler
300
GNERouteHandler routeHandler(myViewNet->getNet(), myPersonBaseObject->hasStringAttribute(GNE_ATTR_DEMAND_FILE) ?
301
myPersonBaseObject->getStringAttribute(GNE_ATTR_DEMAND_FILE) : "",
302
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
303
// check if we're creating a person or personFlow
304
if (personTag == SUMO_TAG_PERSON) {
305
// Add parameter departure
306
if (!myPersonBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myPersonBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {
307
myPersonBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");
308
}
309
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
310
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myPersonBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(personTag));
311
// obtain person parameters
312
SUMOVehicleParameter* personParameters = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_PERSON, SUMOSAXAttrs, false, false, false);
313
// check personParameters
314
if (personParameters) {
315
myPersonBaseObject->setVehicleParameter(personParameters);
316
// parse vehicle
317
routeHandler.parseSumoBaseObject(myPersonBaseObject);
318
// delete personParameters
319
delete personParameters;
320
}
321
} else {
322
// set begin and end attributes
323
if (!myPersonBaseObject->hasStringAttribute(SUMO_ATTR_BEGIN) || myPersonBaseObject->getStringAttribute(SUMO_ATTR_BEGIN).empty()) {
324
myPersonBaseObject->addStringAttribute(SUMO_ATTR_BEGIN, "0");
325
}
326
// adjust poisson value
327
if (myPersonBaseObject->hasDoubleAttribute(GNE_ATTR_POISSON)) {
328
myPersonBaseObject->addStringAttribute(SUMO_ATTR_PERIOD, "exp(" + toString(myPersonBaseObject->getDoubleAttribute(GNE_ATTR_POISSON)) + ")");
329
}
330
// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes
331
SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myPersonBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(personTag));
332
// obtain personFlow parameters
333
SUMOVehicleParameter* personFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(SUMO_TAG_PERSONFLOW, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);
334
// check personParameters
335
if (personFlowParameters) {
336
myPersonBaseObject->setVehicleParameter(personFlowParameters);
337
// parse vehicle
338
routeHandler.parseSumoBaseObject(myPersonBaseObject);
339
// delete personParameters
340
delete personFlowParameters;
341
}
342
}
343
// refresh person and personPlan attributes
344
myPersonAttributesEditor->refreshAttributesEditor();
345
myPersonPlanAttributesEditor->refreshAttributesEditor();
346
// return created person
347
return myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(personTag, myPersonBaseObject->getStringAttribute(SUMO_ATTR_ID));
348
}
349
350
/****************************************************************************/
351
352