Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEPersonPlanFrame.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 GNEPersonPlanFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jun 2019
17
///
18
// The Widget for add PersonPlan elements
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNEViewParent.h>
24
#include <netedit/elements/additional/GNETAZ.h>
25
#include <netedit/elements/demand/GNERouteHandler.h>
26
#include <netedit/frames/GNEAttributesEditor.h>
27
#include <netedit/frames/GNEDemandSelector.h>
28
#include <netedit/frames/GNEElementTree.h>
29
#include <netedit/frames/GNEPlanCreator.h>
30
#include <netedit/frames/GNEPlanCreatorLegend.h>
31
32
#include "GNEPersonPlanFrame.h"
33
34
// ===========================================================================
35
// method definitions
36
// ===========================================================================
37
38
GNEPersonPlanFrame::GNEPersonPlanFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
39
GNEFrame(viewParent, viewNet, TL("PersonPlans")) {
40
41
// create person types selector module
42
myPersonSelector = new GNEDemandElementSelector(this, {GNETagProperties::Type::PERSON});
43
44
// Create plan selector
45
myPlanSelector = new GNEPlanSelector(this, SUMO_TAG_PERSON);
46
47
// Create person parameters
48
myPersonPlanAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
49
50
// create plan creator Module
51
myPlanCreator = new GNEPlanCreator(this, viewNet->getNet()->getDemandPathManager());
52
53
// Create GNEElementTree module
54
myPersonHierarchy = new GNEElementTree(this);
55
56
// create plan creator legend
57
myPlanCreatorLegend = new GNEPlanCreatorLegend(this);
58
}
59
60
61
GNEPersonPlanFrame::~GNEPersonPlanFrame() {}
62
63
64
void
65
GNEPersonPlanFrame::show() {
66
// get persons maps
67
const auto& persons = myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_PERSON);
68
const auto& personFlows = myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_PERSONFLOW);
69
// Only show modules if there is at least one person
70
if ((persons.size() > 0) || (personFlows.size() > 0)) {
71
// show person selector
72
myPersonSelector->showDemandElementSelector();
73
// refresh tag selector
74
myPlanSelector->refreshPlanSelector();
75
} else {
76
// hide all modules
77
myPersonSelector->hideDemandElementSelector();
78
myPlanSelector->hidePlanSelector();
79
myPersonPlanAttributesEditor->hideAttributesEditor();
80
myPlanCreator->hidePathCreatorModule();
81
myPersonHierarchy->hideHierarchicalElementTree();
82
myPlanCreatorLegend->hidePlanCreatorLegend();
83
}
84
// show frame
85
GNEFrame::show();
86
}
87
88
89
void
90
GNEPersonPlanFrame::hide() {
91
// reset candidate edges
92
for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
93
edge.second->resetCandidateFlags();
94
}
95
// enable undo/redo
96
myViewNet->getViewParent()->getGNEAppWindows()->enableUndoRedoTemporally();
97
// hide frame
98
GNEFrame::hide();
99
}
100
101
102
bool
103
GNEPersonPlanFrame::addPersonPlanElement(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {
104
// first check that we clicked over an AC
105
if (viewObjects.getAttributeCarrierFront() == nullptr) {
106
return false;
107
}
108
// check if we have to select a new person
109
if (myPersonSelector->getCurrentDemandElement() == nullptr) {
110
if (viewObjects.getDemandElementFront() && viewObjects.getDemandElementFront()->getTagProperty()->isPerson()) {
111
// continue depending of number of demand elements under cursor
112
if (viewObjects.getDemandElements().size() > 1) {
113
// Filter persons
114
myPersonSelector->setDemandElements(viewObjects.getDemandElements());
115
} else {
116
// select new person
117
myPersonSelector->setDemandElement(viewObjects.getDemandElementFront());
118
}
119
return true;
120
} else {
121
myViewNet->setStatusBarText(TL("Current selected person isn't valid."));
122
return false;
123
}
124
}
125
// finally check that person plan selected is valid
126
if (!myPlanSelector->getCurrentPlanTemplate()) {
127
myViewNet->setStatusBarText(TL("Current selected person plan isn't valid."));
128
return false;
129
}
130
// continue depending of marked elements
131
if (myPlanSelector->markRoutes() && viewObjects.getDemandElementFront() &&
132
(viewObjects.getDemandElementFront()->getTagProperty()->getTag() == SUMO_TAG_ROUTE)) {
133
return myPlanCreator->addRoute(viewObjects.getDemandElementFront());
134
} else if (myPlanSelector->markStoppingPlaces() && viewObjects.getAdditionalFront() &&
135
(viewObjects.getAdditionalFront()->getTagProperty()->isStoppingPlace())) {
136
return myPlanCreator->addStoppingPlace(viewObjects.getAdditionalFront());
137
} else if (myPlanSelector->markJunctions() && viewObjects.getJunctionFront()) {
138
return myPlanCreator->addJunction(viewObjects.getJunctionFront());
139
} else if (myPlanSelector->markEdges() && viewObjects.getLaneFront()) {
140
return myPlanCreator->addEdge(viewObjects.getLaneFront());
141
} else if (myPlanSelector->markTAZs() && viewObjects.getTAZFront()) {
142
return myPlanCreator->addTAZ(viewObjects.getTAZFront());
143
} else {
144
return false;
145
}
146
}
147
148
149
void
150
GNEPersonPlanFrame::resetSelectedPerson() {
151
myPersonSelector->setDemandElement(nullptr);
152
}
153
154
155
GNEPlanCreator*
156
GNEPersonPlanFrame::getPlanCreator() const {
157
return myPlanCreator;
158
}
159
160
161
GNEElementTree*
162
GNEPersonPlanFrame::getPersonHierarchy() const {
163
return myPersonHierarchy;
164
}
165
166
167
GNEDemandElementSelector*
168
GNEPersonPlanFrame::getPersonSelector() const {
169
return myPersonSelector;
170
}
171
172
173
GNEPlanSelector*
174
GNEPersonPlanFrame::getPlanSelector() const {
175
return myPlanSelector;
176
}
177
178
// ===========================================================================
179
// protected
180
// ===========================================================================
181
182
void
183
GNEPersonPlanFrame::tagSelected() {
184
// first check if person is valid
185
if (myPlanSelector->getCurrentPlanTemplate()) {
186
// show person attributes
187
myPersonPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), true);
188
// set path creator mode depending if previousEdge exist
189
if (myPersonSelector) {
190
// show path creator mode
191
myPlanCreator->showPlanCreatorModule(myPlanSelector, myPersonSelector->getPreviousPlanElement());
192
// show legend
193
myPlanCreatorLegend->showPlanCreatorLegend();
194
// show person hierarchy
195
myPersonHierarchy->showHierarchicalElementTree(myPersonSelector->getCurrentDemandElement());
196
} else {
197
// hide modules
198
myPlanCreator->hidePathCreatorModule();
199
myPersonHierarchy->hideHierarchicalElementTree();
200
myPlanCreatorLegend->hidePlanCreatorLegend();
201
}
202
} else {
203
// hide modules if tag selected isn't valid
204
myPersonPlanAttributesEditor->hideAttributesEditor();
205
myPlanCreator->hidePathCreatorModule();
206
myPersonHierarchy->hideHierarchicalElementTree();
207
myPlanCreatorLegend->hidePlanCreatorLegend();
208
}
209
}
210
211
212
void
213
GNEPersonPlanFrame::demandElementSelected() {
214
// check if a valid person was selected
215
if (myPersonSelector->getCurrentDemandElement()) {
216
// show person plan tag selector
217
myPlanSelector->showPlanSelector();
218
// now check if person plan selected is valid
219
if (myPlanSelector->getCurrentPlanTemplate()) {
220
// call tag selected
221
tagSelected();
222
} else {
223
myPersonPlanAttributesEditor->hideAttributesEditor();
224
myPlanCreator->hidePathCreatorModule();
225
myPersonHierarchy->hideHierarchicalElementTree();
226
myPlanCreatorLegend->hidePlanCreatorLegend();
227
}
228
} else {
229
// hide modules if person selected isn't valid
230
myPlanSelector->hidePlanSelector();
231
myPersonPlanAttributesEditor->hideAttributesEditor();
232
myPlanCreator->hidePathCreatorModule();
233
myPersonHierarchy->hideHierarchicalElementTree();
234
myPlanCreatorLegend->hidePlanCreatorLegend();
235
}
236
}
237
238
239
bool
240
GNEPersonPlanFrame::createPath(const bool /*useLastRoute*/) {
241
// first check that all attributes are valid
242
if (!myPersonPlanAttributesEditor->checkAttributes(true)) {
243
return false;
244
} else {
245
// declare route handler
246
GNERouteHandler routeHandler(myViewNet->getNet(), myPersonSelector->getCurrentDemandElement()->getAttribute(GNE_ATTR_DEMAND_FILE),
247
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
248
// check if person plan can be created
249
if (routeHandler.buildPersonPlan(myPlanSelector->getCurrentPlanTemplate(), myPersonSelector->getCurrentDemandElement(),
250
myPersonPlanAttributesEditor, myPlanCreator, false)) {
251
// refresh GNEElementTree
252
myPersonHierarchy->refreshHierarchicalElementTree();
253
// abort path creation
254
myPlanCreator->abortPathCreation();
255
// refresh using tagSelected
256
tagSelected();
257
// refresh personPlan attributes
258
myPersonPlanAttributesEditor->refreshAttributesEditor();
259
// enable show all person plans
260
myViewNet->getDemandViewOptions().menuCheckShowAllPersonPlans->setChecked(TRUE);
261
return true;
262
} else {
263
return false;
264
}
265
}
266
}
267
268
/****************************************************************************/
269
270