Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/changes/GNEChange_Lane.cpp
169678 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 GNEChange_Lane.cpp
15
/// @author Jakob Erdmann
16
/// @date April 2011
17
///
18
// A network change in which a single lane is created or deleted
19
/****************************************************************************/
20
21
#include <netedit/GNENet.h>
22
#include <netedit/GNEViewNet.h>
23
#include <netedit/GNEViewParent.h>
24
#include <netedit/GNEApplicationWindow.h>
25
26
#include "GNEChange_Lane.h"
27
28
// ===========================================================================
29
// FOX-declarations
30
// ===========================================================================
31
32
FXIMPLEMENT_ABSTRACT(GNEChange_Lane, GNEChange, nullptr, 0)
33
34
// ===========================================================================
35
// member method definitions
36
// ===========================================================================
37
38
GNEChange_Lane::GNEChange_Lane(GNEEdge* edge, const NBEdge::Lane& laneAttrs):
39
GNEChange(Supermode::NETWORK, true, false),
40
myEdge(edge),
41
myLane(nullptr),
42
myLaneAttrs(laneAttrs),
43
myRecomputeConnections(true) {
44
myEdge->incRef("GNEChange_Lane");
45
}
46
47
48
GNEChange_Lane::GNEChange_Lane(GNEEdge* edge, GNELane* lane, const NBEdge::Lane& laneAttrs, bool forward, bool recomputeConnections):
49
GNEChange(Supermode::NETWORK, lane, forward, lane->isAttributeCarrierSelected()),
50
myEdge(edge),
51
myLane(lane),
52
myLaneAttrs(laneAttrs),
53
myRecomputeConnections(recomputeConnections) {
54
// include both references (To edge and lane)
55
myEdge->incRef("GNEChange_Lane");
56
myLane->incRef("GNEChange_Lane");
57
}
58
59
60
GNEChange_Lane::~GNEChange_Lane() {
61
// only continue we have undo-redo mode enabled
62
if (myEdge->getNet()->getViewNet()->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed()) {
63
myEdge->decRef("GNEChange_Lane");
64
if (myEdge->unreferenced()) {
65
delete myEdge;
66
}
67
if (myLane) {
68
myLane->decRef("GNEChange_Lane");
69
if (myLane->unreferenced()) {
70
// delete lane
71
delete myLane;
72
}
73
}
74
}
75
}
76
77
78
void
79
GNEChange_Lane::undo() {
80
if (myForward) {
81
// remove lane from edge (note: myLane can be nullptr)
82
myEdge->removeLane(myLane, false);
83
// special case if lane exist
84
if (myLane && mySelectedElement) {
85
myLane->unselectAttributeCarrier();
86
}
87
} else {
88
// show extra information for tests
89
if (myLane && mySelectedElement) {
90
myLane->selectAttributeCarrier();
91
}
92
// add lane and their attributes to edge (lane removal is reverted, no need to recompute connections)
93
myEdge->addLane(myLane, myLaneAttrs, false);
94
}
95
// enable save networkElements
96
myEdge->getNet()->getSavingStatus()->requireSaveNetwork();
97
}
98
99
100
void
101
GNEChange_Lane::redo() {
102
if (myForward) {
103
// show extra information for tests
104
if (myLane && mySelectedElement) {
105
myLane->selectAttributeCarrier();
106
}
107
// add lane and their attributes to edge
108
myEdge->addLane(myLane, myLaneAttrs, myRecomputeConnections);
109
} else {
110
// special case if lane exist
111
if (myLane && mySelectedElement) {
112
myLane->unselectAttributeCarrier();
113
}
114
// remove lane from edge
115
myEdge->removeLane(myLane, myRecomputeConnections);
116
}
117
// enable save networkElements
118
myEdge->getNet()->getSavingStatus()->requireSaveNetwork();
119
}
120
121
122
std::string
123
GNEChange_Lane::undoName() const {
124
if (myForward) {
125
return (TL("Undo create lane '") + myLane->getID() + "'");
126
} else {
127
return (TL("Undo delete lane '") + myLane->getID() + "'");
128
}
129
}
130
131
132
std::string
133
GNEChange_Lane::redoName() const {
134
if (myForward) {
135
return (TL("Redo create lane '") + myLane->getID() + "'");
136
} else {
137
return (TL("Redo delete lane '") + myLane->getID() + "'");
138
}
139
}
140
141