Eclipse SUMO - Simulation of Urban MObility
GNEDataInterval.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 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 // A abstract class for data sets
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <netedit/GNENet.h>
28 #include <netedit/GNEViewNet.h>
29 #include <netedit/GNEUndoList.h>
30 #include <netedit/GNEViewParent.h>
33 
34 #include "GNEDataInterval.h"
35 
36 
37 // ===========================================================================
38 // member method definitions
39 // ===========================================================================
40 
41 // ---------------------------------------------------------------------------
42 // GNEDataInterval - methods
43 // ---------------------------------------------------------------------------
44 
45 GNEDataInterval::GNEDataInterval(GNEDataSet* dataSetParent, const double begin, const double end) :
46  GNEHierarchicalElement(dataSetParent->getNet(), SUMO_TAG_DATAINTERVAL, {}, {}, {}, {}, {}, {}),
47  myDataSetParent(dataSetParent),
48  myBegin(begin),
49 myEnd(end) {
50 }
51 
52 
54 
55 
56 void
58  if (myNet->isUpdateDataEnabled()) {
59  // iterate over generic data childrens
60  for (const auto& genericData : myGenericDataChildren) {
61  if (genericData->getTagProperty().getTag() == GNE_TAG_EDGEREL_SINGLE) {
62  // {dataset}[{begin}m{end}]{edge}
63  genericData->setMicrosimID(myDataSetParent->getID() + "[" + toString(myBegin) + "," + toString(myEnd) + "]" +
64  genericData->getParentEdges().front()->getID());
65  } else if (genericData->getTagProperty().getTag() == SUMO_TAG_EDGEREL) {
66  // {dataset}[{begin}m{end}]{from}->{to}
67  genericData->setMicrosimID(myDataSetParent->getID() + "[" + toString(myBegin) + "," + toString(myEnd) + "]" +
68  genericData->getParentEdges().front()->getID() + "->" + genericData->getParentEdges().back()->getID());
69  }
70  }
71  }
72 }
73 
74 
75 void
77  if (myNet->isUpdateDataEnabled()) {
78  // first clear both container
81  // iterate over generic data children
82  for (const auto& genericData : myGenericDataChildren) {
83  for (const auto& param : genericData->getParametersMap()) {
84  // check if value can be parsed
85  if (canParse<double>(param.second)) {
86  // parse param value
87  const double value = parse<double>(param.second);
88  // update values in both containers
89  myAllAttributeColors.updateValues(param.first, value);
90  mySpecificAttributeColors[genericData->getTagProperty().getTag()].updateValues(param.first, value);
91  }
92  }
93  }
94  }
95 }
96 
97 
100  return myAllAttributeColors;
101 }
102 
103 
104 const std::map<SumoXMLTag, GNEDataSet::AttributeColors>&
107 }
108 
109 
112  return nullptr;
113 }
114 
115 
116 const GUIGlObject*
118  return nullptr;
119 }
120 
121 
122 void
124  // nothing to update
125 }
126 
127 
128 Position
130  return Position();
131 }
132 
133 
134 bool
136  return false;
137 }
138 
139 
140 bool
142  return false;
143 }
144 
145 
146 bool
148  return false;
149 }
150 
151 
152 bool
154  return false;
155 }
156 
157 
158 bool
160  return false;
161 }
162 
163 
164 bool
166  return false;
167 }
168 
169 
170 bool
172  return false;
173 }
174 
175 
176 bool
178  return true;
179 }
180 
181 
182 std::string
184  return "";
185 }
186 
187 
188 void
190  throw InvalidArgument(getTagStr() + " cannot fix any problem");
191 }
192 
193 
194 GNEDataSet*
196  return myDataSetParent;
197 }
198 
199 
200 void
202  // check that GenericData wasn't previously inserted
203  if (!hasGenericDataChild(genericData)) {
204  myGenericDataChildren.push_back(genericData);
205  // update generic data IDs
207  // check if add to boundary
208  if (genericData->getTagProperty().isPlacedInRTree()) {
209  myNet->addGLObjectIntoGrid(genericData);
210  }
211  // update geometry after insertion if myUpdateGeometryEnabled is enabled
213  // update generic data RTREE
214  genericData->updateGeometry();
215  }
216  // add reference in attributeCarriers
218  // update colors
220  } else {
221  throw ProcessError(TL("GenericData was already inserted"));
222  }
223 }
224 
225 
226 void
228  auto it = std::find(myGenericDataChildren.begin(), myGenericDataChildren.end(), genericData);
229  // check that GenericData was previously inserted
230  if (it != myGenericDataChildren.end()) {
231  // remove generic data child
232  myGenericDataChildren.erase(it);
233  // remove it from inspected ACs and GNEElementTree
236  // update colors
238  // delete path element
239  myNet->getPathManager()->removePath(genericData);
240  // check if remove from RTREE
241  if (genericData->getTagProperty().isPlacedInRTree()) {
242  myNet->removeGLObjectFromGrid(genericData);
243  }
244  // remove reference from attributeCarriers
246  } else {
247  throw ProcessError(TL("GenericData wasn't previously inserted"));
248  }
249 }
250 
251 
252 bool
254  return std::find(myGenericDataChildren.begin(), myGenericDataChildren.end(), genericData) != myGenericDataChildren.end();
255 }
256 
257 
258 const std::vector<GNEGenericData*>&
260  return myGenericDataChildren;
261 }
262 
263 
264 bool
265 GNEDataInterval::edgeRelExists(const GNEEdge* fromEdge, const GNEEdge* toEdge) const {
266  // interate over all edgeRels and check edge parents
267  for (const auto& genericData : myGenericDataChildren) {
268  if ((genericData->getTagProperty().getTag() == SUMO_TAG_EDGEREL) &&
269  (genericData->getParentEdges().front() == fromEdge) &&
270  (genericData->getParentEdges().back() == toEdge)) {
271  return true;
272  }
273  }
274  return false;
275 }
276 
277 
278 bool
280  // interate over all TAZRels and check TAZ parents
281  for (const auto& genericData : myGenericDataChildren) {
282  if ((genericData->getTagProperty().getTag() == SUMO_TAG_TAZREL) &&
283  (genericData->getParentAdditionals().size() == 1) &&
284  (genericData->getParentAdditionals().front() == TAZ)) {
285  return true;
286  }
287  }
288  return false;
289 }
290 
291 
292 bool
293 GNEDataInterval::TAZRelExists(const GNEAdditional* fromTAZ, const GNEAdditional* toTAZ) const {
294  // interate over all TAZRels and check TAZ parents
295  for (const auto& genericData : myGenericDataChildren) {
296  if ((genericData->getTagProperty().getTag() == SUMO_TAG_TAZREL) &&
297  (genericData->getParentAdditionals().size() == 2) &&
298  (genericData->getParentAdditionals().front() == fromTAZ) &&
299  (genericData->getParentAdditionals().back() == toTAZ)) {
300  return true;
301  }
302  }
303  return false;
304 }
305 
306 
307 std::string
309  switch (key) {
310  case SUMO_ATTR_ID:
312  case SUMO_ATTR_BEGIN:
313  return toString(myBegin);
314  case SUMO_ATTR_END:
315  return toString(myEnd);
316  default:
317  throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
318  }
319 }
320 
321 
322 double
324  switch (key) {
325  case SUMO_ATTR_BEGIN:
326  return myBegin;
327  case SUMO_ATTR_END:
328  return myEnd;
329  default:
330  throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");
331  }
332 }
333 
334 
335 void
336 GNEDataInterval::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
337  switch (key) {
338  case SUMO_ATTR_BEGIN:
339  case SUMO_ATTR_END:
340  GNEChange_Attribute::changeAttribute(this, key, value, undoList);
341  break;
342  default:
343  throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
344  }
345 }
346 
347 
348 bool
349 GNEDataInterval::isValid(SumoXMLAttr key, const std::string& value) {
350  switch (key) {
351  case SUMO_ATTR_BEGIN:
352  return canParse<double>(value);
353  case SUMO_ATTR_END:
354  return canParse<double>(value);
355  default:
356  throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
357  }
358 }
359 
360 
361 bool
363  switch (key) {
364  case SUMO_ATTR_ID:
365  return false;
366  default:
367  return true;
368  }
369 }
370 
371 
372 std::string
374  return getTagStr();
375 }
376 
377 
378 std::string
380  return "interval: " + getAttribute(SUMO_ATTR_BEGIN) + " -> " + getAttribute(SUMO_ATTR_END);
381 }
382 
383 
384 const Parameterised::Map&
386  return getParametersMap();
387 }
388 
389 
390 void
391 GNEDataInterval::setAttribute(SumoXMLAttr key, const std::string& value) {
392  switch (key) {
393  case SUMO_ATTR_BEGIN:
394  myBegin = parse<double>(value);
395  // update Generic Data IDs
397  break;
398  case SUMO_ATTR_END:
399  myEnd = parse<double>(value);
400  // update Generic Data IDs
402  break;
403  default:
404  throw InvalidArgument(getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'");
405  }
406  // mark interval toolbar for update
408 }
409 
410 /****************************************************************************/
#define TL(string)
Definition: MsgHandler.h:315
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_DATAINTERVAL
@ GNE_TAG_EDGEREL_SINGLE
@ SUMO_TAG_TAZREL
a relation between two TAZs
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ID
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
An Element which don't belong to GNENet but has influence in the simulation.
Definition: GNEAdditional.h:49
const std::string getID() const
get ID (all Attribute Carriers have one)
const std::string & getTagStr() const
get tag assigned to this object in string format
const GNETagProperties & getTagProperty() const
get tagProperty associated with this Attribute Carrier
GNENet * myNet
pointer to net
GNENet * getNet() const
get pointer to net
static void changeAttribute(GNEAttributeCarrier *AC, SumoXMLAttr key, const std::string &value, GNEUndoList *undoList, const bool force=false)
change attribute
void fixDataIntervalProblem()
fix data element problem (by default throw an exception, has to be reimplemented in children)
bool isAttributeEnabled(SumoXMLAttr key) const
double myBegin
begin interval
Position getPositionInView() const
Returns element position in view.
GNEDataInterval(GNEDataSet *dataSetParent, const double begin, const double end)
Constructor.
bool checkDrawRelatedContour() const
check if draw related contour (cyan)
bool edgeRelExists(const GNEEdge *fromEdge, const GNEEdge *toEdge) const
check if there is already a edgeRel defined between two edges
GNEDataSet * myDataSetParent
GNEDataSet parent to which this data interval belongs.
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
method for setting the attribute and letting the object perform data element changes
const Parameterised::Map & getACParametersMap() const
get parameters map
void removeGenericDataChild(GNEGenericData *genericData)
add generic data child
std::string getAttribute(SumoXMLAttr key) const
double getAttributeDouble(SumoXMLAttr key) const
GUIGlObject * getGUIGlObject()
get GUIGlObject associated with this AttributeCarrier
bool isDataIntervalValid() const
GNEDataSet * getDataSetParent() const
Returns a pointer to GNEDataSet parent.
bool isValid(SumoXMLAttr key, const std::string &value)
method for checking if the key and their conrrespond attribute are valids
bool hasGenericDataChild(GNEGenericData *genericData) const
check if given generic data is child of this data interval
bool TAZRelExists(const GNEAdditional *TAZ) const
check if there is already a TAZRel defined in one TAZ
GNEDataSet::AttributeColors myAllAttributeColors
all attribute colors
bool checkDrawMoveContour() const
check if draw move contour (red)
bool checkDrawFromContour() const
check if draw from contour (green)
const std::vector< GNEGenericData * > & getGenericDataChildren() const
get generic data children
bool checkDrawToContour() const
check if draw from contour (magenta)
double myEnd
end interval
bool checkDrawOverContour() const
check if draw over contour (orange)
std::string getPopUpID() const
get PopPup ID (Used in AC Hierarchy)
const std::map< SumoXMLTag, GNEDataSet::AttributeColors > & getSpecificAttributeColors() const
specific attribute colors
void updateGenericDataIDs()
update generic data child IDs
~GNEDataInterval()
Destructor.
std::map< SumoXMLTag, GNEDataSet::AttributeColors > mySpecificAttributeColors
specific attribute colors
std::string getHierarchyName() const
get Hierarchy Name (Used in AC Hierarchy)
std::string getDataIntervalProblem() const
return a string with the current data element problem (by default empty, can be reimplemented in chil...
const GNEDataSet::AttributeColors & getAllAttributeColors() const
all attribute colors
bool checkDrawSelectContour() const
check if draw select contour (blue)
std::vector< GNEGenericData * > myGenericDataChildren
vector with generic data children
void addGenericDataChild(GNEGenericData *genericData)
add generic data child
void updateGeometry()
update pre-computed geometry information
void updateAttributeColors()
update attribute colors deprecated
bool checkDrawDeleteContour() const
check if draw delete contour (pink/white)
attribute colors
Definition: GNEDataSet.h:47
void clear()
clear AttributeColors
Definition: GNEDataSet.cpp:107
void updateValues(const std::string &attribute, const double value)
update value for an specific attribute
Definition: GNEDataSet.cpp:51
std::string getAttribute(SumoXMLAttr key) const
Definition: GNEDataSet.cpp:346
void updateAttributeColors()
update attribute colors deprecated
Definition: GNEDataSet.cpp:143
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:53
void removeCurrentEditedAttributeCarrier(const GNEAttributeCarrier *HE)
if given AttributeCarrier is the same of myHE, set it as nullptr
An Element which don't belong to GNENet but has influence in the simulation.
virtual void updateGeometry()=0
update pre-computed geometry information
GNEDataInterval * getDataIntervalParent() const
get data interval parent
GNEElementTree * getHierarchicalElementTree() const
get GNEElementTree modul
void insertGenericData(GNEGenericData *genericData)
insert generic data in container
void deleteGenericData(GNEGenericData *genericData)
delete generic data of container
void addGLObjectIntoGrid(GNEAttributeCarrier *AC)
add GL Object into net
Definition: GNENet.cpp:1368
void removeGLObjectFromGrid(GNEAttributeCarrier *AC)
add GL Object into net
Definition: GNENet.cpp:1378
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:123
bool isUpdateGeometryEnabled() const
check if update geometry after inserting or removing has to be updated
Definition: GNENet.cpp:2787
bool isUpdateDataEnabled() const
check if update data after inserting or removing has to be updated
Definition: GNENet.cpp:2810
GNEPathManager * getPathManager()
get path manager
Definition: GNENet.cpp:135
GNEViewNet * getViewNet() const
get view net
Definition: GNENet.cpp:2136
void removePath(PathElement *pathElement)
remove path
bool isPlacedInRTree() const
return true if Tag correspond to an element that has to be placed in RTREE
GNEViewNetHelper::IntervalBar & getIntervalBar()
get interval bar
GNEViewParent * getViewParent() const
get the net object
void removeFromAttributeCarrierInspected(const GNEAttributeCarrier *AC)
remove given AC of list of inspected Attribute Carriers
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
std::map< std::string, std::string > Map
parameters map
Definition: Parameterised.h:45
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37