Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/od/ODDistrictCont.cpp
169666 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2002-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 ODDistrictCont.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Michael Behrisch
17
/// @author Yun-Pang Floetteroed
18
/// @date Sept 2002
19
///
20
// A container for districts
21
/****************************************************************************/
22
#include <config.h>
23
24
#include <string>
25
#include <utils/common/MsgHandler.h>
26
#include <utils/common/UtilExceptions.h>
27
#include <utils/common/NamedObjectCont.h>
28
#include <utils/xml/XMLSubSys.h>
29
#include <utils/common/RandHelper.h>
30
#include <utils/common/FileHelpers.h>
31
#include <utils/options/OptionsCont.h>
32
#include "ODDistrict.h"
33
#include "ODDistrictHandler.h"
34
#include "ODDistrictCont.h"
35
36
37
38
// ===========================================================================
39
// method definitions
40
// ===========================================================================
41
ODDistrictCont::ODDistrictCont() {}
42
43
44
ODDistrictCont::~ODDistrictCont() {}
45
46
47
std::string
48
ODDistrictCont::getRandomSourceFromDistrict(const std::string& name) const {
49
ODDistrict* district = get(name);
50
if (district == nullptr) {
51
throw InvalidArgument("There is no district '" + name + "'.");
52
}
53
std::string randomSource;
54
try {
55
randomSource = district->getRandomSource();
56
} catch (OutOfBoundsException&) {
57
throw ProcessError(TLF("District '%' does not provide any valid source.", name));
58
}
59
return randomSource;
60
}
61
62
63
std::string
64
ODDistrictCont::getRandomSinkFromDistrict(const std::string& name) const {
65
ODDistrict* district = get(name);
66
if (district == nullptr) {
67
throw InvalidArgument("There is no district '" + name + "'.");
68
}
69
std::string randomSink;
70
try {
71
randomSink = district->getRandomSink();
72
} catch (OutOfBoundsException&) {
73
throw ProcessError(TLF("District '%' does not provide any valid sink.", name));
74
}
75
return randomSink;
76
}
77
78
79
void
80
ODDistrictCont::loadDistricts(std::vector<std::string> files) {
81
for (std::vector<std::string>::iterator i = files.begin(); i != files.end(); ++i) {
82
const std::string& districtfile = *i;
83
if (!FileHelpers::isReadable(districtfile)) {
84
throw ProcessError(TLF("Could not access network file '%' to load.", districtfile));
85
}
86
PROGRESS_BEGIN_MESSAGE("Loading districts from '" + districtfile + "'");
87
// build the xml-parser and handler
88
ODDistrictHandler handler(*this, districtfile);
89
if (!XMLSubSys::runParser(handler, districtfile, true)) {
90
PROGRESS_FAILED_MESSAGE();
91
} else {
92
PROGRESS_DONE_MESSAGE();
93
}
94
}
95
}
96
97
98
void
99
ODDistrictCont::makeDistricts(const std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > >& districts) {
100
for (std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > >::const_iterator it = districts.begin(); it != districts.end(); ++it) {
101
ODDistrict* current = new ODDistrict(it->first);
102
const std::vector<std::string>& sources = it->second.first;
103
for (std::vector<std::string>::const_iterator i = sources.begin(); i != sources.end(); ++i) {
104
current->addSource(*i, 1.);
105
}
106
const std::vector<std::string>& sinks = it->second.second;
107
for (std::vector<std::string>::const_iterator i = sinks.begin(); i != sinks.end(); ++i) {
108
current->addSink(*i, 1.);
109
}
110
add(current->getID(), current);
111
}
112
}
113
114
115
/****************************************************************************/
116
117