Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2002-2024 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 232 : ODDistrictCont::ODDistrictCont() {} 42 : 43 : 44 232 : 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 15963 : return district->getRandomSource(); 54 : } 55 : 56 : 57 : std::string 58 15963 : ODDistrictCont::getRandomSinkFromDistrict(const std::string& name) const { 59 : ODDistrict* district = get(name); 60 15963 : if (district == nullptr) { 61 0 : throw InvalidArgument("There is no district '" + name + "'."); 62 : } 63 15963 : return district->getRandomSink(); 64 : } 65 : 66 : 67 : void 68 143 : ODDistrictCont::loadDistricts(std::vector<std::string> files) { 69 285 : for (std::vector<std::string>::iterator i = files.begin(); i != files.end(); ++i) { 70 : const std::string& districtfile = *i; 71 286 : if (!FileHelpers::isReadable(districtfile)) { 72 5 : throw ProcessError(TLF("Could not access network file '%' to load.", districtfile)); 73 : } 74 284 : PROGRESS_BEGIN_MESSAGE("Loading districts from '" + districtfile + "'"); 75 : // build the xml-parser and handler 76 142 : ODDistrictHandler handler(*this, districtfile); 77 142 : if (!XMLSubSys::runParser(handler, districtfile, true)) { 78 0 : PROGRESS_FAILED_MESSAGE(); 79 : } else { 80 142 : PROGRESS_DONE_MESSAGE(); 81 : } 82 142 : } 83 142 : } 84 : 85 : 86 : void 87 89 : ODDistrictCont::makeDistricts(const std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > >& districts) { 88 332 : for (std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > >::const_iterator it = districts.begin(); it != districts.end(); ++it) { 89 243 : ODDistrict* current = new ODDistrict(it->first); 90 : const std::vector<std::string>& sources = it->second.first; 91 672 : for (std::vector<std::string>::const_iterator i = sources.begin(); i != sources.end(); ++i) { 92 429 : current->addSource(*i, 1.); 93 : } 94 : const std::vector<std::string>& sinks = it->second.second; 95 665 : for (std::vector<std::string>::const_iterator i = sinks.begin(); i != sinks.end(); ++i) { 96 422 : current->addSink(*i, 1.); 97 : } 98 243 : add(current->getID(), current); 99 : } 100 89 : } 101 : 102 : 103 : /****************************************************************************/