Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/GNENetHelper.cpp
169665 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 GNENetHelper.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Mar 2020
17
///
18
// Helper for GNENet
19
/****************************************************************************/
20
21
#include <netbuild/NBNetBuilder.h>
22
#include <netedit/GNEApplicationWindow.h>
23
#include <netedit/GNENet.h>
24
#include <netedit/GNETagPropertiesDatabase.h>
25
#include <netedit/GNEViewNet.h>
26
#include <netedit/GNEViewParent.h>
27
#include <netedit/dialogs/basic/GNEQuestionBasicDialog.h>
28
#include <netedit/elements/additional/GNEAccess.h>
29
#include <netedit/elements/additional/GNEBusStop.h>
30
#include <netedit/elements/additional/GNECalibrator.h>
31
#include <netedit/elements/additional/GNECalibratorFlow.h>
32
#include <netedit/elements/additional/GNEChargingStation.h>
33
#include <netedit/elements/additional/GNEClosingLaneReroute.h>
34
#include <netedit/elements/additional/GNEClosingReroute.h>
35
#include <netedit/elements/additional/GNEContainerStop.h>
36
#include <netedit/elements/additional/GNEDestProbReroute.h>
37
#include <netedit/elements/additional/GNEEntryExitDetector.h>
38
#include <netedit/elements/additional/GNEInductionLoopDetector.h>
39
#include <netedit/elements/additional/GNEInstantInductionLoopDetector.h>
40
#include <netedit/elements/additional/GNELaneAreaDetector.h>
41
#include <netedit/elements/additional/GNEMultiEntryExitDetector.h>
42
#include <netedit/elements/additional/GNEOverheadWire.h>
43
#include <netedit/elements/additional/GNEPOI.h>
44
#include <netedit/elements/additional/GNEParkingArea.h>
45
#include <netedit/elements/additional/GNEParkingAreaReroute.h>
46
#include <netedit/elements/additional/GNEParkingSpace.h>
47
#include <netedit/elements/additional/GNEPoly.h>
48
#include <netedit/elements/additional/GNERerouter.h>
49
#include <netedit/elements/additional/GNERerouterInterval.h>
50
#include <netedit/elements/additional/GNERerouterSymbol.h>
51
#include <netedit/elements/additional/GNERouteProbReroute.h>
52
#include <netedit/elements/additional/GNERouteProbe.h>
53
#include <netedit/elements/additional/GNETAZ.h>
54
#include <netedit/elements/additional/GNETAZSourceSink.h>
55
#include <netedit/elements/additional/GNETractionSubstation.h>
56
#include <netedit/elements/additional/GNEVaporizer.h>
57
#include <netedit/elements/additional/GNEVariableSpeedSign.h>
58
#include <netedit/elements/additional/GNEVariableSpeedSignStep.h>
59
#include <netedit/elements/additional/GNEVariableSpeedSignSymbol.h>
60
#include <netedit/elements/data/GNEDataInterval.h>
61
#include <netedit/elements/data/GNEMeanData.h>
62
#include <netedit/elements/demand/GNEContainer.h>
63
#include <netedit/elements/demand/GNEPerson.h>
64
#include <netedit/elements/demand/GNEPersonTrip.h>
65
#include <netedit/elements/demand/GNERide.h>
66
#include <netedit/elements/demand/GNERoute.h>
67
#include <netedit/elements/demand/GNERouteRef.h>
68
#include <netedit/elements/demand/GNEVTypeRef.h>
69
#include <netedit/elements/demand/GNEStop.h>
70
#include <netedit/elements/demand/GNEStopPlan.h>
71
#include <netedit/elements/demand/GNETranship.h>
72
#include <netedit/elements/demand/GNETransport.h>
73
#include <netedit/elements/demand/GNEVType.h>
74
#include <netedit/elements/demand/GNEVTypeDistribution.h>
75
#include <netedit/elements/demand/GNERouteDistribution.h>
76
#include <netedit/elements/demand/GNEVehicle.h>
77
#include <netedit/elements/demand/GNEWalk.h>
78
#include <netedit/elements/network/GNEConnection.h>
79
#include <netedit/elements/network/GNECrossing.h>
80
#include <netedit/elements/network/GNEEdgeTemplate.h>
81
#include <netedit/elements/network/GNEEdgeType.h>
82
#include <netedit/elements/network/GNEInternalLane.h>
83
#include <netedit/elements/network/GNEWalkingArea.h>
84
#include <netedit/frames/GNEDemandSelector.h>
85
#include <netedit/frames/GNEElementTree.h>
86
#include <netedit/frames/common/GNEInspectorFrame.h>
87
#include <netedit/frames/demand/GNEContainerFrame.h>
88
#include <netedit/frames/demand/GNEContainerPlanFrame.h>
89
#include <netedit/frames/demand/GNEPersonFrame.h>
90
#include <netedit/frames/demand/GNEPersonPlanFrame.h>
91
#include <netedit/frames/demand/GNERouteDistributionFrame.h>
92
#include <netedit/frames/demand/GNEStopFrame.h>
93
#include <netedit/frames/demand/GNETypeDistributionFrame.h>
94
#include <netedit/frames/demand/GNETypeFrame.h>
95
#include <netedit/frames/demand/GNEVehicleFrame.h>
96
#include <netedit/frames/network/GNECreateEdgeFrame.h>
97
#include <utils/gui/div/GUIGlobalSelection.h>
98
#include <utils/gui/globjects/GUIGlObjectStorage.h>
99
#include <utils/options/OptionsCont.h>
100
#include <utils/xml/NamespaceIDs.h>
101
102
#include "GNENetHelper.h"
103
104
// ---------------------------------------------------------------------------
105
// GNENetHelper::AttributeCarriers - methods
106
// ---------------------------------------------------------------------------
107
108
GNENetHelper::AttributeCarriers::AttributeCarriers(GNENet* net) :
109
myNet(net),
110
myStopIndex(0) {
111
// fill additionals with tags
112
auto additionalTagProperties = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::ADDITIONALELEMENT |
113
GNETagProperties::Type::SHAPE | GNETagProperties::Type::TAZELEMENT | GNETagProperties::Type::WIRE);
114
for (const auto& additionalTagProperty : additionalTagProperties) {
115
myAdditionals.insert(std::make_pair(additionalTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEAdditional*>()));
116
if (additionalTagProperty->hasAttribute(SUMO_ATTR_ID) || (additionalTagProperty->getTag() == SUMO_TAG_VAPORIZER)) {
117
myAdditionalIDs.insert(std::make_pair(additionalTagProperty->getTag(), std::map<const std::string, GNEAdditional*>()));
118
}
119
}
120
myTAZSourceSinks.insert(std::make_pair(SUMO_TAG_TAZSOURCE, std::unordered_map<const GNEAttributeCarrier*, GNETAZSourceSink*>()));
121
myTAZSourceSinks.insert(std::make_pair(SUMO_TAG_TAZSINK, std::unordered_map<const GNEAttributeCarrier*, GNETAZSourceSink*>()));
122
// fill demand elements with tags
123
auto demandElementTagProperties = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::DEMANDELEMENT);
124
for (const auto& demandElementTagProperty : demandElementTagProperties) {
125
myDemandElements.insert(std::make_pair(demandElementTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEDemandElement*>()));
126
if (demandElementTagProperty->hasAttribute(SUMO_ATTR_ID)) {
127
myDemandElementIDs.insert(std::make_pair(demandElementTagProperty->getTag(), std::map<const std::string, GNEDemandElement*>()));
128
}
129
}
130
auto stopTagProperties = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_VEHICLE);
131
for (const auto& stopTagProperty : stopTagProperties) {
132
myDemandElements.insert(std::make_pair(stopTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEDemandElement*>()));
133
}
134
// fill data elements with tags
135
auto genericDataElementTagProperties = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::GENERICDATA);
136
for (const auto& genericDataElementTagProperty : genericDataElementTagProperties) {
137
myGenericDatas.insert(std::make_pair(genericDataElementTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEGenericData*>()));
138
}
139
// fill meanDatas with tags
140
auto meanDataTagProperties = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
141
for (const auto& meanDataTagProperty : meanDataTagProperties) {
142
myMeanDatas.insert(std::make_pair(meanDataTagProperty->getTag(), std::map<const std::string, GNEMeanData*>()));
143
}
144
}
145
146
147
GNENetHelper::AttributeCarriers::~AttributeCarriers() {
148
// Drop EdgeTypes
149
for (const auto& edgeType : myEdgeTypes) {
150
edgeType.second->decRef("GNENetHelper::~GNENet");
151
delete edgeType.second;
152
}
153
// Drop Edges
154
for (const auto& edge : myEdges) {
155
edge.second->decRef("GNENetHelper::~GNENet");
156
delete edge.second;
157
}
158
// Drop myJunctions
159
for (const auto& junction : myJunctions) {
160
junction.second->decRef("GNENetHelper::~GNENet");
161
delete junction.second;
162
}
163
// Drop Additionals (Only used for additionals that were inserted without using GNEChange_Additional)
164
for (const auto& additionalTag : myAdditionals) {
165
for (const auto& additional : additionalTag.second) {
166
// decrease reference manually (because it was increased manually in GNEAdditionalHandler)
167
additional.second->decRef();
168
delete additional.second;
169
}
170
}
171
// Drop demand elements (Only used for demand elements that were inserted without using GNEChange_DemandElement, for example the default VType")
172
for (const auto& demandElementTag : myDemandElements) {
173
for (const auto& demandElement : demandElementTag.second) {
174
// decrease reference manually (because it was increased manually in GNERouteHandler)
175
demandElement.second->decRef();
176
delete demandElement.second;
177
}
178
}
179
// Drop dataSets (Only used for TAZElements that were inserted without using GNEChange_DataSets)
180
for (const auto& dataSet : myDataSets) {
181
// decrease reference manually (because it was increased manually in GNEDataHandler)
182
dataSet.second->decRef();
183
delete dataSet.second;
184
}
185
// Drop MeanDatas (Only used for meanDatas that were inserted without using GNEChange_MeanData)
186
for (const auto& meanDataTag : myMeanDatas) {
187
for (const auto& meanData : meanDataTag.second) {
188
// decrease reference manually (because it was increased manually in GNEMeanDataHandler)
189
meanData.second->decRef();
190
delete meanData.second;
191
}
192
}
193
}
194
195
196
void
197
GNENetHelper::AttributeCarriers::remapJunctionAndEdgeIds() {
198
std::map<std::string, GNEEdge*> newEdgeMap;
199
std::map<std::string, GNEJunction*> newJunctionMap;
200
// fill newEdgeMap
201
for (const auto& edge : myEdges) {
202
edge.second->setEdgeID(edge.second->getNBEdge()->getID());
203
newEdgeMap[edge.second->getNBEdge()->getID()] = edge.second;
204
}
205
for (const auto& junction : myJunctions) {
206
newJunctionMap[junction.second->getNBNode()->getID()] = junction.second;
207
junction.second->setNetworkElementID(junction.second->getNBNode()->getID());
208
}
209
myEdges = newEdgeMap;
210
myJunctions = newJunctionMap;
211
}
212
213
214
bool
215
GNENetHelper::AttributeCarriers::isNetworkElementAroundTriangle(GNEAttributeCarrier* AC, const Triangle& triangle) const {
216
// check what type of AC
217
if (AC->getTagProperty()->getTag() == SUMO_TAG_JUNCTION) {
218
// Junction
219
const GNEJunction* junction = myJunctions.at(AC->getID());
220
if (junction->getNBNode()->getShape().size() == 0) {
221
return triangle.isPositionWithin(junction->getNBNode()->getCenter());
222
} else {
223
return (triangle.intersectWithShape(junction->getNBNode()->getShape()));
224
}
225
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
226
// Edge
227
for (const auto& lane : myEdges.at(AC->getID())->getChildLanes()) {
228
if (triangle.intersectWithShape(lane->getLaneShape())) {
229
return true;
230
}
231
}
232
return false;
233
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_LANE) {
234
// Lane
235
return triangle.intersectWithShape(retrieveLane(AC->getID())->getLaneShape());
236
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
237
// connection
238
return triangle.intersectWithShape(myConnections.at(AC->getGUIGlObject())->getConnectionShape());
239
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_CROSSING) {
240
// crossing
241
return triangle.intersectWithShape(myCrossings.at(AC->getGUIGlObject())->getCrossingShape());
242
} else if (AC->getTagProperty()->isAdditionalElement()) {
243
// Additional (including shapes and TAZs
244
const GNEAdditional* additional = retrieveAdditional(AC->getGUIGlObject());
245
if (additional->getAdditionalGeometry().getShape().size() <= 1) {
246
return triangle.isPositionWithin(additional->getPositionInView());
247
} else {
248
return triangle.intersectWithShape(additional->getAdditionalGeometry().getShape());
249
}
250
} else {
251
return false;
252
}
253
}
254
255
256
int
257
GNENetHelper::AttributeCarriers::getNumberOfNetworkElements() const {
258
return myNumberOfNetworkElements;
259
}
260
261
262
int
263
GNENetHelper::AttributeCarriers::getNumberOfDemandElements() const {
264
return myNumberOfDemandElements;
265
}
266
267
268
int
269
GNENetHelper::AttributeCarriers::getNumberOfDataElements() const {
270
return myNumberOfDataElements;
271
}
272
273
274
GNEAttributeCarrier*
275
GNENetHelper::AttributeCarriers::retrieveAttributeCarrier(const GUIGlID id, bool hardFail) const {
276
// obtain blocked GUIGlObject
277
GUIGlObject* object = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id);
278
// Make sure that object exists
279
if (object != nullptr) {
280
// unblock and try to parse to AttributeCarrier
281
GUIGlObjectStorage::gIDStorage.unblockObject(id);
282
GNEAttributeCarrier* ac = dynamic_cast<GNEAttributeCarrier*>(object);
283
// If was successfully parsed, return it
284
if (ac == nullptr) {
285
throw ProcessError("GUIGlObject does not match the declared type");
286
} else {
287
return ac;
288
}
289
} else if (hardFail) {
290
throw ProcessError("Attempted to retrieve non-existant GUIGlObject");
291
} else {
292
return nullptr;
293
}
294
}
295
296
297
std::vector<GNEAttributeCarrier*>
298
GNENetHelper::AttributeCarriers::retrieveAttributeCarriers(SumoXMLTag tag) {
299
std::vector<GNEAttributeCarrier*> ACs;
300
// first check if we have to return all ACs
301
if (tag == SUMO_TAG_NOTHING) {
302
const auto rootTagProperty = myNet->getTagPropertiesDatabase()->getTagProperty(SUMO_TAG_ROOTFILE, true);
303
ACs.reserve(myNumberOfNetworkElements + myNumberOfDemandElements + myNumberOfDataElements);
304
retrieveAttributeCarriersRecursively(rootTagProperty, ACs);
305
} else {
306
const auto tagProperty = myNet->getTagPropertiesDatabase()->getTagProperty(tag, true);
307
// reserve space
308
if (tagProperty->getSupermode() == Supermode::NETWORK) {
309
ACs.reserve(myNumberOfNetworkElements);
310
} else if (tagProperty->getSupermode() == Supermode::DEMAND) {
311
ACs.reserve(myNumberOfDemandElements);
312
} else if (tagProperty->getSupermode() == Supermode::DATA) {
313
ACs.reserve(myNumberOfDataElements + myNumberOfMeanDataElements);
314
}
315
retrieveAttributeCarriersRecursively(tagProperty, ACs);
316
}
317
return ACs;
318
}
319
320
321
std::vector<GNEAttributeCarrier*>
322
GNENetHelper::AttributeCarriers::retrieveAttributeCarriers(Supermode supermode, const bool onlySelected) {
323
std::vector<GNEAttributeCarrier*> result;
324
// continue depending of supermode
325
if (supermode == Supermode::NETWORK) {
326
// network
327
for (const auto& junction : myJunctions) {
328
if (!onlySelected || junction.second->isAttributeCarrierSelected()) {
329
result.push_back(junction.second);
330
}
331
}
332
for (const auto& crossing : myCrossings) {
333
if (!onlySelected || crossing.second->isAttributeCarrierSelected()) {
334
result.push_back(crossing.second);
335
}
336
}
337
for (const auto& edge : myEdges) {
338
if (!onlySelected || edge.second->isAttributeCarrierSelected()) {
339
result.push_back(edge.second);
340
}
341
}
342
for (const auto& lane : myLanes) {
343
if (!onlySelected || lane.second->isAttributeCarrierSelected()) {
344
result.push_back(lane.second);
345
}
346
}
347
for (const auto& connection : myConnections) {
348
if (!onlySelected || connection.second->isAttributeCarrierSelected()) {
349
result.push_back(connection.second);
350
}
351
}
352
for (const auto& additionalSet : myAdditionals) {
353
for (const auto& additional : additionalSet.second) {
354
if (!onlySelected || additional.second->isAttributeCarrierSelected()) {
355
result.push_back(additional.second);
356
}
357
}
358
}
359
} else if (supermode == Supermode::DEMAND) {
360
for (const auto& demandElementSet : myDemandElements) {
361
for (const auto& demandElement : demandElementSet.second) {
362
if (!onlySelected || demandElement.second->isAttributeCarrierSelected()) {
363
result.push_back(demandElement.second);
364
}
365
}
366
}
367
} else if (supermode == Supermode::DATA) {
368
for (const auto& dataSet : myDataSets) {
369
if (!onlySelected || dataSet.second->isAttributeCarrierSelected()) {
370
result.push_back(dataSet.second);
371
}
372
}
373
for (const auto& dataInterval : myDataIntervals) {
374
if (!onlySelected || dataInterval.second->isAttributeCarrierSelected()) {
375
result.push_back(dataInterval.second);
376
}
377
}
378
for (const auto& genericDataSet : myGenericDatas) {
379
for (const auto& genericData : genericDataSet.second) {
380
if (!onlySelected || genericData.second->isAttributeCarrierSelected()) {
381
result.push_back(genericData.second);
382
}
383
}
384
}
385
for (const auto& meanDataSet : myMeanDatas) {
386
for (const auto& meanData : meanDataSet.second) {
387
if (!onlySelected || meanData.second->isAttributeCarrierSelected()) {
388
result.push_back(meanData.second);
389
}
390
}
391
}
392
}
393
return result;
394
}
395
396
397
std::vector<GNEAttributeCarrier*>
398
GNENetHelper::AttributeCarriers::getSelectedAttributeCarriers(const bool ignoreCurrentSupermode) {
399
// get modes
400
const auto& editModes = myNet->getViewNet()->getEditModes();
401
// declare vector to save result
402
std::vector<GNEAttributeCarrier*> result;
403
result.reserve(gSelected.getSelected().size());
404
// iterate over all elements of global selection
405
for (const auto& glID : gSelected.getSelected()) {
406
// obtain AC
407
GNEAttributeCarrier* AC = retrieveAttributeCarrier(glID, false);
408
// check if attribute carrier exist and is selected
409
if (AC && AC->isAttributeCarrierSelected()) {
410
if (ignoreCurrentSupermode) {
411
result.push_back(AC);
412
} else if (editModes.isCurrentSupermodeNetwork() && (AC->getTagProperty()->isNetworkElement() ||
413
AC->getTagProperty()->isAdditionalElement())) {
414
result.push_back(AC);
415
} else if (editModes.isCurrentSupermodeDemand() && AC->getTagProperty()->isDemandElement()) {
416
result.push_back(AC);
417
} else if (editModes.isCurrentSupermodeData() && AC->getTagProperty()->isDataElement()) {
418
result.push_back(AC);
419
}
420
}
421
}
422
return result;
423
}
424
425
426
GNEJunction*
427
GNENetHelper::AttributeCarriers::retrieveJunction(const std::string& id, bool hardFail) const {
428
auto it = myJunctions.find(id);
429
if (it != myJunctions.end()) {
430
return it->second;
431
}
432
if (hardFail) {
433
// If junction wasn't found, throw exception
434
throw UnknownElement("Attempted to retrieve non-existant junction " + id);
435
} else {
436
return nullptr;
437
}
438
}
439
440
441
const std::map<std::string, GNEJunction*>&
442
GNENetHelper::AttributeCarriers::getJunctions() const {
443
return myJunctions;
444
}
445
446
447
std::vector<GNEJunction*>
448
GNENetHelper::AttributeCarriers::getSelectedJunctions() const {
449
std::vector<GNEJunction*> result;
450
// returns junctions depending of selection
451
for (const auto& junction : myJunctions) {
452
if (junction.second->isAttributeCarrierSelected()) {
453
result.push_back(junction.second);
454
}
455
}
456
return result;
457
}
458
459
460
GNEJunction*
461
GNENetHelper::AttributeCarriers::registerJunction(GNEJunction* junction) {
462
// increase reference
463
junction->incRef("GNENet::registerJunction");
464
junction->setResponsible(false);
465
myJunctions[junction->getMicrosimID()] = junction;
466
myNumberOfNetworkElements++;
467
// expand net boundary
468
myNet->expandBoundary(junction->getCenteringBoundary());
469
// add edge into grid
470
myNet->addGLObjectIntoGrid(junction);
471
// update geometry
472
junction->updateGeometry();
473
// add z in net boundary
474
myNet->addZValueInBoundary(junction->getNBNode()->getPosition().z());
475
return junction;
476
}
477
478
479
void
480
GNENetHelper::AttributeCarriers::clearJunctions() {
481
myJunctions.clear();
482
}
483
484
485
void
486
GNENetHelper::AttributeCarriers::addPrefixToJunctions(const std::string& prefix) {
487
// make a copy of junctions
488
auto junctionCopy = myJunctions;
489
// clear junctions
490
myJunctions.clear();
491
// fill junctions again
492
for (const auto& junction : junctionCopy) {
493
// update microsim ID
494
junction.second->setNetworkElementID(prefix + junction.first);
495
// insert in myJunctions again
496
myJunctions[prefix + junction.first] = junction.second;
497
}
498
}
499
500
501
void
502
GNENetHelper::AttributeCarriers::updateJunctionID(GNEJunction* junction, const std::string& newID) {
503
if (myJunctions.count(junction->getID()) == 0) {
504
throw ProcessError(junction->getTagStr() + " with ID='" + junction->getID() + "' doesn't exist in AttributeCarriers.junction");
505
} else if (myJunctions.count(newID) != 0) {
506
throw ProcessError("There is another " + junction->getTagStr() + " with new ID='" + newID + "' in myJunctions");
507
} else {
508
// remove junction from container
509
myJunctions.erase(junction->getNBNode()->getID());
510
// rename in NetBuilder
511
myNet->getNetBuilder()->getNodeCont().rename(junction->getNBNode(), newID);
512
// update microsim ID
513
junction->setNetworkElementID(newID);
514
// add it into myJunctions again
515
myJunctions[junction->getID()] = junction;
516
// build crossings
517
junction->getNBNode()->buildCrossings();
518
// net has to be saved
519
myNet->getSavingStatus()->requireSaveNetwork();
520
}
521
}
522
523
524
int
525
GNENetHelper::AttributeCarriers::getNumberOfSelectedJunctions() const {
526
int counter = 0;
527
for (const auto& junction : myJunctions) {
528
if (junction.second->isAttributeCarrierSelected()) {
529
counter++;
530
}
531
}
532
return counter;
533
}
534
535
536
GNECrossing*
537
GNENetHelper::AttributeCarriers::retrieveCrossing(const GUIGlObject* glObject, bool hardFail) const {
538
auto it = myCrossings.find(glObject);
539
if (it != myCrossings.end()) {
540
return it->second;
541
}
542
if (hardFail) {
543
// If junction wasn't found, throw exception
544
throw UnknownElement("Attempted to retrieve non-existant crossing " + glObject->getMicrosimID());
545
} else {
546
return nullptr;
547
}
548
}
549
550
551
const std::unordered_map<const GUIGlObject*, GNECrossing*>&
552
GNENetHelper::AttributeCarriers::getCrossings() const {
553
return myCrossings;
554
}
555
556
557
std::vector<GNECrossing*>
558
GNENetHelper::AttributeCarriers::getSelectedCrossings() const {
559
std::vector<GNECrossing*> result;
560
// iterate over crossings
561
for (const auto& crossing : myCrossings) {
562
if (crossing.second->isAttributeCarrierSelected()) {
563
result.push_back(crossing.second);
564
}
565
}
566
return result;
567
}
568
569
570
int
571
GNENetHelper::AttributeCarriers::getNumberOfSelectedCrossings() const {
572
int counter = 0;
573
for (const auto& crossing : myCrossings) {
574
if (crossing.second->isAttributeCarrierSelected()) {
575
counter++;
576
}
577
}
578
return counter;
579
}
580
581
582
GNEWalkingArea*
583
GNENetHelper::AttributeCarriers::retrieveWalkingArea(const GUIGlObject* glObject, bool hardFail) const {
584
auto it = myWalkingAreas.find(glObject);
585
if (it != myWalkingAreas.end()) {
586
return it->second;
587
}
588
if (hardFail) {
589
// If junction wasn't found, throw exception
590
throw UnknownElement("Attempted to retrieve non-existant walkingArea " + glObject->getMicrosimID());
591
} else {
592
return nullptr;
593
}
594
}
595
596
597
const std::unordered_map<const GUIGlObject*, GNEWalkingArea*>&
598
GNENetHelper::AttributeCarriers::getWalkingAreas() const {
599
return myWalkingAreas;
600
}
601
602
603
std::vector<GNEWalkingArea*>
604
GNENetHelper::AttributeCarriers::getSelectedWalkingAreas() const {
605
std::vector<GNEWalkingArea*> result;
606
// iterate over walkingAreas
607
for (const auto& walkingArea : myWalkingAreas) {
608
if (walkingArea.second->isAttributeCarrierSelected()) {
609
result.push_back(walkingArea.second);
610
}
611
}
612
return result;
613
}
614
615
616
int
617
GNENetHelper::AttributeCarriers::getNumberOfSelectedWalkingAreas() const {
618
int counter = 0;
619
for (const auto& walkingArea : myWalkingAreas) {
620
if (walkingArea.second->isAttributeCarrierSelected()) {
621
counter++;
622
}
623
}
624
return counter;
625
}
626
627
628
GNEEdgeType*
629
GNENetHelper::AttributeCarriers::retrieveEdgeType(const std::string& id, bool hardFail) const {
630
if (myEdgeTypes.count(id) > 0) {
631
return myEdgeTypes.at(id);
632
} else if (hardFail) {
633
// If edge wasn't found, throw exception
634
throw UnknownElement("Attempted to retrieve non-existant EdgeType " + id);
635
} else {
636
return nullptr;
637
}
638
}
639
640
641
GNEEdgeType*
642
GNENetHelper::AttributeCarriers::registerEdgeType(GNEEdgeType* edgeType) {
643
// increase reference
644
edgeType->incRef("GNENet::registerEdgeType");
645
// add it in container
646
myEdgeTypes[edgeType->getMicrosimID()] = edgeType;
647
return edgeType;
648
}
649
650
651
const std::map<std::string, GNEEdgeType*>&
652
GNENetHelper::AttributeCarriers::getEdgeTypes() const {
653
return myEdgeTypes;
654
}
655
656
657
void GNENetHelper::AttributeCarriers::clearEdgeTypes() {
658
myEdgeTypes.clear();
659
}
660
661
662
void
663
GNENetHelper::AttributeCarriers::updateEdgeTypeID(GNEEdgeType* edgeType, const std::string& newID) {
664
if (myEdgeTypes.count(edgeType->getID()) == 0) {
665
throw ProcessError(edgeType->getTagStr() + " with ID='" + edgeType->getID() + "' doesn't exist in AttributeCarriers.edgeType");
666
} else if (myEdgeTypes.count(newID) != 0) {
667
throw ProcessError("There is another " + edgeType->getTagStr() + " with new ID='" + newID + "' in myEdgeTypes");
668
} else {
669
// remove edgeType from container
670
myEdgeTypes.erase(edgeType->getID());
671
// rename in typeCont
672
myNet->getNetBuilder()->getTypeCont().updateEdgeTypeID(edgeType->getID(), newID);
673
// update microsim ID
674
edgeType->setNetworkElementID(newID);
675
// add it into myEdgeTypes again
676
myEdgeTypes[edgeType->getID()] = edgeType;
677
// net has to be saved
678
myNet->getSavingStatus()->requireSaveNetwork();
679
}
680
}
681
682
683
std::string
684
GNENetHelper::AttributeCarriers::generateEdgeTypeID() const {
685
int counter = 0;
686
while (myEdgeTypes.count("edgeType_" + toString(counter)) != 0) {
687
counter++;
688
}
689
return ("edgeType_" + toString(counter));
690
}
691
692
693
GNEEdge*
694
GNENetHelper::AttributeCarriers::retrieveEdge(const std::string& id, bool hardFail) const {
695
auto it = myEdges.find(id);
696
if (it != myEdges.end()) {
697
return it->second;
698
}
699
if (hardFail) {
700
// If edge wasn't found, throw exception
701
throw UnknownElement("Attempted to retrieve non-existant edge " + id);
702
} else {
703
return nullptr;
704
}
705
}
706
707
708
std::vector<GNEEdge*>
709
GNENetHelper::AttributeCarriers::retrieveEdges(GNEJunction* from, GNEJunction* to) const {
710
if ((from == nullptr) || (to == nullptr)) {
711
throw UnknownElement("Junctions cannot be nullptr");
712
}
713
std::vector<GNEEdge*> edges;
714
// iterate over outgoing edges of from edge and check to junction
715
for (const auto& edgeTo : from->getGNEOutgoingEdges()) {
716
if (edgeTo->getToJunction() == to) {
717
edges.push_back(edgeTo);
718
}
719
}
720
return edges;
721
}
722
723
724
const std::map<std::string, GNEEdge*>&
725
GNENetHelper::AttributeCarriers::getEdges() const {
726
return myEdges;
727
}
728
729
730
std::vector<GNEEdge*>
731
GNENetHelper::AttributeCarriers::getSelectedEdges() const {
732
std::vector<GNEEdge*> result;
733
// returns edges depending of selection
734
for (const auto& edge : myEdges) {
735
if (edge.second->isAttributeCarrierSelected()) {
736
result.push_back(edge.second);
737
}
738
}
739
return result;
740
}
741
742
743
GNEEdge*
744
GNENetHelper::AttributeCarriers::registerEdge(GNEEdge* edge) {
745
edge->incRef("GNENet::registerEdge");
746
edge->setResponsible(false);
747
// add edge to internal container of GNENet
748
myEdges[edge->getMicrosimID()] = edge;
749
myNumberOfNetworkElements++;
750
// insert all lanes
751
for (const auto& lane : edge->getChildLanes()) {
752
insertLane(lane);
753
}
754
// Add references into GNEJunctions
755
edge->getFromJunction()->addOutgoingGNEEdge(edge);
756
edge->getToJunction()->addIncomingGNEEdge(edge);
757
// update boundaries of both junctions (to remove it from Grid)
758
edge->getFromJunction()->updateCenteringBoundary(true);
759
edge->getToJunction()->updateCenteringBoundary(true);
760
// update edge boundary
761
edge->updateCenteringBoundary(false);
762
// expand edge boundary
763
myNet->expandBoundary(edge->getCenteringBoundary());
764
// finally add edge into grid
765
myNet->addGLObjectIntoGrid(edge);
766
return edge;
767
}
768
769
770
void
771
GNENetHelper::AttributeCarriers::clearEdges() {
772
myEdges.clear();
773
}
774
775
776
void
777
GNENetHelper::AttributeCarriers::addPrefixToEdges(const std::string& prefix) {
778
// make a copy of edges
779
auto edgeCopy = myEdges;
780
// clear edges
781
myEdges.clear();
782
// fill edges again
783
for (const auto& edge : edgeCopy) {
784
// update microsim ID
785
edge.second->setNetworkElementID(prefix + edge.first);
786
// insert in myEdges again
787
myEdges[prefix + edge.first] = edge.second;
788
}
789
}
790
791
792
std::string
793
GNENetHelper::AttributeCarriers::generateEdgeID() const {
794
// get edge prefix
795
const std::string edgePrefix = OptionsCont::getOptions().getString("prefix") + OptionsCont::getOptions().getString("edge-prefix");
796
// generate new ID
797
while (myEdges.count(edgePrefix + toString(myNet->getEdgeIDCounter())) != 0) {
798
myNet->getEdgeIDCounter()++;
799
}
800
return edgePrefix + toString(myNet->getEdgeIDCounter());
801
}
802
803
804
void
805
GNENetHelper::AttributeCarriers::updateEdgeID(GNEEdge* edge, const std::string& newID) {
806
if (myEdges.count(edge->getID()) == 0) {
807
throw ProcessError(edge->getTagStr() + " with ID='" + edge->getID() + "' doesn't exist in AttributeCarriers.edge");
808
} else if (myEdges.count(newID) != 0) {
809
throw ProcessError("There is another " + edge->getTagStr() + " with new ID='" + newID + "' in myEdges");
810
} else {
811
// remove edge from container
812
myEdges.erase(edge->getNBEdge()->getID());
813
// rename in NetBuilder
814
myNet->getNetBuilder()->getEdgeCont().rename(edge->getNBEdge(), newID);
815
// update microsim ID
816
edge->setEdgeID(newID);
817
// add it into myEdges again
818
myEdges[edge->getID()] = edge;
819
// rename all connections related to this edge
820
for (const auto& lane : edge->getChildLanes()) {
821
lane->updateConnectionIDs();
822
}
823
// net has to be saved
824
myNet->getSavingStatus()->requireSaveNetwork();
825
}
826
}
827
828
829
int
830
GNENetHelper::AttributeCarriers::getNumberOfSelectedEdges() const {
831
int counter = 0;
832
for (const auto& edge : myEdges) {
833
if (edge.second->isAttributeCarrierSelected()) {
834
counter++;
835
}
836
}
837
return counter;
838
}
839
840
841
GNELane*
842
GNENetHelper::AttributeCarriers::retrieveLane(const std::string& id, bool hardFail, bool checkVolatileChange) const {
843
const std::string edge_id = SUMOXMLDefinitions::getEdgeIDFromLane(id);
844
const GNEEdge* edge = retrieveEdge(edge_id, false);
845
if (edge != nullptr) {
846
GNELane* lane = nullptr;
847
// search lane in lane's edges
848
for (auto laneIt : edge->getChildLanes()) {
849
if (laneIt->getID() == id) {
850
lane = laneIt;
851
}
852
}
853
// throw exception or return nullptr if lane wasn't found
854
if (lane == nullptr) {
855
if (hardFail) {
856
// Throw exception if hardFail is enabled
857
throw UnknownElement(toString(SUMO_TAG_LANE) + " " + id);
858
}
859
} else {
860
// check if the recomputing with volatile option has changed the number of lanes (needed for additionals and demand elements)
861
if (checkVolatileChange && (myNet->getEdgesAndNumberOfLanes().count(edge_id) == 1) &&
862
myNet->getEdgesAndNumberOfLanes().at(edge_id) != (int)edge->getChildLanes().size()) {
863
return edge->getChildLanes().at(lane->getIndex() + 1);
864
}
865
return lane;
866
}
867
} else if (hardFail) {
868
// Throw exception if hardFail is enabled
869
throw UnknownElement(toString(SUMO_TAG_EDGE) + " " + edge_id);
870
}
871
return nullptr;
872
}
873
874
875
GNELane*
876
GNENetHelper::AttributeCarriers::retrieveLane(const GUIGlObject* glObject, bool hardFail) const {
877
auto it = myLanes.find(glObject);
878
if (it != myLanes.end()) {
879
return it->second;
880
}
881
if (hardFail) {
882
// If junction wasn't found, throw exception
883
throw UnknownElement("Attempted to retrieve non-existant lane " + glObject->getMicrosimID());
884
} else {
885
return nullptr;
886
}
887
}
888
889
890
const std::unordered_map<const GUIGlObject*, GNELane*>&
891
GNENetHelper::AttributeCarriers::getLanes() const {
892
return myLanes;
893
}
894
895
896
std::vector<GNELane*>
897
GNENetHelper::AttributeCarriers::getSelectedLanes() const {
898
std::vector<GNELane*> result;
899
// returns lanes depending of selection
900
for (const auto& lane : myLanes) {
901
if (lane.second->isAttributeCarrierSelected()) {
902
result.push_back(lane.second);
903
}
904
}
905
return result;
906
}
907
908
909
int
910
GNENetHelper::AttributeCarriers::getNumberOfSelectedLanes() const {
911
int counter = 0;
912
for (const auto& lane : myLanes) {
913
if (lane.second->isAttributeCarrierSelected()) {
914
counter++;
915
}
916
}
917
return counter;
918
}
919
920
921
GNEConnection*
922
GNENetHelper::AttributeCarriers::retrieveConnection(const std::string& id, bool hardFail) const {
923
// iterate over connections
924
for (const auto& connection : myConnections) {
925
if (connection.second->getID() == id) {
926
return connection.second;
927
}
928
}
929
if (hardFail) {
930
// If POI wasn't found, throw exception
931
throw UnknownElement("Attempted to retrieve non-existant connection " + id);
932
} else {
933
return nullptr;
934
}
935
}
936
937
938
GNEConnection*
939
GNENetHelper::AttributeCarriers::retrieveConnection(const GUIGlObject* glObject, bool hardFail) const {
940
auto it = myConnections.find(glObject);
941
if (it != myConnections.end()) {
942
return it->second;
943
}
944
if (hardFail) {
945
// If POI wasn't found, throw exception
946
throw UnknownElement("Attempted to retrieve non-existant connection " + glObject->getMicrosimID());
947
} else {
948
return nullptr;
949
}
950
}
951
952
953
const std::unordered_map<const GUIGlObject*, GNEConnection*>&
954
GNENetHelper::AttributeCarriers::getConnections() const {
955
return myConnections;
956
}
957
958
959
std::vector<GNEConnection*>
960
GNENetHelper::AttributeCarriers::getSelectedConnections() const {
961
std::vector<GNEConnection*> result;
962
// returns connections depending of selection
963
for (const auto& connection : myConnections) {
964
if (connection.second->isAttributeCarrierSelected()) {
965
result.push_back(connection.second);
966
}
967
}
968
return result;
969
}
970
971
972
int
973
GNENetHelper::AttributeCarriers::getNumberOfSelectedConnections() const {
974
int counter = 0;
975
for (const auto& connection : myConnections) {
976
if (connection.second->isAttributeCarrierSelected()) {
977
counter++;
978
}
979
}
980
return counter;
981
}
982
983
984
GNEInternalLane*
985
GNENetHelper::AttributeCarriers::retrieveInternalLane(const GUIGlObject* glObject, bool hardFail) const {
986
auto it = myInternalLanes.find(glObject);
987
if (it != myInternalLanes.end()) {
988
return it->second;
989
}
990
if (hardFail) {
991
// If POI wasn't found, throw exception
992
throw UnknownElement("Attempted to retrieve non-existant internalLane " + glObject->getMicrosimID());
993
} else {
994
return nullptr;
995
}
996
}
997
998
999
GNEAdditional*
1000
GNENetHelper::AttributeCarriers::retrieveAdditional(SumoXMLTag type, const std::string& id, bool hardFail) const {
1001
auto it = myAdditionalIDs.at(type).find(id);
1002
if (it != myAdditionalIDs.at(type).end()) {
1003
return it->second;
1004
}
1005
if (hardFail) {
1006
throw ProcessError("Attempted to retrieve non-existant additional (string)");
1007
} else {
1008
return nullptr;
1009
}
1010
}
1011
1012
1013
GNEAdditional*
1014
GNENetHelper::AttributeCarriers::retrieveAdditionals(const std::vector<SumoXMLTag> types, const std::string& id, bool hardFail) const {
1015
for (const auto& type : types) {
1016
auto it = myAdditionalIDs.at(type).find(id);
1017
if (it != myAdditionalIDs.at(type).end()) {
1018
return it->second;
1019
}
1020
}
1021
if (hardFail) {
1022
throw ProcessError("Attempted to retrieve non-existant additional (string)");
1023
} else {
1024
return nullptr;
1025
}
1026
}
1027
1028
1029
GNEAdditional*
1030
GNENetHelper::AttributeCarriers::retrieveAdditional(const GUIGlObject* glObject, bool hardFail) const {
1031
// iterate over all additionals
1032
for (const auto& additionalTag : myAdditionals) {
1033
auto it = additionalTag.second.find(glObject);
1034
if (it != additionalTag.second.end()) {
1035
return it->second;
1036
}
1037
}
1038
if (hardFail) {
1039
throw ProcessError("Attempted to retrieve non-existant additional (glObject)");
1040
} else {
1041
return nullptr;
1042
}
1043
}
1044
1045
1046
GNEAdditional*
1047
GNENetHelper::AttributeCarriers::retrieveRerouterInterval(const std::string& rerouterID, const SUMOTime begin, const SUMOTime end) const {
1048
// first retrieve rerouter
1049
const GNEAdditional* rerouter = retrieveAdditional(SUMO_TAG_REROUTER, rerouterID);
1050
// parse begin and end
1051
const std::string beginStr = time2string(begin);
1052
const std::string endStr = time2string(end);
1053
// now iterate over all children and check begin and end
1054
for (const auto& interval : rerouter->getChildAdditionals()) {
1055
// check tag (to avoid symbols)
1056
if (interval->getTagProperty()->getTag() == SUMO_TAG_INTERVAL) {
1057
// check begin and end
1058
if ((interval->getAttribute(SUMO_ATTR_BEGIN) == beginStr) &&
1059
(interval->getAttribute(SUMO_ATTR_END) == endStr)) {
1060
return interval;
1061
}
1062
}
1063
}
1064
// throw exception
1065
throw ProcessError("Attempted to retrieve non-existant rerouter interval");
1066
}
1067
1068
1069
const std::unordered_map<SumoXMLTag, std::unordered_map<const GUIGlObject*, GNEAdditional*>, std::hash<int> >&
1070
GNENetHelper::AttributeCarriers::getAdditionals() const {
1071
return myAdditionals;
1072
}
1073
1074
1075
std::vector<GNEAdditional*>
1076
GNENetHelper::AttributeCarriers::getSelectedAdditionals() const {
1077
std::vector<GNEAdditional*> result;
1078
// returns additionals depending of selection
1079
for (const auto& additionalsTags : myAdditionals) {
1080
for (const auto& additional : additionalsTags.second) {
1081
if (additional.second->isAttributeCarrierSelected()) {
1082
result.push_back(additional.second);
1083
}
1084
}
1085
}
1086
return result;
1087
}
1088
1089
1090
std::vector<GNEAdditional*>
1091
GNENetHelper::AttributeCarriers::getSelectedShapes() const {
1092
std::vector<GNEAdditional*> result;
1093
// returns additionals depending of selection
1094
for (const auto& additionalsTags : myAdditionals) {
1095
for (const auto& additional : additionalsTags.second) {
1096
if (additional.second->getTagProperty()->isShapeElement() && additional.second->isAttributeCarrierSelected()) {
1097
result.push_back(additional.second);
1098
}
1099
}
1100
}
1101
return result;
1102
}
1103
1104
1105
int
1106
GNENetHelper::AttributeCarriers::getNumberOfAdditionals() const {
1107
int counter = 0;
1108
for (const auto& additionalsTag : myAdditionals) {
1109
counter += (int)additionalsTag.second.size();
1110
}
1111
return counter;
1112
}
1113
1114
1115
void
1116
GNENetHelper::AttributeCarriers::clearAdditionals() {
1117
// clear elements in grid
1118
for (const auto& additionalsTags : myAdditionals) {
1119
for (const auto& additional : additionalsTags.second) {
1120
myNet->removeGLObjectFromGrid(additional.second);
1121
}
1122
}
1123
// iterate over myAdditionals and clear all additionals
1124
for (auto& additionals : myAdditionals) {
1125
additionals.second.clear();
1126
}
1127
for (auto& additionals : myAdditionalIDs) {
1128
additionals.second.clear();
1129
}
1130
}
1131
1132
1133
void
1134
GNENetHelper::AttributeCarriers::updateAdditionalID(GNEAdditional* additional, const std::string& newID) {
1135
const auto tag = additional->getTagProperty()->getTag();
1136
const auto it = myAdditionalIDs.at(tag).find(additional->getID());
1137
if (it == myAdditionalIDs.at(tag).end()) {
1138
throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' doesn't exist in AttributeCarriers.additionals");
1139
} else {
1140
// remove from container, set new Id, and insert it again
1141
myAdditionalIDs.at(tag).erase(it);
1142
// set microsim ID
1143
additional->setMicrosimID(newID);
1144
myAdditionalIDs.at(tag)[newID] = additional;
1145
}
1146
}
1147
1148
1149
std::string
1150
GNENetHelper::AttributeCarriers::generateAdditionalID(SumoXMLTag tag) const {
1151
// obtain option container
1152
const auto& neteditOptions = OptionsCont::getOptions();
1153
// get prefix
1154
std::string prefix;
1155
if (tag == SUMO_TAG_BUS_STOP) {
1156
prefix = neteditOptions.getString("busStop-prefix");
1157
} else if (tag == SUMO_TAG_TRAIN_STOP) {
1158
prefix = neteditOptions.getString("trainStop-prefix");
1159
} else if (tag == SUMO_TAG_CONTAINER_STOP) {
1160
prefix = neteditOptions.getString("containerStop-prefix");
1161
} else if (tag == SUMO_TAG_CHARGING_STATION) {
1162
prefix = neteditOptions.getString("chargingStation-prefix");
1163
} else if (tag == SUMO_TAG_PARKING_AREA) {
1164
prefix = neteditOptions.getString("parkingArea-prefix");
1165
} else if (tag == SUMO_TAG_INDUCTION_LOOP) {
1166
prefix = neteditOptions.getString("e1Detector-prefix");
1167
} else if ((tag == SUMO_TAG_LANE_AREA_DETECTOR) || (tag == GNE_TAG_MULTI_LANE_AREA_DETECTOR)) {
1168
prefix = neteditOptions.getString("e2Detector-prefix");
1169
} else if (tag == SUMO_TAG_ENTRY_EXIT_DETECTOR) {
1170
prefix = neteditOptions.getString("e3Detector-prefix");
1171
} else if (tag == SUMO_TAG_INSTANT_INDUCTION_LOOP) {
1172
prefix = neteditOptions.getString("e1InstantDetector-prefix");
1173
} else if (tag == SUMO_TAG_REROUTER) {
1174
prefix = neteditOptions.getString("rerouter-prefix");
1175
} else if ((tag == SUMO_TAG_CALIBRATOR) || (tag == GNE_TAG_CALIBRATOR_LANE)) {
1176
prefix = neteditOptions.getString("calibrator-prefix");
1177
} else if (tag == SUMO_TAG_ROUTEPROBE) {
1178
prefix = neteditOptions.getString("routeProbe-prefix");
1179
} else if (tag == SUMO_TAG_VSS) {
1180
prefix = neteditOptions.getString("vss-prefix");
1181
} else if (tag == SUMO_TAG_TRACTION_SUBSTATION) {
1182
prefix = neteditOptions.getString("tractionSubstation-prefix");
1183
} else if (tag == SUMO_TAG_OVERHEAD_WIRE_SECTION) {
1184
prefix = neteditOptions.getString("overheadWire-prefix");
1185
} else if (tag == SUMO_TAG_POLY) {
1186
prefix = neteditOptions.getString("polygon-prefix");
1187
} else if ((tag == SUMO_TAG_POI) || (tag == GNE_TAG_POILANE) || (tag == GNE_TAG_POIGEO)) {
1188
prefix = neteditOptions.getString("poi-prefix");
1189
} else if (tag == SUMO_TAG_TAZ) {
1190
prefix = toString(SUMO_TAG_TAZ);
1191
} else if (tag == GNE_TAG_JPS_WALKABLEAREA) {
1192
prefix = neteditOptions.getString("jps.walkableArea-prefix");
1193
} else if (tag == GNE_TAG_JPS_OBSTACLE) {
1194
prefix = neteditOptions.getString("jps.obstacle-prefix");
1195
}
1196
int counter = 0;
1197
// check namespaces
1198
if (std::find(NamespaceIDs::busStops.begin(), NamespaceIDs::busStops.end(), tag) != NamespaceIDs::busStops.end()) {
1199
while (retrieveAdditionals(NamespaceIDs::busStops, prefix + "_" + toString(counter), false) != nullptr) {
1200
counter++;
1201
}
1202
} else if (std::find(NamespaceIDs::calibrators.begin(), NamespaceIDs::calibrators.end(), tag) != NamespaceIDs::calibrators.end()) {
1203
while (retrieveAdditionals(NamespaceIDs::calibrators, prefix + "_" + toString(counter), false) != nullptr) {
1204
counter++;
1205
}
1206
} else if (std::find(NamespaceIDs::polygons.begin(), NamespaceIDs::polygons.end(), tag) != NamespaceIDs::polygons.end()) {
1207
while (retrieveAdditionals(NamespaceIDs::polygons, prefix + "_" + toString(counter), false) != nullptr) {
1208
counter++;
1209
}
1210
} else if (std::find(NamespaceIDs::POIs.begin(), NamespaceIDs::POIs.end(), tag) != NamespaceIDs::POIs.end()) {
1211
while (retrieveAdditionals(NamespaceIDs::POIs, prefix + "_" + toString(counter), false) != nullptr) {
1212
counter++;
1213
}
1214
} else if (std::find(NamespaceIDs::laneAreaDetectors.begin(), NamespaceIDs::laneAreaDetectors.end(), tag) != NamespaceIDs::laneAreaDetectors.end()) {
1215
while (retrieveAdditionals(NamespaceIDs::laneAreaDetectors, prefix + "_" + toString(counter), false) != nullptr) {
1216
counter++;
1217
}
1218
} else {
1219
while (retrieveAdditional(tag, prefix + "_" + toString(counter), false) != nullptr) {
1220
counter++;
1221
}
1222
}
1223
// return new element ID
1224
return (prefix + "_" + toString(counter));
1225
}
1226
1227
1228
int
1229
GNENetHelper::AttributeCarriers::getNumberOfSelectedAdditionals() const {
1230
int counter = 0;
1231
for (const auto& additionalsTags : myAdditionals) {
1232
for (const auto& additional : additionalsTags.second) {
1233
if (additional.second->isAttributeCarrierSelected()) {
1234
counter++;
1235
}
1236
}
1237
}
1238
return counter;
1239
}
1240
1241
1242
int
1243
GNENetHelper::AttributeCarriers::getNumberOfSelectedPureAdditionals() const {
1244
return getNumberOfSelectedAdditionals() -
1245
// shapes
1246
getNumberOfSelectedPolygons() - getNumberOfSelectedPOIs() -
1247
// JuPedSims
1248
getNumberOfSelectedJpsWalkableAreas() - getNumberOfSelectedJpsObstacles() -
1249
// TAZ
1250
getNumberOfSelectedTAZs() -
1251
// wires
1252
getNumberOfSelectedWires();
1253
}
1254
1255
1256
int
1257
GNENetHelper::AttributeCarriers::getNumberOfSelectedPolygons() const {
1258
int counter = 0;
1259
for (const auto& poly : myAdditionals.at(SUMO_TAG_POLY)) {
1260
if (poly.second->isAttributeCarrierSelected()) {
1261
counter++;
1262
}
1263
}
1264
return counter;
1265
}
1266
1267
1268
int
1269
GNENetHelper::AttributeCarriers::getNumberOfSelectedJpsWalkableAreas() const {
1270
int counter = 0;
1271
for (const auto& walkableArea : myAdditionals.at(GNE_TAG_JPS_WALKABLEAREA)) {
1272
if (walkableArea.second->isAttributeCarrierSelected()) {
1273
counter++;
1274
}
1275
}
1276
return counter;
1277
}
1278
1279
1280
int
1281
GNENetHelper::AttributeCarriers::getNumberOfSelectedJpsObstacles() const {
1282
int counter = 0;
1283
for (const auto& obstacle : myAdditionals.at(GNE_TAG_JPS_OBSTACLE)) {
1284
if (obstacle.second->isAttributeCarrierSelected()) {
1285
counter++;
1286
}
1287
}
1288
return counter;
1289
}
1290
1291
1292
int
1293
GNENetHelper::AttributeCarriers::getNumberOfSelectedPOIs() const {
1294
int counter = 0;
1295
for (const auto& POI : myAdditionals.at(SUMO_TAG_POI)) {
1296
if (POI.second->isAttributeCarrierSelected()) {
1297
counter++;
1298
}
1299
}
1300
for (const auto& POILane : myAdditionals.at(GNE_TAG_POILANE)) {
1301
if (POILane.second->isAttributeCarrierSelected()) {
1302
counter++;
1303
}
1304
}
1305
for (const auto& POIGEO : myAdditionals.at(GNE_TAG_POIGEO)) {
1306
if (POIGEO.second->isAttributeCarrierSelected()) {
1307
counter++;
1308
}
1309
}
1310
return counter;
1311
}
1312
1313
1314
int
1315
GNENetHelper::AttributeCarriers::getNumberOfSelectedTAZs() const {
1316
int counter = 0;
1317
for (const auto& TAZ : myAdditionals.at(SUMO_TAG_TAZ)) {
1318
if (TAZ.second->isAttributeCarrierSelected()) {
1319
counter++;
1320
}
1321
}
1322
return counter;
1323
}
1324
1325
1326
int
1327
GNENetHelper::AttributeCarriers::getNumberOfSelectedWires() const {
1328
int counter = 0;
1329
for (const auto& additionalsTags : myAdditionals) {
1330
for (const auto& additional : additionalsTags.second) {
1331
if (additional.second->isAttributeCarrierSelected() && additional.second->getTagProperty()->isWireElement()) {
1332
counter++;
1333
}
1334
}
1335
}
1336
return counter;
1337
}
1338
1339
1340
GNETAZSourceSink*
1341
GNENetHelper::AttributeCarriers::retrieveTAZSourceSink(const GNEAttributeCarrier* sourceSink, bool hardFail) const {
1342
// iterate over all demand elements
1343
for (const auto& TAZSourceSinkTag : myTAZSourceSinks) {
1344
auto it = TAZSourceSinkTag.second.find(sourceSink);
1345
if (it != TAZSourceSinkTag.second.end()) {
1346
return it->second;
1347
}
1348
}
1349
if (hardFail) {
1350
throw ProcessError("Attempted to retrieve non-existant sourceSink (glObject)");
1351
} else {
1352
return nullptr;
1353
}
1354
}
1355
1356
1357
const std::unordered_map<SumoXMLTag, std::unordered_map<const GNEAttributeCarrier*, GNETAZSourceSink*>, std::hash<int> >&
1358
GNENetHelper::AttributeCarriers::getTAZSourceSinks() const {
1359
return myTAZSourceSinks;
1360
}
1361
1362
1363
int
1364
GNENetHelper::AttributeCarriers::getNumberOfTAZSourceSinks() const {
1365
int counter = 0;
1366
for (const auto& sourceSinksTag : myTAZSourceSinks) {
1367
counter += (int)sourceSinksTag.second.size();
1368
}
1369
return counter;
1370
}
1371
1372
1373
void
1374
GNENetHelper::AttributeCarriers::clearTAZSourceSinks() {
1375
// iterate over myTAZSourceSinks and clear all sourceSinks
1376
for (auto& sourceSinksTags : myTAZSourceSinks) {
1377
sourceSinksTags.second.clear();
1378
}
1379
}
1380
1381
1382
GNEDemandElement*
1383
GNENetHelper::AttributeCarriers::retrieveDemandElement(SumoXMLTag type, const std::string& id, bool hardFail) const {
1384
auto it = myDemandElementIDs.at(type).find(id);
1385
if (it != myDemandElementIDs.at(type).end()) {
1386
return it->second;
1387
}
1388
if (hardFail) {
1389
throw ProcessError("Attempted to retrieve non-existant demand element (string)");
1390
} else {
1391
return nullptr;
1392
}
1393
}
1394
1395
1396
GNEDemandElement*
1397
GNENetHelper::AttributeCarriers::retrieveDemandElements(std::vector<SumoXMLTag> types, const std::string& id, bool hardFail) const {
1398
for (const auto& type : types) {
1399
auto it = myDemandElementIDs.at(type).find(id);
1400
if (it != myDemandElementIDs.at(type).end()) {
1401
return it->second;
1402
}
1403
}
1404
if (hardFail) {
1405
throw ProcessError("Attempted to retrieve non-existant demand element (string)");
1406
} else {
1407
return nullptr;
1408
}
1409
}
1410
1411
1412
GNEDemandElement*
1413
GNENetHelper::AttributeCarriers::retrieveDemandElement(const GUIGlObject* glObject, bool hardFail) const {
1414
// iterate over all demand elements
1415
for (const auto& demandElementTag : myDemandElements) {
1416
auto it = demandElementTag.second.find(glObject);
1417
if (it != demandElementTag.second.end()) {
1418
return it->second;
1419
}
1420
}
1421
if (hardFail) {
1422
throw ProcessError("Attempted to retrieve non-existant demandElement (glObject)");
1423
} else {
1424
return nullptr;
1425
}
1426
}
1427
1428
1429
std::vector<GNEDemandElement*>
1430
GNENetHelper::AttributeCarriers::getSelectedDemandElements() const {
1431
std::vector<GNEDemandElement*> result;
1432
// returns demand elements depending of selection
1433
for (const auto& demandElementTag : myDemandElements) {
1434
for (const auto& demandElement : demandElementTag.second) {
1435
if (demandElement.second->isAttributeCarrierSelected()) {
1436
result.push_back(demandElement.second);
1437
}
1438
}
1439
}
1440
return result;
1441
}
1442
1443
1444
const std::unordered_map<SumoXMLTag, std::unordered_map<const GUIGlObject*, GNEDemandElement*>, std::hash<int> >&
1445
GNENetHelper::AttributeCarriers::getDemandElements() const {
1446
return myDemandElements;
1447
}
1448
1449
1450
std::string
1451
GNENetHelper::AttributeCarriers::generateDemandElementID(SumoXMLTag tag) const {
1452
// obtain option container
1453
const auto& neteditOptions = OptionsCont::getOptions();
1454
// get tag property
1455
const auto tagProperty = myNet->getTagPropertiesDatabase()->getTagProperty(tag, true);
1456
// get prefix
1457
std::string prefix;
1458
if (tag == SUMO_TAG_ROUTE) {
1459
prefix = neteditOptions.getString("route-prefix");
1460
} else if (tag == SUMO_TAG_ROUTE_DISTRIBUTION) {
1461
prefix = neteditOptions.getString("routeDistribution-prefix");
1462
} else if (tag == SUMO_TAG_VTYPE) {
1463
prefix = neteditOptions.getString("vType-prefix");
1464
} else if (tag == SUMO_TAG_VTYPE_DISTRIBUTION) {
1465
prefix = neteditOptions.getString("vTypeDistribution-prefix");
1466
} else if ((tag == SUMO_TAG_TRIP) || (tag == GNE_TAG_TRIP_JUNCTIONS) || (tag == GNE_TAG_TRIP_TAZS)) {
1467
prefix = neteditOptions.getString("trip-prefix");
1468
} else if (tagProperty->isVehicle() && !tagProperty->isFlow()) {
1469
prefix = neteditOptions.getString("vehicle-prefix");
1470
} else if (tagProperty->isPerson()) {
1471
if (tagProperty->isFlow()) {
1472
prefix = neteditOptions.getString("personflow-prefix");
1473
} else {
1474
prefix = neteditOptions.getString("person-prefix");
1475
}
1476
} else if (tagProperty->isContainer()) {
1477
if (tagProperty->isFlow()) {
1478
prefix = neteditOptions.getString("containerflow-prefix");
1479
} else {
1480
prefix = neteditOptions.getString("container-prefix");
1481
}
1482
} else if (tagProperty->isFlow()) {
1483
prefix = neteditOptions.getString("flow-prefix");
1484
}
1485
// declare counter
1486
int counter = 0;
1487
if (std::find(NamespaceIDs::types.begin(), NamespaceIDs::types.end(), tag) != NamespaceIDs::types.end()) {
1488
while (retrieveDemandElements(NamespaceIDs::types, prefix + "_" + toString(counter), false) != nullptr) {
1489
counter++;
1490
}
1491
} else if (std::find(NamespaceIDs::routes.begin(), NamespaceIDs::routes.end(), tag) != NamespaceIDs::routes.end()) {
1492
while (retrieveDemandElements(NamespaceIDs::routes, prefix + "_" + toString(counter), false) != nullptr) {
1493
counter++;
1494
}
1495
} else if (std::find(NamespaceIDs::persons.begin(), NamespaceIDs::persons.end(), tag) != NamespaceIDs::persons.end()) {
1496
while (retrieveDemandElements(NamespaceIDs::persons, prefix + "_" + toString(counter), false) != nullptr) {
1497
counter++;
1498
}
1499
} else if (std::find(NamespaceIDs::containers.begin(), NamespaceIDs::containers.end(), tag) != NamespaceIDs::containers.end()) {
1500
while (retrieveDemandElements(NamespaceIDs::containers, prefix + "_" + toString(counter), false) != nullptr) {
1501
counter++;
1502
}
1503
} else if (std::find(NamespaceIDs::vehicles.begin(), NamespaceIDs::vehicles.end(), tag) != NamespaceIDs::vehicles.end()) {
1504
while (retrieveDemandElements(NamespaceIDs::vehicles, prefix + "_" + toString(counter), false) != nullptr) {
1505
counter++;
1506
}
1507
} else {
1508
while (retrieveDemandElement(tag, prefix + "_" + toString(counter), false) != nullptr) {
1509
counter++;
1510
}
1511
}
1512
// return new element ID
1513
return (prefix + "_" + toString(counter));
1514
1515
}
1516
1517
1518
GNEDemandElement*
1519
GNENetHelper::AttributeCarriers::getDefaultType() const {
1520
auto it = myDemandElementIDs.at(SUMO_TAG_VTYPE).find(DEFAULT_VTYPE_ID);
1521
if (it != myDemandElementIDs.at(SUMO_TAG_VTYPE).end()) {
1522
return it->second;
1523
}
1524
throw ProcessError(TL("Default vType doesn't exist"));
1525
}
1526
1527
1528
void
1529
GNENetHelper::AttributeCarriers::clearDemandElements() {
1530
// clear elements in grid
1531
for (const auto& demandElementsTags : myDemandElements) {
1532
for (const auto& demandElement : demandElementsTags.second) {
1533
myNet->removeGLObjectFromGrid(demandElement.second);
1534
}
1535
}
1536
// iterate over myDemandElements and clear all demand elements
1537
for (auto& demandElements : myDemandElements) {
1538
demandElements.second.clear();
1539
}
1540
for (auto& demandElements : myDemandElementIDs) {
1541
demandElements.second.clear();
1542
}
1543
}
1544
1545
1546
void
1547
GNENetHelper::AttributeCarriers::updateDemandElementID(GNEDemandElement* demandElement, const std::string& newID) {
1548
const auto tag = demandElement->getTagProperty()->getTag();
1549
const auto it = myDemandElementIDs.at(tag).find(demandElement->getID());
1550
if (it == myDemandElementIDs.at(tag).end()) {
1551
throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' doesn't exist in AttributeCarriers.demandElements");
1552
} else {
1553
// remove from container, set new Id, and insert it again
1554
myDemandElementIDs.at(tag).erase(it);
1555
// set microsim ID
1556
demandElement->setMicrosimID(newID);
1557
myDemandElementIDs.at(tag)[newID] = demandElement;
1558
}
1559
}
1560
1561
1562
void
1563
GNENetHelper::AttributeCarriers::addDefaultVTypes() {
1564
// Create default vehicle Type (it has to be created here due myViewNet was previously nullptr)
1565
GNEVType* defaultVehicleType = new GNEVType(DEFAULT_VTYPE_ID, myNet, SVC_PASSENGER);
1566
myDemandElements.at(defaultVehicleType->getTagProperty()->getTag()).insert(std::make_pair(defaultVehicleType->getGUIGlObject(), defaultVehicleType));
1567
myDemandElementIDs.at(defaultVehicleType->getTagProperty()->getTag()).insert(std::make_pair(defaultVehicleType->getID(), defaultVehicleType));
1568
defaultVehicleType->incRef("GNENet::DEFAULT_VEHTYPE");
1569
1570
// Create default Bike Type (it has to be created here due myViewNet was previously nullptr)
1571
GNEVType* defaultBikeType = new GNEVType(DEFAULT_BIKETYPE_ID, myNet, SVC_BICYCLE);
1572
myDemandElements.at(defaultBikeType->getTagProperty()->getTag()).insert(std::make_pair(defaultBikeType->getGUIGlObject(), defaultBikeType));
1573
myDemandElementIDs.at(defaultBikeType->getTagProperty()->getTag()).insert(std::make_pair(defaultBikeType->getID(), defaultBikeType));
1574
defaultBikeType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1575
defaultBikeType->incRef("GNENet::DEFAULT_BIKETYPE_ID");
1576
1577
// Create default taxi Type (it has to be created here due myViewNet was previously nullptr)
1578
GNEVType* defaultTaxiType = new GNEVType(DEFAULT_TAXITYPE_ID, myNet, SVC_TAXI);
1579
myDemandElements.at(defaultTaxiType->getTagProperty()->getTag()).insert(std::make_pair(defaultTaxiType->getGUIGlObject(), defaultTaxiType));
1580
myDemandElementIDs.at(defaultTaxiType->getTagProperty()->getTag()).insert(std::make_pair(defaultTaxiType->getID(), defaultTaxiType));
1581
defaultTaxiType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1582
defaultTaxiType->incRef("GNENet::DEFAULT_TAXITYPE_ID");
1583
1584
// Create default rail Type (it has to be created here due myViewNet was previously nullptr)
1585
GNEVType* defaultRailType = new GNEVType(DEFAULT_RAILTYPE_ID, myNet, SVC_RAIL);
1586
myDemandElements.at(defaultRailType->getTagProperty()->getTag()).insert(std::make_pair(defaultRailType->getGUIGlObject(), defaultRailType));
1587
myDemandElementIDs.at(defaultRailType->getTagProperty()->getTag()).insert(std::make_pair(defaultRailType->getID(), defaultRailType));
1588
defaultRailType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1589
defaultRailType->incRef("GNENet::DEFAULT_RAILTYPE_ID");
1590
1591
// Create default person Type (it has to be created here due myViewNet was previously nullptr)
1592
GNEVType* defaultPersonType = new GNEVType(DEFAULT_PEDTYPE_ID, myNet, SVC_PEDESTRIAN);
1593
myDemandElements.at(defaultPersonType->getTagProperty()->getTag()).insert(std::make_pair(defaultPersonType->getGUIGlObject(), defaultPersonType));
1594
myDemandElementIDs.at(defaultPersonType->getTagProperty()->getTag()).insert(std::make_pair(defaultPersonType->getID(), defaultPersonType));
1595
defaultPersonType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1596
defaultPersonType->incRef("GNENet::DEFAULT_PEDTYPE_ID");
1597
1598
// Create default container Type (it has to be created here due myViewNet was previously nullptr)
1599
GNEVType* defaultContainerType = new GNEVType(DEFAULT_CONTAINERTYPE_ID, myNet, SVC_IGNORING);
1600
myDemandElements.at(defaultContainerType->getTagProperty()->getTag()).insert(std::make_pair(defaultContainerType->getGUIGlObject(), defaultContainerType));
1601
myDemandElementIDs.at(defaultContainerType->getTagProperty()->getTag()).insert(std::make_pair(defaultContainerType->getID(), defaultContainerType));
1602
defaultContainerType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1603
defaultContainerType->incRef("GNENet::DEFAULT_CONTAINERTYPE_ID");
1604
}
1605
1606
1607
int
1608
GNENetHelper::AttributeCarriers::getStopIndex() {
1609
return myStopIndex++;
1610
}
1611
1612
1613
int
1614
GNENetHelper::AttributeCarriers::getNumberOfSelectedDemandElements() const {
1615
int counter = 0;
1616
for (const auto& demandElementsTags : myDemandElements) {
1617
for (const auto& demandElement : demandElementsTags.second) {
1618
if (demandElement.second->isAttributeCarrierSelected()) {
1619
counter++;
1620
}
1621
}
1622
}
1623
return counter;
1624
}
1625
1626
1627
int
1628
GNENetHelper::AttributeCarriers::getNumberOfSelectedRoutes() const {
1629
int counter = 0;
1630
// iterate over routes
1631
for (const auto& route : myDemandElements.at(SUMO_TAG_ROUTE)) {
1632
if (route.second->isAttributeCarrierSelected()) {
1633
counter++;
1634
}
1635
}
1636
// iterate over vehicles with embedded routes
1637
for (const auto& vehicle : myDemandElements.at(GNE_TAG_VEHICLE_WITHROUTE)) {
1638
if (vehicle.second->getChildDemandElements().front()->isAttributeCarrierSelected()) {
1639
counter++;
1640
}
1641
}
1642
for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_WITHROUTE)) {
1643
if (flow.second->getChildDemandElements().front()->isAttributeCarrierSelected()) {
1644
counter++;
1645
}
1646
}
1647
return counter;
1648
}
1649
1650
1651
int
1652
GNENetHelper::AttributeCarriers::getNumberOfSelectedVehicles() const {
1653
int counter = 0;
1654
// iterate over all vehicles and flows
1655
for (const auto& vehicle : myDemandElements.at(SUMO_TAG_VEHICLE)) {
1656
if (vehicle.second->isAttributeCarrierSelected()) {
1657
counter++;
1658
}
1659
}
1660
for (const auto& trip : myDemandElements.at(SUMO_TAG_TRIP)) {
1661
if (trip.second->isAttributeCarrierSelected()) {
1662
counter++;
1663
}
1664
}
1665
for (const auto& vehicle : myDemandElements.at(GNE_TAG_VEHICLE_WITHROUTE)) {
1666
if (vehicle.second->isAttributeCarrierSelected()) {
1667
counter++;
1668
}
1669
}
1670
for (const auto& flow : myDemandElements.at(SUMO_TAG_FLOW)) {
1671
if (flow.second->isAttributeCarrierSelected()) {
1672
counter++;
1673
}
1674
}
1675
for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_ROUTE)) {
1676
if (flow.second->isAttributeCarrierSelected()) {
1677
counter++;
1678
}
1679
}
1680
for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_WITHROUTE)) {
1681
if (flow.second->isAttributeCarrierSelected()) {
1682
counter++;
1683
}
1684
}
1685
return counter;
1686
}
1687
1688
1689
int
1690
GNENetHelper::AttributeCarriers::getNumberOfSelectedPersons() const {
1691
int counter = 0;
1692
// iterate over all persons
1693
for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1694
if (person.second->isAttributeCarrierSelected()) {
1695
counter++;
1696
}
1697
}
1698
for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1699
if (personFlow.second->isAttributeCarrierSelected()) {
1700
counter++;
1701
}
1702
}
1703
return counter;
1704
}
1705
1706
1707
int
1708
GNENetHelper::AttributeCarriers::getNumberOfSelectedPersonTrips() const {
1709
int counter = 0;
1710
// iterate over all person plans
1711
for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1712
for (const auto& personPlan : person.second->getChildDemandElements()) {
1713
if (personPlan->getTagProperty()->isPlanPersonTrip() && personPlan->isAttributeCarrierSelected()) {
1714
counter++;
1715
}
1716
}
1717
}
1718
for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1719
for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1720
if (personPlan->getTagProperty()->isPlanPersonTrip() && personPlan->isAttributeCarrierSelected()) {
1721
counter++;
1722
}
1723
}
1724
}
1725
return counter;
1726
}
1727
1728
1729
int
1730
GNENetHelper::AttributeCarriers::getNumberOfSelectedWalks() const {
1731
int counter = 0;
1732
// iterate over all person plans
1733
for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1734
for (const auto& personPlan : person.second->getChildDemandElements()) {
1735
if (personPlan->getTagProperty()->isPlanWalk() && personPlan->isAttributeCarrierSelected()) {
1736
counter++;
1737
}
1738
}
1739
}
1740
for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1741
for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1742
if (personPlan->getTagProperty()->isPlanWalk() && personPlan->isAttributeCarrierSelected()) {
1743
counter++;
1744
}
1745
}
1746
}
1747
return counter;
1748
}
1749
1750
1751
int
1752
GNENetHelper::AttributeCarriers::getNumberOfSelectedRides() const {
1753
int counter = 0;
1754
// iterate over all person plans
1755
for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1756
for (const auto& personPlan : person.second->getChildDemandElements()) {
1757
if (personPlan->getTagProperty()->isPlanRide() && personPlan->isAttributeCarrierSelected()) {
1758
counter++;
1759
}
1760
}
1761
}
1762
for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1763
for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1764
if (personPlan->getTagProperty()->isPlanRide() && personPlan->isAttributeCarrierSelected()) {
1765
counter++;
1766
}
1767
}
1768
}
1769
return counter;
1770
}
1771
1772
1773
int
1774
GNENetHelper::AttributeCarriers::getNumberOfSelectedContainers() const {
1775
int counter = 0;
1776
// iterate over all containers
1777
for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1778
if (container.second->isAttributeCarrierSelected()) {
1779
counter++;
1780
}
1781
}
1782
for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1783
if (containerFlow.second->isAttributeCarrierSelected()) {
1784
counter++;
1785
}
1786
}
1787
return counter;
1788
}
1789
1790
1791
int
1792
GNENetHelper::AttributeCarriers::getNumberOfSelectedTransport() const {
1793
int counter = 0;
1794
// iterate over all container plans
1795
for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1796
for (const auto& containerPlan : container.second->getChildDemandElements()) {
1797
if (containerPlan->getTagProperty()->isPlanTransport() && containerPlan->isAttributeCarrierSelected()) {
1798
counter++;
1799
}
1800
}
1801
}
1802
for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1803
for (const auto& containerPlan : containerFlow.second->getChildDemandElements()) {
1804
if (containerPlan->getTagProperty()->isPlanTransport() && containerPlan->isAttributeCarrierSelected()) {
1805
counter++;
1806
}
1807
}
1808
}
1809
return counter;
1810
}
1811
1812
1813
int
1814
GNENetHelper::AttributeCarriers::getNumberOfSelectedTranships() const {
1815
int counter = 0;
1816
// iterate over all container plans
1817
for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1818
for (const auto& containerPlan : container.second->getChildDemandElements()) {
1819
if (containerPlan->getTagProperty()->isPlanTranship() && containerPlan->isAttributeCarrierSelected()) {
1820
counter++;
1821
}
1822
}
1823
}
1824
for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1825
for (const auto& containerPlan : containerFlow.second->getChildDemandElements()) {
1826
if (containerPlan->getTagProperty()->isPlanTranship() && containerPlan->isAttributeCarrierSelected()) {
1827
counter++;
1828
}
1829
}
1830
}
1831
return counter;
1832
}
1833
1834
1835
int
1836
GNENetHelper::AttributeCarriers::getNumberOfSelectedStops() const {
1837
int counter = 0;
1838
// iterate over routes
1839
for (const auto& route : myDemandElements.at(SUMO_TAG_ROUTE)) {
1840
if (route.second->isAttributeCarrierSelected()) {
1841
counter++;
1842
}
1843
}
1844
// vehicles
1845
for (const auto& trip : myDemandElements.at(SUMO_TAG_TRIP)) {
1846
for (const auto& stop : trip.second->getChildDemandElements()) {
1847
if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1848
counter++;
1849
}
1850
}
1851
}
1852
for (const auto& vehicle : myDemandElements.at(GNE_TAG_VEHICLE_WITHROUTE)) {
1853
for (const auto& stop : vehicle.second->getChildDemandElements().front()->getChildDemandElements()) {
1854
if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1855
counter++;
1856
}
1857
}
1858
}
1859
for (const auto& flow : myDemandElements.at(SUMO_TAG_FLOW)) {
1860
for (const auto& stop : flow.second->getChildDemandElements()) {
1861
if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1862
counter++;
1863
}
1864
}
1865
}
1866
for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_WITHROUTE)) {
1867
for (const auto& stop : flow.second->getChildDemandElements().front()->getChildDemandElements()) {
1868
if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1869
counter++;
1870
}
1871
}
1872
}
1873
// persons
1874
for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1875
for (const auto& personPlan : person.second->getChildDemandElements()) {
1876
if (personPlan->getTagProperty()->isPlanStopPerson() && personPlan->isAttributeCarrierSelected()) {
1877
counter++;
1878
}
1879
}
1880
}
1881
for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1882
for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1883
if (personPlan->getTagProperty()->isPlanStopPerson() && personPlan->isAttributeCarrierSelected()) {
1884
counter++;
1885
}
1886
}
1887
}
1888
// containers
1889
for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1890
for (const auto& containerPlan : container.second->getChildDemandElements()) {
1891
if (containerPlan->getTagProperty()->isPlanStopContainer() && containerPlan->isAttributeCarrierSelected()) {
1892
counter++;
1893
}
1894
}
1895
}
1896
for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1897
for (const auto& containerPlan : containerFlow.second->getChildDemandElements()) {
1898
if (containerPlan->getTagProperty()->isPlanStopContainer() && containerPlan->isAttributeCarrierSelected()) {
1899
counter++;
1900
}
1901
}
1902
}
1903
return counter;
1904
}
1905
1906
1907
GNEDataSet*
1908
GNENetHelper::AttributeCarriers::retrieveDataSet(const std::string& id, bool hardFail) const {
1909
for (const auto& dataSet : myDataSets) {
1910
if (dataSet.second->getID() == id) {
1911
return dataSet.second;
1912
}
1913
}
1914
if (hardFail) {
1915
throw ProcessError("Attempted to retrieve non-existant data set");
1916
} else {
1917
return nullptr;
1918
}
1919
}
1920
1921
1922
const std::map<const std::string, GNEDataSet*>&
1923
GNENetHelper::AttributeCarriers::getDataSets() const {
1924
return myDataSets;
1925
}
1926
1927
1928
std::string
1929
GNENetHelper::AttributeCarriers::generateDataSetID() const {
1930
// get prefix
1931
const auto prefix = OptionsCont::getOptions().getString("dataSet-prefix");
1932
int counter = 0;
1933
while (retrieveDataSet(prefix + "_" + toString(counter), false) != nullptr) {
1934
counter++;
1935
}
1936
return (prefix + "_" + toString(counter));
1937
}
1938
1939
1940
GNEDataInterval*
1941
GNENetHelper::AttributeCarriers::retrieveDataInterval(const GNEAttributeCarrier* AC, bool hardFail) const {
1942
if (myDataIntervals.count(AC)) {
1943
return myDataIntervals.at(AC);
1944
} else if (hardFail) {
1945
throw ProcessError("Attempted to retrieve non-existant data interval");
1946
} else {
1947
return nullptr;
1948
}
1949
}
1950
1951
1952
const std::unordered_map<const GNEAttributeCarrier*, GNEDataInterval*>&
1953
GNENetHelper::AttributeCarriers::getDataIntervals() const {
1954
return myDataIntervals;
1955
}
1956
1957
1958
void
1959
GNENetHelper::AttributeCarriers::insertDataInterval(const GNEAttributeCarrier* AC, GNEDataInterval* dataInterval) {
1960
if (myDataIntervals.count(AC) > 0) {
1961
throw ProcessError(dataInterval->getTagStr() + " with ID='" + dataInterval->getID() + "' already exist");
1962
} else {
1963
myDataIntervals[AC] = dataInterval;
1964
}
1965
// mark interval toolbar for update
1966
myNet->getViewNet()->getIntervalBar().markForUpdate();
1967
}
1968
1969
1970
void
1971
GNENetHelper::AttributeCarriers::deleteDataInterval(GNEDataInterval* dataInterval) {
1972
const auto finder = myDataIntervals.find(dataInterval);
1973
if (finder == myDataIntervals.end()) {
1974
throw ProcessError(dataInterval->getTagStr() + " with ID='" + dataInterval->getID() + "' wasn't previously inserted");
1975
} else {
1976
myDataIntervals.erase(finder);
1977
}
1978
// remove it from inspected elements and GNEElementTree
1979
myNet->getViewNet()->getInspectedElements().uninspectAC(dataInterval);
1980
dataInterval->unmarkForDrawingFront();
1981
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(dataInterval);
1982
// mark interval toolbar for update
1983
myNet->getViewNet()->getIntervalBar().markForUpdate();
1984
}
1985
1986
1987
GNEGenericData*
1988
GNENetHelper::AttributeCarriers::retrieveGenericData(const GUIGlObject* glObject, bool hardFail) const {
1989
// iterate over all genericDatas
1990
for (const auto& genericDataTag : myGenericDatas) {
1991
auto it = genericDataTag.second.find(glObject);
1992
if (it != genericDataTag.second.end()) {
1993
return it->second;
1994
}
1995
}
1996
if (hardFail) {
1997
throw ProcessError("Attempted to retrieve non-existant generic (glObject)");
1998
} else {
1999
return nullptr;
2000
}
2001
}
2002
2003
2004
std::vector<GNEGenericData*>
2005
GNENetHelper::AttributeCarriers::getSelectedGenericDatas() const {
2006
std::vector<GNEGenericData*> result;
2007
// returns generic datas depending of selection
2008
for (const auto& genericDataTag : myGenericDatas) {
2009
for (const auto& genericData : genericDataTag.second) {
2010
if (genericData.second->isAttributeCarrierSelected()) {
2011
result.push_back(genericData.second);
2012
}
2013
}
2014
}
2015
return result;
2016
}
2017
2018
2019
const std::unordered_map<SumoXMLTag, std::unordered_map<const GUIGlObject*, GNEGenericData*>, std::hash<int> >&
2020
GNENetHelper::AttributeCarriers::getGenericDatas() const {
2021
return myGenericDatas;
2022
}
2023
2024
2025
std::vector<GNEGenericData*>
2026
GNENetHelper::AttributeCarriers::retrieveGenericDatas(const SumoXMLTag genericDataTag, const double begin, const double end) {
2027
// declare generic data vector
2028
std::vector<GNEGenericData*> genericDatas;
2029
// iterate over all data sets
2030
for (const auto& genericData : myGenericDatas.at(genericDataTag)) {
2031
// check interval
2032
if ((genericData.second->getDataIntervalParent()->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) &&
2033
(genericData.second->getDataIntervalParent()->getAttributeDouble(SUMO_ATTR_END) <= end)) {
2034
genericDatas.push_back(genericData.second);
2035
}
2036
}
2037
return genericDatas;
2038
}
2039
2040
2041
int
2042
GNENetHelper::AttributeCarriers::getNumberOfGenericDatas() const {
2043
int counter = 0;
2044
// iterate over all generic datas
2045
for (const auto& genericDataTag : myGenericDatas) {
2046
counter += (int)genericDataTag.second.size();
2047
}
2048
return counter;
2049
}
2050
2051
2052
int
2053
GNENetHelper::AttributeCarriers::getNumberOfSelectedEdgeDatas() const {
2054
int counter = 0;
2055
// iterate over all edgeDatas
2056
for (const auto& genericData : myGenericDatas.at(GNE_TAG_EDGEREL_SINGLE)) {
2057
if (genericData.second->isAttributeCarrierSelected()) {
2058
counter++;
2059
}
2060
}
2061
return counter;
2062
}
2063
2064
2065
int
2066
GNENetHelper::AttributeCarriers::getNumberOfSelectedEdgeRelDatas() const {
2067
int counter = 0;
2068
// iterate over all edgeDatas
2069
for (const auto& genericData : myGenericDatas.at(SUMO_TAG_EDGEREL)) {
2070
if (genericData.second->isAttributeCarrierSelected()) {
2071
counter++;
2072
}
2073
}
2074
return counter;
2075
}
2076
2077
2078
int
2079
GNENetHelper::AttributeCarriers::getNumberOfSelectedEdgeTAZRel() const {
2080
int counter = 0;
2081
// iterate over all edgeDatas
2082
for (const auto& genericData : myGenericDatas.at(SUMO_TAG_TAZREL)) {
2083
if (genericData.second->isAttributeCarrierSelected()) {
2084
counter++;
2085
}
2086
}
2087
return counter;
2088
}
2089
2090
2091
void
2092
GNENetHelper::AttributeCarriers::insertGenericData(GNEGenericData* genericData) {
2093
if (myGenericDatas.at(genericData->getTagProperty()->getTag()).count(genericData->getGUIGlObject()) > 0) {
2094
throw ProcessError(genericData->getTagStr() + " with ID='" + genericData->getID() + "' already exist");
2095
} else {
2096
myGenericDatas.at(genericData->getTagProperty()->getTag()).insert(std::make_pair(genericData->getGUIGlObject(), genericData));
2097
}
2098
// mark interval toolbar for update
2099
myNet->getViewNet()->getIntervalBar().markForUpdate();
2100
}
2101
2102
2103
void
2104
GNENetHelper::AttributeCarriers::deleteGenericData(GNEGenericData* genericData) {
2105
const auto finder = myGenericDatas.at(genericData->getTagProperty()->getTag()).find(genericData);
2106
if (finder == myGenericDatas.at(genericData->getTagProperty()->getTag()).end()) {
2107
throw ProcessError(genericData->getTagStr() + " with ID='" + genericData->getID() + "' wasn't previously inserted");
2108
} else {
2109
myGenericDatas.at(genericData->getTagProperty()->getTag()).erase(finder);
2110
}
2111
// remove it from inspected elements and GNEElementTree
2112
myNet->getViewNet()->getInspectedElements().uninspectAC(genericData);
2113
genericData->unmarkForDrawingFront();
2114
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(genericData);
2115
// delete path element
2116
myNet->getDataPathManager()->removePath(genericData);
2117
// mark interval toolbar for update
2118
myNet->getViewNet()->getIntervalBar().markForUpdate();
2119
}
2120
2121
2122
std::set<std::string>
2123
GNENetHelper::AttributeCarriers::retrieveGenericDataParameters(const std::string& genericDataTag, const double begin, const double end) const {
2124
// declare solution
2125
std::set<std::string> attributesSolution;
2126
// declare generic data vector
2127
std::vector<GNEGenericData*> genericDatas;
2128
// iterate over all data sets
2129
for (const auto& interval : myDataIntervals) {
2130
// check interval
2131
if ((interval.second->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) && (interval.second->getAttributeDouble(SUMO_ATTR_END) <= end)) {
2132
// iterate over generic datas
2133
for (const auto& genericData : interval.second->getGenericDataChildren()) {
2134
if (genericDataTag.empty() || (genericData->getTagProperty()->getTagStr() == genericDataTag)) {
2135
genericDatas.push_back(genericData);
2136
}
2137
}
2138
}
2139
}
2140
// iterate over generic datas
2141
for (const auto& genericData : genericDatas) {
2142
for (const auto& attribute : genericData->getParametersMap()) {
2143
attributesSolution.insert(attribute.first);
2144
}
2145
}
2146
return attributesSolution;
2147
}
2148
2149
2150
std::set<std::string>
2151
GNENetHelper::AttributeCarriers::retrieveGenericDataParameters(const std::string& dataSetID, const std::string& genericDataTag,
2152
const std::string& beginStr, const std::string& endStr) const {
2153
// declare solution
2154
std::set<std::string> attributesSolution;
2155
// vector of data sets and intervals
2156
std::vector<GNEDataSet*> dataSets;
2157
std::vector<GNEDataInterval*> dataIntervals;
2158
// get dataSet
2159
GNEDataSet* retrievedDataSet = retrieveDataSet(dataSetID, false);
2160
// if dataSetID is empty, return all parameters
2161
if (dataSetID.empty()) {
2162
// add all data sets
2163
dataSets.reserve(myDataSets.size());
2164
for (const auto& dataSet : myDataSets) {
2165
dataSets.push_back(dataSet.second);
2166
}
2167
} else if (retrievedDataSet) {
2168
dataSets.push_back(retrievedDataSet);
2169
} else {
2170
return attributesSolution;
2171
}
2172
// now continue with data intervals
2173
int numberOfIntervals = 0;
2174
for (const auto& dataSet : dataSets) {
2175
numberOfIntervals += (int)dataSet->getDataIntervalChildren().size();
2176
}
2177
// resize dataIntervals
2178
dataIntervals.reserve(numberOfIntervals);
2179
// add intervals
2180
for (const auto& dataSet : dataSets) {
2181
for (const auto& dataInterval : dataSet->getDataIntervalChildren()) {
2182
// continue depending of begin and end
2183
if (beginStr.empty() && endStr.empty()) {
2184
dataIntervals.push_back(dataInterval.second);
2185
} else if (endStr.empty()) {
2186
// parse begin
2187
const double begin = GNEAttributeCarrier::parse<double>(beginStr);
2188
if (dataInterval.second->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) {
2189
dataIntervals.push_back(dataInterval.second);
2190
}
2191
} else if (beginStr.empty()) {
2192
// parse end
2193
const double end = GNEAttributeCarrier::parse<double>(endStr);
2194
if (dataInterval.second->getAttributeDouble(SUMO_ATTR_END) <= end) {
2195
dataIntervals.push_back(dataInterval.second);
2196
}
2197
} else {
2198
// parse both begin end
2199
const double begin = GNEAttributeCarrier::parse<double>(beginStr);
2200
const double end = GNEAttributeCarrier::parse<double>(endStr);
2201
if ((dataInterval.second->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) &&
2202
(dataInterval.second->getAttributeDouble(SUMO_ATTR_END) <= end)) {
2203
dataIntervals.push_back(dataInterval.second);
2204
}
2205
}
2206
}
2207
}
2208
// finally iterate over intervals and get attributes
2209
for (const auto& dataInterval : dataIntervals) {
2210
for (const auto& genericData : dataInterval->getGenericDataChildren()) {
2211
// check generic data tag
2212
if (genericDataTag.empty() || (genericData->getTagProperty()->getTagStr() == genericDataTag)) {
2213
for (const auto& attribute : genericData->getParametersMap()) {
2214
attributesSolution.insert(attribute.first);
2215
}
2216
}
2217
}
2218
}
2219
return attributesSolution;
2220
}
2221
2222
2223
GNEMeanData*
2224
GNENetHelper::AttributeCarriers::retrieveMeanData(SumoXMLTag type, const std::string& id, bool hardFail) const {
2225
for (const auto& meanData : myMeanDatas.at(type)) {
2226
if (meanData.second->getID() == id) {
2227
return meanData.second;
2228
}
2229
}
2230
if (hardFail) {
2231
throw ProcessError("Attempted to retrieve non-existant meanData (string)");
2232
} else {
2233
return nullptr;
2234
}
2235
}
2236
2237
2238
const std::unordered_map<SumoXMLTag, std::map<const std::string, GNEMeanData*>, std::hash<int> >&
2239
GNENetHelper::AttributeCarriers::getMeanDatas() const {
2240
return myMeanDatas;
2241
}
2242
2243
2244
int
2245
GNENetHelper::AttributeCarriers::getNumberOfMeanDatas() const {
2246
return myNumberOfMeanDataElements;
2247
}
2248
2249
2250
void
2251
GNENetHelper::AttributeCarriers::clearMeanDatas() {
2252
// iterate over myMeanDatas and clear all meanDatas
2253
for (auto& meanDatas : myMeanDatas) {
2254
meanDatas.second.clear();
2255
}
2256
}
2257
2258
2259
void
2260
GNENetHelper::AttributeCarriers::updateMeanDataID(GNEMeanData* meanData, const std::string& newID) {
2261
const auto tag = meanData->getTagProperty()->getTag();
2262
const auto it = myMeanDatas.at(tag).find(meanData->getID());
2263
if (it == myMeanDatas.at(tag).end()) {
2264
throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' doesn't exist in AttributeCarriers.meanDatas");
2265
} else {
2266
// remove from container, set new Id, and insert it again
2267
myMeanDatas.at(tag).erase(it);
2268
myMeanDatas.at(tag)[newID] = meanData;
2269
}
2270
}
2271
2272
2273
std::string
2274
GNENetHelper::AttributeCarriers::generateMeanDataID(SumoXMLTag tag) const {
2275
// obtain option container
2276
const auto& neteditOptions = OptionsCont::getOptions();
2277
// get prefix
2278
std::string prefix;
2279
if (tag == SUMO_TAG_MEANDATA_EDGE) {
2280
prefix = neteditOptions.getString("meanDataEdge-prefix");
2281
} else if (tag == SUMO_TAG_MEANDATA_LANE) {
2282
prefix = neteditOptions.getString("meanDataLane-prefix");
2283
}
2284
int counter = 0;
2285
while (retrieveMeanData(tag, prefix + "_" + toString(counter), false) != nullptr) {
2286
counter++;
2287
}
2288
return (prefix + "_" + toString(counter));
2289
}
2290
2291
2292
void
2293
GNENetHelper::AttributeCarriers::insertJunction(GNEJunction* junction) {
2294
myNet->getNetBuilder()->getNodeCont().insert(junction->getNBNode());
2295
registerJunction(junction);
2296
}
2297
2298
2299
void
2300
GNENetHelper::AttributeCarriers::deleteSingleJunction(GNEJunction* junction) {
2301
// remove it from inspected elements and GNEElementTree
2302
myNet->getViewNet()->getInspectedElements().uninspectAC(junction);
2303
junction->unmarkForDrawingFront();
2304
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(junction);
2305
// Remove from grid and container
2306
myNet->removeGLObjectFromGrid(junction);
2307
myJunctions.erase(junction->getMicrosimID());
2308
myNumberOfNetworkElements--;
2309
myNet->getNetBuilder()->getNodeCont().extract(junction->getNBNode());
2310
junction->decRef("GNENet::deleteSingleJunction");
2311
junction->setResponsible(true);
2312
}
2313
2314
2315
void
2316
GNENetHelper::AttributeCarriers::insertEdgeType(GNEEdgeType* edgeType) {
2317
// get pointer to create edge frame
2318
const auto& createEdgeFrame = myNet->getViewNet()->getViewParent()->getCreateEdgeFrame();
2319
// insert in myEdgeTypes
2320
myEdgeTypes[edgeType->getMicrosimID()] = edgeType;
2321
myNumberOfNetworkElements++;
2322
// update edge selector
2323
if (myNet->getViewNet()->getViewParent()->getCreateEdgeFrame()->shown()) {
2324
myNet->getViewNet()->getViewParent()->getCreateEdgeFrame()->getEdgeTypeSelector()->refreshEdgeTypeSelector();
2325
}
2326
// set current edge type inspected
2327
createEdgeFrame->getEdgeTypeSelector()->setCurrentEdgeType(edgeType);
2328
}
2329
2330
2331
void
2332
GNENetHelper::AttributeCarriers::deleteEdgeType(GNEEdgeType* edgeType) {
2333
// get pointer to create edge frame
2334
const auto& createEdgeFrame = myNet->getViewNet()->getViewParent()->getCreateEdgeFrame();
2335
// remove it from inspected elements and GNEElementTree
2336
myNet->getViewNet()->getInspectedElements().uninspectAC(edgeType);
2337
edgeType->unmarkForDrawingFront();
2338
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(edgeType);
2339
// remove from edge types
2340
myEdgeTypes.erase(edgeType->getMicrosimID());
2341
myNumberOfNetworkElements--;
2342
// check if this is the selected edge type in edgeSelector
2343
if (createEdgeFrame->getEdgeTypeSelector()->getEdgeTypeSelected() == edgeType) {
2344
createEdgeFrame->getEdgeTypeSelector()->clearEdgeTypeSelected();
2345
}
2346
// update edge selector
2347
createEdgeFrame->getEdgeTypeSelector()->refreshEdgeTypeSelector();
2348
}
2349
2350
2351
void
2352
GNENetHelper::AttributeCarriers::insertEdge(GNEEdge* edge) {
2353
NBEdge* nbe = edge->getNBEdge();
2354
myNet->getNetBuilder()->getEdgeCont().insert(nbe); // should we ignore pruning double edges?
2355
// if this edge was previouls extracted from the edgeContainer we have to rewire the nodes
2356
nbe->getFromNode()->addOutgoingEdge(nbe);
2357
nbe->getToNode()->addIncomingEdge(nbe);
2358
// register edge
2359
registerEdge(edge);
2360
}
2361
2362
2363
void
2364
GNENetHelper::AttributeCarriers::deleteSingleEdge(GNEEdge* edge) {
2365
// remove it from inspected elements and GNEElementTree
2366
myNet->getViewNet()->getInspectedElements().uninspectAC(edge);
2367
edge->unmarkForDrawingFront();
2368
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(edge);
2369
// remove edge from visual grid and container
2370
myNet->removeGLObjectFromGrid(edge);
2371
myEdges.erase(edge->getMicrosimID());
2372
myNumberOfNetworkElements--;
2373
// remove all lanes
2374
for (const auto& lane : edge->getChildLanes()) {
2375
deleteLane(lane);
2376
}
2377
// extract edge of district container
2378
myNet->getNetBuilder()->getEdgeCont().extract(myNet->getNetBuilder()->getDistrictCont(), edge->getNBEdge());
2379
edge->decRef("GNENet::deleteSingleEdge");
2380
edge->setResponsible(true);
2381
// Remove refrences from GNEJunctions
2382
edge->getFromJunction()->removeOutgoingGNEEdge(edge);
2383
edge->getToJunction()->removeIncomingGNEEdge(edge);
2384
// update boundaries of both junctions (to remove it from Grid)
2385
edge->getFromJunction()->updateCenteringBoundary(true);
2386
edge->getToJunction()->updateCenteringBoundary(true);
2387
// get template editor
2388
GNEInspectorFrame::TemplateEditor* templateEditor = myNet->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
2389
// check if we have to remove template
2390
if (templateEditor->getEdgeTemplate() && (templateEditor->getEdgeTemplate()->getID() == edge->getID())) {
2391
templateEditor->setEdgeTemplate(nullptr);
2392
}
2393
}
2394
2395
2396
void
2397
GNENetHelper::AttributeCarriers::insertLane(GNELane* lane) {
2398
if (myLanes.count(lane->getGUIGlObject()) > 0) {
2399
throw ProcessError(lane->getTagStr() + " with ID='" + lane->getID() + "' already exist");
2400
} else {
2401
myLanes[lane->getGUIGlObject()] = lane;
2402
myNumberOfNetworkElements++;
2403
}
2404
}
2405
2406
2407
void
2408
GNENetHelper::AttributeCarriers::deleteLane(GNELane* lane) {
2409
const auto finder = myLanes.find(lane->getGUIGlObject());
2410
if (finder == myLanes.end()) {
2411
throw ProcessError(lane->getTagStr() + " with ID='" + lane->getID() + "' wasn't previously inserted");
2412
} else {
2413
myLanes.erase(finder);
2414
myNumberOfNetworkElements--;
2415
// remove it from inspected elements and GNEElementTree
2416
myNet->getViewNet()->getInspectedElements().uninspectAC(lane);
2417
lane->unmarkForDrawingFront();
2418
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(lane);
2419
}
2420
}
2421
2422
2423
void
2424
GNENetHelper::AttributeCarriers::insertCrossing(GNECrossing* crossing) {
2425
if (myCrossings.count(crossing->getGUIGlObject()) > 0) {
2426
throw ProcessError(crossing->getTagStr() + " with ID='" + crossing->getID() + "' already exist");
2427
} else {
2428
myCrossings[crossing->getGUIGlObject()] = crossing;
2429
myNumberOfNetworkElements++;
2430
}
2431
}
2432
2433
2434
void
2435
GNENetHelper::AttributeCarriers::deleteCrossing(GNECrossing* crossing) {
2436
const auto finder = myCrossings.find(crossing->getGUIGlObject());
2437
if (finder == myCrossings.end()) {
2438
throw ProcessError(crossing->getTagStr() + " with ID='" + crossing->getID() + "' wasn't previously inserted");
2439
} else {
2440
myCrossings.erase(finder);
2441
myNumberOfNetworkElements--;
2442
// remove it from inspected elements and GNEElementTree
2443
if (myNet->getViewNet()) {
2444
myNet->getViewNet()->getInspectedElements().uninspectAC(crossing);
2445
crossing->unmarkForDrawingFront();
2446
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(crossing);
2447
}
2448
}
2449
}
2450
2451
2452
void
2453
GNENetHelper::AttributeCarriers::insertWalkingArea(GNEWalkingArea* walkingArea) {
2454
if (myWalkingAreas.count(walkingArea->getGUIGlObject()) > 0) {
2455
throw ProcessError(walkingArea->getTagStr() + " with ID='" + walkingArea->getID() + "' already exist");
2456
} else {
2457
myWalkingAreas[walkingArea->getGUIGlObject()] = walkingArea;
2458
myNumberOfNetworkElements++;
2459
}
2460
}
2461
2462
2463
void
2464
GNENetHelper::AttributeCarriers::deleteWalkingArea(GNEWalkingArea* walkingArea) {
2465
const auto finder = myWalkingAreas.find(walkingArea->getGUIGlObject());
2466
if (finder == myWalkingAreas.end()) {
2467
throw ProcessError(walkingArea->getTagStr() + " with ID='" + walkingArea->getID() + "' wasn't previously inserted");
2468
} else {
2469
myWalkingAreas.erase(finder);
2470
myNumberOfNetworkElements--;
2471
// remove it from inspected elements and GNEElementTree
2472
myNet->getViewNet()->getInspectedElements().uninspectAC(walkingArea);
2473
walkingArea->unmarkForDrawingFront();
2474
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(walkingArea);
2475
}
2476
}
2477
2478
2479
void
2480
GNENetHelper::AttributeCarriers::insertConnection(GNEConnection* connection) {
2481
if (myConnections.count(connection->getGUIGlObject()) > 0) {
2482
throw ProcessError(connection->getTagStr() + " with ID='" + connection->getID() + "' already exist");
2483
} else {
2484
myConnections[connection->getGUIGlObject()] = connection;
2485
myNumberOfNetworkElements++;
2486
}
2487
}
2488
2489
2490
void
2491
GNENetHelper::AttributeCarriers::deleteConnection(GNEConnection* connection) {
2492
const auto finder = myConnections.find(connection->getGUIGlObject());
2493
if (finder == myConnections.end()) {
2494
throw ProcessError(connection->getTagStr() + " with ID='" + connection->getID() + "' wasn't previously inserted");
2495
} else {
2496
myConnections.erase(finder);
2497
myNumberOfNetworkElements--;
2498
// remove it from inspected elements and GNEElementTree
2499
myNet->getViewNet()->getInspectedElements().uninspectAC(connection);
2500
connection->unmarkForDrawingFront();
2501
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(connection);
2502
}
2503
}
2504
2505
2506
void
2507
GNENetHelper::AttributeCarriers::insertInternalLane(GNEInternalLane* internalLane) {
2508
if (myInternalLanes.count(internalLane->getGUIGlObject()) > 0) {
2509
throw ProcessError(internalLane->getTagStr() + " with ID='" + internalLane->getMicrosimID() + "' already exist");
2510
} else {
2511
myInternalLanes[internalLane->getGUIGlObject()] = internalLane;
2512
myNumberOfNetworkElements++;
2513
}
2514
}
2515
2516
2517
void
2518
GNENetHelper::AttributeCarriers::deleteInternalLane(GNEInternalLane* internalLane) {
2519
const auto finder = myInternalLanes.find(internalLane->getGUIGlObject());
2520
if (finder == myInternalLanes.end()) {
2521
throw ProcessError(internalLane->getTagStr() + " with ID='" + internalLane->getID() + "' wasn't previously inserted");
2522
} else {
2523
myInternalLanes.erase(finder);
2524
myNumberOfNetworkElements--;
2525
}
2526
}
2527
2528
2529
void
2530
GNENetHelper::AttributeCarriers::insertAdditional(GNEAdditional* additional) {
2531
const auto tag = additional->getTagProperty()->getTag();
2532
if (myAdditionals.at(tag).count(additional) > 0) {
2533
throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' already exist");
2534
} else {
2535
// insert in both containers
2536
myAdditionals.at(tag)[additional->getGUIGlObject()] = additional;
2537
if (additional->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2538
myAdditionalIDs.at(tag)[additional->getID()] = additional;
2539
}
2540
myNumberOfNetworkElements++;
2541
// add element in grid
2542
if (additional->getTagProperty()->isPlacedInRTree()) {
2543
myNet->addGLObjectIntoGrid(additional);
2544
}
2545
// update geometry after insertion of additionals if myUpdateGeometryEnabled is enabled
2546
if (myNet->isUpdateGeometryEnabled()) {
2547
additional->updateGeometry();
2548
}
2549
// additionals has to be saved
2550
myNet->getSavingStatus()->requireSaveAdditionals();
2551
}
2552
}
2553
2554
2555
void
2556
GNENetHelper::AttributeCarriers::deleteAdditional(GNEAdditional* additional) {
2557
const auto tag = additional->getTagProperty()->getTag();
2558
// find demanElement in additionalTag
2559
auto itFind = myAdditionals.at(tag).find(additional->getGUIGlObject());
2560
// check if additional was previously inserted
2561
if (itFind == myAdditionals.at(tag).end()) {
2562
throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' wasn't previously inserted");
2563
} else {
2564
// remove from both container
2565
myAdditionals.at(tag).erase(itFind);
2566
if (additional->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2567
myAdditionalIDs.at(tag).erase(myAdditionalIDs.at(tag).find(additional->getID()));
2568
}
2569
myNumberOfNetworkElements--;
2570
// remove it from inspected elements and GNEElementTree
2571
myNet->getViewNet()->getInspectedElements().uninspectAC(additional);
2572
additional->unmarkForDrawingFront();
2573
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(additional);
2574
// remove element from grid
2575
if (additional->getTagProperty()->isPlacedInRTree()) {
2576
myNet->removeGLObjectFromGrid(additional);
2577
}
2578
// delete path element
2579
myNet->getNetworkPathManager()->removePath(additional);
2580
// additionals has to be saved
2581
myNet->getSavingStatus()->requireSaveAdditionals();
2582
}
2583
}
2584
2585
2586
2587
2588
void
2589
GNENetHelper::AttributeCarriers::insertTAZSourceSink(GNETAZSourceSink* sourceSink) {
2590
const auto sourceSinkTag = sourceSink->getTagProperty()->getTag();
2591
if (myTAZSourceSinks.at(sourceSinkTag).count(sourceSink) > 0) {
2592
throw ProcessError(sourceSink->getTagStr() + " with ID='" + sourceSink->getID() + "' already exist");
2593
} else {
2594
myTAZSourceSinks.at(sourceSinkTag)[sourceSink] = sourceSink;
2595
myNumberOfNetworkElements++;
2596
// additionals has to be saved
2597
myNet->getSavingStatus()->requireSaveAdditionals();
2598
}
2599
}
2600
2601
2602
void
2603
GNENetHelper::AttributeCarriers::deleteTAZSourceSink(GNETAZSourceSink* sourceSink) {
2604
const auto tag = sourceSink->getTagProperty()->getTag();
2605
// find demanElement in additionalTag
2606
auto itFind = myTAZSourceSinks.at(tag).find(sourceSink);
2607
// check if sourceSink was previously inserted
2608
if (itFind == myTAZSourceSinks.at(tag).end()) {
2609
throw ProcessError(sourceSink->getTagStr() + " with ID='" + sourceSink->getID() + "' wasn't previously inserted");
2610
} else {
2611
// remove from both container
2612
myTAZSourceSinks.at(tag).erase(itFind);
2613
myNumberOfNetworkElements--;
2614
// remove it from inspected elements and GNEElementTree
2615
myNet->getViewNet()->getInspectedElements().uninspectAC(sourceSink);
2616
sourceSink->unmarkForDrawingFront();
2617
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(sourceSink);
2618
// additionals has to be saved
2619
myNet->getSavingStatus()->requireSaveAdditionals();
2620
}
2621
}
2622
2623
2624
void
2625
GNENetHelper::AttributeCarriers::insertDemandElement(GNEDemandElement* demandElement) {
2626
const auto tag = demandElement->getTagProperty()->getTag();
2627
if (myDemandElements.at(tag).count(demandElement) > 0) {
2628
throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' already exist");
2629
} else {
2630
myDemandElements.at(tag)[demandElement->getGUIGlObject()] = demandElement;
2631
myNumberOfDemandElements++;
2632
if (demandElement->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2633
myDemandElementIDs.at(tag)[demandElement->getID()] = demandElement;
2634
}
2635
// add element in grid
2636
myNet->addGLObjectIntoGrid(demandElement);
2637
// update geometry after insertion of demandElements if myUpdateGeometryEnabled is enabled
2638
if (myNet->isUpdateGeometryEnabled()) {
2639
demandElement->updateGeometry();
2640
}
2641
// compute path element
2642
if (myNet->getViewNet()->getEditModes().isCurrentSupermodeDemand()) {
2643
demandElement->computePathElement();
2644
}
2645
// update demand elements frames
2646
updateDemandElementFrames(demandElement->getTagProperty());
2647
// demandElements has to be saved
2648
myNet->getSavingStatus()->requireSaveDemandElements();
2649
}
2650
}
2651
2652
2653
void
2654
GNENetHelper::AttributeCarriers::deleteDemandElement(GNEDemandElement* demandElement, const bool updateFrames) {
2655
const auto tag = demandElement->getTagProperty()->getTag();
2656
auto viewParent = myNet->getViewNet()->getViewParent();
2657
// find demanElement in demandElementTag
2658
auto itFind = myDemandElements.at(tag).find(demandElement->getGUIGlObject());
2659
// check if demandElement was previously inserted
2660
if (itFind == myDemandElements.at(tag).end()) {
2661
throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' wasn't previously inserted");
2662
} else {
2663
// erase it from container
2664
myDemandElements.at(tag).erase(itFind);
2665
if (demandElement->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2666
myDemandElementIDs.at(tag).erase(myDemandElementIDs.at(tag).find(demandElement->getID()));
2667
}
2668
myNumberOfDemandElements--;
2669
// remove element from grid
2670
myNet->removeGLObjectFromGrid(demandElement);
2671
// remove it from inspected elements and GNEElementTree
2672
myNet->getViewNet()->getInspectedElements().uninspectAC(demandElement);
2673
demandElement->unmarkForDrawingFront();
2674
viewParent->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(demandElement);
2675
viewParent->getPersonPlanFrame()->getPersonHierarchy()->removeCurrentEditedAttributeCarrier(demandElement);
2676
viewParent->getContainerPlanFrame()->getContainerHierarchy()->removeCurrentEditedAttributeCarrier(demandElement);
2677
if (viewParent->getRouteDistributionFrame()->getDistributionSelector()->getCurrentDistribution() == demandElement) {
2678
viewParent->getRouteDistributionFrame()->getDistributionSelector()->setDistribution(nullptr);
2679
}
2680
if (viewParent->getTypeDistributionFrame()->getDistributionSelector()->getCurrentDistribution() == demandElement) {
2681
viewParent->getTypeDistributionFrame()->getDistributionSelector()->setDistribution(nullptr);
2682
}
2683
// if is the last inserted route, remove it from GNEViewNet
2684
if (myNet->getViewNet()->getLastCreatedRoute() == demandElement) {
2685
myNet->getViewNet()->setLastCreatedRoute(nullptr);
2686
}
2687
// delete path element
2688
myNet->getDemandPathManager()->removePath(demandElement);
2689
// check if update demand elements frames
2690
if (updateFrames) {
2691
updateDemandElementFrames(demandElement->getTagProperty());
2692
}
2693
// demandElements has to be saved
2694
myNet->getSavingStatus()->requireSaveDemandElements();
2695
}
2696
}
2697
2698
2699
void
2700
GNENetHelper::AttributeCarriers::insertDataSet(GNEDataSet* dataSet) {
2701
if (myDataSets.count(dataSet->getID()) > 0) {
2702
throw ProcessError(dataSet->getTagStr() + " with ID='" + dataSet->getID() + "' already exist");
2703
} else {
2704
myDataSets[dataSet->getID()] = dataSet;
2705
myNumberOfDataElements++;
2706
// dataSets has to be saved
2707
myNet->getSavingStatus()->requireSaveDataElements();
2708
// mark interval toolbar for update
2709
myNet->getViewNet()->getIntervalBar().markForUpdate();
2710
}
2711
}
2712
2713
2714
void
2715
GNENetHelper::AttributeCarriers::deleteDataSet(GNEDataSet* dataSet) {
2716
const auto finder = myDataSets.find(dataSet->getID());
2717
if (finder == myDataSets.end()) {
2718
throw ProcessError(dataSet->getTagStr() + " with ID='" + dataSet->getID() + "' wasn't previously inserted");
2719
} else {
2720
myDataSets.erase(finder);
2721
myNumberOfDataElements--;
2722
// remove it from inspected elements and GNEElementTree
2723
myNet->getViewNet()->getInspectedElements().uninspectAC(dataSet);
2724
dataSet->unmarkForDrawingFront();
2725
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(dataSet);
2726
// dataSets has to be saved
2727
myNet->getSavingStatus()->requireSaveDataElements();
2728
// mark interval toolbar for update
2729
myNet->getViewNet()->getIntervalBar().markForUpdate();
2730
}
2731
}
2732
2733
2734
void
2735
GNENetHelper::AttributeCarriers::insertMeanData(GNEMeanData* meanData) {
2736
if (myMeanDatas.at(meanData->getTagProperty()->getTag()).count(meanData->getID()) > 0) {
2737
throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' already exist");
2738
} else {
2739
myMeanDatas.at(meanData->getTagProperty()->getTag()).insert(std::make_pair(meanData->getID(), meanData));
2740
myNumberOfMeanDataElements++;
2741
// meanDatas has to be saved
2742
myNet->getSavingStatus()->requireSaveMeanDatas();
2743
}
2744
}
2745
2746
2747
void
2748
GNENetHelper::AttributeCarriers::deleteMeanData(GNEMeanData* meanData) {
2749
// find demanElement in meanDataTag
2750
auto itFind = myMeanDatas.at(meanData->getTagProperty()->getTag()).find(meanData->getID());
2751
// check if meanData was previously inserted
2752
if (itFind == myMeanDatas.at(meanData->getTagProperty()->getTag()).end()) {
2753
throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' wasn't previously inserted");
2754
} else {
2755
// remove from container
2756
myMeanDatas.at(meanData->getTagProperty()->getTag()).erase(itFind);
2757
myNumberOfMeanDataElements--;
2758
// remove it from inspected elements and GNEElementTree
2759
myNet->getViewNet()->getInspectedElements().uninspectAC(meanData);
2760
meanData->unmarkForDrawingFront();
2761
myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(meanData);
2762
// remove element from grid
2763
if (meanData->getTagProperty()->isPlacedInRTree()) {
2764
myNet->removeGLObjectFromGrid(meanData);
2765
}
2766
// meanDatas has to be saved
2767
myNet->getSavingStatus()->requireSaveMeanDatas();
2768
}
2769
}
2770
2771
2772
void
2773
GNENetHelper::AttributeCarriers::updateDemandElementFrames(const GNETagProperties* tagProperty) {
2774
if (myNet->getViewNet()->getEditModes().isCurrentSupermodeDemand()) {
2775
// continue depending of demand mode
2776
switch (myNet->getViewNet()->getEditModes().demandEditMode) {
2777
case DemandEditMode::DEMAND_VEHICLE:
2778
if (tagProperty->isType()) {
2779
myNet->getViewNet()->getViewParent()->getVehicleFrame()->getTypeSelector()->refreshDemandElementSelector();
2780
}
2781
break;
2782
case DemandEditMode::DEMAND_TYPE:
2783
if (tagProperty->isType()) {
2784
myNet->getViewNet()->getViewParent()->getTypeFrame()->getTypeSelector()->refreshTypeSelector(true);
2785
}
2786
break;
2787
case DemandEditMode::DEMAND_TYPEDISTRIBUTION:
2788
if (tagProperty->isType()) {
2789
myNet->getViewNet()->getViewParent()->getTypeDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
2790
}
2791
break;
2792
case DemandEditMode::DEMAND_ROUTEDISTRIBUTION:
2793
if (tagProperty->isRoute()) {
2794
myNet->getViewNet()->getViewParent()->getRouteDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
2795
}
2796
break;
2797
case DemandEditMode::DEMAND_PERSON:
2798
if (tagProperty->isType()) {
2799
myNet->getViewNet()->getViewParent()->getPersonFrame()->getTypeSelector()->refreshDemandElementSelector();
2800
}
2801
break;
2802
case DemandEditMode::DEMAND_PERSONPLAN:
2803
if (tagProperty->isPerson()) {
2804
myNet->getViewNet()->getViewParent()->getPersonPlanFrame()->getPersonSelector()->refreshDemandElementSelector();
2805
}
2806
break;
2807
case DemandEditMode::DEMAND_CONTAINER:
2808
if (tagProperty->isType()) {
2809
myNet->getViewNet()->getViewParent()->getContainerFrame()->getTypeSelector()->refreshDemandElementSelector();
2810
}
2811
break;
2812
case DemandEditMode::DEMAND_CONTAINERPLAN:
2813
if (tagProperty->isContainer()) {
2814
myNet->getViewNet()->getViewParent()->getContainerPlanFrame()->getContainerSelector()->refreshDemandElementSelector();
2815
}
2816
break;
2817
case DemandEditMode::DEMAND_STOP:
2818
myNet->getViewNet()->getViewParent()->getStopFrame()->getStopParentSelector()->refreshDemandElementSelector();
2819
break;
2820
default:
2821
// nothing to update
2822
break;
2823
}
2824
}
2825
}
2826
2827
2828
void
2829
GNENetHelper::AttributeCarriers::retrieveAttributeCarriersRecursively(const GNETagProperties* tag, std::vector<GNEAttributeCarrier*>& ACs) {
2830
// fill network elements
2831
if (tag->getTag() == SUMO_TAG_JUNCTION) {
2832
for (const auto& junction : myJunctions) {
2833
ACs.push_back(junction.second);
2834
}
2835
}
2836
if (tag->getTag() == SUMO_TAG_EDGE) {
2837
for (const auto& edge : myEdges) {
2838
ACs.push_back(edge.second);
2839
}
2840
}
2841
if (tag->getTag() == SUMO_TAG_LANE) {
2842
for (const auto& lane : myLanes) {
2843
ACs.push_back(lane.second);
2844
}
2845
}
2846
if (tag->getTag() == SUMO_TAG_CONNECTION) {
2847
for (const auto& connection : myConnections) {
2848
ACs.push_back(connection.second);
2849
}
2850
}
2851
if (tag->getTag() == SUMO_TAG_CROSSING) {
2852
for (const auto& crossing : myCrossings) {
2853
ACs.push_back(crossing.second);
2854
}
2855
}
2856
if (tag->getTag() == SUMO_TAG_WALKINGAREA) {
2857
for (const auto& walkingArea : myWalkingAreas) {
2858
ACs.push_back(walkingArea.second);
2859
}
2860
}
2861
// fill additional elements
2862
if (tag->isAdditionalElement()) {
2863
for (const auto& additionalTag : myAdditionals) {
2864
if (additionalTag.first == tag->getTag()) {
2865
for (const auto& additional : additionalTag.second) {
2866
ACs.push_back(additional.second);
2867
}
2868
}
2869
}
2870
}
2871
// fill demand elements
2872
if (tag->isDemandElement()) {
2873
for (const auto& demandElementTag : myDemandElements) {
2874
if (demandElementTag.first == tag->getTag()) {
2875
for (const auto& demandElemet : demandElementTag.second) {
2876
ACs.push_back(demandElemet.second);
2877
}
2878
}
2879
}
2880
}
2881
// fill data elements
2882
if (tag->isDataElement()) {
2883
if (tag->getTag() == SUMO_TAG_DATASET) {
2884
for (const auto& dataSet : myDataSets) {
2885
ACs.push_back(dataSet.second);
2886
}
2887
}
2888
if (tag->getTag() == SUMO_TAG_DATAINTERVAL) {
2889
for (const auto& dataInterval : myDataIntervals) {
2890
ACs.push_back(dataInterval.second);
2891
}
2892
}
2893
for (const auto& genericDataTag : myGenericDatas) {
2894
if (genericDataTag.first == tag->getTag()) {
2895
for (const auto& genericData : genericDataTag.second) {
2896
ACs.push_back(genericData.second);
2897
}
2898
}
2899
}
2900
for (const auto& meanDataTag : myMeanDatas) {
2901
if (meanDataTag.first == tag->getTag()) {
2902
for (const auto& meanData : meanDataTag.second) {
2903
ACs.push_back(meanData.second);
2904
}
2905
}
2906
}
2907
}
2908
// iterate over children
2909
for (const auto child : tag->getHierarchicalChildren()) {
2910
retrieveAttributeCarriersRecursively(child, ACs);
2911
}
2912
}
2913
2914
// ---------------------------------------------------------------------------
2915
// GNENetHelper::GNETagSelector - methods
2916
// ---------------------------------------------------------------------------
2917
2918
GNENetHelper::ACTemplate::ACTemplate(GNENet* net) :
2919
myNet(net) {
2920
}
2921
2922
2923
void
2924
GNENetHelper::ACTemplate::buildTemplates() {
2925
// network
2926
myTemplates[SUMO_TAG_CROSSING] = new GNECrossing(myNet);
2927
// additionals
2928
myTemplates[SUMO_TAG_BUS_STOP] = GNEBusStop::buildBusStop(myNet);
2929
myTemplates[SUMO_TAG_TRAIN_STOP] = GNEBusStop::buildTrainStop(myNet);
2930
myTemplates[SUMO_TAG_ACCESS] = new GNEAccess(myNet);
2931
myTemplates[SUMO_TAG_CONTAINER_STOP] = new GNEContainerStop(myNet);
2932
myTemplates[SUMO_TAG_CHARGING_STATION] = new GNEChargingStation(myNet);
2933
myTemplates[SUMO_TAG_PARKING_AREA] = new GNEParkingArea(myNet);
2934
myTemplates[SUMO_TAG_PARKING_SPACE] = new GNEParkingSpace(myNet);
2935
myTemplates[SUMO_TAG_INDUCTION_LOOP] = new GNEInductionLoopDetector(myNet);
2936
myTemplates[SUMO_TAG_LANE_AREA_DETECTOR] = new GNELaneAreaDetector(SUMO_TAG_LANE_AREA_DETECTOR, myNet);
2937
myTemplates[GNE_TAG_MULTI_LANE_AREA_DETECTOR] = new GNELaneAreaDetector(GNE_TAG_MULTI_LANE_AREA_DETECTOR, myNet);
2938
myTemplates[SUMO_TAG_ENTRY_EXIT_DETECTOR] = new GNEMultiEntryExitDetector(myNet);
2939
myTemplates[SUMO_TAG_DET_ENTRY] = new GNEEntryExitDetector(SUMO_TAG_DET_ENTRY, myNet);
2940
myTemplates[SUMO_TAG_DET_EXIT] = new GNEEntryExitDetector(SUMO_TAG_DET_EXIT, myNet);
2941
myTemplates[SUMO_TAG_INSTANT_INDUCTION_LOOP] = new GNEInstantInductionLoopDetector(myNet);
2942
myTemplates[SUMO_TAG_VSS] = new GNEVariableSpeedSign(myNet);
2943
myTemplates[SUMO_TAG_STEP] = new GNEVariableSpeedSignStep(myNet);
2944
myTemplates[SUMO_TAG_CALIBRATOR] = new GNECalibrator(SUMO_TAG_CALIBRATOR, myNet);
2945
myTemplates[GNE_TAG_CALIBRATOR_LANE] = new GNECalibrator(GNE_TAG_CALIBRATOR_LANE, myNet);
2946
myTemplates[GNE_TAG_CALIBRATOR_FLOW] = new GNECalibratorFlow(myNet);
2947
myTemplates[SUMO_TAG_REROUTER] = new GNERerouter(myNet);
2948
myTemplates[SUMO_TAG_INTERVAL] = new GNERerouterInterval(myNet);
2949
myTemplates[SUMO_TAG_CLOSING_REROUTE] = new GNEClosingReroute(myNet);
2950
myTemplates[SUMO_TAG_CLOSING_LANE_REROUTE] = new GNEClosingLaneReroute(myNet);
2951
myTemplates[SUMO_TAG_DEST_PROB_REROUTE] = new GNEDestProbReroute(myNet);
2952
myTemplates[SUMO_TAG_PARKING_AREA_REROUTE] = new GNEParkingAreaReroute(myNet);
2953
myTemplates[SUMO_TAG_ROUTE_PROB_REROUTE] = new GNERouteProbReroute(myNet);
2954
myTemplates[SUMO_TAG_ROUTEPROBE] = new GNERouteProbe(myNet);
2955
myTemplates[SUMO_TAG_VAPORIZER] = new GNEVaporizer(myNet);
2956
// symbols
2957
myTemplates[GNE_TAG_REROUTER_SYMBOL] = new GNERerouterSymbol(myNet);
2958
myTemplates[GNE_TAG_VSS_SYMBOL] = new GNEVariableSpeedSignSymbol(myNet);
2959
// shapes
2960
myTemplates[SUMO_TAG_POLY] = new GNEPoly(SUMO_TAG_POLY, myNet);
2961
myTemplates[SUMO_TAG_POI] = new GNEPOI(SUMO_TAG_POI, myNet);
2962
myTemplates[GNE_TAG_POILANE] = new GNEPOI(GNE_TAG_POILANE, myNet);
2963
myTemplates[GNE_TAG_POIGEO] = new GNEPOI(GNE_TAG_POIGEO, myNet);
2964
// TAZs
2965
myTemplates[SUMO_TAG_TAZ] = new GNETAZ(myNet);
2966
myTemplates[SUMO_TAG_TAZSOURCE] = new GNETAZSourceSink(SUMO_TAG_TAZSOURCE, myNet);
2967
myTemplates[SUMO_TAG_TAZSINK] = new GNETAZSourceSink(SUMO_TAG_TAZSINK, myNet);
2968
// wires
2969
myTemplates[SUMO_TAG_TRACTION_SUBSTATION] = new GNETractionSubstation(myNet);
2970
myTemplates[SUMO_TAG_OVERHEAD_WIRE_SECTION] = new GNEOverheadWire(myNet);
2971
//myTemplates[SUMO_TAG_OVERHEAD_WIRE_CLAMP] = nullptr; // TMP
2972
// JuPedSim elements
2973
myTemplates[GNE_TAG_JPS_WALKABLEAREA] = new GNEPoly(GNE_TAG_JPS_WALKABLEAREA, myNet);
2974
myTemplates[GNE_TAG_JPS_OBSTACLE] = new GNEPoly(GNE_TAG_JPS_OBSTACLE, myNet);
2975
// vTypes
2976
const auto vTypes = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::VTYPE);
2977
for (const auto vType : vTypes) {
2978
myTemplates[vType->getTag()] = new GNEVType(vType->getTag(), myNet);
2979
}
2980
// vType distributions
2981
myTemplates[SUMO_TAG_VTYPE_DISTRIBUTION] = new GNEVTypeDistribution(myNet);
2982
myTemplates[GNE_TAG_VTYPEREF] = new GNEVTypeRef(myNet);
2983
// routes (basic and embedded)
2984
const auto routes = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::ROUTE);
2985
for (const auto route : routes) {
2986
myTemplates[route->getTag()] = new GNERoute(route->getTag(), myNet);
2987
}
2988
// route distribution
2989
myTemplates[SUMO_TAG_ROUTE_DISTRIBUTION] = new GNERouteDistribution(myNet);
2990
myTemplates[GNE_TAG_ROUTEREF] = new GNERouteRef(myNet);
2991
// vehicles
2992
const auto vehicles = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::VEHICLE);
2993
for (const auto vehicle : vehicles) {
2994
myTemplates[vehicle->getTag()] = new GNEVehicle(vehicle->getTag(), myNet);
2995
}
2996
// persons
2997
const auto persons = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::PERSON);
2998
for (const auto person : persons) {
2999
myTemplates[person->getTag()] = new GNEPerson(person->getTag(), myNet);
3000
}
3001
// container
3002
const auto containers = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::CONTAINER);
3003
for (const auto container : containers) {
3004
myTemplates[container->getTag()] = new GNEContainer(container->getTag(), myNet);
3005
}
3006
// stops and waypoints
3007
const auto stopAndWaypoints = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_VEHICLE);
3008
for (const auto stopAndWaypoint : stopAndWaypoints) {
3009
myTemplates[stopAndWaypoint->getTag()] = new GNEStop(stopAndWaypoint->getTag(), myNet);
3010
}
3011
// personTrip
3012
const auto personTrips = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::PERSONTRIP);
3013
for (const auto personTrip : personTrips) {
3014
myTemplates[personTrip->getTag()] = new GNEPersonTrip(personTrip->getTag(), myNet);
3015
}
3016
// walk
3017
const auto walks = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::WALK);
3018
for (const auto walk : walks) {
3019
myTemplates[walk->getTag()] = new GNEWalk(walk->getTag(), myNet);
3020
}
3021
// ride
3022
const auto rides = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::RIDE);
3023
for (const auto ride : rides) {
3024
myTemplates[ride->getTag()] = new GNERide(ride->getTag(), myNet);
3025
}
3026
// stop person
3027
const auto stopPersons = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_PERSON);
3028
for (const auto stopPerson : stopPersons) {
3029
myTemplates[stopPerson->getTag()] = new GNEStopPlan(stopPerson->getTag(), myNet);
3030
}
3031
// transport
3032
const auto transports = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::TRANSPORT);
3033
for (const auto transport : transports) {
3034
myTemplates[transport->getTag()] = new GNETransport(transport->getTag(), myNet);
3035
}
3036
// tranship
3037
const auto tranships = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::TRANSHIP);
3038
for (const auto tranship : tranships) {
3039
myTemplates[tranship->getTag()] = new GNETranship(tranship->getTag(), myNet);
3040
}
3041
// stop container
3042
const auto stopContainers = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_CONTAINER);
3043
for (const auto stopContainer : stopContainers) {
3044
myTemplates[stopContainer->getTag()] = new GNEStopPlan(stopContainer->getTag(), myNet);
3045
}
3046
// reset all to their default values
3047
for (const auto& AC : myTemplates) {
3048
AC.second->resetDefaultValues(false);
3049
}
3050
}
3051
3052
3053
GNENetHelper::ACTemplate::~ACTemplate() {
3054
for (auto& AC : myTemplates) {
3055
delete AC.second;
3056
}
3057
}
3058
3059
3060
std::map<SumoXMLTag, GNEAttributeCarrier*>
3061
GNENetHelper::ACTemplate::getACTemplates() const {
3062
return myTemplates;
3063
}
3064
3065
3066
GNEAttributeCarrier*
3067
GNENetHelper::ACTemplate::getTemplateAC(const SumoXMLTag tag) const {
3068
if (myTemplates.count(tag) > 0) {
3069
return myTemplates.at(tag);
3070
} else {
3071
return nullptr;
3072
}
3073
}
3074
3075
3076
GNEAttributeCarrier*
3077
GNENetHelper::ACTemplate::getTemplateAC(const std::string& selectorText) const {
3078
for (const auto& templateAC : myTemplates) {
3079
if (templateAC.second->getTagProperty()->getSelectorText() == selectorText) {
3080
return templateAC.second;
3081
}
3082
}
3083
return nullptr;
3084
}
3085
3086
// ---------------------------------------------------------------------------
3087
// GNENetHelper::SavingFilesHandler - methods
3088
// ---------------------------------------------------------------------------
3089
3090
GNENetHelper::SavingFilesHandler::SavingFilesHandler(GNENet* net) :
3091
myNet(net) {
3092
}
3093
3094
3095
void
3096
GNENetHelper::SavingFilesHandler::updateNeteditConfig() {
3097
auto& neteditOptions = OptionsCont::getOptions();
3098
// get files
3099
const auto additionalFiles = parsingSavingFiles(myAdditionalElementsSavingFiles);
3100
const auto demandElementFiles = parsingSavingFiles(myDemandElementsSavingFiles);
3101
const auto dataElementFiles = parsingSavingFiles(myDataElementsSavingFiles);
3102
const auto meanDataElementFiles = parsingSavingFiles(myMeanDataElementsSavingFiles);
3103
// additionals
3104
neteditOptions.resetWritable();
3105
if (additionalFiles.size() > 0) {
3106
neteditOptions.set("additional-files", additionalFiles);
3107
} else {
3108
neteditOptions.resetDefault("additional-files");
3109
}
3110
// route files
3111
neteditOptions.resetWritable();
3112
if (demandElementFiles.size() > 0) {
3113
neteditOptions.set("route-files", demandElementFiles);
3114
} else {
3115
neteditOptions.resetDefault("route-files");
3116
}
3117
// data files
3118
neteditOptions.resetWritable();
3119
if (dataElementFiles.size() > 0) {
3120
neteditOptions.set("data-files", dataElementFiles);
3121
} else {
3122
neteditOptions.resetDefault("data-files");
3123
}
3124
// meanData files
3125
neteditOptions.resetWritable();
3126
if (meanDataElementFiles.size() > 0) {
3127
neteditOptions.set("meandata-files", meanDataElementFiles);
3128
} else {
3129
neteditOptions.resetDefault("meandata-files");
3130
}
3131
}
3132
3133
3134
void
3135
GNENetHelper::SavingFilesHandler::addAdditionalFilename(const GNEAttributeCarrier* additionalElement) {
3136
if ((additionalElement->getFilename().size() > 0) && !existAdditionalFilename(additionalElement->getFilename())) {
3137
if (myAdditionalElementsSavingFiles.empty()) {
3138
updateAdditionalEmptyFilenames(additionalElement->getFilename());
3139
} else {
3140
myAdditionalElementsSavingFiles.push_back(additionalElement->getFilename());
3141
}
3142
}
3143
}
3144
3145
3146
void
3147
GNENetHelper::SavingFilesHandler::updateAdditionalEmptyFilenames(const std::string& file) {
3148
for (const auto& additionalTag : myNet->getAttributeCarriers()->getAdditionals()) {
3149
for (const auto& additional : additionalTag.second) {
3150
additional.second->changeDefaultFilename(file);
3151
}
3152
}
3153
// update all templates
3154
for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3155
if (templateAC.second->getTagProperty()->isAdditionalElement() && templateAC.second->getFilename().empty()) {
3156
templateAC.second->changeDefaultFilename(file);
3157
}
3158
}
3159
// add it to current files
3160
if (!existAdditionalFilename(file)) {
3161
myAdditionalElementsSavingFiles.push_back(file);
3162
}
3163
}
3164
3165
3166
const std::vector<std::string>&
3167
GNENetHelper::SavingFilesHandler::getAdditionalFilenames() const {
3168
return myAdditionalElementsSavingFiles;
3169
}
3170
3171
3172
GNENetHelper::SavingFilesHandler::ACsbyFilename
3173
GNENetHelper::SavingFilesHandler::getAdditionalsByFilename() {
3174
ACsbyFilename additionalsbyFilenames;
3175
for (const auto& additionalTag : myNet->getAttributeCarriers()->getAdditionals()) {
3176
for (const auto& additional : additionalTag.second) {
3177
additionalsbyFilenames[additional.second->getFilename()].insert(additional.second);
3178
}
3179
}
3180
// special case for routes (due calibrators)
3181
for (const auto& route : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE)) {
3182
if (std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), route.second->getFilename()) != myAdditionalElementsSavingFiles.end()) {
3183
additionalsbyFilenames[route.second->getFilename()].insert(route.second);
3184
}
3185
}
3186
// clear empty saving files
3187
auto it = myAdditionalElementsSavingFiles.begin();
3188
while (it != myAdditionalElementsSavingFiles.end()) {
3189
if (it->empty() || (additionalsbyFilenames.find(*it) == additionalsbyFilenames.end())) {
3190
it = myAdditionalElementsSavingFiles.erase(it);
3191
} else {
3192
it++;
3193
}
3194
}
3195
return additionalsbyFilenames;
3196
}
3197
3198
3199
bool
3200
GNENetHelper::SavingFilesHandler::existAdditionalFilename(const std::string& file) const {
3201
const auto it = std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), file);
3202
return it != myAdditionalElementsSavingFiles.end();
3203
}
3204
3205
3206
void
3207
GNENetHelper::SavingFilesHandler::addDemandFilename(const GNEAttributeCarrier* demandElement) {
3208
if ((demandElement->getFilename().size() > 0) && !existDemandFilename(demandElement->getFilename())) {
3209
if (myDemandElementsSavingFiles.empty()) {
3210
updateDemandEmptyFilenames(demandElement->getFilename());
3211
} else {
3212
myDemandElementsSavingFiles.push_back(demandElement->getFilename());
3213
}
3214
}
3215
}
3216
3217
3218
void
3219
GNENetHelper::SavingFilesHandler::updateDemandEmptyFilenames(const std::string& file) {
3220
for (const auto& demandTag : myNet->getAttributeCarriers()->getDemandElements()) {
3221
for (const auto& demand : demandTag.second) {
3222
demand.second->changeDefaultFilename(file);
3223
}
3224
}
3225
// update all templates
3226
for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3227
if (templateAC.second->getTagProperty()->isDemandElement() && templateAC.second->getFilename().empty()) {
3228
templateAC.second->changeDefaultFilename(file);
3229
}
3230
}
3231
// add it to current files
3232
if (!existDemandFilename(file)) {
3233
myDemandElementsSavingFiles.push_back(file);
3234
}
3235
}
3236
3237
3238
const std::vector<std::string>&
3239
GNENetHelper::SavingFilesHandler::getDemandFilenames() const {
3240
return myDemandElementsSavingFiles;
3241
}
3242
3243
3244
GNENetHelper::SavingFilesHandler::ACsbyFilename
3245
GNENetHelper::SavingFilesHandler::getDemandsByFilename() {
3246
ACsbyFilename demandsbyFilenames;
3247
for (const auto& demandTag : myNet->getAttributeCarriers()->getDemandElements()) {
3248
for (const auto& demand : demandTag.second) {
3249
if (std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), demand.second->getFilename()) == myAdditionalElementsSavingFiles.end()) {
3250
demandsbyFilenames[demand.second->getFilename()].insert(demand.second);
3251
}
3252
}
3253
}
3254
// clear empty saving files
3255
auto it = myDemandElementsSavingFiles.begin();
3256
while (it != myDemandElementsSavingFiles.end()) {
3257
if (it->empty() || (demandsbyFilenames.find(*it) == demandsbyFilenames.end())) {
3258
it = myDemandElementsSavingFiles.erase(it);
3259
} else {
3260
it++;
3261
}
3262
}
3263
return demandsbyFilenames;
3264
}
3265
3266
3267
bool
3268
GNENetHelper::SavingFilesHandler::existDemandFilename(const std::string& file) const {
3269
const auto it = std::find(myDemandElementsSavingFiles.begin(), myDemandElementsSavingFiles.end(), file);
3270
return it != myDemandElementsSavingFiles.end();
3271
}
3272
3273
3274
void
3275
GNENetHelper::SavingFilesHandler::addDataFilename(const GNEAttributeCarrier* dataElement) {
3276
if ((dataElement->getFilename().size() > 0) && !existDataFilename(dataElement->getFilename())) {
3277
if (myDataElementsSavingFiles.empty()) {
3278
updateDataEmptyFilenames(dataElement->getFilename());
3279
} else {
3280
myDataElementsSavingFiles.push_back(dataElement->getFilename());
3281
}
3282
}
3283
}
3284
3285
3286
void
3287
GNENetHelper::SavingFilesHandler::updateDataEmptyFilenames(const std::string& file) {
3288
if (file.size() > 0) {
3289
for (const auto& dataSet : myNet->getAttributeCarriers()->getDataSets()) {
3290
dataSet.second->changeDefaultFilename(file);
3291
}
3292
// add it to current files
3293
if (!existDataFilename(file)) {
3294
myDataElementsSavingFiles.push_back(file);
3295
}
3296
}
3297
}
3298
3299
3300
const std::vector<std::string>&
3301
GNENetHelper::SavingFilesHandler::getDataFilenames() const {
3302
return myDataElementsSavingFiles;
3303
}
3304
3305
3306
GNENetHelper::SavingFilesHandler::ACsbyFilename
3307
GNENetHelper::SavingFilesHandler::getDatasByFilename() {
3308
ACsbyFilename datasbyFilenames;
3309
for (const auto& dataSet : myNet->getAttributeCarriers()->getDataSets()) {
3310
datasbyFilenames[dataSet.second->getFilename()].insert(dataSet.second);
3311
}
3312
// clear empty saving files
3313
auto it = myDataElementsSavingFiles.begin();
3314
while (it != myDataElementsSavingFiles.end()) {
3315
if (it->empty() || (datasbyFilenames.find(*it) == datasbyFilenames.end())) {
3316
it = myDataElementsSavingFiles.erase(it);
3317
} else {
3318
it++;
3319
}
3320
}
3321
return datasbyFilenames;
3322
}
3323
3324
3325
bool
3326
GNENetHelper::SavingFilesHandler::existDataFilename(const std::string& file) const {
3327
const auto it = std::find(myDataElementsSavingFiles.begin(), myDataElementsSavingFiles.end(), file);
3328
return it != myDataElementsSavingFiles.end();
3329
}
3330
3331
3332
void
3333
GNENetHelper::SavingFilesHandler::addMeanDataFilename(const GNEAttributeCarrier* meanDataElement) {
3334
if ((meanDataElement->getFilename().size() > 0) && !existMeanDataFilename(meanDataElement->getFilename())) {
3335
if (myMeanDataElementsSavingFiles.empty()) {
3336
updateMeanDataEmptyFilenames(meanDataElement->getFilename());
3337
} else {
3338
myMeanDataElementsSavingFiles.push_back(meanDataElement->getFilename());
3339
}
3340
}
3341
}
3342
3343
3344
void
3345
GNENetHelper::SavingFilesHandler::updateMeanDataEmptyFilenames(const std::string& file) {
3346
for (const auto& meanDataTag : myNet->getAttributeCarriers()->getMeanDatas()) {
3347
for (const auto& meanData : meanDataTag.second) {
3348
meanData.second->changeDefaultFilename(file);
3349
}
3350
}
3351
// update all templates
3352
for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3353
if (templateAC.second->getTagProperty()->isMeanData() && templateAC.second->getFilename().empty()) {
3354
templateAC.second->changeDefaultFilename(file);
3355
}
3356
}
3357
// add it to current files
3358
if (!existMeanDataFilename(file)) {
3359
myMeanDataElementsSavingFiles.push_back(file);
3360
}
3361
}
3362
3363
3364
const std::vector<std::string>&
3365
GNENetHelper::SavingFilesHandler::getMeanDataFilenames() const {
3366
return myMeanDataElementsSavingFiles;
3367
}
3368
3369
3370
GNENetHelper::SavingFilesHandler::ACsbyFilename
3371
GNENetHelper::SavingFilesHandler::getMeanDatasByFilename() {
3372
ACsbyFilename meanDatasbyFilenames;
3373
for (const auto& meanDataTag : myNet->getAttributeCarriers()->getMeanDatas()) {
3374
for (const auto& meanData : meanDataTag.second) {
3375
meanDatasbyFilenames[meanData.second->getFilename()].insert(meanData.second);
3376
}
3377
}
3378
// clear empty saving files
3379
auto it = myMeanDataElementsSavingFiles.begin();
3380
while (it != myMeanDataElementsSavingFiles.end()) {
3381
if (it->empty() || (meanDatasbyFilenames.find(*it) == meanDatasbyFilenames.end())) {
3382
it = myMeanDataElementsSavingFiles.erase(it);
3383
} else {
3384
it++;
3385
}
3386
}
3387
return meanDatasbyFilenames;
3388
}
3389
3390
3391
bool
3392
GNENetHelper::SavingFilesHandler::existMeanDataFilename(const std::string& file) const {
3393
const auto it = std::find(myMeanDataElementsSavingFiles.begin(), myMeanDataElementsSavingFiles.end(), file);
3394
return it != myMeanDataElementsSavingFiles.end();
3395
}
3396
3397
3398
std::string
3399
GNENetHelper::SavingFilesHandler::parsingSavingFiles(const std::vector<std::string>& savingFiles) const {
3400
std::string savingFileNames;
3401
// group all saving files in a single string separated with comma
3402
for (const auto& savingFile : savingFiles) {
3403
savingFileNames.append(savingFile + ",");
3404
}
3405
// remove last ','
3406
if (savingFileNames.size() > 0) {
3407
savingFileNames.pop_back();
3408
}
3409
return savingFileNames;
3410
}
3411
3412
// ---------------------------------------------------------------------------
3413
// GNENetHelper::SavingStatus - methods
3414
// ---------------------------------------------------------------------------
3415
3416
GNENetHelper::SavingStatus::SavingStatus(GNENet* net) :
3417
myNet(net) {
3418
}
3419
3420
3421
void
3422
GNENetHelper::SavingStatus::requireSaveSumoConfig() {
3423
mySumoConfigSaved = false;
3424
}
3425
3426
3427
void
3428
GNENetHelper::SavingStatus::SumoConfigSaved() {
3429
mySumoConfigSaved = true;
3430
}
3431
3432
3433
bool
3434
GNENetHelper::SavingStatus::isSumoConfigSaved() const {
3435
return mySumoConfigSaved;
3436
}
3437
3438
3439
3440
void
3441
GNENetHelper::SavingStatus::requireSaveNeteditConfig() {
3442
myNeteditConfigSaved = false;
3443
}
3444
3445
3446
void
3447
GNENetHelper::SavingStatus::neteditConfigSaved() {
3448
myNeteditConfigSaved = true;
3449
}
3450
3451
3452
bool
3453
GNENetHelper::SavingStatus::isNeteditConfigSaved() const {
3454
return myNeteditConfigSaved;
3455
}
3456
3457
3458
void
3459
GNENetHelper::SavingStatus::requireSaveNetwork() {
3460
myNetworkSaved = false;
3461
// implies requiere save netedit config and sumo config
3462
myNeteditConfigSaved = false;
3463
mySumoConfigSaved = false;
3464
}
3465
3466
3467
void
3468
GNENetHelper::SavingStatus::networkSaved() {
3469
myNetworkSaved = true;
3470
}
3471
3472
3473
bool
3474
GNENetHelper::SavingStatus::isNetworkSaved() const {
3475
return myNetworkSaved;
3476
}
3477
3478
3479
void
3480
GNENetHelper::SavingStatus::requireSaveTLS() {
3481
myTLSSaved = false;
3482
}
3483
3484
3485
void
3486
GNENetHelper::SavingStatus::TLSSaved() {
3487
myTLSSaved = true;
3488
}
3489
3490
3491
bool
3492
GNENetHelper::SavingStatus::isTLSSaved() const {
3493
return myTLSSaved;
3494
}
3495
3496
3497
void
3498
GNENetHelper::SavingStatus::requireSaveEdgeType() {
3499
myEdgeTypeSaved = false;
3500
}
3501
3502
3503
void
3504
GNENetHelper::SavingStatus::edgeTypeSaved() {
3505
myEdgeTypeSaved = true;
3506
}
3507
3508
3509
bool
3510
GNENetHelper::SavingStatus::isEdgeTypeSaved() const {
3511
return myEdgeTypeSaved;
3512
}
3513
3514
3515
void
3516
GNENetHelper::SavingStatus::requireSaveAdditionals() {
3517
myAdditionalSaved = false;
3518
// implies requiere save netedit config and sumo config
3519
myNeteditConfigSaved = false;
3520
mySumoConfigSaved = false;
3521
}
3522
3523
3524
void
3525
GNENetHelper::SavingStatus::additionalsSaved() {
3526
myAdditionalSaved = true;
3527
}
3528
3529
3530
bool
3531
GNENetHelper::SavingStatus::isAdditionalsSaved() const {
3532
return myAdditionalSaved;
3533
}
3534
3535
3536
void
3537
GNENetHelper::SavingStatus::requireSaveDemandElements() {
3538
myDemandElementSaved = false;
3539
// implies requiere save netedit config and sumo config
3540
myNeteditConfigSaved = false;
3541
mySumoConfigSaved = false;
3542
}
3543
3544
3545
void
3546
GNENetHelper::SavingStatus::demandElementsSaved() {
3547
myDemandElementSaved = true;
3548
}
3549
3550
3551
bool
3552
GNENetHelper::SavingStatus::isDemandElementsSaved() const {
3553
return myDemandElementSaved;
3554
}
3555
3556
3557
void
3558
GNENetHelper::SavingStatus::requireSaveDataElements() {
3559
myDataElementSaved = false;
3560
// implies requiere save netedit config and sumo config
3561
myNeteditConfigSaved = false;
3562
mySumoConfigSaved = false;
3563
}
3564
3565
3566
void
3567
GNENetHelper::SavingStatus::dataElementsSaved() {
3568
myDataElementSaved = true;
3569
}
3570
3571
3572
bool
3573
GNENetHelper::SavingStatus::isDataElementsSaved() const {
3574
return myDataElementSaved;
3575
}
3576
3577
3578
void
3579
GNENetHelper::SavingStatus::requireSaveMeanDatas() {
3580
myMeanDataElementSaved = false;
3581
// implies requiere save netedit config and sumo config
3582
myNeteditConfigSaved = false;
3583
mySumoConfigSaved = false;
3584
}
3585
3586
3587
void
3588
GNENetHelper::SavingStatus::meanDatasSaved() {
3589
myMeanDataElementSaved = true;
3590
}
3591
3592
3593
bool
3594
GNENetHelper::SavingStatus::isMeanDatasSaved() const {
3595
return myMeanDataElementSaved;
3596
}
3597
3598
3599
GNEDialog::Result
3600
GNENetHelper::SavingStatus::askSaveNetwork(bool& abortSaving) const {
3601
// Check if there are non saved network elements
3602
if (abortSaving) {
3603
return GNEDialog::Result::ABORT;
3604
} else if (myNetworkSaved) {
3605
return GNEDialog::Result::CANCEL;
3606
} else {
3607
// open question dialog box
3608
const std::string header = TL("Confirm close Network");
3609
const std::string contentsA = TL("You have unsaved changes in the network.");
3610
const std::string contentsB = TL("Do you wish to close and discard all changes?");
3611
const auto questionDialog = GNEQuestionBasicDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3612
GNEDialog::Buttons::SAVE_DONTSAVE_CANCEL, header, contentsA, contentsB);
3613
// check if enable flag abort
3614
if (questionDialog.getResult() == GNEDialog::Result::ABORT) {
3615
abortSaving = true;
3616
}
3617
// return question dialog
3618
return questionDialog.getResult();
3619
}
3620
}
3621
3622
3623
GNEDialog::Result
3624
GNENetHelper::SavingStatus::askSaveAdditionalElements(bool& abortSaving) const {
3625
// Check if there are non saved additional elements
3626
if (abortSaving) {
3627
return GNEDialog::Result::ABORT;
3628
} else if (myAdditionalSaved) {
3629
return GNEDialog::Result::CANCEL;
3630
} else {
3631
// open question box
3632
const std::string header = TL("Save additional elements before close");
3633
const std::string contentsA = TL("You have unsaved additional elements.");
3634
const std::string contentsB = TL("Do you wish to close and discard all changes?");
3635
const auto questionDialog = GNEQuestionBasicDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3636
GNEDialog::Buttons::SAVE_DONTSAVE_CANCEL, header, contentsA, contentsB);
3637
// check if enable flag abort
3638
if (questionDialog.getResult() == GNEDialog::Result::ABORT) {
3639
abortSaving = true;
3640
}
3641
// return question dialog
3642
return questionDialog.getResult();
3643
}
3644
}
3645
3646
3647
GNEDialog::Result
3648
GNENetHelper::SavingStatus::askSaveDemandElements(bool& abortSaving) const {
3649
// Check if there are non saved demand elements
3650
if (abortSaving) {
3651
return GNEDialog::Result::ABORT;
3652
} else if (myDemandElementSaved) {
3653
return GNEDialog::Result::CANCEL;
3654
} else {
3655
// open question box
3656
const std::string header = TL("Save demand elements before close");
3657
const std::string contentsA = TL("You have unsaved demand elements.");
3658
const std::string contentsB = TL("Do you wish to close and discard all changes?");
3659
const auto questionDialog = GNEQuestionBasicDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3660
GNEDialog::Buttons::SAVE_DONTSAVE_CANCEL, header, contentsA, contentsB);
3661
// check if enable flag abort
3662
if (questionDialog.getResult() == GNEDialog::Result::ABORT) {
3663
abortSaving = true;
3664
}
3665
// return question dialog
3666
return questionDialog.getResult();
3667
}
3668
}
3669
3670
3671
GNEDialog::Result
3672
GNENetHelper::SavingStatus::askSaveDataElements(bool& abortSaving) const {
3673
// Check if there are non saved data elements
3674
if (abortSaving) {
3675
return GNEDialog::Result::ABORT;
3676
} else if (myDataElementSaved) {
3677
return GNEDialog::Result::CANCEL;
3678
} else {
3679
// open question box
3680
const std::string header = TL("Save data elements before close");
3681
const std::string contentsA = TL("You have unsaved data elements.");
3682
const std::string contentsB = TL("Do you wish to close and discard all changes?");
3683
const auto questionDialog = GNEQuestionBasicDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3684
GNEDialog::Buttons::SAVE_DONTSAVE_CANCEL, header, contentsA, contentsB);
3685
// check if enable flag abort
3686
if (questionDialog.getResult() == GNEDialog::Result::ABORT) {
3687
abortSaving = true;
3688
}
3689
// return question dialog
3690
return questionDialog.getResult();
3691
}
3692
}
3693
3694
3695
GNEDialog::Result
3696
GNENetHelper::SavingStatus::askSaveMeanDataElements(bool& abortSaving) const {
3697
// Check if there are non saved mean data elements
3698
if (abortSaving) {
3699
return GNEDialog::Result::ABORT;
3700
} else if (myMeanDataElementSaved) {
3701
return GNEDialog::Result::CANCEL;
3702
} else {
3703
// open question box
3704
const std::string header = TL("Save meanData elements before close");
3705
const std::string contentsA = TL("You have unsaved meanData elements.");
3706
const std::string contentsB = TL("Do you wish to close and discard all changes?");
3707
const auto questionDialog = GNEQuestionBasicDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3708
GNEDialog::Buttons::SAVE_DONTSAVE_CANCEL, header, contentsA, contentsB);
3709
// check if enable flag abort
3710
if (questionDialog.getResult() == GNEDialog::Result::ABORT) {
3711
abortSaving = true;
3712
}
3713
// return question dialog
3714
return questionDialog.getResult();
3715
}
3716
}
3717
3718
// ---------------------------------------------------------------------------
3719
// GNENetHelper::GNEChange_ReplaceEdgeInTLS - methods
3720
// ---------------------------------------------------------------------------
3721
3722
GNENetHelper::GNEChange_ReplaceEdgeInTLS::GNEChange_ReplaceEdgeInTLS(NBTrafficLightLogicCont& tllcont, NBEdge* replaced, NBEdge* by) :
3723
GNEChange(Supermode::NETWORK, true, false),
3724
myTllcont(tllcont),
3725
myReplaced(replaced),
3726
myBy(by) {
3727
}
3728
3729
3730
GNENetHelper::GNEChange_ReplaceEdgeInTLS::~GNEChange_ReplaceEdgeInTLS() {}
3731
3732
3733
void
3734
GNENetHelper::GNEChange_ReplaceEdgeInTLS::undo() {
3735
// assuming this is only used for replacing incoming connections (GNENet::replaceIncomingEdge)
3736
myTllcont.replaceRemoved(myBy, -1, myReplaced, -1, true);
3737
}
3738
3739
3740
void
3741
GNENetHelper::GNEChange_ReplaceEdgeInTLS::redo() {
3742
// assuming this is only used for replacing incoming connections (GNENet::replaceIncomingEdge)
3743
myTllcont.replaceRemoved(myReplaced, -1, myBy, -1, true);
3744
}
3745
3746
3747
std::string
3748
GNENetHelper::GNEChange_ReplaceEdgeInTLS::undoName() const {
3749
return TL("Redo replace in TLS");
3750
}
3751
3752
3753
std::string
3754
GNENetHelper::GNEChange_ReplaceEdgeInTLS::redoName() const {
3755
return TL("Undo replace in TLS");
3756
}
3757
3758
3759
bool
3760
GNENetHelper::GNEChange_ReplaceEdgeInTLS::trueChange() {
3761
return myReplaced != myBy;
3762
}
3763
3764
/****************************************************************************/
3765
3766