Line data Source code
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 241 : ODDistrictCont::ODDistrictCont() {}
42 :
43 :
44 241 : ODDistrictCont::~ODDistrictCont() {}
45 :
46 :
47 : std::string
48 15963 : ODDistrictCont::getRandomSourceFromDistrict(const std::string& name) const {
49 : ODDistrict* district = get(name);
50 15963 : if (district == nullptr) {
51 0 : throw InvalidArgument("There is no district '" + name + "'.");
52 : }
53 : std::string randomSource;
54 : try {
55 15963 : randomSource = district->getRandomSource();
56 0 : } catch (OutOfBoundsException&) {
57 0 : throw ProcessError(TLF("District '%' does not provide any valid source.", name));
58 0 : }
59 15963 : return randomSource;
60 : }
61 :
62 :
63 : std::string
64 15963 : ODDistrictCont::getRandomSinkFromDistrict(const std::string& name) const {
65 : ODDistrict* district = get(name);
66 15963 : if (district == nullptr) {
67 0 : throw InvalidArgument("There is no district '" + name + "'.");
68 : }
69 : std::string randomSink;
70 : try {
71 15963 : randomSink = district->getRandomSink();
72 0 : } catch (OutOfBoundsException&) {
73 0 : throw ProcessError(TLF("District '%' does not provide any valid sink.", name));
74 0 : }
75 15963 : return randomSink;
76 : }
77 :
78 :
79 : void
80 143 : ODDistrictCont::loadDistricts(std::vector<std::string> files) {
81 285 : for (std::vector<std::string>::iterator i = files.begin(); i != files.end(); ++i) {
82 : const std::string& districtfile = *i;
83 286 : if (!FileHelpers::isReadable(districtfile)) {
84 3 : throw ProcessError(TLF("Could not access network file '%' to load.", districtfile));
85 : }
86 426 : PROGRESS_BEGIN_MESSAGE("Loading districts from '" + districtfile + "'");
87 : // build the xml-parser and handler
88 142 : ODDistrictHandler handler(*this, districtfile);
89 142 : if (!XMLSubSys::runParser(handler, districtfile, true)) {
90 0 : PROGRESS_FAILED_MESSAGE();
91 : } else {
92 142 : PROGRESS_DONE_MESSAGE();
93 : }
94 142 : }
95 142 : }
96 :
97 :
98 : void
99 98 : ODDistrictCont::makeDistricts(const std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > >& districts) {
100 353 : 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 255 : ODDistrict* current = new ODDistrict(it->first);
102 : const std::vector<std::string>& sources = it->second.first;
103 714 : for (std::vector<std::string>::const_iterator i = sources.begin(); i != sources.end(); ++i) {
104 459 : current->addSource(*i, 1.);
105 : }
106 : const std::vector<std::string>& sinks = it->second.second;
107 707 : for (std::vector<std::string>::const_iterator i = sinks.begin(); i != sinks.end(); ++i) {
108 452 : current->addSink(*i, 1.);
109 : }
110 255 : add(current->getID(), current);
111 : }
112 98 : }
113 :
114 :
115 : /****************************************************************************/
|