Path: blob/main/src/netimport/vissim/tempstructs/NIVissimNodeCluster.cpp
169684 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file NIVissimNodeCluster.cpp14/// @author Daniel Krajzewicz15/// @author Jakob Erdmann16/// @author Michael Behrisch17/// @date Sept 200218///19// -------------------20/****************************************************************************/21#include <config.h>222324#include <map>25#include <algorithm>26#include <cassert>27#include <utils/common/VectorHelper.h>28#include <utils/common/ToString.h>29#include <utils/geom/PositionVector.h>30#include <netbuild/NBNode.h>31#include <netbuild/NBNodeCont.h>32#include "NIVissimTL.h"33#include "NIVissimDisturbance.h"34#include "NIVissimConnection.h"35#include "NIVissimNodeCluster.h"363738// ===========================================================================39// static member variables40// ===========================================================================41NIVissimNodeCluster::DictType NIVissimNodeCluster::myDict;42int NIVissimNodeCluster::myCurrentID = 1;434445// ===========================================================================46// method definitions47// ===========================================================================48NIVissimNodeCluster::NIVissimNodeCluster(int id, int nodeid, int tlid,49const std::vector<int>& connectors,50const std::vector<int>& disturbances,51bool amEdgeSplitOnly)52: myID(id), myNodeID(nodeid), myTLID(tlid),53myConnectors(connectors), myDisturbances(disturbances),54myNBNode(nullptr), myAmEdgeSplit(amEdgeSplitOnly) {}555657NIVissimNodeCluster::~NIVissimNodeCluster() {}5859606162bool63NIVissimNodeCluster::dictionary(int id, NIVissimNodeCluster* o) {64DictType::iterator i = myDict.find(id);65if (i == myDict.end()) {66myDict[id] = o;67return true;68}69assert(false);70return false;71}727374int75NIVissimNodeCluster::dictionary(int nodeid, int tlid,76const std::vector<int>& connectors,77const std::vector<int>& disturbances,78bool amEdgeSplitOnly) {79int id = nodeid;80if (nodeid < 0) {81id = myCurrentID++;82}83NIVissimNodeCluster* o = new NIVissimNodeCluster(id,84nodeid, tlid, connectors, disturbances, amEdgeSplitOnly);85dictionary(id, o);86return id;87}888990NIVissimNodeCluster*91NIVissimNodeCluster::dictionary(int id) {92DictType::iterator i = myDict.find(id);93if (i == myDict.end()) {94return nullptr;95}96return (*i).second;97}9899100101int102NIVissimNodeCluster::contSize() {103return (int)myDict.size();104}105106107108std::string109NIVissimNodeCluster::getNodeName() const {110if (myTLID == -1) {111return toString<int>(myID);112} else {113return toString<int>(myID) + "LSA " + toString<int>(myTLID);114}115}116117118void119NIVissimNodeCluster::buildNBNode(NBNodeCont& nc) {120if (myConnectors.size() == 0) {121return; // !!! Check, whether this can happen122}123124// compute the position125PositionVector crossings;126std::vector<int>::iterator i, j;127// check whether this is a split of an edge only128if (myAmEdgeSplit) {129// !!! should be assert(myTLID==-1);130for (i = myConnectors.begin(); i != myConnectors.end(); i++) {131NIVissimConnection* c1 = NIVissimConnection::dictionary(*i);132crossings.push_back_noDoublePos(c1->getFromGeomPosition());133}134} else {135// compute the places the connections cross136for (i = myConnectors.begin(); i != myConnectors.end(); i++) {137NIVissimAbstractEdge* c1 = NIVissimAbstractEdge::dictionary(*i);138c1->buildGeom();139for (j = i + 1; j != myConnectors.end(); j++) {140NIVissimAbstractEdge* c2 = NIVissimAbstractEdge::dictionary(*j);141c2->buildGeom();142if (c1->crossesEdge(c2)) {143crossings.push_back_noDoublePos(c1->crossesEdgeAtPoint(c2));144}145}146}147// alternative way: compute via positions of crossings148if (crossings.size() == 0) {149for (i = myConnectors.begin(); i != myConnectors.end(); i++) {150NIVissimConnection* c1 = NIVissimConnection::dictionary(*i);151crossings.push_back_noDoublePos(c1->getFromGeomPosition());152crossings.push_back_noDoublePos(c1->getToGeomPosition());153}154}155}156// get the position (center)157Position pos = crossings.getPolygonCenter();158// build the node159/* if(myTLID!=-1) {160!!! NIVissimTL *tl = NIVissimTL::dictionary(myTLID);161if(tl->getType()=="festzeit") {162node = new NBNode(getNodeName(), pos.x(), pos.y(),163"traffic_light");164} else {165node = new NBNode(getNodeName(), pos.x(), pos.y(),166"actuated_traffic_light");167}168}*/169NBNode* node = new NBNode(getNodeName(), pos, SumoXMLNodeType::PRIORITY);170if (!nc.insert(node)) {171delete node;172throw 1;173}174myNBNode = node;175}176177178void179NIVissimNodeCluster::buildNBNodes(NBNodeCont& nc) {180for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {181(*i).second->buildNBNode(nc);182}183}184185186187void188NIVissimNodeCluster::dict_recheckEdgeChanges() {189return;190}191192193int194NIVissimNodeCluster::getFromNode(int edgeid) {195int ret = -1;196for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {197NIVissimNodeCluster* c = (*i).second;198for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {199NIVissimConnection* conn = NIVissimConnection::dictionary(*j);200if (conn != nullptr && conn->getToEdgeID() == edgeid) {201// return (*i).first;202if (ret != -1 && (*i).first != ret) {203// "NIVissimNodeCluster:DoubleNode:" << ret << endl;204throw 1; // an edge should not outgo from two different nodes205// but actually, a joined cluster may posess a connections more than once206}207ret = (*i).first;208}209}210}211return ret;212}213214215int216NIVissimNodeCluster::getToNode(int edgeid) {217int ret = -1;218for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {219NIVissimNodeCluster* c = (*i).second;220for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {221NIVissimConnection* conn = NIVissimConnection::dictionary(*j);222if (conn != nullptr && conn->getFromEdgeID() == edgeid) {223// return (*i).first;224if (ret != -1 && ret != (*i).first) {225// << "NIVissimNodeCluster: multiple to-nodes" << endl;226throw 1; // an edge should not outgo from two different nodes227// but actually, a joined cluster may posess a connections more than once228229}230ret = (*i).first;231}232}233}234return ret;235}236237238void239NIVissimNodeCluster::_debugOut(std::ostream& into) {240for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {241NIVissimNodeCluster* c = (*i).second;242into << std::endl << c->myID << ":";243for (std::vector<int>::iterator j = c->myConnectors.begin(); j != c->myConnectors.end(); j++) {244if (j != c->myConnectors.begin()) {245into << ", ";246}247into << (*j);248}249}250into << "=======================" << std::endl;251}252253254255NBNode*256NIVissimNodeCluster::getNBNode() const {257return myNBNode;258}259260261Position262NIVissimNodeCluster::getPos() const {263return myPosition;264}265266267void268NIVissimNodeCluster::dict_addDisturbances(NBDistrictCont& dc,269NBNodeCont& nc, NBEdgeCont& ec) {270for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {271const std::vector<int>& disturbances = (*i).second->myDisturbances;272NBNode* node = nc.retrieve((*i).second->getNodeName());273for (std::vector<int>::const_iterator j = disturbances.begin(); j != disturbances.end(); j++) {274NIVissimDisturbance* disturbance = NIVissimDisturbance::dictionary(*j);275disturbance->addToNode(node, dc, nc, ec);276}277}278NIVissimDisturbance::reportRefused();279}280281282void283NIVissimNodeCluster::clearDict() {284for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {285delete (*i).second;286}287myDict.clear();288}289290291void292NIVissimNodeCluster::setCurrentVirtID(int id) {293myCurrentID = id;294}295296297/****************************************************************************/298299300