Eclipse SUMO - Simulation of Urban MObility
GNEChange.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2020 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 /****************************************************************************/
18 // The reification of a NETEDIT editing operation (see command pattern)
19 // inherits from FXCommand and is used to for undo/redo
20 /****************************************************************************/
21 #pragma once
22 #include <config.h>
23 
24 #include <fx.h>
25 #include <netbuild/NBEdge.h>
26 #include <netbuild/NBNode.h>
39 
40 
41 // ===========================================================================
42 // class declarations
43 // ===========================================================================
46 class GNEAdditional;
47 class GNEDataSet;
48 class GNEDemandElement;
49 class GNEGenericData;
50 class GNEDataInterval;
51 class GNEEdge;
52 class GNELane;
53 class GNEShape;
54 class GNETAZElement;
55 class GNENet;
56 class GNEViewNet;
57 
58 // ===========================================================================
59 // class definitions
60 // ===========================================================================
65 class GNEChange : public FXCommand {
66  FXDECLARE_ABSTRACT(GNEChange)
67 
68 public:
73  GNEChange(bool forward, const bool selectedElement);
74 
80  GNEChange(GNEHierarchicalElement* element, bool forward, const bool selectedElement);
81 
83  ~GNEChange();
84 
86  virtual FXuint size() const;
87 
89  virtual FXString undoName() const;
90 
92  virtual FXString redoName() const;
93 
95  virtual void undo();
96 
98  virtual void redo();
99 
100 protected:
103 
105  template<typename T>
107  // add element in parents
108  for (const auto& junction : myOriginalHierarchicalContainer.getParents<std::vector<GNEJunction*> >()) {
109  junction->addChildElement(element);
110  }
111  for (const auto& edge : myOriginalHierarchicalContainer.getParents<std::vector<GNEEdge*> >()) {
112  edge->addChildElement(element);
113  }
114  for (const auto& lane : myOriginalHierarchicalContainer.getParents<std::vector<GNELane*> >()) {
115  lane->addChildElement(element);
116  }
117  for (const auto& additional : myOriginalHierarchicalContainer.getParents<std::vector<GNEAdditional*> >()) {
118  additional->addChildElement(element);
119  }
120  for (const auto& shape : myOriginalHierarchicalContainer.getParents<std::vector<GNEShape*> >()) {
121  shape->addChildElement(element);
122  }
123  for (const auto& TAZElement : myOriginalHierarchicalContainer.getParents<std::vector<GNETAZElement*> >()) {
124  TAZElement->addChildElement(element);
125  }
126  for (const auto& demandElement : myOriginalHierarchicalContainer.getParents<std::vector<GNEDemandElement*> >()) {
127  demandElement->addChildElement(element);
128  }
129  for (const auto& genericData : myOriginalHierarchicalContainer.getParents<std::vector<GNEGenericData*> >()) {
130  genericData->addChildElement(element);
131  }
132  // add element in children
133  for (const auto& junction : myOriginalHierarchicalContainer.getChildren<std::vector<GNEJunction*> >()) {
134  junction->addParentElement(element);
135  }
136  for (const auto& edge : myOriginalHierarchicalContainer.getChildren<std::vector<GNEEdge*> >()) {
137  edge->addParentElement(element);
138  }
139  for (const auto& lane : myOriginalHierarchicalContainer.getChildren<std::vector<GNELane*> >()) {
140  lane->addParentElement(element);
141  }
142  for (const auto& additional : myOriginalHierarchicalContainer.getChildren<std::vector<GNEAdditional*> >()) {
143  additional->addParentElement(element);
144  }
145  for (const auto& shape : myOriginalHierarchicalContainer.getChildren<std::vector<GNEShape*> >()) {
146  shape->addParentElement(element);
147  }
148  for (const auto& TAZElement : myOriginalHierarchicalContainer.getChildren<std::vector<GNETAZElement*> >()) {
149  TAZElement->addParentElement(element);
150  }
151  for (const auto& demandElement : myOriginalHierarchicalContainer.getChildren<std::vector<GNEDemandElement*> >()) {
152  demandElement->addParentElement(element);
153  }
154  for (const auto& genericData : myOriginalHierarchicalContainer.getChildren<std::vector<GNEGenericData*> >()) {
155  genericData->addParentElement(element);
156  }
157  }
158 
160  template<typename T>
162  // Remove element from parents
163  for (const auto& junction : myOriginalHierarchicalContainer.getParents<std::vector<GNEJunction*> >()) {
164  junction->removeChildElement(element);
165  }
166  for (const auto& edge : myOriginalHierarchicalContainer.getParents<std::vector<GNEEdge*> >()) {
167  edge->removeChildElement(element);
168  }
169  for (const auto& lane : myOriginalHierarchicalContainer.getParents<std::vector<GNELane*> >()) {
170  lane->removeChildElement(element);
171  }
172  for (const auto& additional : myOriginalHierarchicalContainer.getParents<std::vector<GNEAdditional*> >()) {
173  additional->removeChildElement(element);
174  }
175  for (const auto& shape : myOriginalHierarchicalContainer.getParents<std::vector<GNEShape*> >()) {
176  shape->removeChildElement(element);
177  }
178  for (const auto& TAZElement : myOriginalHierarchicalContainer.getParents<std::vector<GNETAZElement*> >()) {
179  TAZElement->removeChildElement(element);
180  }
181  for (const auto& demandElement : myOriginalHierarchicalContainer.getParents<std::vector<GNEDemandElement*> >()) {
182  demandElement->removeChildElement(element);
183  }
184  for (const auto& genericData : myOriginalHierarchicalContainer.getParents<std::vector<GNEGenericData*> >()) {
185  genericData->removeChildElement(element);
186  }
187  // Remove element from children
188  for (const auto& junction : myOriginalHierarchicalContainer.getChildren<std::vector<GNEJunction*> >()) {
189  junction->removeParentElement(element);
190  }
191  for (const auto& edge : myOriginalHierarchicalContainer.getChildren<std::vector<GNEEdge*> >()) {
192  edge->removeParentElement(element);
193  }
194  for (const auto& lane : myOriginalHierarchicalContainer.getChildren<std::vector<GNELane*> >()) {
195  lane->removeParentElement(element);
196  }
197  for (const auto& additional : myOriginalHierarchicalContainer.getChildren<std::vector<GNEAdditional*> >()) {
198  additional->removeParentElement(element);
199  }
200  for (const auto& shape : myOriginalHierarchicalContainer.getChildren<std::vector<GNEShape*> >()) {
201  shape->removeParentElement(element);
202  }
203  for (const auto& TAZElement : myOriginalHierarchicalContainer.getChildren<std::vector<GNETAZElement*> >()) {
204  TAZElement->removeParentElement(element);
205  }
206  for (const auto& demandElement : myOriginalHierarchicalContainer.getChildren<std::vector<GNEDemandElement*> >()) {
207  demandElement->removeParentElement(element);
208  }
209  for (const auto& genericData : myOriginalHierarchicalContainer.getChildren<std::vector<GNEGenericData*> >()) {
210  genericData->removeParentElement(element);
211  }
212  }
213 
215  bool myForward;
216 
218  const bool mySelectedElement;
219 
222 
224  std::map<GNEHierarchicalElement*, GNEHierarchicalContainer> myHierarchicalContainers;
225 };
An Element which don't belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:47
the function-object for an editing operation (abstract base)
Definition: GNEChange.h:65
virtual FXString redoName() const
return rendoName
Definition: GNEChange.cpp:68
virtual void undo()
undo action/operation
Definition: GNEChange.cpp:74
std::map< GNEHierarchicalElement *, GNEHierarchicalContainer > myHierarchicalContainers
map with hierarchical container of all parent and children elements
Definition: GNEChange.h:224
bool myForward
we group antagonistic commands (create junction/delete junction) and keep them apart by this flag
Definition: GNEChange.h:215
virtual FXuint size() const
return actual size
Definition: GNEChange.cpp:56
virtual FXString undoName() const
return undoName
Definition: GNEChange.cpp:62
const bool mySelectedElement
flag for check if element is selected
Definition: GNEChange.h:218
void addElementInParentsAndChildren(T *element)
add given element into parents and children (only use in redo() function)
Definition: GNEChange.h:106
~GNEChange()
Destructor.
Definition: GNEChange.cpp:52
GNEChange(bool forward, const bool selectedElement)
Constructor.
Definition: GNEChange.cpp:34
void removeElementFromParentsAndChildren(T *element)
remove given element from parents and children (only use in redo() function)
Definition: GNEChange.h:161
virtual void redo()
redo action/operation
Definition: GNEChange.cpp:78
void restoreHierarchicalContainers()
restore container (only use in undo() function)
Definition: GNEChange.cpp:82
const GNEHierarchicalContainer myOriginalHierarchicalContainer
Hierarchical container with parent and children.
Definition: GNEChange.h:221
An Element which don't belongs to GNENet but has influency in the simulation.
An Element which don't belongs to GNENet but has influency in the simulation.
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:49
An Element which don't belongs to GNENet but has influency in the simulation.
Hierarchical container (used for keep myParent and myChildren.
const T & getParents() const
get parents
const T & getChildren() const
get children
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition: GNELane.h:45
A NBNetBuilder extended by visualisation and editing capabilities.
Definition: GNENet.h:40
An Element which don't belongs to GNENet but has influency in the simulation.
Definition: GNETAZElement.h:45