Eclipse SUMO - Simulation of Urban MObility
NIVissimConnection.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 /****************************************************************************/
18 // -------------------
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <string>
28 #include <map>
29 #include <iostream>
30 #include <cassert>
33 #include <utils/common/ToString.h>
36 #include <utils/geom/Boundary.h>
37 #include <utils/geom/GeomHelper.h>
38 #include <netbuild/NBEdge.h>
39 #include <netbuild/NBNode.h>
40 #include <netbuild/NBEdgeCont.h>
41 #include "NIVissimEdge.h"
43 #include "NIVissimNodeDef.h"
44 #include "NIVissimConnection.h"
46 
47 
48 // ===========================================================================
49 // static members
50 // ===========================================================================
53 
54 
55 // ===========================================================================
56 // method definitions
57 // ===========================================================================
59  const std::string& name, const NIVissimExtendedEdgePoint& from_def,
60  const NIVissimExtendedEdgePoint& to_def,
61  const PositionVector& geom,
62  const std::vector<int>& assignedVehicles, const NIVissimClosedLanesVector& clv)
63  : NIVissimAbstractEdge(id, geom),
64  myName(name), myFromDef(from_def), myToDef(to_def),
65  myAssignedVehicles(assignedVehicles), myClosedLanes(clv) {}
66 
67 
69  for (NIVissimClosedLanesVector::iterator i = myClosedLanes.begin(); i != myClosedLanes.end(); i++) {
70  delete (*i);
71  }
72  myClosedLanes.clear();
73 }
74 
75 
76 bool
78  DictType::iterator i = myDict.find(id);
79  if (i == myDict.end()) {
80  myDict[id] = o;
81  return true;
82  }
83  return false;
84 }
85 
86 
87 
90  DictType::iterator i = myDict.find(id);
91  if (i == myDict.end()) {
92  return nullptr;
93  }
94  return (*i).second;
95 }
96 
97 
98 void
100  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
101  NIVissimConnection* e = (*i).second;
102  if (!e->clustered()) {
103  assert(e->myBoundary != 0 && e->myBoundary->xmax() > e->myBoundary->xmin());
104  std::vector<int> connections =
106  NIVissimNodeCluster::dictionary(-1, -1, connections,
107  std::vector<int>(), true); // 19.5.!!! should be on a single edge
108  }
109  }
110 }
111 
112 
113 
114 
115 
116 std::vector<int>
118  std::vector<int> ret;
119  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
120  if ((*i).second->crosses(poly)) {
121  ret.push_back((*i).second->myID);
122  }
123  }
124  return ret;
125 }
126 
127 
128 void
130  Boundary* bound = new Boundary();
131  bound->add(myFromDef.getGeomPosition());
132  bound->add(myToDef.getGeomPosition());
133  assert(myBoundary == 0);
134  myBoundary = bound;
135 }
136 
137 
138 std::vector<int>
139 NIVissimConnection::getForEdge(int edgeid, bool /*omitNodeAssigned*/) {
140  std::vector<int> ret;
141  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
142  int connID = (*i).first;
143  if ((*i).second->myFromDef.getEdgeID() == edgeid
144  ||
145  (*i).second->myToDef.getEdgeID() == edgeid) {
146  if (!(*i).second->hasNodeCluster()) {
147  ret.push_back(connID);
148  }
149  }
150  }
151  return ret;
152 }
153 
154 
155 int
157  return myFromDef.getEdgeID();
158 }
159 
160 
161 int
163  return myToDef.getEdgeID();
164 }
165 
166 
167 double
169  return myFromDef.getPosition();
170 }
171 
172 
173 double
175  return myToDef.getPosition();
176 }
177 
178 
179 Position
181  return myFromDef.getGeomPosition();
182 }
183 
184 
185 
186 Position
188  return myToDef.getGeomPosition();
189 }
190 
191 
192 void
194  assert(myNode == -1);
195  myNode = nodeid;
196 }
197 
198 
199 void
201  if (myGeom.size() > 0) {
202  return;
203  }
204  myGeom.push_back(myFromDef.getGeomPosition());
205  myGeom.push_back(myToDef.getGeomPosition());
206 }
207 
208 
209 int
211  int unsetConnections = 0;
212  // try to determine the connected edges
213  NBEdge* fromEdge = nullptr;
214  NBEdge* toEdge = nullptr;
216  if (vissimFrom->wasWithinAJunction()) {
217  // this edge was not built, try to get one that approaches it
218  vissimFrom = vissimFrom->getBestIncoming();
219  if (vissimFrom != nullptr) {
220  fromEdge = ec.retrievePossiblySplit(toString(vissimFrom->getID()), toString(getFromEdgeID()), true);
221  }
222  } else {
223  // this edge was built, try to get the proper part
225  }
227  if (vissimTo->wasWithinAJunction()) {
228  vissimTo = vissimTo->getBestOutgoing();
229  if (vissimTo != nullptr) {
230  toEdge = ec.retrievePossiblySplit(toString(vissimTo->getID()), toString(getToEdgeID()), true);
231  }
232  } else {
234  }
235 
236  // try to get the edges the current connection connects
237  /*
238  NBEdge *fromEdge = ec.retrievePossiblySplit(toString(getFromEdgeID()), toString(getToEdgeID()), true);
239  NBEdge *toEdge = ec.retrievePossiblySplit(toString(getToEdgeID()), toString(getFromEdgeID()), false);
240  */
241  if (fromEdge == nullptr || toEdge == nullptr) {
242  WRITE_WARNING("Could not build connection between '" + toString(getFromEdgeID()) + "' and '" + toString(getToEdgeID()) + "'.");
243  return 1; // !!! actually not 1
244  }
245  recheckLanes(fromEdge, toEdge);
246  const std::vector<int>& fromLanes = getFromLanes();
247  const std::vector<int>& toLanes = getToLanes();
248  if (fromLanes.size() != toLanes.size()) {
249  WRITE_WARNING("Lane sizes differ for connection '" + toString(getID()) + "'.");
250  } else {
251  for (int index = 0; index < (int)fromLanes.size(); ++index) {
252  if (fromEdge->getNumLanes() <= fromLanes[index]) {
253  WRITE_WARNING("Could not set connection between '" + fromEdge->getID() + "_" + toString(fromLanes[index]) + "' and '" + toEdge->getID() + "_" + toString(toLanes[index]) + "'.");
254  ++unsetConnections;
255  } else if (!fromEdge->addLane2LaneConnection(fromLanes[index], toEdge, toLanes[index], NBEdge::L2L_VALIDATED, true)) {
256  WRITE_WARNING("Could not set connection between '" + fromEdge->getID() + "_" + toString(fromLanes[index]) + "' and '" + toEdge->getID() + "_" + toString(toLanes[index]) + "'.");
257  ++unsetConnections;
258  }
259  }
260  }
261  return unsetConnections;
262 }
263 
264 
265 void
267  int unsetConnections = 0;
268  // go through connections
269  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
270  unsetConnections += (*i).second->buildEdgeConnections(ec);
271  }
272  if (unsetConnections != 0) {
273  WRITE_WARNING(toString<int>(unsetConnections) + " of " + toString<int>((int)myDict.size()) + " connections could not be assigned.");
274  }
275 }
276 
277 
278 const std::vector<int>&
280  return myFromDef.getLanes();
281 }
282 
283 
284 const std::vector<int>&
286  return myToDef.getLanes();
287 }
288 
289 
290 void
291 NIVissimConnection::recheckLanes(const NBEdge* const fromEdge, const NBEdge* const toEdge) {
292  myFromDef.recheckLanes(fromEdge);
293  myToDef.recheckLanes(toEdge);
294 }
295 
296 
297 const Boundary&
299  assert(myBoundary != 0 && myBoundary->xmax() >= myBoundary->xmin());
300  return *myBoundary;
301 }
302 
303 
304 void
306  for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {
307  NIVissimConnection* c = (*i).second;
308  NIVissimEdge::dictionary(c->getFromEdgeID())->addOutgoingConnection((*i).first);
309  NIVissimEdge::dictionary(c->getToEdgeID())->addIncomingConnection((*i).first);
310  }
311 }
312 
313 
314 int
316  return myMaxID;
317 }
318 
319 
320 /****************************************************************************/
321 
322 
NIVissimAbstractEdge
Definition: NIVissimAbstractEdge.h:36
AbstractPoly
Definition: AbstractPoly.h:35
Boundary.h
NIVissimConnection::dict_assignToEdges
static void dict_assignToEdges()
Definition: NIVissimConnection.cpp:305
ToString.h
NIVissimClosedLanesVector
std::vector< NIVissimClosedLaneDef * > NIVissimClosedLanesVector
Definition: NIVissimClosedLanesVector.h:29
NIVissimConnection::buildEdgeConnections
int buildEdgeConnections(NBEdgeCont &ec)
Definition: NIVissimConnection.cpp:210
NIVissimConnection::setNodeCluster
void setNodeCluster(int nodeid)
Definition: NIVissimConnection.cpp:193
WRITE_WARNING
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:275
NIVissimEdge.h
NBEdgeCont
Storage for edges, including some functionality operating on multiple edges.
Definition: NBEdgeCont.h:60
NIVissimConnection::getBoundingBox
const Boundary & getBoundingBox() const
Definition: NIVissimConnection.cpp:298
NIVissimEdge
A temporary storage for edges imported from Vissim.
Definition: NIVissimEdge.h:52
NIVissimEdge::wasWithinAJunction
bool wasWithinAJunction() const
Returns whether this edge was found to be within a junction.
Definition: NIVissimEdge.h:106
NIVissimConnection::getToPosition
double getToPosition() const
Definition: NIVissimConnection.cpp:174
NIVissimExtendedEdgePoint::getLanes
const std::vector< int > & getLanes() const
Definition: NIVissimExtendedEdgePoint.cpp:63
NIVissimConnection::recheckLanes
void recheckLanes(const NBEdge *const fromEdge, const NBEdge *const toEdge)
Resets lane numbers if all lanes shall be used.
Definition: NIVissimConnection.cpp:291
NIVissimConnection::getToGeomPosition
Position getToGeomPosition() const
Definition: NIVissimConnection.cpp:187
MsgHandler.h
NIVissimConnection::buildGeom
void buildGeom()
Definition: NIVissimConnection.cpp:200
NBEdgeCont.h
Boundary::xmax
double xmax() const
Returns maximum x-coordinate.
Definition: Boundary.cpp:124
PositionVector
A list of positions.
Definition: PositionVector.h:45
NIVissimAbstractEdge::getID
int getID() const
Definition: NIVissimAbstractEdge.cpp:147
NIVissimNodeCluster::dictionary
static bool dictionary(int id, NIVissimNodeCluster *o)
Definition: NIVissimNodeCluster.cpp:65
NIVissimConnection::getToEdgeID
int getToEdgeID() const
Definition: NIVissimConnection.cpp:162
NIVissimConnection::getForEdge
static std::vector< int > getForEdge(int edgeid, bool omitNodeAssigned=true)
Definition: NIVissimConnection.cpp:139
NIVissimExtendedEdgePoint::getEdgeID
int getEdgeID() const
Definition: NIVissimExtendedEdgePoint.cpp:44
NIVissimConnection::myToDef
NIVissimExtendedEdgePoint myToDef
Definition: NIVissimConnection.h:104
NBEdge
The representation of a single edge during network building.
Definition: NBEdge.h:91
NIVissimEdge::dictionary
static bool dictionary(int id, const std::string &name, const std::string &type, int noLanes, double zuschlag1, double zuschlag2, double length, const PositionVector &geom, const NIVissimClosedLanesVector &clv)
Adds the described item to the dictionary Builds the edge first.
Definition: NIVissimEdge.cpp:138
NIVissimConnection::getFromGeomPosition
Position getFromGeomPosition() const
Definition: NIVissimConnection.cpp:180
VectorHelper.h
NIVissimConnection::NIVissimConnection
NIVissimConnection(int id, const std::string &name, const NIVissimExtendedEdgePoint &from_def, const NIVissimExtendedEdgePoint &to_def, const PositionVector &geom, const std::vector< int > &assignedVehicles, const NIVissimClosedLanesVector &clv)
Definition: NIVissimConnection.cpp:58
NIVissimExtendedEdgePoint
Definition: NIVissimExtendedEdgePoint.h:42
Boundary::xmin
double xmin() const
Returns minimum x-coordinate.
Definition: Boundary.cpp:118
NIVissimNodeDef.h
Boundary
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:41
NIVissimConnection::myDict
static DictType myDict
Definition: NIVissimConnection.h:109
NIVissimConnection
Definition: NIVissimConnection.h:45
NBEdge::getNumLanes
int getNumLanes() const
Returns the number of lanes.
Definition: NBEdge.h:477
NBEdgeCont::retrievePossiblySplit
NBEdge * retrievePossiblySplit(const std::string &id, bool downstream) const
Tries to retrieve an edge, even if it is splitted.
Definition: NBEdgeCont.cpp:282
NIVissimConnection::~NIVissimConnection
virtual ~NIVissimConnection()
Definition: NIVissimConnection.cpp:68
Position
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:38
Boundary::add
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:78
NIVissimConnection::getFromPosition
double getFromPosition() const
Definition: NIVissimConnection.cpp:168
UtilExceptions.h
NIVissimAbstractEdge::myNode
int myNode
Definition: NIVissimAbstractEdge.h:68
NIVissimConnection::myMaxID
static int myMaxID
Definition: NIVissimConnection.h:110
NIVissimEdge::getBestIncoming
NIVissimEdge * getBestIncoming() const
Definition: NIVissimEdge.cpp:991
NIVissimBoundedClusterObject::clustered
bool clustered() const
Definition: NIVissimBoundedClusterObject.cpp:56
NIVissimConnection::computeBounding
void computeBounding()
Definition: NIVissimConnection.cpp:129
NIVissimExtendedEdgePoint::recheckLanes
void recheckLanes(const NBEdge *const edge)
Resets lane numbers if all lanes shall be used.
Definition: NIVissimExtendedEdgePoint.cpp:69
NBEdge::L2L_VALIDATED
@ L2L_VALIDATED
The connection was computed and validated.
Definition: NBEdge.h:135
NIVissimConnection::dict_buildNBEdgeConnections
static void dict_buildNBEdgeConnections(NBEdgeCont &ec)
Definition: NIVissimConnection.cpp:266
NIVissimEdge::getBestOutgoing
NIVissimEdge * getBestOutgoing() const
Definition: NIVissimEdge.cpp:1008
NIVissimClosedLanesVector.h
NIVissimConnection::getMaxID
static int getMaxID()
Definition: NIVissimConnection.cpp:315
NIVissimConnection::myClosedLanes
NIVissimClosedLanesVector myClosedLanes
Definition: NIVissimConnection.h:106
toString
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:47
NIVissimConnection.h
NIVissimBoundedClusterObject::myBoundary
Boundary * myBoundary
Definition: NIVissimBoundedClusterObject.h:54
NIVissimExtendedEdgePoint.h
NIVissimConnection::getToLanes
const std::vector< int > & getToLanes() const
Definition: NIVissimConnection.cpp:285
NIVissimConnection::DictType
std::map< int, NIVissimConnection * > DictType
Definition: NIVissimConnection.h:108
NIVissimConnection::getWithin
static std::vector< int > getWithin(const AbstractPoly &poly)
Definition: NIVissimConnection.cpp:117
NIVissimConnection::getFromLanes
const std::vector< int > & getFromLanes() const
Definition: NIVissimConnection.cpp:279
NIVissimExtendedEdgePoint::getGeomPosition
Position getGeomPosition() const
Definition: NIVissimExtendedEdgePoint.cpp:56
NIVissimConnection::myFromDef
NIVissimExtendedEdgePoint myFromDef
Definition: NIVissimConnection.h:104
config.h
NIVissimConnection::dictionary
static bool dictionary(int id, NIVissimConnection *o)
Definition: NIVissimConnection.cpp:77
GeomHelper.h
NIVissimConnection::getFromEdgeID
int getFromEdgeID() const
Definition: NIVissimConnection.cpp:156
NIVissimConnection::buildNodeClusters
static void buildNodeClusters()
Definition: NIVissimConnection.cpp:99
NBNode.h
NIVissimAbstractEdge::myGeom
PositionVector myGeom
Definition: NIVissimAbstractEdge.h:66
NIVissimExtendedEdgePoint::getPosition
double getPosition() const
Definition: NIVissimExtendedEdgePoint.cpp:50
PositionVector.h
NBEdge::addLane2LaneConnection
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, bool keepClear=true, double contPos=UNSPECIFIED_CONTPOS, double visibility=UNSPECIFIED_VISIBILITY_DISTANCE, double speed=UNSPECIFIED_SPEED, const PositionVector &customShape=PositionVector::EMPTY, const bool uncontrolled=UNSPECIFIED_CONNECTION_UNCONTROLLED, SVCPermissions=SVC_UNSPECIFIED)
Adds a connection between the specified this edge's lane and an approached one.
Definition: NBEdge.cpp:984
NBEdge.h
NBEdge::getID
const std::string & getID() const
Definition: NBEdge.h:1380