Eclipse SUMO - Simulation of Urban MObility
GNEChange_Additional.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 /****************************************************************************/
15 // A network change in which a busStop is created or deleted
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <netedit/GNENet.h>
29 #include <netedit/GNEViewNet.h>
30 
31 #include "GNEChange_Additional.h"
32 
33 // ===========================================================================
34 // FOX-declarations
35 // ===========================================================================
36 FXIMPLEMENT_ABSTRACT(GNEChange_Additional, GNEChange, nullptr, 0)
37 
38 // ===========================================================================
39 // member method definitions
40 // ===========================================================================
41 
43  GNEChange(additional->getViewNet()->getNet(), forward),
44  myAdditional(additional),
45  myEdgeParents(myAdditional->getEdgeParents()),
46  myLaneParents(myAdditional->getLaneParents()),
47  myShapeParents(myAdditional->getShapeParents()),
48  myAdditionalParents(myAdditional->getAdditionalParents()),
49  myDemandElementParents(myAdditional->getDemandElementParents()),
50  myEdgeChildren(myAdditional->getEdgeChildren()),
51  myLaneChildren(myAdditional->getLaneChildren()),
52  myShapeChildren(myAdditional->getShapeChildren()),
53  myAdditionalChildren(myAdditional->getAdditionalChildren()),
54  myDemandElementChildren(myAdditional->getDemandElementChildren()) {
55  myAdditional->incRef("GNEChange_Additional");
56 }
57 
58 
60  assert(myAdditional);
61  myAdditional->decRef("GNEChange_Additional");
62  if (myAdditional->unreferenced()) {
63  // show extra information for tests
64  WRITE_DEBUG("Deleting unreferenced " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "'");
65  // make sure that additional isn't in net before removing
68  // Remove additional from parent elements
69  for (const auto& i : myEdgeParents) {
70  i->removeAdditionalChild(myAdditional);
71  }
72  for (const auto& i : myLaneParents) {
73  i->removeAdditionalChild(myAdditional);
74  }
75  for (const auto& i : myShapeParents) {
76  i->removeAdditionalChild(myAdditional);
77  }
78  for (const auto& i : myAdditionalParents) {
79  i->removeAdditionalChild(myAdditional);
80  }
81  for (const auto& i : myDemandElementParents) {
82  i->removeAdditionalChild(myAdditional);
83  }
84  // Remove additional from child elements
85  for (const auto& i : myEdgeChildren) {
86  i->removeAdditionalParent(myAdditional);
87  }
88  for (const auto& i : myLaneChildren) {
89  i->removeAdditionalParent(myAdditional);
90  }
91  for (const auto& i : myShapeChildren) {
92  i->removeAdditionalChild(myAdditional);
93  }
94  for (const auto& i : myAdditionalChildren) {
95  i->removeAdditionalParent(myAdditional);
96  }
97  for (const auto& i : myDemandElementChildren) {
98  i->removeAdditionalParent(myAdditional);
99  }
100  }
101  delete myAdditional;
102  }
103 }
104 
105 
106 void
108  if (myForward) {
109  // show extra information for tests
110  WRITE_DEBUG("Removing " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
111  // delete additional from net
113  // Remove additional from parent elements
114  for (const auto& i : myEdgeParents) {
115  i->removeAdditionalChild(myAdditional);
116  }
117  for (const auto& i : myLaneParents) {
118  i->removeAdditionalChild(myAdditional);
119  }
120  for (const auto& i : myShapeParents) {
121  i->removeAdditionalChild(myAdditional);
122  }
123  for (const auto& i : myAdditionalParents) {
124  i->removeAdditionalChild(myAdditional);
125  }
126  for (const auto& i : myDemandElementParents) {
127  i->removeAdditionalChild(myAdditional);
128  }
129  // Remove additional from child elements
130  for (const auto& i : myEdgeChildren) {
131  i->removeAdditionalParent(myAdditional);
132  }
133  for (const auto& i : myLaneChildren) {
134  i->removeAdditionalParent(myAdditional);
135  }
136  for (const auto& i : myShapeChildren) {
137  i->removeAdditionalChild(myAdditional);
138  }
139  for (const auto& i : myAdditionalChildren) {
140  i->removeAdditionalParent(myAdditional);
141  }
142  for (const auto& i : myDemandElementChildren) {
143  i->removeAdditionalParent(myAdditional);
144  }
145  } else {
146  // show extra information for tests
147  WRITE_DEBUG("Adding " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
148  // insert additional into net
150  // add additional in parent elements
151  for (const auto& i : myEdgeParents) {
152  i->addAdditionalChild(myAdditional);
153  }
154  for (const auto& i : myLaneParents) {
155  i->addAdditionalChild(myAdditional);
156  }
157  for (const auto& i : myShapeParents) {
158  i->addAdditionalChild(myAdditional);
159  }
160  for (const auto& i : myAdditionalParents) {
161  i->addAdditionalChild(myAdditional);
162  }
163  for (const auto& i : myDemandElementParents) {
164  i->addAdditionalChild(myAdditional);
165  }
166  // add additional in child elements
167  for (const auto& i : myEdgeChildren) {
168  i->addAdditionalParent(myAdditional);
169  }
170  for (const auto& i : myLaneChildren) {
171  i->addAdditionalParent(myAdditional);
172  }
173  for (const auto& i : myShapeChildren) {
174  i->addAdditionalParent(myAdditional);
175  }
176  for (const auto& i : myAdditionalChildren) {
177  i->addAdditionalParent(myAdditional);
178  }
179  for (const auto& i : myDemandElementChildren) {
180  i->addAdditionalParent(myAdditional);
181  }
182  }
183  // Requiere always save additionals
185 }
186 
187 
188 void
190  if (myForward) {
191  // show extra information for tests
192  WRITE_DEBUG("Adding " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
193  // insert additional into net
195  // add additional in parent elements
196  for (const auto& i : myEdgeParents) {
197  i->addAdditionalChild(myAdditional);
198  }
199  for (const auto& i : myLaneParents) {
200  i->addAdditionalChild(myAdditional);
201  }
202  for (const auto& i : myShapeParents) {
203  i->addAdditionalChild(myAdditional);
204  }
205  for (const auto& i : myAdditionalParents) {
206  i->addAdditionalChild(myAdditional);
207  }
208  for (const auto& i : myDemandElementParents) {
209  i->addAdditionalChild(myAdditional);
210  }
211  // add additional in child elements
212  for (const auto& i : myEdgeChildren) {
213  i->addAdditionalParent(myAdditional);
214  }
215  for (const auto& i : myLaneChildren) {
216  i->addAdditionalParent(myAdditional);
217  }
218  for (const auto& i : myShapeChildren) {
219  i->addAdditionalParent(myAdditional);
220  }
221  for (const auto& i : myAdditionalChildren) {
222  i->addAdditionalParent(myAdditional);
223  }
224  for (const auto& i : myDemandElementChildren) {
225  i->addAdditionalParent(myAdditional);
226  }
227  } else {
228  // show extra information for tests
229  WRITE_DEBUG("Removing " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
230  // delete additional from net
232  // Remove additional from parent elements
233  for (const auto& i : myEdgeParents) {
234  i->removeAdditionalChild(myAdditional);
235  }
236  for (const auto& i : myLaneParents) {
237  i->removeAdditionalChild(myAdditional);
238  }
239  for (const auto& i : myShapeParents) {
240  i->removeAdditionalChild(myAdditional);
241  }
242  for (const auto& i : myAdditionalParents) {
243  i->removeAdditionalChild(myAdditional);
244  }
245  for (const auto& i : myDemandElementParents) {
246  i->removeAdditionalChild(myAdditional);
247  }
248  // Remove additional from child elements
249  for (const auto& i : myEdgeChildren) {
250  i->removeAdditionalParent(myAdditional);
251  }
252  for (const auto& i : myLaneChildren) {
253  i->removeAdditionalParent(myAdditional);
254  }
255  for (const auto& i : myShapeChildren) {
256  i->removeAdditionalChild(myAdditional);
257  }
258  for (const auto& i : myAdditionalChildren) {
259  i->removeAdditionalParent(myAdditional);
260  }
261  for (const auto& i : myDemandElementChildren) {
262  i->removeAdditionalParent(myAdditional);
263  }
264  }
265  // Requiere always save additionals
267 }
268 
269 
270 FXString
272  if (myForward) {
273  return ("Undo create " + myAdditional->getTagStr()).c_str();
274  } else {
275  return ("Undo delete " + myAdditional->getTagStr()).c_str();
276  }
277 }
278 
279 
280 FXString
282  if (myForward) {
283  return ("Redo create " + myAdditional->getTagStr()).c_str();
284  } else {
285  return ("Redo delete " + myAdditional->getTagStr()).c_str();
286  }
287 }
GNENet::insertAdditional
void insertAdditional(GNEAdditional *additional)
Insert a additional element int GNENet container.
Definition: GNENet.cpp:2659
GNEAdditional
An Element which don't belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:47
GNEReferenceCounter::unreferenced
bool unreferenced()
check if object ins't referenced
Definition: GNEReferenceCounter.h:79
GNEAdditional.h
GNEAttributeCarrier::getID
const std::string getID() const
function to support debugging
Definition: GNEAttributeCarrier.cpp:1187
GNEChange_Additional::myShapeParents
const std::vector< GNEShape * > & myShapeParents
reference to vector of shape parents
Definition: GNEChange_Additional.h:86
GNEChange_Additional::myAdditionalChildren
const std::vector< GNEAdditional * > & myAdditionalChildren
reference to vector of additional children
Definition: GNEChange_Additional.h:104
GNEChange_Additional::redo
void redo()
redo action
Definition: GNEChange_Additional.cpp:189
GNEChange::myForward
bool myForward
we group antagonistic commands (create junction/delete junction) and keep them apart by this flag
Definition: GNEChange.h:81
GNEChange_Additional
Definition: GNEChange_Additional.h:45
GNENet::deleteAdditional
void deleteAdditional(GNEAdditional *additional, GNEUndoList *undoList)
remove additional
Definition: GNENet.cpp:625
GNEChange_Additional::myDemandElementParents
const std::vector< GNEDemandElement * > & myDemandElementParents
reference to vector of demand element parents
Definition: GNEChange_Additional.h:92
GNEChange_Additional.h
GNEChange_Additional::myShapeChildren
const std::vector< GNEShape * > & myShapeChildren
reference to vector of shape children
Definition: GNEChange_Additional.h:101
GNENet::requiereSaveAdditionals
void requiereSaveAdditionals(bool value)
inform that additionals has to be saved
Definition: GNENet.cpp:2186
GNEChange_Additional::myEdgeParents
const std::vector< GNEEdge * > & myEdgeParents
reference to vector of edge parents
Definition: GNEChange_Additional.h:80
GNEDemandElement.h
GNEViewNet.h
GNEEdge.h
GNEChange::myNet
GNENet * myNet
the net to which operations shall be applied or which shall be informed about gui updates (we are not...
Definition: GNEChange.h:76
GNEChange_Additional::myEdgeChildren
const std::vector< GNEEdge * > & myEdgeChildren
reference to vector of edge children
Definition: GNEChange_Additional.h:95
GNEReferenceCounter::decRef
void decRef(const std::string &debugMsg="")
Decrease reference.
Definition: GNEReferenceCounter.h:53
GNELane.h
GNEChange_Additional::~GNEChange_Additional
~GNEChange_Additional()
Destructor.
Definition: GNEChange_Additional.cpp:59
GNEShape.h
GNEChange_Additional::myLaneChildren
const std::vector< GNELane * > & myLaneChildren
reference to vector of lane children
Definition: GNEChange_Additional.h:98
GNENet::additionalExist
bool additionalExist(GNEAdditional *additional) const
return true if additional exist (use pointer instead ID)
Definition: GNENet.cpp:2647
GNEChange_Additional::myDemandElementChildren
const std::vector< GNEDemandElement * > & myDemandElementChildren
reference to vector of demand element children
Definition: GNEChange_Additional.h:107
GNEChange_Additional::myLaneParents
const std::vector< GNELane * > & myLaneParents
reference to vector of lane parents
Definition: GNEChange_Additional.h:83
GNEChange_Additional::myAdditional
GNEAdditional * myAdditional
full information regarding the additional element that is to be created/deleted
Definition: GNEChange_Additional.h:77
config.h
GNEChange_Additional::undoName
FXString undoName() const
return undoName
Definition: GNEChange_Additional.cpp:271
GNEAttributeCarrier::getTagStr
const std::string & getTagStr() const
get tag assigned to this object in string format
Definition: GNEAttributeCarrier.cpp:1165
GNEChange_Additional::myAdditionalParents
const std::vector< GNEAdditional * > & myAdditionalParents
reference to vector of additional parents
Definition: GNEChange_Additional.h:89
GNEChange_Additional::undo
void undo()
undo action
Definition: GNEChange_Additional.cpp:107
GNEChange
the function-object for an editing operation (abstract base)
Definition: GNEChange.h:43
GNEChange_Additional::redoName
FXString redoName() const
get Redo name
Definition: GNEChange_Additional.cpp:281
WRITE_DEBUG
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:246
GNENet.h