Eclipse SUMO - Simulation of Urban MObility
NIVissimNodeCluster.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
16 // -------------------
17 /****************************************************************************/
18 
19 
20 // ===========================================================================
21 // included modules
22 // ===========================================================================
23 #include <config.h>
24 
25 
26 #include <map>
27 #include <algorithm>
28 #include <cassert>
30 #include <utils/common/ToString.h>
32 #include <netbuild/NBNode.h>
33 #include <netbuild/NBNodeCont.h>
34 #include "NIVissimTL.h"
35 #include "NIVissimDisturbance.h"
36 #include "NIVissimConnection.h"
37 #include "NIVissimNodeCluster.h"
38 
39 
40 // ===========================================================================
41 // static member variables
42 // ===========================================================================
45 
46 
47 // ===========================================================================
48 // method definitions
49 // ===========================================================================
50 NIVissimNodeCluster::NIVissimNodeCluster(int id, int nodeid, int tlid,
51  const std::vector<int>& connectors,
52  const std::vector<int>& disturbances,
53  bool amEdgeSplitOnly)
54  : myID(id), myNodeID(nodeid), myTLID(tlid),
55  myConnectors(connectors), myDisturbances(disturbances),
56  myNBNode(nullptr), myAmEdgeSplit(amEdgeSplitOnly) {}
57 
58 
60 
61 
62 
63 
64 bool
66  DictType::iterator i = myDict.find(id);
67  if (i == myDict.end()) {
68  myDict[id] = o;
69  return true;
70  }
71  assert(false);
72  return false;
73 }
74 
75 
76 int
77 NIVissimNodeCluster::dictionary(int nodeid, int tlid,
78  const std::vector<int>& connectors,
79  const std::vector<int>& disturbances,
80  bool amEdgeSplitOnly) {
81  int id = nodeid;
82  if (nodeid < 0) {
83  id = myCurrentID++;
84  }
86  nodeid, tlid, connectors, disturbances, amEdgeSplitOnly);
87  dictionary(id, o);
88  return id;
89 }
90 
91 
94  DictType::iterator i = myDict.find(id);
95  if (i == myDict.end()) {
96  return nullptr;
97  }
98  return (*i).second;
99 }
100 
101 
102 
103 int
105  return (int)myDict.size();
106 }
107 
108 
109 
110 std::string
112  if (myTLID == -1) {
113  return toString<int>(myID);
114  } else {
115  return toString<int>(myID) + "LSA " + toString<int>(myTLID);
116  }
117 }
118 
119 
120 void
122  if (myConnectors.size() == 0) {
123  return; // !!! Check, whether this can happen
124  }
125 
126  // compute the position
127  PositionVector crossings;
128  std::vector<int>::iterator i, j;
129  // check whether this is a split of an edge only
130  if (myAmEdgeSplit) {
131 // !!! should be assert(myTLID==-1);
132  for (i = myConnectors.begin(); i != myConnectors.end(); i++) {
135  }
136  } else {
137  // compute the places the connections cross
138  for (i = myConnectors.begin(); i != myConnectors.end(); i++) {
140  c1->buildGeom();
141  for (j = i + 1; j != myConnectors.end(); j++) {
143  c2->buildGeom();
144  if (c1->crossesEdge(c2)) {
145  crossings.push_back_noDoublePos(c1->crossesEdgeAtPoint(c2));
146  }
147  }
148  }
149  // alternative way: compute via positions of crossings
150  if (crossings.size() == 0) {
151  for (i = myConnectors.begin(); i != myConnectors.end(); i++) {
154  crossings.push_back_noDoublePos(c1->getToGeomPosition());
155  }
156  }
157  }
158  // get the position (center)
159  Position pos = crossings.getPolygonCenter();
160  // build the node
161  /* if(myTLID!=-1) {
162  !!! NIVissimTL *tl = NIVissimTL::dictionary(myTLID);
163  if(tl->getType()=="festzeit") {
164  node = new NBNode(getNodeName(), pos.x(), pos.y(),
165  "traffic_light");
166  } else {
167  node = new NBNode(getNodeName(), pos.x(), pos.y(),
168  "actuated_traffic_light");
169  }
170  }*/
171  NBNode* node = new NBNode(getNodeName(), pos, NODETYPE_PRIORITY);
172  if (!nc.insert(node)) {
173  delete node;
174  throw 1;
175  }
176  myNBNode = node;
177 }
178 
179 
180 void
182  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
183  (*i).second->buildNBNode(nc);
184  }
185 }
186 
187 
188 
189 void
191  return;
192 }
193 
194 
195 int
197  int ret = -1;
198  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
199  NIVissimNodeCluster* c = (*i).second;
200  for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {
202  if (conn != nullptr && conn->getToEdgeID() == edgeid) {
203 // return (*i).first;
204  if (ret != -1 && (*i).first != ret) {
205 // "NIVissimNodeCluster:DoubleNode:" << ret << endl;
206  throw 1; // an edge should not outgo from two different nodes
207 // but actually, a joined cluster may posess a connections more than once
208  }
209  ret = (*i).first;
210  }
211  }
212  }
213  return ret;
214 }
215 
216 
217 int
219  int ret = -1;
220  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
221  NIVissimNodeCluster* c = (*i).second;
222  for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {
224  if (conn != nullptr && conn->getFromEdgeID() == edgeid) {
225 // return (*i).first;
226  if (ret != -1 && ret != (*i).first) {
227 // << "NIVissimNodeCluster: multiple to-nodes" << endl;
228  throw 1; // an edge should not outgo from two different nodes
229 // but actually, a joined cluster may posess a connections more than once
230 
231  }
232  ret = (*i).first;
233  }
234  }
235  }
236  return ret;
237 }
238 
239 
240 void
241 NIVissimNodeCluster::_debugOut(std::ostream& into) {
242  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
243  NIVissimNodeCluster* c = (*i).second;
244  into << std::endl << c->myID << ":";
245  for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {
246  if (j != c->myConnectors.begin()) {
247  into << ", ";
248  }
249  into << (*j);
250  }
251  }
252  into << "=======================" << std::endl;
253 }
254 
255 
256 
257 NBNode*
259  return myNBNode;
260 }
261 
262 
263 Position
265  return myPosition;
266 }
267 
268 
269 void
271  NBNodeCont& nc, NBEdgeCont& ec) {
272  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
273  const std::vector<int>& disturbances = (*i).second->myDisturbances;
274  NBNode* node = nc.retrieve((*i).second->getNodeName());
275  for (std::vector<int>::const_iterator j = disturbances.begin(); j != disturbances.end(); j++) {
277  disturbance->addToNode(node, dc, nc, ec);
278  }
279  }
281 }
282 
283 
284 void
286  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
287  delete (*i).second;
288  }
289  myDict.clear();
290 }
291 
292 
293 void
295  myCurrentID = id;
296 }
297 
298 
299 
300 /****************************************************************************/
301 
NIVissimNodeCluster::getToNode
static int getToNode(int edgeid)
Definition: NIVissimNodeCluster.cpp:218
NIVissimAbstractEdge
Definition: NIVissimAbstractEdge.h:36
NODETYPE_PRIORITY
@ NODETYPE_PRIORITY
Definition: SUMOXMLDefinitions.h:1061
NIVissimDisturbance::reportRefused
static void reportRefused()
Definition: NIVissimDisturbance.cpp:347
ToString.h
PositionVector::getPolygonCenter
Position getPolygonCenter() const
Returns the arithmetic of all corner points.
Definition: PositionVector.cpp:400
NIVissimNodeCluster::myTLID
int myTLID
Definition: NIVissimNodeCluster.h:84
NBEdgeCont
Storage for edges, including some functionality operating on multiple edges.
Definition: NBEdgeCont.h:60
NIVissimNodeCluster::buildNBNodes
static void buildNBNodes(NBNodeCont &nc)
Definition: NIVissimNodeCluster.cpp:181
NIVissimNodeCluster::clearDict
static void clearDict()
Definition: NIVissimNodeCluster.cpp:285
NIVissimConnection::getToGeomPosition
Position getToGeomPosition() const
Definition: NIVissimConnection.cpp:187
NBNodeCont::insert
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
Definition: NBNodeCont.cpp:78
NIVissimAbstractEdge::buildGeom
virtual void buildGeom()=0
NIVissimDisturbance::dictionary
static bool dictionary(const std::string &name, const NIVissimExtendedEdgePoint &edge, const NIVissimExtendedEdgePoint &by)
Definition: NIVissimDisturbance.cpp:68
NIVissimNodeCluster::myPosition
Position myPosition
Definition: NIVissimNodeCluster.h:87
NIVissimNodeCluster::myNBNode
NBNode * myNBNode
Definition: NIVissimNodeCluster.h:91
NIVissimAbstractEdge::crossesEdge
bool crossesEdge(NIVissimAbstractEdge *c) const
Definition: NIVissimAbstractEdge.cpp:110
PositionVector
A list of positions.
Definition: PositionVector.h:45
NIVissimDisturbance::addToNode
bool addToNode(NBNode *node, NBDistrictCont &dc, NBNodeCont &nc, NBEdgeCont &ec)
Definition: NIVissimDisturbance.cpp:130
NBDistrictCont
A container for districts.
Definition: NBDistrictCont.h:52
NIVissimNodeCluster::dictionary
static bool dictionary(int id, NIVissimNodeCluster *o)
Definition: NIVissimNodeCluster.cpp:65
NIVissimConnection::getToEdgeID
int getToEdgeID() const
Definition: NIVissimConnection.cpp:162
NIVissimNodeCluster::dict_recheckEdgeChanges
static void dict_recheckEdgeChanges()
Definition: NIVissimNodeCluster.cpp:190
NBNodeCont
Container for nodes during the netbuilding process.
Definition: NBNodeCont.h:59
NIVissimAbstractEdge::crossesEdgeAtPoint
Position crossesEdgeAtPoint(NIVissimAbstractEdge *c) const
Definition: NIVissimAbstractEdge.cpp:116
NIVissimNodeCluster::_debugOut
static void _debugOut(std::ostream &into)
Definition: NIVissimNodeCluster.cpp:241
NIVissimConnection::getFromGeomPosition
Position getFromGeomPosition() const
Definition: NIVissimConnection.cpp:180
VectorHelper.h
NIVissimNodeCluster::myDict
static DictType myDict
Definition: NIVissimNodeCluster.h:89
NIVissimDisturbance.h
PositionVector::push_back_noDoublePos
void push_back_noDoublePos(const Position &p)
insert in back a non double position
Definition: PositionVector.cpp:1295
NIVissimNodeCluster::getNodeName
std::string getNodeName() const
Definition: NIVissimNodeCluster.cpp:111
NIVissimNodeCluster::myID
int myID
Definition: NIVissimNodeCluster.h:82
NIVissimNodeCluster::NIVissimNodeCluster
NIVissimNodeCluster(int id, int nodeid, int tlid, const std::vector< int > &connectors, const std::vector< int > &disturbances, bool amEdgeSplitOnly)
Definition: NIVissimNodeCluster.cpp:50
NIVissimConnection
Definition: NIVissimConnection.h:47
Position
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:38
NIVissimAbstractEdge::dictionary
static bool dictionary(int id, NIVissimAbstractEdge *e)
Definition: NIVissimAbstractEdge.cpp:58
NIVissimNodeCluster.h
NIVissimNodeCluster::buildNBNode
void buildNBNode(NBNodeCont &nc)
Definition: NIVissimNodeCluster.cpp:121
NIVissimNodeCluster::getPos
Position getPos() const
Definition: NIVissimNodeCluster.cpp:264
NBNodeCont::retrieve
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
Definition: NBNodeCont.cpp:107
NBNodeCont.h
NIVissimNodeCluster::myCurrentID
static int myCurrentID
Definition: NIVissimNodeCluster.h:90
NIVissimConnection.h
NIVissimTL.h
NIVissimNodeCluster::getNBNode
NBNode * getNBNode() const
Definition: NIVissimNodeCluster.cpp:258
NIVissimNodeCluster::myConnectors
std::vector< int > myConnectors
Definition: NIVissimNodeCluster.h:85
config.h
NIVissimConnection::dictionary
static bool dictionary(int id, NIVissimConnection *o)
Definition: NIVissimConnection.cpp:77
NIVissimNodeCluster::dict_addDisturbances
static void dict_addDisturbances(NBDistrictCont &dc, NBNodeCont &nc, NBEdgeCont &ec)
Definition: NIVissimNodeCluster.cpp:270
NIVissimNodeCluster::setCurrentVirtID
static void setCurrentVirtID(int id)
Definition: NIVissimNodeCluster.cpp:294
NIVissimNodeCluster::myAmEdgeSplit
bool myAmEdgeSplit
Definition: NIVissimNodeCluster.h:92
NIVissimNodeCluster::DictType
std::map< int, NIVissimNodeCluster * > DictType
Definition: NIVissimNodeCluster.h:88
NIVissimConnection::getFromEdgeID
int getFromEdgeID() const
Definition: NIVissimConnection.cpp:156
NIVissimDisturbance
Definition: NIVissimDisturbance.h:43
NBNode
Represents a single node (junction) during network building.
Definition: NBNode.h:67
NBNode.h
PositionVector.h
NIVissimNodeCluster::~NIVissimNodeCluster
~NIVissimNodeCluster()
Definition: NIVissimNodeCluster.cpp:59
NIVissimNodeCluster::contSize
static int contSize()
Definition: NIVissimNodeCluster.cpp:104
NIVissimNodeCluster
Definition: NIVissimNodeCluster.h:45
NIVissimNodeCluster::getFromNode
static int getFromNode(int edgeid)
Definition: NIVissimNodeCluster.cpp:196