Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-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 PCLoaderXML.cpp 15 : /// @author Daniel Krajzewicz 16 : /// @author Jakob Erdmann 17 : /// @author Christoph Sommer 18 : /// @author Michael Behrisch 19 : /// @date Thu, 02.11.2006 20 : /// 21 : // A reader for polygons and pois stored in XML-format 22 : /****************************************************************************/ 23 : #include <config.h> 24 : 25 : #include <string> 26 : #include <map> 27 : #include <fstream> 28 : #include <utils/options/OptionsCont.h> 29 : #include <utils/options/Option.h> 30 : #include <utils/common/MsgHandler.h> 31 : #include <utils/common/FileHelpers.h> 32 : #include <utils/common/RGBColor.h> 33 : #include <utils/common/StdDefs.h> 34 : #include <utils/common/SysUtils.h> 35 : #include <polyconvert/PCPolyContainer.h> 36 : #include <utils/geom/GeomHelper.h> 37 : #include <utils/geom/Boundary.h> 38 : #include <utils/geom/Position.h> 39 : #include <utils/geom/GeoConvHelper.h> 40 : #include <utils/xml/XMLSubSys.h> 41 : #include <utils/geom/GeomConvHelper.h> 42 : #include <utils/xml/SUMOXMLDefinitions.h> 43 : #include "PCLoaderXML.h" 44 : 45 : 46 : // =========================================================================== 47 : // method definitions 48 : // =========================================================================== 49 : // --------------------------------------------------------------------------- 50 : // static interface 51 : // --------------------------------------------------------------------------- 52 : void 53 45 : PCLoaderXML::loadIfSet(OptionsCont& oc, PCPolyContainer& toFill, 54 : PCTypeMap& tm) { 55 90 : if (!oc.isSet("xml-files")) { 56 34 : return; 57 : } 58 11 : PCLoaderXML handler(toFill, tm, oc); 59 : // parse file(s) 60 22 : std::vector<std::string> files = oc.getStringVector("xml"); 61 21 : for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) { 62 22 : if (!FileHelpers::isReadable(*file)) { 63 0 : throw ProcessError(TLF("Could not open xml-file '%'.", *file)); 64 : } 65 22 : const long before = PROGRESS_BEGIN_TIME_MESSAGE("Parsing XML from '" + *file + "'"); 66 11 : if (!XMLSubSys::runParser(handler, *file)) { 67 1 : throw ProcessError(); 68 : } 69 10 : PROGRESS_TIME_MESSAGE(before); 70 : } 71 11 : } 72 : 73 : 74 : 75 : // --------------------------------------------------------------------------- 76 : // handler methods 77 : // --------------------------------------------------------------------------- 78 11 : PCLoaderXML::PCLoaderXML(PCPolyContainer& toFill, 79 11 : PCTypeMap& tm, OptionsCont& oc) 80 : : ShapeHandler("xml-poi-definition", toFill), 81 22 : myTypeMap(tm), myOptions(oc) {} 82 : 83 : 84 11 : PCLoaderXML::~PCLoaderXML() {} 85 : 86 : 87 : void 88 29 : PCLoaderXML::myStartElement(int element, 89 : const SUMOSAXAttributes& attrs) { 90 29 : if (element != SUMO_TAG_POI && element != SUMO_TAG_POLY) { 91 11 : return; 92 : } 93 18 : bool ok = true; 94 : // get the id, report an error if not given or empty... 95 18 : std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok); 96 36 : std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, myOptions.getString("type")); 97 18 : if (!ok) { 98 : return; 99 : } 100 : // patch the values 101 18 : bool discard = myOptions.getBool("discard"); 102 18 : if (myTypeMap.has(type)) { 103 0 : const PCTypeMap::TypeDef& def = myTypeMap.get(type); 104 0 : discard = def.discard; 105 0 : setDefaults(def.prefix, def.color, def.icon, def.layer, def.allowFill); 106 : } else { 107 72 : setDefaults(myOptions.getString("prefix"), RGBColor::parseColor(myOptions.getString("color")), 108 72 : myOptions.getString("icon"), myOptions.getFloat("layer"), myOptions.getBool("fill")); 109 : } 110 18 : if (!discard) { 111 18 : if (element == SUMO_TAG_POI) { 112 18 : addPOI(attrs, myOptions.isInStringVector("prune.keep-list", id), true); 113 : } 114 18 : if (element == SUMO_TAG_POLY) { 115 18 : addPoly(attrs, myOptions.isInStringVector("prune.keep-list", id), true); 116 : } 117 : } 118 : } 119 : 120 : 121 : Position 122 1 : PCLoaderXML::getLanePos(const std::string& poiID, const std::string& laneID, double lanePos, bool friendlyPos, double lanePosLat) { 123 1 : static_cast<PCPolyContainer&>(myShapeContainer).addLanePos(poiID, laneID, lanePos, friendlyPos, lanePosLat); 124 1 : return Position::INVALID; 125 : } 126 : 127 : 128 : /****************************************************************************/