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 NIVissimConflictArea.cpp
15 : /// @author Lukas Grohmann
16 : /// @date Aug 2015
17 : ///
18 : // A temporary storage for conflict areas imported from Vissim
19 : /****************************************************************************/
20 : #include <config.h>
21 :
22 : #include <iterator>
23 : #include <map>
24 : #include <string>
25 : #include <utils/common/ToString.h>
26 : #include <utils/common/StringUtils.h>
27 : #include "NIVissimConflictArea.h"
28 : #include "NIVissimConnection.h"
29 : #include <netbuild/NBEdgeCont.h>
30 : #include <netbuild/NBEdge.h>
31 : #include <netbuild/NBNode.h>
32 :
33 :
34 : // ===========================================================================
35 : // static members
36 : // ===========================================================================
37 : NIVissimConflictArea::DictType NIVissimConflictArea::myDict;
38 :
39 :
40 : // ===========================================================================
41 : // method definitions
42 : // ===========================================================================
43 50 : NIVissimConflictArea::NIVissimConflictArea(int id,
44 : const std::string& link1,
45 : const std::string& link2,
46 50 : const std::string& status)
47 100 : : myConflictID(id), myFirstLink(link1), mySecondLink(link2), myStatus(status) {
48 50 : }
49 :
50 :
51 50 : NIVissimConflictArea::~NIVissimConflictArea() {}
52 :
53 :
54 :
55 :
56 : bool
57 50 : NIVissimConflictArea::dictionary(int id, const std::string& link1,
58 : const std::string& link2,
59 : const std::string& status) {
60 50 : NIVissimConflictArea* ca = new NIVissimConflictArea(id, link1, link2, status);
61 50 : if (!dictionary(id, ca)) {
62 0 : delete ca;
63 0 : return false;
64 : }
65 : return true;
66 : }
67 :
68 :
69 :
70 : bool
71 50 : NIVissimConflictArea::dictionary(int id, NIVissimConflictArea* ca) {
72 : DictType::iterator i = myDict.find(id);
73 50 : if (i == myDict.end()) {
74 50 : myDict[id] = ca;
75 50 : return true;
76 : }
77 : return false;
78 : }
79 :
80 :
81 :
82 : NIVissimConflictArea*
83 0 : NIVissimConflictArea::dictionary(int id) {
84 : DictType::iterator i = myDict.find(id);
85 0 : if (i == myDict.end()) {
86 : return nullptr;
87 : }
88 0 : return (*i).second;
89 : }
90 :
91 :
92 :
93 : NIVissimConflictArea*
94 0 : NIVissimConflictArea::dict_findByLinks(const std::string& link1,
95 : const std::string& link2) {
96 0 : for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
97 0 : if (((*i).second->myFirstLink == link1) &&
98 0 : ((*i).second->mySecondLink == link2)) {
99 : return (*i).second;
100 : }
101 : }
102 : return nullptr;
103 : }
104 :
105 :
106 : void
107 9 : NIVissimConflictArea::clearDict() {
108 59 : for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
109 50 : delete (*i).second;
110 : }
111 : myDict.clear();
112 9 : }
113 :
114 :
115 : void
116 9 : NIVissimConflictArea::setPriorityRegulation(NBEdgeCont& ec) {
117 : std::map<int, NIVissimConflictArea*>::iterator it;
118 59 : for (it = myDict.begin(); it != myDict.end(); it++) {
119 50 : NIVissimConflictArea* const conflictArea = it->second;
120 100 : NIVissimConnection* const firstLink = NIVissimConnection::dictionary(StringUtils::toInt(conflictArea->getFirstLink()));
121 50 : NIVissimConnection* const secondLink = NIVissimConnection::dictionary(StringUtils::toInt(conflictArea->getSecondLink()));
122 50 : if (firstLink == nullptr || secondLink == nullptr) {
123 33 : continue;
124 : }
125 : // status == "TWOYIELDSONE"
126 : NIVissimConnection* priority_conn = firstLink;
127 : NIVissimConnection* subordinate_conn = secondLink;
128 17 : if (conflictArea->getStatus() == "ONEYIELDSTWO") {
129 : priority_conn = secondLink;
130 : subordinate_conn = firstLink;
131 : }
132 17 : const std::string mayDriveFrom_id = toString<int>(priority_conn->getFromEdgeID());
133 17 : const std::string mayDriveTo_id = toString<int>(priority_conn->getToEdgeID());
134 17 : const std::string mustStopFrom_id = toString<int>(subordinate_conn->getFromEdgeID());
135 17 : const std::string mustStopTo_id = toString<int>(subordinate_conn->getToEdgeID());
136 :
137 17 : NBEdge* const mayDriveFrom = ec.retrievePossiblySplit(mayDriveFrom_id, true);
138 17 : NBEdge* const mayDriveTo = ec.retrievePossiblySplit(mayDriveTo_id, false);
139 17 : NBEdge* const mustStopFrom = ec.retrievePossiblySplit(mustStopFrom_id, true);
140 17 : NBEdge* const mustStopTo = ec.retrievePossiblySplit(mustStopTo_id, false);
141 :
142 17 : if (mayDriveFrom != nullptr && mayDriveTo != nullptr && mustStopFrom != nullptr && mustStopTo != nullptr) {
143 : NBNode* node = mayDriveFrom->getToNode();
144 17 : node->addSortedLinkFoes(
145 34 : NBConnection(mayDriveFrom, mayDriveTo),
146 34 : NBConnection(mustStopFrom, mustStopTo));
147 : }
148 : }
149 9 : }
150 :
151 :
152 : /****************************************************************************/
|