Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netimport/vissim/tempstructs/NIVissimNodeCluster.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-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 NIVissimNodeCluster.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Sept 2002
19
///
20
// -------------------
21
/****************************************************************************/
22
#include <config.h>
23
24
25
#include <map>
26
#include <algorithm>
27
#include <cassert>
28
#include <utils/common/VectorHelper.h>
29
#include <utils/common/ToString.h>
30
#include <utils/geom/PositionVector.h>
31
#include <netbuild/NBNode.h>
32
#include <netbuild/NBNodeCont.h>
33
#include "NIVissimTL.h"
34
#include "NIVissimDisturbance.h"
35
#include "NIVissimConnection.h"
36
#include "NIVissimNodeCluster.h"
37
38
39
// ===========================================================================
40
// static member variables
41
// ===========================================================================
42
NIVissimNodeCluster::DictType NIVissimNodeCluster::myDict;
43
int NIVissimNodeCluster::myCurrentID = 1;
44
45
46
// ===========================================================================
47
// method definitions
48
// ===========================================================================
49
NIVissimNodeCluster::NIVissimNodeCluster(int id, int nodeid, int tlid,
50
const std::vector<int>& connectors,
51
const std::vector<int>& disturbances,
52
bool amEdgeSplitOnly)
53
: myID(id), myNodeID(nodeid), myTLID(tlid),
54
myConnectors(connectors), myDisturbances(disturbances),
55
myNBNode(nullptr), myAmEdgeSplit(amEdgeSplitOnly) {}
56
57
58
NIVissimNodeCluster::~NIVissimNodeCluster() {}
59
60
61
62
63
bool
64
NIVissimNodeCluster::dictionary(int id, NIVissimNodeCluster* o) {
65
DictType::iterator i = myDict.find(id);
66
if (i == myDict.end()) {
67
myDict[id] = o;
68
return true;
69
}
70
assert(false);
71
return false;
72
}
73
74
75
int
76
NIVissimNodeCluster::dictionary(int nodeid, int tlid,
77
const std::vector<int>& connectors,
78
const std::vector<int>& disturbances,
79
bool amEdgeSplitOnly) {
80
int id = nodeid;
81
if (nodeid < 0) {
82
id = myCurrentID++;
83
}
84
NIVissimNodeCluster* o = new NIVissimNodeCluster(id,
85
nodeid, tlid, connectors, disturbances, amEdgeSplitOnly);
86
dictionary(id, o);
87
return id;
88
}
89
90
91
NIVissimNodeCluster*
92
NIVissimNodeCluster::dictionary(int id) {
93
DictType::iterator i = myDict.find(id);
94
if (i == myDict.end()) {
95
return nullptr;
96
}
97
return (*i).second;
98
}
99
100
101
102
int
103
NIVissimNodeCluster::contSize() {
104
return (int)myDict.size();
105
}
106
107
108
109
std::string
110
NIVissimNodeCluster::getNodeName() const {
111
if (myTLID == -1) {
112
return toString<int>(myID);
113
} else {
114
return toString<int>(myID) + "LSA " + toString<int>(myTLID);
115
}
116
}
117
118
119
void
120
NIVissimNodeCluster::buildNBNode(NBNodeCont& nc) {
121
if (myConnectors.size() == 0) {
122
return; // !!! Check, whether this can happen
123
}
124
125
// compute the position
126
PositionVector crossings;
127
std::vector<int>::iterator i, j;
128
// check whether this is a split of an edge only
129
if (myAmEdgeSplit) {
130
// !!! should be assert(myTLID==-1);
131
for (i = myConnectors.begin(); i != myConnectors.end(); i++) {
132
NIVissimConnection* c1 = NIVissimConnection::dictionary(*i);
133
crossings.push_back_noDoublePos(c1->getFromGeomPosition());
134
}
135
} else {
136
// compute the places the connections cross
137
for (i = myConnectors.begin(); i != myConnectors.end(); i++) {
138
NIVissimAbstractEdge* c1 = NIVissimAbstractEdge::dictionary(*i);
139
c1->buildGeom();
140
for (j = i + 1; j != myConnectors.end(); j++) {
141
NIVissimAbstractEdge* c2 = NIVissimAbstractEdge::dictionary(*j);
142
c2->buildGeom();
143
if (c1->crossesEdge(c2)) {
144
crossings.push_back_noDoublePos(c1->crossesEdgeAtPoint(c2));
145
}
146
}
147
}
148
// alternative way: compute via positions of crossings
149
if (crossings.size() == 0) {
150
for (i = myConnectors.begin(); i != myConnectors.end(); i++) {
151
NIVissimConnection* c1 = NIVissimConnection::dictionary(*i);
152
crossings.push_back_noDoublePos(c1->getFromGeomPosition());
153
crossings.push_back_noDoublePos(c1->getToGeomPosition());
154
}
155
}
156
}
157
// get the position (center)
158
Position pos = crossings.getPolygonCenter();
159
// build the node
160
/* if(myTLID!=-1) {
161
!!! NIVissimTL *tl = NIVissimTL::dictionary(myTLID);
162
if(tl->getType()=="festzeit") {
163
node = new NBNode(getNodeName(), pos.x(), pos.y(),
164
"traffic_light");
165
} else {
166
node = new NBNode(getNodeName(), pos.x(), pos.y(),
167
"actuated_traffic_light");
168
}
169
}*/
170
NBNode* node = new NBNode(getNodeName(), pos, SumoXMLNodeType::PRIORITY);
171
if (!nc.insert(node)) {
172
delete node;
173
throw 1;
174
}
175
myNBNode = node;
176
}
177
178
179
void
180
NIVissimNodeCluster::buildNBNodes(NBNodeCont& nc) {
181
for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
182
(*i).second->buildNBNode(nc);
183
}
184
}
185
186
187
188
void
189
NIVissimNodeCluster::dict_recheckEdgeChanges() {
190
return;
191
}
192
193
194
int
195
NIVissimNodeCluster::getFromNode(int edgeid) {
196
int ret = -1;
197
for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
198
NIVissimNodeCluster* c = (*i).second;
199
for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {
200
NIVissimConnection* conn = NIVissimConnection::dictionary(*j);
201
if (conn != nullptr && conn->getToEdgeID() == edgeid) {
202
// return (*i).first;
203
if (ret != -1 && (*i).first != ret) {
204
// "NIVissimNodeCluster:DoubleNode:" << ret << endl;
205
throw 1; // an edge should not outgo from two different nodes
206
// but actually, a joined cluster may posess a connections more than once
207
}
208
ret = (*i).first;
209
}
210
}
211
}
212
return ret;
213
}
214
215
216
int
217
NIVissimNodeCluster::getToNode(int edgeid) {
218
int ret = -1;
219
for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
220
NIVissimNodeCluster* c = (*i).second;
221
for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {
222
NIVissimConnection* conn = NIVissimConnection::dictionary(*j);
223
if (conn != nullptr && conn->getFromEdgeID() == edgeid) {
224
// return (*i).first;
225
if (ret != -1 && ret != (*i).first) {
226
// << "NIVissimNodeCluster: multiple to-nodes" << endl;
227
throw 1; // an edge should not outgo from two different nodes
228
// but actually, a joined cluster may posess a connections more than once
229
230
}
231
ret = (*i).first;
232
}
233
}
234
}
235
return ret;
236
}
237
238
239
void
240
NIVissimNodeCluster::_debugOut(std::ostream& into) {
241
for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
242
NIVissimNodeCluster* c = (*i).second;
243
into << std::endl << c->myID << ":";
244
for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {
245
if (j != c->myConnectors.begin()) {
246
into << ", ";
247
}
248
into << (*j);
249
}
250
}
251
into << "=======================" << std::endl;
252
}
253
254
255
256
NBNode*
257
NIVissimNodeCluster::getNBNode() const {
258
return myNBNode;
259
}
260
261
262
Position
263
NIVissimNodeCluster::getPos() const {
264
return myPosition;
265
}
266
267
268
void
269
NIVissimNodeCluster::dict_addDisturbances(NBDistrictCont& dc,
270
NBNodeCont& nc, NBEdgeCont& ec) {
271
for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
272
const std::vector<int>& disturbances = (*i).second->myDisturbances;
273
NBNode* node = nc.retrieve((*i).second->getNodeName());
274
for (std::vector<int>::const_iterator j = disturbances.begin(); j != disturbances.end(); j++) {
275
NIVissimDisturbance* disturbance = NIVissimDisturbance::dictionary(*j);
276
disturbance->addToNode(node, dc, nc, ec);
277
}
278
}
279
NIVissimDisturbance::reportRefused();
280
}
281
282
283
void
284
NIVissimNodeCluster::clearDict() {
285
for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
286
delete (*i).second;
287
}
288
myDict.clear();
289
}
290
291
292
void
293
NIVissimNodeCluster::setCurrentVirtID(int id) {
294
myCurrentID = id;
295
}
296
297
298
/****************************************************************************/
299
300