Path: blob/main/src/netimport/vissim/tempstructs/NIVissimAbstractEdge.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 NIVissimAbstractEdge.cpp14/// @author Daniel Krajzewicz15/// @author Jakob Erdmann16/// @author Michael Behrisch17/// @date Sept 200218///19// -------------------20/****************************************************************************/21#include <config.h>222324#include <map>25#include <cassert>26#include <utils/common/MsgHandler.h>27#include <utils/common/ToString.h>28#include <utils/geom/GeomHelper.h>29#include <utils/geom/GeoConvHelper.h>30#include <netbuild/NBNetBuilder.h>31#include "NIVissimAbstractEdge.h"323334NIVissimAbstractEdge::DictType NIVissimAbstractEdge::myDict;3536NIVissimAbstractEdge::NIVissimAbstractEdge(int id,37const PositionVector& geom)38: myID(id), myNode(-1) {39// convert/publicate geometry40for (PositionVector::const_iterator i = geom.begin(); i != geom.end(); ++i) {41Position p = *i;42if (!NBNetBuilder::transformCoordinate(p)) {43WRITE_WARNINGF(TL("Unable to project coordinates for edge '%'."), toString(id));44}45myGeom.push_back_noDoublePos(p);46}47//48dictionary(id, this);49}505152NIVissimAbstractEdge::~NIVissimAbstractEdge() {}535455bool56NIVissimAbstractEdge::dictionary(int id, NIVissimAbstractEdge* e) {57DictType::iterator i = myDict.find(id);58if (i == myDict.end()) {59myDict[id] = e;60return true;61}62return false;63}646566NIVissimAbstractEdge*67NIVissimAbstractEdge::dictionary(int id) {68DictType::iterator i = myDict.find(id);69if (i == myDict.end()) {70return nullptr;71}72return (*i).second;73}74757677Position78NIVissimAbstractEdge::getGeomPosition(double pos) const {79if (myGeom.length() > pos) {80return myGeom.positionAtOffset(pos);81} else if (myGeom.length() == pos) {82return myGeom[-1];83} else {84PositionVector g(myGeom);85const double amount = pos - myGeom.length();86g.extrapolate(amount * 2);87return g.positionAtOffset(pos + amount * 2);88}89}909192void93NIVissimAbstractEdge::splitAndAssignToNodes() {94for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {95NIVissimAbstractEdge* e = (*i).second;96e->splitAssigning();97}98}99100void101NIVissimAbstractEdge::splitAssigning() {}102103104105106107bool108NIVissimAbstractEdge::crossesEdge(NIVissimAbstractEdge* c) const {109return myGeom.intersects(c->myGeom);110}111112113Position114NIVissimAbstractEdge::crossesEdgeAtPoint(NIVissimAbstractEdge* c) const {115return myGeom.intersectionPosition2D(c->myGeom);116}117118119std::vector<int>120NIVissimAbstractEdge::getWithin(const AbstractPoly& p, double offset) {121std::vector<int> ret;122for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {123NIVissimAbstractEdge* e = (*i).second;124if (e->overlapsWith(p, offset)) {125ret.push_back(e->myID);126}127}128return ret;129}130131132bool133NIVissimAbstractEdge::overlapsWith(const AbstractPoly& p, double offset) const {134return myGeom.overlapsWith(p, offset);135}136137138bool139NIVissimAbstractEdge::hasNodeCluster() const {140return myNode != -1;141}142143144int145NIVissimAbstractEdge::getID() const {146return myID;147}148149void150NIVissimAbstractEdge::clearDict() {151for (DictType::iterator i = myDict.begin(); i != myDict.end(); i++) {152delete (*i).second;153}154myDict.clear();155}156157158const PositionVector&159NIVissimAbstractEdge::getGeometry() const {160return myGeom;161}162163164void165NIVissimAbstractEdge::addDisturbance(int disturbance) {166myDisturbances.push_back(disturbance);167}168169170const std::vector<int>&171NIVissimAbstractEdge::getDisturbances() const {172return myDisturbances;173}174175176/****************************************************************************/177178179