Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNENetHelper.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-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/****************************************************************************/
18// Helper for GNENet
19/****************************************************************************/
20
94#include <netedit/GNENet.h>
96#include <netedit/GNEViewNet.h>
102
103#include "GNENetHelper.h"
104
105// ---------------------------------------------------------------------------
106// GNENetHelper::AttributeCarriers - methods
107// ---------------------------------------------------------------------------
108
110 myNet(net),
111 myStopIndex(0) {
112 // fill additionals with tags
115 for (const auto& additionalTagProperty : additionalTagProperties) {
116 myAdditionals.insert(std::make_pair(additionalTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEAdditional*>()));
117 if (additionalTagProperty->hasAttribute(SUMO_ATTR_ID) || (additionalTagProperty->getTag() == SUMO_TAG_VAPORIZER)) {
118 myAdditionalIDs.insert(std::make_pair(additionalTagProperty->getTag(), std::map<const std::string, GNEAdditional*>()));
119 }
120 }
121 myTAZSourceSinks.insert(std::make_pair(SUMO_TAG_TAZSOURCE, std::unordered_map<const GNEAttributeCarrier*, GNETAZSourceSink*>()));
122 myTAZSourceSinks.insert(std::make_pair(SUMO_TAG_TAZSINK, std::unordered_map<const GNEAttributeCarrier*, GNETAZSourceSink*>()));
123 // fill demand elements with tags
125 for (const auto& demandElementTagProperty : demandElementTagProperties) {
126 myDemandElements.insert(std::make_pair(demandElementTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEDemandElement*>()));
127 if (demandElementTagProperty->hasAttribute(SUMO_ATTR_ID)) {
128 myDemandElementIDs.insert(std::make_pair(demandElementTagProperty->getTag(), std::map<const std::string, GNEDemandElement*>()));
129 }
130 }
132 for (const auto& stopTagProperty : stopTagProperties) {
133 myDemandElements.insert(std::make_pair(stopTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEDemandElement*>()));
134 }
135 // fill data elements with tags
137 for (const auto& genericDataElementTagProperty : genericDataElementTagProperties) {
138 myGenericDatas.insert(std::make_pair(genericDataElementTagProperty->getTag(), std::unordered_map<const GUIGlObject*, GNEGenericData*>()));
139 }
140 // fill meanDatas with tags
142 for (const auto& meanDataTagProperty : meanDataTagProperties) {
143 myMeanDatas.insert(std::make_pair(meanDataTagProperty->getTag(), std::map<const std::string, GNEMeanData*>()));
144 }
145}
146
147
149 // Drop EdgeTypes
150 for (const auto& edgeType : myEdgeTypes) {
151 edgeType.second->decRef("GNENetHelper::~GNENet");
152 delete edgeType.second;
153 }
154 // Drop Edges
155 for (const auto& edge : myEdges) {
156 edge.second->decRef("GNENetHelper::~GNENet");
157 delete edge.second;
158 }
159 // Drop myJunctions
160 for (const auto& junction : myJunctions) {
161 junction.second->decRef("GNENetHelper::~GNENet");
162 delete junction.second;
163 }
164 // Drop Additionals (Only used for additionals that were inserted without using GNEChange_Additional)
165 for (const auto& additionalTag : myAdditionals) {
166 for (const auto& additional : additionalTag.second) {
167 // decrease reference manually (because it was increased manually in GNEAdditionalHandler)
168 additional.second->decRef();
169 delete additional.second;
170 }
171 }
172 // Drop demand elements (Only used for demand elements that were inserted without using GNEChange_DemandElement, for example the default VType")
173 for (const auto& demandElementTag : myDemandElements) {
174 for (const auto& demandElement : demandElementTag.second) {
175 // decrease reference manually (because it was increased manually in GNERouteHandler)
176 demandElement.second->decRef();
177 delete demandElement.second;
178 }
179 }
180 // Drop dataSets (Only used for TAZElements that were inserted without using GNEChange_DataSets)
181 for (const auto& dataSet : myDataSets) {
182 // decrease reference manually (because it was increased manually in GNEDataHandler)
183 dataSet.second->decRef();
184 delete dataSet.second;
185 }
186 // Drop MeanDatas (Only used for meanDatas that were inserted without using GNEChange_MeanData)
187 for (const auto& meanDataTag : myMeanDatas) {
188 for (const auto& meanData : meanDataTag.second) {
189 // decrease reference manually (because it was increased manually in GNEMeanDataHandler)
190 meanData.second->decRef();
191 delete meanData.second;
192 }
193 }
194}
195
196
197void
199 std::map<std::string, GNEEdge*> newEdgeMap;
200 std::map<std::string, GNEJunction*> newJunctionMap;
201 // fill newEdgeMap
202 for (const auto& edge : myEdges) {
203 edge.second->setEdgeID(edge.second->getNBEdge()->getID());
204 newEdgeMap[edge.second->getNBEdge()->getID()] = edge.second;
205 }
206 for (const auto& junction : myJunctions) {
207 newJunctionMap[junction.second->getNBNode()->getID()] = junction.second;
208 junction.second->setNetworkElementID(junction.second->getNBNode()->getID());
209 }
210 myEdges = newEdgeMap;
211 myJunctions = newJunctionMap;
212}
213
214
215bool
217 // check what type of AC
218 if (AC->getTagProperty()->getTag() == SUMO_TAG_JUNCTION) {
219 // Junction
220 const GNEJunction* junction = myJunctions.at(AC->getID());
221 if (junction->getNBNode()->getShape().size() == 0) {
222 return triangle.isPositionWithin(junction->getNBNode()->getCenter());
223 } else {
224 return (triangle.intersectWithShape(junction->getNBNode()->getShape()));
225 }
226 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
227 // Edge
228 for (const auto& lane : myEdges.at(AC->getID())->getChildLanes()) {
229 if (triangle.intersectWithShape(lane->getLaneShape())) {
230 return true;
231 }
232 }
233 return false;
234 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_LANE) {
235 // Lane
236 return triangle.intersectWithShape(retrieveLane(AC->getID())->getLaneShape());
237 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_CONNECTION) {
238 // connection
239 return triangle.intersectWithShape(myConnections.at(AC->getGUIGlObject())->getConnectionShape());
240 } else if (AC->getTagProperty()->getTag() == SUMO_TAG_CROSSING) {
241 // crossing
242 return triangle.intersectWithShape(myCrossings.at(AC->getGUIGlObject())->getCrossingShape());
243 } else if (AC->getTagProperty()->isAdditionalElement()) {
244 // Additional (including shapes and TAZs
245 const GNEAdditional* additional = retrieveAdditional(AC->getGUIGlObject());
246 if (additional->getAdditionalGeometry().getShape().size() <= 1) {
247 return triangle.isPositionWithin(additional->getPositionInView());
248 } else {
249 return triangle.intersectWithShape(additional->getAdditionalGeometry().getShape());
250 }
251 } else {
252 return false;
253 }
254}
255
256
257int
259 return myNumberOfNetworkElements;
260}
261
262
263int
265 return myNumberOfDemandElements;
266}
267
268
269int
271 return myNumberOfDataElements;
272}
273
274
277 // obtain blocked GUIGlObject
279 // Make sure that object exists
280 if (object != nullptr) {
281 // unblock and try to parse to AttributeCarrier
283 GNEAttributeCarrier* ac = dynamic_cast<GNEAttributeCarrier*>(object);
284 // If was successfully parsed, return it
285 if (ac == nullptr) {
286 throw ProcessError("GUIGlObject does not match the declared type");
287 } else {
288 return ac;
289 }
290 } else if (hardFail) {
291 throw ProcessError("Attempted to retrieve non-existant GUIGlObject");
292 } else {
293 return nullptr;
294 }
295}
296
297
298std::vector<GNEAttributeCarrier*>
300 std::vector<GNEAttributeCarrier*> ACs;
301 // first check if we have to return all ACs
302 if (tag == SUMO_TAG_NOTHING) {
303 const auto rootTagProperty = myNet->getTagPropertiesDatabase()->getTagProperty(SUMO_TAG_ROOTFILE, true);
304 ACs.reserve(myNumberOfNetworkElements + myNumberOfDemandElements + myNumberOfDataElements);
305 retrieveAttributeCarriersRecursively(rootTagProperty, ACs);
306 } else {
307 const auto tagProperty = myNet->getTagPropertiesDatabase()->getTagProperty(tag, true);
308 // reserve space
309 if (tagProperty->getSupermode() == Supermode::NETWORK) {
310 ACs.reserve(myNumberOfNetworkElements);
311 } else if (tagProperty->getSupermode() == Supermode::DEMAND) {
312 ACs.reserve(myNumberOfDemandElements);
313 } else if (tagProperty->getSupermode() == Supermode::DATA) {
314 ACs.reserve(myNumberOfDataElements + myNumberOfMeanDataElements);
315 }
316 retrieveAttributeCarriersRecursively(tagProperty, ACs);
317 }
318 return ACs;
319}
320
321
322std::vector<GNEAttributeCarrier*>
324 std::vector<GNEAttributeCarrier*> result;
325 // continue depending of supermode
326 if (supermode == Supermode::NETWORK) {
327 // network
328 for (const auto& junction : myJunctions) {
329 if (!onlySelected || junction.second->isAttributeCarrierSelected()) {
330 result.push_back(junction.second);
331 }
332 }
333 for (const auto& crossing : myCrossings) {
334 if (!onlySelected || crossing.second->isAttributeCarrierSelected()) {
335 result.push_back(crossing.second);
336 }
337 }
338 for (const auto& edge : myEdges) {
339 if (!onlySelected || edge.second->isAttributeCarrierSelected()) {
340 result.push_back(edge.second);
341 }
342 }
343 for (const auto& lane : myLanes) {
344 if (!onlySelected || lane.second->isAttributeCarrierSelected()) {
345 result.push_back(lane.second);
346 }
347 }
348 for (const auto& connection : myConnections) {
349 if (!onlySelected || connection.second->isAttributeCarrierSelected()) {
350 result.push_back(connection.second);
351 }
352 }
353 for (const auto& additionalSet : myAdditionals) {
354 for (const auto& additional : additionalSet.second) {
355 if (!onlySelected || additional.second->isAttributeCarrierSelected()) {
356 result.push_back(additional.second);
357 }
358 }
359 }
360 } else if (supermode == Supermode::DEMAND) {
361 for (const auto& demandElementSet : myDemandElements) {
362 for (const auto& demandElement : demandElementSet.second) {
363 if (!onlySelected || demandElement.second->isAttributeCarrierSelected()) {
364 result.push_back(demandElement.second);
365 }
366 }
367 }
368 } else if (supermode == Supermode::DATA) {
369 for (const auto& dataSet : myDataSets) {
370 if (!onlySelected || dataSet.second->isAttributeCarrierSelected()) {
371 result.push_back(dataSet.second);
372 }
373 }
374 for (const auto& dataInterval : myDataIntervals) {
375 if (!onlySelected || dataInterval.second->isAttributeCarrierSelected()) {
376 result.push_back(dataInterval.second);
377 }
378 }
379 for (const auto& genericDataSet : myGenericDatas) {
380 for (const auto& genericData : genericDataSet.second) {
381 if (!onlySelected || genericData.second->isAttributeCarrierSelected()) {
382 result.push_back(genericData.second);
383 }
384 }
385 }
386 for (const auto& meanDataSet : myMeanDatas) {
387 for (const auto& meanData : meanDataSet.second) {
388 if (!onlySelected || meanData.second->isAttributeCarrierSelected()) {
389 result.push_back(meanData.second);
390 }
391 }
392 }
393 }
394 return result;
395}
396
397
398std::vector<GNEAttributeCarrier*>
400 // get modes
401 const auto& editModes = myNet->getViewNet()->getEditModes();
402 // declare vector to save result
403 std::vector<GNEAttributeCarrier*> result;
404 result.reserve(gSelected.getSelected().size());
405 // iterate over all elements of global selection
406 for (const auto& glID : gSelected.getSelected()) {
407 // obtain AC
408 GNEAttributeCarrier* AC = retrieveAttributeCarrier(glID, false);
409 // check if attribute carrier exist and is selected
410 if (AC && AC->isAttributeCarrierSelected()) {
411 if (ignoreCurrentSupermode) {
412 result.push_back(AC);
413 } else if (editModes.isCurrentSupermodeNetwork() && (AC->getTagProperty()->isNetworkElement() ||
415 result.push_back(AC);
416 } else if (editModes.isCurrentSupermodeDemand() && AC->getTagProperty()->isDemandElement()) {
417 result.push_back(AC);
418 } else if (editModes.isCurrentSupermodeData() && AC->getTagProperty()->isDataElement()) {
419 result.push_back(AC);
420 }
421 }
422 }
423 return result;
424}
425
426
428GNENetHelper::AttributeCarriers::retrieveJunction(const std::string& id, bool hardFail) const {
429 auto it = myJunctions.find(id);
430 if (it != myJunctions.end()) {
431 return it->second;
432 }
433 if (hardFail) {
434 // If junction wasn't found, throw exception
435 throw UnknownElement("Attempted to retrieve non-existant junction " + id);
436 } else {
437 return nullptr;
438 }
439}
440
441
442const std::map<std::string, GNEJunction*>&
444 return myJunctions;
445}
446
447
448std::vector<GNEJunction*>
450 std::vector<GNEJunction*> result;
451 // returns junctions depending of selection
452 for (const auto& junction : myJunctions) {
453 if (junction.second->isAttributeCarrierSelected()) {
454 result.push_back(junction.second);
455 }
456 }
457 return result;
458}
459
460
463 // increase reference
464 junction->incRef("GNENet::registerJunction");
465 junction->setResponsible(false);
466 myJunctions[junction->getMicrosimID()] = junction;
467 myNumberOfNetworkElements++;
468 // expand net boundary
469 myNet->expandBoundary(junction->getCenteringBoundary());
470 // add edge into grid
471 myNet->addGLObjectIntoGrid(junction);
472 // update geometry
473 junction->updateGeometry();
474 // add z in net boundary
475 myNet->addZValueInBoundary(junction->getNBNode()->getPosition().z());
476 return junction;
477}
478
479
480void
482 myJunctions.clear();
483}
484
485
486void
488 // make a copy of junctions
489 auto junctionCopy = myJunctions;
490 // clear junctions
491 myJunctions.clear();
492 // fill junctions again
493 for (const auto& junction : junctionCopy) {
494 // update microsim ID
495 junction.second->setNetworkElementID(prefix + junction.first);
496 // insert in myJunctions again
497 myJunctions[prefix + junction.first] = junction.second;
498 }
499}
500
501
502void
504 if (myJunctions.count(junction->getID()) == 0) {
505 throw ProcessError(junction->getTagStr() + " with ID='" + junction->getID() + "' doesn't exist in AttributeCarriers.junction");
506 } else if (myJunctions.count(newID) != 0) {
507 throw ProcessError("There is another " + junction->getTagStr() + " with new ID='" + newID + "' in myJunctions");
508 } else {
509 // remove junction from container
510 myJunctions.erase(junction->getNBNode()->getID());
511 // rename in NetBuilder
512 myNet->getNetBuilder()->getNodeCont().rename(junction->getNBNode(), newID);
513 // update microsim ID
514 junction->setNetworkElementID(newID);
515 // add it into myJunctions again
516 myJunctions[junction->getID()] = junction;
517 // build crossings
518 junction->getNBNode()->buildCrossings();
519 // net has to be saved
520 myNet->getSavingStatus()->requireSaveNetwork();
521 }
522}
523
524
525int
527 int counter = 0;
528 for (const auto& junction : myJunctions) {
529 if (junction.second->isAttributeCarrierSelected()) {
530 counter++;
531 }
532 }
533 return counter;
534}
535
536
539 auto it = myCrossings.find(glObject);
540 if (it != myCrossings.end()) {
541 return it->second;
542 }
543 if (hardFail) {
544 // If junction wasn't found, throw exception
545 throw UnknownElement("Attempted to retrieve non-existant crossing " + glObject->getMicrosimID());
546 } else {
547 return nullptr;
548 }
549}
550
551
552const std::unordered_map<const GUIGlObject*, GNECrossing*>&
554 return myCrossings;
555}
556
557
558std::vector<GNECrossing*>
560 std::vector<GNECrossing*> result;
561 // iterate over crossings
562 for (const auto& crossing : myCrossings) {
563 if (crossing.second->isAttributeCarrierSelected()) {
564 result.push_back(crossing.second);
565 }
566 }
567 return result;
568}
569
570
571int
573 int counter = 0;
574 for (const auto& crossing : myCrossings) {
575 if (crossing.second->isAttributeCarrierSelected()) {
576 counter++;
577 }
578 }
579 return counter;
580}
581
582
585 auto it = myWalkingAreas.find(glObject);
586 if (it != myWalkingAreas.end()) {
587 return it->second;
588 }
589 if (hardFail) {
590 // If junction wasn't found, throw exception
591 throw UnknownElement("Attempted to retrieve non-existant walkingArea " + glObject->getMicrosimID());
592 } else {
593 return nullptr;
594 }
595}
596
597
598const std::unordered_map<const GUIGlObject*, GNEWalkingArea*>&
600 return myWalkingAreas;
601}
602
603
604std::vector<GNEWalkingArea*>
606 std::vector<GNEWalkingArea*> result;
607 // iterate over walkingAreas
608 for (const auto& walkingArea : myWalkingAreas) {
609 if (walkingArea.second->isAttributeCarrierSelected()) {
610 result.push_back(walkingArea.second);
611 }
612 }
613 return result;
614}
615
616
617int
619 int counter = 0;
620 for (const auto& walkingArea : myWalkingAreas) {
621 if (walkingArea.second->isAttributeCarrierSelected()) {
622 counter++;
623 }
624 }
625 return counter;
626}
627
628
630GNENetHelper::AttributeCarriers::retrieveEdgeType(const std::string& id, bool hardFail) const {
631 if (myEdgeTypes.count(id) > 0) {
632 return myEdgeTypes.at(id);
633 } else if (hardFail) {
634 // If edge wasn't found, throw exception
635 throw UnknownElement("Attempted to retrieve non-existant EdgeType " + id);
636 } else {
637 return nullptr;
638 }
639}
640
641
644 // increase reference
645 edgeType->incRef("GNENet::registerEdgeType");
646 // add it in container
647 myEdgeTypes[edgeType->getMicrosimID()] = edgeType;
648 return edgeType;
649}
650
651
652const std::map<std::string, GNEEdgeType*>&
654 return myEdgeTypes;
655}
656
657
659 myEdgeTypes.clear();
660}
661
662
663void
665 if (myEdgeTypes.count(edgeType->getID()) == 0) {
666 throw ProcessError(edgeType->getTagStr() + " with ID='" + edgeType->getID() + "' doesn't exist in AttributeCarriers.edgeType");
667 } else if (myEdgeTypes.count(newID) != 0) {
668 throw ProcessError("There is another " + edgeType->getTagStr() + " with new ID='" + newID + "' in myEdgeTypes");
669 } else {
670 // remove edgeType from container
671 myEdgeTypes.erase(edgeType->getID());
672 // rename in typeCont
673 myNet->getNetBuilder()->getTypeCont().updateEdgeTypeID(edgeType->getID(), newID);
674 // update microsim ID
675 edgeType->setNetworkElementID(newID);
676 // add it into myEdgeTypes again
677 myEdgeTypes[edgeType->getID()] = edgeType;
678 // net has to be saved
679 myNet->getSavingStatus()->requireSaveNetwork();
680 }
681}
682
683
684std::string
686 int counter = 0;
687 while (myEdgeTypes.count("edgeType_" + toString(counter)) != 0) {
688 counter++;
689 }
690 return ("edgeType_" + toString(counter));
691}
692
693
694GNEEdge*
695GNENetHelper::AttributeCarriers::retrieveEdge(const std::string& id, bool hardFail) const {
696 auto it = myEdges.find(id);
697 if (it != myEdges.end()) {
698 return it->second;
699 }
700 if (hardFail) {
701 // If edge wasn't found, throw exception
702 throw UnknownElement("Attempted to retrieve non-existant edge " + id);
703 } else {
704 return nullptr;
705 }
706}
707
708
709std::vector<GNEEdge*>
711 if ((from == nullptr) || (to == nullptr)) {
712 throw UnknownElement("Junctions cannot be nullptr");
713 }
714 std::vector<GNEEdge*> edges;
715 // iterate over outgoing edges of from edge and check to junction
716 for (const auto& edgeTo : from->getGNEOutgoingEdges()) {
717 if (edgeTo->getToJunction() == to) {
718 edges.push_back(edgeTo);
719 }
720 }
721 return edges;
722}
723
724
725const std::map<std::string, GNEEdge*>&
727 return myEdges;
728}
729
730
731std::vector<GNEEdge*>
733 std::vector<GNEEdge*> result;
734 // returns edges depending of selection
735 for (const auto& edge : myEdges) {
736 if (edge.second->isAttributeCarrierSelected()) {
737 result.push_back(edge.second);
738 }
739 }
740 return result;
741}
742
743
744GNEEdge*
746 edge->incRef("GNENet::registerEdge");
747 edge->setResponsible(false);
748 // add edge to internal container of GNENet
749 myEdges[edge->getMicrosimID()] = edge;
750 myNumberOfNetworkElements++;
751 // insert all lanes
752 for (const auto& lane : edge->getChildLanes()) {
753 insertLane(lane);
754 }
755 // Add references into GNEJunctions
756 edge->getFromJunction()->addOutgoingGNEEdge(edge);
757 edge->getToJunction()->addIncomingGNEEdge(edge);
758 // update boundaries of both junctions (to remove it from Grid)
761 // update edge boundary
762 edge->updateCenteringBoundary(false);
763 // expand edge boundary
764 myNet->expandBoundary(edge->getCenteringBoundary());
765 // finally add edge into grid
766 myNet->addGLObjectIntoGrid(edge);
767 return edge;
768}
769
770
771void
775
776
777void
779 // make a copy of edges
780 auto edgeCopy = myEdges;
781 // clear edges
782 myEdges.clear();
783 // fill edges again
784 for (const auto& edge : edgeCopy) {
785 // update microsim ID
786 edge.second->setNetworkElementID(prefix + edge.first);
787 // insert in myEdges again
788 myEdges[prefix + edge.first] = edge.second;
789 }
790}
791
792
793std::string
795 // get edge prefix
796 const std::string edgePrefix = OptionsCont::getOptions().getString("prefix") + OptionsCont::getOptions().getString("edge-prefix");
797 // generate new ID
798 while (myEdges.count(edgePrefix + toString(myNet->getEdgeIDCounter())) != 0) {
799 myNet->getEdgeIDCounter()++;
800 }
801 return edgePrefix + toString(myNet->getEdgeIDCounter());
802}
803
804
805void
807 if (myEdges.count(edge->getID()) == 0) {
808 throw ProcessError(edge->getTagStr() + " with ID='" + edge->getID() + "' doesn't exist in AttributeCarriers.edge");
809 } else if (myEdges.count(newID) != 0) {
810 throw ProcessError("There is another " + edge->getTagStr() + " with new ID='" + newID + "' in myEdges");
811 } else {
812 // remove edge from container
813 myEdges.erase(edge->getNBEdge()->getID());
814 // rename in NetBuilder
815 myNet->getNetBuilder()->getEdgeCont().rename(edge->getNBEdge(), newID);
816 // update microsim ID
817 edge->setEdgeID(newID);
818 // add it into myEdges again
819 myEdges[edge->getID()] = edge;
820 // rename all connections related to this edge
821 for (const auto& lane : edge->getChildLanes()) {
822 lane->updateConnectionIDs();
823 }
824 // net has to be saved
825 myNet->getSavingStatus()->requireSaveNetwork();
826 }
827}
828
829
830int
832 int counter = 0;
833 for (const auto& edge : myEdges) {
834 if (edge.second->isAttributeCarrierSelected()) {
835 counter++;
836 }
837 }
838 return counter;
839}
840
841
842GNELane*
843GNENetHelper::AttributeCarriers::retrieveLane(const std::string& id, bool hardFail, bool checkVolatileChange) const {
844 const std::string edge_id = SUMOXMLDefinitions::getEdgeIDFromLane(id);
845 const GNEEdge* edge = retrieveEdge(edge_id, false);
846 if (edge != nullptr) {
847 GNELane* lane = nullptr;
848 // search lane in lane's edges
849 for (auto laneIt : edge->getChildLanes()) {
850 if (laneIt->getID() == id) {
851 lane = laneIt;
852 }
853 }
854 // throw exception or return nullptr if lane wasn't found
855 if (lane == nullptr) {
856 if (hardFail) {
857 // Throw exception if hardFail is enabled
858 throw UnknownElement(toString(SUMO_TAG_LANE) + " " + id);
859 }
860 } else {
861 // check if the recomputing with volatile option has changed the number of lanes (needed for additionals and demand elements)
862 if (checkVolatileChange && (myNet->getEdgesAndNumberOfLanes().count(edge_id) == 1) &&
863 myNet->getEdgesAndNumberOfLanes().at(edge_id) != (int)edge->getChildLanes().size()) {
864 return edge->getChildLanes().at(lane->getIndex() + 1);
865 }
866 return lane;
867 }
868 } else if (hardFail) {
869 // Throw exception if hardFail is enabled
870 throw UnknownElement(toString(SUMO_TAG_EDGE) + " " + edge_id);
871 }
872 return nullptr;
873}
874
875
876GNELane*
877GNENetHelper::AttributeCarriers::retrieveLane(const GUIGlObject* glObject, bool hardFail) const {
878 auto it = myLanes.find(glObject);
879 if (it != myLanes.end()) {
880 return it->second;
881 }
882 if (hardFail) {
883 // If junction wasn't found, throw exception
884 throw UnknownElement("Attempted to retrieve non-existant lane " + glObject->getMicrosimID());
885 } else {
886 return nullptr;
887 }
888}
889
890
891const std::unordered_map<const GUIGlObject*, GNELane*>&
893 return myLanes;
894}
895
896
897std::vector<GNELane*>
899 std::vector<GNELane*> result;
900 // returns lanes depending of selection
901 for (const auto& lane : myLanes) {
902 if (lane.second->isAttributeCarrierSelected()) {
903 result.push_back(lane.second);
904 }
905 }
906 return result;
907}
908
909
910int
912 int counter = 0;
913 for (const auto& lane : myLanes) {
914 if (lane.second->isAttributeCarrierSelected()) {
915 counter++;
916 }
917 }
918 return counter;
919}
920
921
923GNENetHelper::AttributeCarriers::retrieveConnection(const std::string& id, bool hardFail) const {
924 // iterate over connections
925 for (const auto& connection : myConnections) {
926 if (connection.second->getID() == id) {
927 return connection.second;
928 }
929 }
930 if (hardFail) {
931 // If POI wasn't found, throw exception
932 throw UnknownElement("Attempted to retrieve non-existant connection " + id);
933 } else {
934 return nullptr;
935 }
936}
937
938
941 auto it = myConnections.find(glObject);
942 if (it != myConnections.end()) {
943 return it->second;
944 }
945 if (hardFail) {
946 // If POI wasn't found, throw exception
947 throw UnknownElement("Attempted to retrieve non-existant connection " + glObject->getMicrosimID());
948 } else {
949 return nullptr;
950 }
951}
952
953
954const std::unordered_map<const GUIGlObject*, GNEConnection*>&
956 return myConnections;
957}
958
959
960std::vector<GNEConnection*>
962 std::vector<GNEConnection*> result;
963 // returns connections depending of selection
964 for (const auto& connection : myConnections) {
965 if (connection.second->isAttributeCarrierSelected()) {
966 result.push_back(connection.second);
967 }
968 }
969 return result;
970}
971
972
973int
975 int counter = 0;
976 for (const auto& connection : myConnections) {
977 if (connection.second->isAttributeCarrierSelected()) {
978 counter++;
979 }
980 }
981 return counter;
982}
983
984
987 auto it = myInternalLanes.find(glObject);
988 if (it != myInternalLanes.end()) {
989 return it->second;
990 }
991 if (hardFail) {
992 // If POI wasn't found, throw exception
993 throw UnknownElement("Attempted to retrieve non-existant internalLane " + glObject->getMicrosimID());
994 } else {
995 return nullptr;
996 }
997}
998
999
1001GNENetHelper::AttributeCarriers::retrieveAdditional(SumoXMLTag type, const std::string& id, bool hardFail) const {
1002 auto it = myAdditionalIDs.at(type).find(id);
1003 if (it != myAdditionalIDs.at(type).end()) {
1004 return it->second;
1005 }
1006 if (hardFail) {
1007 throw ProcessError("Attempted to retrieve non-existant additional (string)");
1008 } else {
1009 return nullptr;
1010 }
1011}
1012
1013
1015GNENetHelper::AttributeCarriers::retrieveAdditionals(const std::vector<SumoXMLTag> types, const std::string& id, bool hardFail) const {
1016 for (const auto& type : types) {
1017 auto it = myAdditionalIDs.at(type).find(id);
1018 if (it != myAdditionalIDs.at(type).end()) {
1019 return it->second;
1020 }
1021 }
1022 if (hardFail) {
1023 throw ProcessError("Attempted to retrieve non-existant additional (string)");
1024 } else {
1025 return nullptr;
1026 }
1027}
1028
1029
1032 // iterate over all additionals
1033 for (const auto& additionalTag : myAdditionals) {
1034 auto it = additionalTag.second.find(glObject);
1035 if (it != additionalTag.second.end()) {
1036 return it->second;
1037 }
1038 }
1039 if (hardFail) {
1040 throw ProcessError("Attempted to retrieve non-existant additional (glObject)");
1041 } else {
1042 return nullptr;
1043 }
1044}
1045
1046
1048GNENetHelper::AttributeCarriers::retrieveRerouterInterval(const std::string& rerouterID, const SUMOTime begin, const SUMOTime end) const {
1049 // first retrieve rerouter
1050 const GNEAdditional* rerouter = retrieveAdditional(SUMO_TAG_REROUTER, rerouterID);
1051 // parse begin and end
1052 const std::string beginStr = time2string(begin);
1053 const std::string endStr = time2string(end);
1054 // now iterate over all children and check begin and end
1055 for (const auto& interval : rerouter->getChildAdditionals()) {
1056 // check tag (to avoid symbols)
1057 if (interval->getTagProperty()->getTag() == SUMO_TAG_INTERVAL) {
1058 // check begin and end
1059 if ((interval->getAttribute(SUMO_ATTR_BEGIN) == beginStr) &&
1060 (interval->getAttribute(SUMO_ATTR_END) == endStr)) {
1061 return interval;
1062 }
1063 }
1064 }
1065 // throw exception
1066 throw ProcessError("Attempted to retrieve non-existant rerouter interval");
1067}
1068
1069
1070const std::unordered_map<SumoXMLTag, std::unordered_map<const GUIGlObject*, GNEAdditional*>, std::hash<int> >&
1072 return myAdditionals;
1073}
1074
1075
1076std::vector<GNEAdditional*>
1078 std::vector<GNEAdditional*> result;
1079 // returns additionals depending of selection
1080 for (const auto& additionalsTags : myAdditionals) {
1081 for (const auto& additional : additionalsTags.second) {
1082 if (additional.second->isAttributeCarrierSelected()) {
1083 result.push_back(additional.second);
1084 }
1085 }
1086 }
1087 return result;
1088}
1089
1090
1091std::vector<GNEAdditional*>
1093 std::vector<GNEAdditional*> result;
1094 // returns additionals depending of selection
1095 for (const auto& additionalsTags : myAdditionals) {
1096 for (const auto& additional : additionalsTags.second) {
1097 if (additional.second->getTagProperty()->isShapeElement() && additional.second->isAttributeCarrierSelected()) {
1098 result.push_back(additional.second);
1099 }
1100 }
1101 }
1102 return result;
1103}
1104
1105
1106int
1108 int counter = 0;
1109 for (const auto& additionalsTag : myAdditionals) {
1110 counter += (int)additionalsTag.second.size();
1111 }
1112 return counter;
1113}
1114
1115
1116void
1118 // clear elements in grid
1119 for (const auto& additionalsTags : myAdditionals) {
1120 for (const auto& additional : additionalsTags.second) {
1121 myNet->removeGLObjectFromGrid(additional.second);
1122 }
1123 }
1124 // iterate over myAdditionals and clear all additionals
1125 for (auto& additionals : myAdditionals) {
1126 additionals.second.clear();
1127 }
1128 for (auto& additionals : myAdditionalIDs) {
1129 additionals.second.clear();
1130 }
1131}
1132
1133
1134void
1136 const auto tag = additional->getTagProperty()->getTag();
1137 const auto it = myAdditionalIDs.at(tag).find(additional->getID());
1138 if (it == myAdditionalIDs.at(tag).end()) {
1139 throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' doesn't exist in AttributeCarriers.additionals");
1140 } else {
1141 // remove from container, set new Id, and insert it again
1142 myAdditionalIDs.at(tag).erase(it);
1143 // set microsim ID
1144 additional->setMicrosimID(newID);
1145 myAdditionalIDs.at(tag)[newID] = additional;
1146 }
1147}
1148
1149
1150std::string
1152 // obtain option container
1153 const auto& neteditOptions = OptionsCont::getOptions();
1154 // get prefix
1155 std::string prefix;
1156 if (tag == SUMO_TAG_BUS_STOP) {
1157 prefix = neteditOptions.getString("busStop-prefix");
1158 } else if (tag == SUMO_TAG_TRAIN_STOP) {
1159 prefix = neteditOptions.getString("trainStop-prefix");
1160 } else if (tag == SUMO_TAG_CONTAINER_STOP) {
1161 prefix = neteditOptions.getString("containerStop-prefix");
1162 } else if (tag == SUMO_TAG_CHARGING_STATION) {
1163 prefix = neteditOptions.getString("chargingStation-prefix");
1164 } else if (tag == SUMO_TAG_PARKING_AREA) {
1165 prefix = neteditOptions.getString("parkingArea-prefix");
1166 } else if (tag == SUMO_TAG_INDUCTION_LOOP) {
1167 prefix = neteditOptions.getString("e1Detector-prefix");
1168 } else if ((tag == SUMO_TAG_LANE_AREA_DETECTOR) || (tag == GNE_TAG_MULTI_LANE_AREA_DETECTOR)) {
1169 prefix = neteditOptions.getString("e2Detector-prefix");
1170 } else if (tag == SUMO_TAG_ENTRY_EXIT_DETECTOR) {
1171 prefix = neteditOptions.getString("e3Detector-prefix");
1172 } else if (tag == SUMO_TAG_INSTANT_INDUCTION_LOOP) {
1173 prefix = neteditOptions.getString("e1InstantDetector-prefix");
1174 } else if (tag == SUMO_TAG_REROUTER) {
1175 prefix = neteditOptions.getString("rerouter-prefix");
1176 } else if ((tag == SUMO_TAG_CALIBRATOR) || (tag == GNE_TAG_CALIBRATOR_LANE)) {
1177 prefix = neteditOptions.getString("calibrator-prefix");
1178 } else if (tag == SUMO_TAG_ROUTEPROBE) {
1179 prefix = neteditOptions.getString("routeProbe-prefix");
1180 } else if (tag == SUMO_TAG_VSS) {
1181 prefix = neteditOptions.getString("vss-prefix");
1182 } else if (tag == SUMO_TAG_TRACTION_SUBSTATION) {
1183 prefix = neteditOptions.getString("tractionSubstation-prefix");
1184 } else if (tag == SUMO_TAG_OVERHEAD_WIRE_SECTION) {
1185 prefix = neteditOptions.getString("overheadWire-prefix");
1186 } else if (tag == SUMO_TAG_POLY) {
1187 prefix = neteditOptions.getString("polygon-prefix");
1188 } else if ((tag == SUMO_TAG_POI) || (tag == GNE_TAG_POILANE) || (tag == GNE_TAG_POIGEO)) {
1189 prefix = neteditOptions.getString("poi-prefix");
1190 } else if (tag == SUMO_TAG_TAZ) {
1191 prefix = toString(SUMO_TAG_TAZ);
1192 } else if (tag == GNE_TAG_JPS_WALKABLEAREA) {
1193 prefix = neteditOptions.getString("jps.walkableArea-prefix");
1194 } else if (tag == GNE_TAG_JPS_OBSTACLE) {
1195 prefix = neteditOptions.getString("jps.obstacle-prefix");
1196 }
1197 int counter = 0;
1198 // check namespaces
1199 if (std::find(NamespaceIDs::busStops.begin(), NamespaceIDs::busStops.end(), tag) != NamespaceIDs::busStops.end()) {
1200 while (retrieveAdditionals(NamespaceIDs::busStops, prefix + "_" + toString(counter), false) != nullptr) {
1201 counter++;
1202 }
1203 } else if (std::find(NamespaceIDs::calibrators.begin(), NamespaceIDs::calibrators.end(), tag) != NamespaceIDs::calibrators.end()) {
1204 while (retrieveAdditionals(NamespaceIDs::calibrators, prefix + "_" + toString(counter), false) != nullptr) {
1205 counter++;
1206 }
1207 } else if (std::find(NamespaceIDs::polygons.begin(), NamespaceIDs::polygons.end(), tag) != NamespaceIDs::polygons.end()) {
1208 while (retrieveAdditionals(NamespaceIDs::polygons, prefix + "_" + toString(counter), false) != nullptr) {
1209 counter++;
1210 }
1211 } else if (std::find(NamespaceIDs::POIs.begin(), NamespaceIDs::POIs.end(), tag) != NamespaceIDs::POIs.end()) {
1212 while (retrieveAdditionals(NamespaceIDs::POIs, prefix + "_" + toString(counter), false) != nullptr) {
1213 counter++;
1214 }
1215 } else if (std::find(NamespaceIDs::laneAreaDetectors.begin(), NamespaceIDs::laneAreaDetectors.end(), tag) != NamespaceIDs::laneAreaDetectors.end()) {
1216 while (retrieveAdditionals(NamespaceIDs::laneAreaDetectors, prefix + "_" + toString(counter), false) != nullptr) {
1217 counter++;
1218 }
1219 } else {
1220 while (retrieveAdditional(tag, prefix + "_" + toString(counter), false) != nullptr) {
1221 counter++;
1222 }
1223 }
1224 // return new element ID
1225 return (prefix + "_" + toString(counter));
1226}
1227
1228
1229int
1231 int counter = 0;
1232 for (const auto& additionalsTags : myAdditionals) {
1233 for (const auto& additional : additionalsTags.second) {
1234 if (additional.second->isAttributeCarrierSelected()) {
1235 counter++;
1236 }
1237 }
1238 }
1239 return counter;
1240}
1241
1242
1243int
1245 return getNumberOfSelectedAdditionals() -
1246 // shapes
1247 getNumberOfSelectedPolygons() - getNumberOfSelectedPOIs() -
1248 // JuPedSims
1249 getNumberOfSelectedJpsWalkableAreas() - getNumberOfSelectedJpsObstacles() -
1250 // TAZ
1251 getNumberOfSelectedTAZs() -
1252 // wires
1253 getNumberOfSelectedWires();
1254}
1255
1256
1257int
1259 int counter = 0;
1260 for (const auto& poly : myAdditionals.at(SUMO_TAG_POLY)) {
1261 if (poly.second->isAttributeCarrierSelected()) {
1262 counter++;
1263 }
1264 }
1265 return counter;
1266}
1267
1268
1269int
1271 int counter = 0;
1272 for (const auto& walkableArea : myAdditionals.at(GNE_TAG_JPS_WALKABLEAREA)) {
1273 if (walkableArea.second->isAttributeCarrierSelected()) {
1274 counter++;
1275 }
1276 }
1277 return counter;
1278}
1279
1280
1281int
1283 int counter = 0;
1284 for (const auto& obstacle : myAdditionals.at(GNE_TAG_JPS_OBSTACLE)) {
1285 if (obstacle.second->isAttributeCarrierSelected()) {
1286 counter++;
1287 }
1288 }
1289 return counter;
1290}
1291
1292
1293int
1295 int counter = 0;
1296 for (const auto& POI : myAdditionals.at(SUMO_TAG_POI)) {
1297 if (POI.second->isAttributeCarrierSelected()) {
1298 counter++;
1299 }
1300 }
1301 for (const auto& POILane : myAdditionals.at(GNE_TAG_POILANE)) {
1302 if (POILane.second->isAttributeCarrierSelected()) {
1303 counter++;
1304 }
1305 }
1306 for (const auto& POIGEO : myAdditionals.at(GNE_TAG_POIGEO)) {
1307 if (POIGEO.second->isAttributeCarrierSelected()) {
1308 counter++;
1309 }
1310 }
1311 return counter;
1312}
1313
1314
1315std::vector<std::string>
1317 std::set<std::string> keys;
1318 for (const auto& POI : myAdditionals.at(SUMO_TAG_POI)) {
1319 for (const auto& parameter : POI.second->getParameters()->getParametersMap()) {
1320 keys.insert(parameter.first);
1321 }
1322 }
1323 for (const auto& POILane : myAdditionals.at(GNE_TAG_POILANE)) {
1324 for (const auto& parameter : POILane.second->getParameters()->getParametersMap()) {
1325 keys.insert(parameter.first);
1326 }
1327 }
1328 for (const auto& POIGEO : myAdditionals.at(GNE_TAG_POIGEO)) {
1329 for (const auto& parameter : POIGEO.second->getParameters()->getParametersMap()) {
1330 keys.insert(parameter.first);
1331 }
1332 }
1333 return std::vector<std::string>(keys.begin(), keys.end());
1334}
1335
1336
1337int
1339 int counter = 0;
1340 for (const auto& TAZ : myAdditionals.at(SUMO_TAG_TAZ)) {
1341 if (TAZ.second->isAttributeCarrierSelected()) {
1342 counter++;
1343 }
1344 }
1345 return counter;
1346}
1347
1348
1349int
1351 int counter = 0;
1352 for (const auto& additionalsTags : myAdditionals) {
1353 for (const auto& additional : additionalsTags.second) {
1354 if (additional.second->isAttributeCarrierSelected() && additional.second->getTagProperty()->isWireElement()) {
1355 counter++;
1356 }
1357 }
1358 }
1359 return counter;
1360}
1361
1362
1365 // iterate over all demand elements
1366 for (const auto& TAZSourceSinkTag : myTAZSourceSinks) {
1367 auto it = TAZSourceSinkTag.second.find(sourceSink);
1368 if (it != TAZSourceSinkTag.second.end()) {
1369 return it->second;
1370 }
1371 }
1372 if (hardFail) {
1373 throw ProcessError("Attempted to retrieve non-existant sourceSink (glObject)");
1374 } else {
1375 return nullptr;
1376 }
1377}
1378
1379
1380const std::unordered_map<SumoXMLTag, std::unordered_map<const GNEAttributeCarrier*, GNETAZSourceSink*>, std::hash<int> >&
1382 return myTAZSourceSinks;
1383}
1384
1385
1386int
1388 int counter = 0;
1389 for (const auto& sourceSinksTag : myTAZSourceSinks) {
1390 counter += (int)sourceSinksTag.second.size();
1391 }
1392 return counter;
1393}
1394
1395
1396void
1398 // iterate over myTAZSourceSinks and clear all sourceSinks
1399 for (auto& sourceSinksTags : myTAZSourceSinks) {
1400 sourceSinksTags.second.clear();
1401 }
1402}
1403
1404
1406GNENetHelper::AttributeCarriers::retrieveDemandElement(SumoXMLTag type, const std::string& id, bool hardFail) const {
1407 auto it = myDemandElementIDs.at(type).find(id);
1408 if (it != myDemandElementIDs.at(type).end()) {
1409 return it->second;
1410 }
1411 if (hardFail) {
1412 throw ProcessError("Attempted to retrieve non-existant demand element (string)");
1413 } else {
1414 return nullptr;
1415 }
1416}
1417
1418
1420GNENetHelper::AttributeCarriers::retrieveDemandElements(std::vector<SumoXMLTag> types, const std::string& id, bool hardFail) const {
1421 for (const auto& type : types) {
1422 auto it = myDemandElementIDs.at(type).find(id);
1423 if (it != myDemandElementIDs.at(type).end()) {
1424 return it->second;
1425 }
1426 }
1427 if (hardFail) {
1428 throw ProcessError("Attempted to retrieve non-existant demand element (string)");
1429 } else {
1430 return nullptr;
1431 }
1432}
1433
1434
1437 // iterate over all demand elements
1438 for (const auto& demandElementTag : myDemandElements) {
1439 auto it = demandElementTag.second.find(glObject);
1440 if (it != demandElementTag.second.end()) {
1441 return it->second;
1442 }
1443 }
1444 if (hardFail) {
1445 throw ProcessError("Attempted to retrieve non-existant demandElement (glObject)");
1446 } else {
1447 return nullptr;
1448 }
1449}
1450
1451
1452std::vector<GNEDemandElement*>
1454 std::vector<GNEDemandElement*> result;
1455 // returns demand elements depending of selection
1456 for (const auto& demandElementTag : myDemandElements) {
1457 for (const auto& demandElement : demandElementTag.second) {
1458 if (demandElement.second->isAttributeCarrierSelected()) {
1459 result.push_back(demandElement.second);
1460 }
1461 }
1462 }
1463 return result;
1464}
1465
1466
1467const std::unordered_map<SumoXMLTag, std::unordered_map<const GUIGlObject*, GNEDemandElement*>, std::hash<int> >&
1469 return myDemandElements;
1470}
1471
1472
1473std::string
1475 // obtain option container
1476 const auto& neteditOptions = OptionsCont::getOptions();
1477 // get tag property
1478 const auto tagProperty = myNet->getTagPropertiesDatabase()->getTagProperty(tag, true);
1479 // get prefix
1480 std::string prefix;
1481 if (tag == SUMO_TAG_ROUTE) {
1482 prefix = neteditOptions.getString("route-prefix");
1483 } else if (tag == SUMO_TAG_ROUTE_DISTRIBUTION) {
1484 prefix = neteditOptions.getString("routeDistribution-prefix");
1485 } else if (tag == SUMO_TAG_VTYPE) {
1486 prefix = neteditOptions.getString("vType-prefix");
1487 } else if (tag == SUMO_TAG_VTYPE_DISTRIBUTION) {
1488 prefix = neteditOptions.getString("vTypeDistribution-prefix");
1489 } else if ((tag == SUMO_TAG_TRIP) || (tag == GNE_TAG_TRIP_JUNCTIONS) || (tag == GNE_TAG_TRIP_TAZS)) {
1490 prefix = neteditOptions.getString("trip-prefix");
1491 } else if (tagProperty->isVehicle() && !tagProperty->isFlow()) {
1492 prefix = neteditOptions.getString("vehicle-prefix");
1493 } else if (tagProperty->isPerson()) {
1494 if (tagProperty->isFlow()) {
1495 prefix = neteditOptions.getString("personflow-prefix");
1496 } else {
1497 prefix = neteditOptions.getString("person-prefix");
1498 }
1499 } else if (tagProperty->isContainer()) {
1500 if (tagProperty->isFlow()) {
1501 prefix = neteditOptions.getString("containerflow-prefix");
1502 } else {
1503 prefix = neteditOptions.getString("container-prefix");
1504 }
1505 } else if (tagProperty->isFlow()) {
1506 prefix = neteditOptions.getString("flow-prefix");
1507 }
1508 // declare counter
1509 int counter = 0;
1510 if (std::find(NamespaceIDs::types.begin(), NamespaceIDs::types.end(), tag) != NamespaceIDs::types.end()) {
1511 while (retrieveDemandElements(NamespaceIDs::types, prefix + "_" + toString(counter), false) != nullptr) {
1512 counter++;
1513 }
1514 } else if (std::find(NamespaceIDs::routes.begin(), NamespaceIDs::routes.end(), tag) != NamespaceIDs::routes.end()) {
1515 while (retrieveDemandElements(NamespaceIDs::routes, prefix + "_" + toString(counter), false) != nullptr) {
1516 counter++;
1517 }
1518 } else if (std::find(NamespaceIDs::persons.begin(), NamespaceIDs::persons.end(), tag) != NamespaceIDs::persons.end()) {
1519 while (retrieveDemandElements(NamespaceIDs::persons, prefix + "_" + toString(counter), false) != nullptr) {
1520 counter++;
1521 }
1522 } else if (std::find(NamespaceIDs::containers.begin(), NamespaceIDs::containers.end(), tag) != NamespaceIDs::containers.end()) {
1523 while (retrieveDemandElements(NamespaceIDs::containers, prefix + "_" + toString(counter), false) != nullptr) {
1524 counter++;
1525 }
1526 } else if (std::find(NamespaceIDs::vehicles.begin(), NamespaceIDs::vehicles.end(), tag) != NamespaceIDs::vehicles.end()) {
1527 while (retrieveDemandElements(NamespaceIDs::vehicles, prefix + "_" + toString(counter), false) != nullptr) {
1528 counter++;
1529 }
1530 } else {
1531 while (retrieveDemandElement(tag, prefix + "_" + toString(counter), false) != nullptr) {
1532 counter++;
1533 }
1534 }
1535 // return new element ID
1536 return (prefix + "_" + toString(counter));
1537
1538}
1539
1540
1543 auto it = myDemandElementIDs.at(SUMO_TAG_VTYPE).find(DEFAULT_VTYPE_ID);
1544 if (it != myDemandElementIDs.at(SUMO_TAG_VTYPE).end()) {
1545 return it->second;
1546 }
1547 throw ProcessError(TL("Default vType doesn't exist"));
1548}
1549
1550
1551void
1553 // clear elements in grid
1554 for (const auto& demandElementsTags : myDemandElements) {
1555 for (const auto& demandElement : demandElementsTags.second) {
1556 myNet->removeGLObjectFromGrid(demandElement.second);
1557 }
1558 }
1559 // iterate over myDemandElements and clear all demand elements
1560 for (auto& demandElements : myDemandElements) {
1561 demandElements.second.clear();
1562 }
1563 for (auto& demandElements : myDemandElementIDs) {
1564 demandElements.second.clear();
1565 }
1566}
1567
1568
1569void
1571 const auto tag = demandElement->getTagProperty()->getTag();
1572 const auto it = myDemandElementIDs.at(tag).find(demandElement->getID());
1573 if (it == myDemandElementIDs.at(tag).end()) {
1574 throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' doesn't exist in AttributeCarriers.demandElements");
1575 } else {
1576 // remove from container, set new Id, and insert it again
1577 myDemandElementIDs.at(tag).erase(it);
1578 // set microsim ID
1579 demandElement->setMicrosimID(newID);
1580 myDemandElementIDs.at(tag)[newID] = demandElement;
1581 }
1582}
1583
1584
1585void
1587 // Create default vehicle Type (it has to be created here due myViewNet was previously nullptr)
1588 GNEVType* defaultVehicleType = new GNEVType(DEFAULT_VTYPE_ID, myNet, SVC_PASSENGER);
1589 myDemandElements.at(defaultVehicleType->getTagProperty()->getTag()).insert(std::make_pair(defaultVehicleType->getGUIGlObject(), defaultVehicleType));
1590 myDemandElementIDs.at(defaultVehicleType->getTagProperty()->getTag()).insert(std::make_pair(defaultVehicleType->getID(), defaultVehicleType));
1591 defaultVehicleType->incRef("GNENet::DEFAULT_VEHTYPE");
1592
1593 // Create default Bike Type (it has to be created here due myViewNet was previously nullptr)
1594 GNEVType* defaultBikeType = new GNEVType(DEFAULT_BIKETYPE_ID, myNet, SVC_BICYCLE);
1595 myDemandElements.at(defaultBikeType->getTagProperty()->getTag()).insert(std::make_pair(defaultBikeType->getGUIGlObject(), defaultBikeType));
1596 myDemandElementIDs.at(defaultBikeType->getTagProperty()->getTag()).insert(std::make_pair(defaultBikeType->getID(), defaultBikeType));
1597 defaultBikeType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1598 defaultBikeType->incRef("GNENet::DEFAULT_BIKETYPE_ID");
1599
1600 // Create default taxi Type (it has to be created here due myViewNet was previously nullptr)
1601 GNEVType* defaultTaxiType = new GNEVType(DEFAULT_TAXITYPE_ID, myNet, SVC_TAXI);
1602 myDemandElements.at(defaultTaxiType->getTagProperty()->getTag()).insert(std::make_pair(defaultTaxiType->getGUIGlObject(), defaultTaxiType));
1603 myDemandElementIDs.at(defaultTaxiType->getTagProperty()->getTag()).insert(std::make_pair(defaultTaxiType->getID(), defaultTaxiType));
1604 defaultTaxiType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1605 defaultTaxiType->incRef("GNENet::DEFAULT_TAXITYPE_ID");
1606
1607 // Create default rail Type (it has to be created here due myViewNet was previously nullptr)
1608 GNEVType* defaultRailType = new GNEVType(DEFAULT_RAILTYPE_ID, myNet, SVC_RAIL);
1609 myDemandElements.at(defaultRailType->getTagProperty()->getTag()).insert(std::make_pair(defaultRailType->getGUIGlObject(), defaultRailType));
1610 myDemandElementIDs.at(defaultRailType->getTagProperty()->getTag()).insert(std::make_pair(defaultRailType->getID(), defaultRailType));
1611 defaultRailType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1612 defaultRailType->incRef("GNENet::DEFAULT_RAILTYPE_ID");
1613
1614 // Create default person Type (it has to be created here due myViewNet was previously nullptr)
1615 GNEVType* defaultPersonType = new GNEVType(DEFAULT_PEDTYPE_ID, myNet, SVC_PEDESTRIAN);
1616 myDemandElements.at(defaultPersonType->getTagProperty()->getTag()).insert(std::make_pair(defaultPersonType->getGUIGlObject(), defaultPersonType));
1617 myDemandElementIDs.at(defaultPersonType->getTagProperty()->getTag()).insert(std::make_pair(defaultPersonType->getID(), defaultPersonType));
1618 defaultPersonType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1619 defaultPersonType->incRef("GNENet::DEFAULT_PEDTYPE_ID");
1620
1621 // Create default container Type (it has to be created here due myViewNet was previously nullptr)
1622 GNEVType* defaultContainerType = new GNEVType(DEFAULT_CONTAINERTYPE_ID, myNet, SVC_IGNORING);
1623 myDemandElements.at(defaultContainerType->getTagProperty()->getTag()).insert(std::make_pair(defaultContainerType->getGUIGlObject(), defaultContainerType));
1624 myDemandElementIDs.at(defaultContainerType->getTagProperty()->getTag()).insert(std::make_pair(defaultContainerType->getID(), defaultContainerType));
1625 defaultContainerType->parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
1626 defaultContainerType->incRef("GNENet::DEFAULT_CONTAINERTYPE_ID");
1627}
1628
1629
1630int
1632 return myStopIndex++;
1633}
1634
1635
1636int
1638 int counter = 0;
1639 for (const auto& demandElementsTags : myDemandElements) {
1640 for (const auto& demandElement : demandElementsTags.second) {
1641 if (demandElement.second->isAttributeCarrierSelected()) {
1642 counter++;
1643 }
1644 }
1645 }
1646 return counter;
1647}
1648
1649
1650int
1652 int counter = 0;
1653 // iterate over routes
1654 for (const auto& route : myDemandElements.at(SUMO_TAG_ROUTE)) {
1655 if (route.second->isAttributeCarrierSelected()) {
1656 counter++;
1657 }
1658 }
1659 // iterate over vehicles with embedded routes
1660 for (const auto& vehicle : myDemandElements.at(GNE_TAG_VEHICLE_WITHROUTE)) {
1661 if (vehicle.second->getChildDemandElements().front()->isAttributeCarrierSelected()) {
1662 counter++;
1663 }
1664 }
1665 for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_WITHROUTE)) {
1666 if (flow.second->getChildDemandElements().front()->isAttributeCarrierSelected()) {
1667 counter++;
1668 }
1669 }
1670 return counter;
1671}
1672
1673
1674int
1676 int counter = 0;
1677 // iterate over all vehicles and flows
1678 for (const auto& vehicle : myDemandElements.at(SUMO_TAG_VEHICLE)) {
1679 if (vehicle.second->isAttributeCarrierSelected()) {
1680 counter++;
1681 }
1682 }
1683 for (const auto& trip : myDemandElements.at(SUMO_TAG_TRIP)) {
1684 if (trip.second->isAttributeCarrierSelected()) {
1685 counter++;
1686 }
1687 }
1688 for (const auto& vehicle : myDemandElements.at(GNE_TAG_VEHICLE_WITHROUTE)) {
1689 if (vehicle.second->isAttributeCarrierSelected()) {
1690 counter++;
1691 }
1692 }
1693 for (const auto& flow : myDemandElements.at(SUMO_TAG_FLOW)) {
1694 if (flow.second->isAttributeCarrierSelected()) {
1695 counter++;
1696 }
1697 }
1698 for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_ROUTE)) {
1699 if (flow.second->isAttributeCarrierSelected()) {
1700 counter++;
1701 }
1702 }
1703 for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_WITHROUTE)) {
1704 if (flow.second->isAttributeCarrierSelected()) {
1705 counter++;
1706 }
1707 }
1708 return counter;
1709}
1710
1711
1712int
1714 int counter = 0;
1715 // iterate over all persons
1716 for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1717 if (person.second->isAttributeCarrierSelected()) {
1718 counter++;
1719 }
1720 }
1721 for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1722 if (personFlow.second->isAttributeCarrierSelected()) {
1723 counter++;
1724 }
1725 }
1726 return counter;
1727}
1728
1729
1730int
1732 int counter = 0;
1733 // iterate over all person plans
1734 for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1735 for (const auto& personPlan : person.second->getChildDemandElements()) {
1736 if (personPlan->getTagProperty()->isPlanPersonTrip() && personPlan->isAttributeCarrierSelected()) {
1737 counter++;
1738 }
1739 }
1740 }
1741 for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1742 for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1743 if (personPlan->getTagProperty()->isPlanPersonTrip() && personPlan->isAttributeCarrierSelected()) {
1744 counter++;
1745 }
1746 }
1747 }
1748 return counter;
1749}
1750
1751
1752int
1754 int counter = 0;
1755 // iterate over all person plans
1756 for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1757 for (const auto& personPlan : person.second->getChildDemandElements()) {
1758 if (personPlan->getTagProperty()->isPlanWalk() && personPlan->isAttributeCarrierSelected()) {
1759 counter++;
1760 }
1761 }
1762 }
1763 for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1764 for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1765 if (personPlan->getTagProperty()->isPlanWalk() && personPlan->isAttributeCarrierSelected()) {
1766 counter++;
1767 }
1768 }
1769 }
1770 return counter;
1771}
1772
1773
1774int
1776 int counter = 0;
1777 // iterate over all person plans
1778 for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1779 for (const auto& personPlan : person.second->getChildDemandElements()) {
1780 if (personPlan->getTagProperty()->isPlanRide() && personPlan->isAttributeCarrierSelected()) {
1781 counter++;
1782 }
1783 }
1784 }
1785 for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1786 for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1787 if (personPlan->getTagProperty()->isPlanRide() && personPlan->isAttributeCarrierSelected()) {
1788 counter++;
1789 }
1790 }
1791 }
1792 return counter;
1793}
1794
1795
1796int
1798 int counter = 0;
1799 // iterate over all containers
1800 for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1801 if (container.second->isAttributeCarrierSelected()) {
1802 counter++;
1803 }
1804 }
1805 for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1806 if (containerFlow.second->isAttributeCarrierSelected()) {
1807 counter++;
1808 }
1809 }
1810 return counter;
1811}
1812
1813
1814int
1816 int counter = 0;
1817 // iterate over all container plans
1818 for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1819 for (const auto& containerPlan : container.second->getChildDemandElements()) {
1820 if (containerPlan->getTagProperty()->isPlanTransport() && containerPlan->isAttributeCarrierSelected()) {
1821 counter++;
1822 }
1823 }
1824 }
1825 for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1826 for (const auto& containerPlan : containerFlow.second->getChildDemandElements()) {
1827 if (containerPlan->getTagProperty()->isPlanTransport() && containerPlan->isAttributeCarrierSelected()) {
1828 counter++;
1829 }
1830 }
1831 }
1832 return counter;
1833}
1834
1835
1836int
1838 int counter = 0;
1839 // iterate over all container plans
1840 for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1841 for (const auto& containerPlan : container.second->getChildDemandElements()) {
1842 if (containerPlan->getTagProperty()->isPlanTranship() && containerPlan->isAttributeCarrierSelected()) {
1843 counter++;
1844 }
1845 }
1846 }
1847 for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1848 for (const auto& containerPlan : containerFlow.second->getChildDemandElements()) {
1849 if (containerPlan->getTagProperty()->isPlanTranship() && containerPlan->isAttributeCarrierSelected()) {
1850 counter++;
1851 }
1852 }
1853 }
1854 return counter;
1855}
1856
1857
1858int
1860 int counter = 0;
1861 // iterate over routes
1862 for (const auto& route : myDemandElements.at(SUMO_TAG_ROUTE)) {
1863 if (route.second->isAttributeCarrierSelected()) {
1864 counter++;
1865 }
1866 }
1867 // vehicles
1868 for (const auto& trip : myDemandElements.at(SUMO_TAG_TRIP)) {
1869 for (const auto& stop : trip.second->getChildDemandElements()) {
1870 if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1871 counter++;
1872 }
1873 }
1874 }
1875 for (const auto& vehicle : myDemandElements.at(GNE_TAG_VEHICLE_WITHROUTE)) {
1876 for (const auto& stop : vehicle.second->getChildDemandElements().front()->getChildDemandElements()) {
1877 if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1878 counter++;
1879 }
1880 }
1881 }
1882 for (const auto& flow : myDemandElements.at(SUMO_TAG_FLOW)) {
1883 for (const auto& stop : flow.second->getChildDemandElements()) {
1884 if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1885 counter++;
1886 }
1887 }
1888 }
1889 for (const auto& flow : myDemandElements.at(GNE_TAG_FLOW_WITHROUTE)) {
1890 for (const auto& stop : flow.second->getChildDemandElements().front()->getChildDemandElements()) {
1891 if (stop->getTagProperty()->isVehicleStop() && stop->isAttributeCarrierSelected()) {
1892 counter++;
1893 }
1894 }
1895 }
1896 // persons
1897 for (const auto& person : myDemandElements.at(SUMO_TAG_PERSON)) {
1898 for (const auto& personPlan : person.second->getChildDemandElements()) {
1899 if (personPlan->getTagProperty()->isPlanStopPerson() && personPlan->isAttributeCarrierSelected()) {
1900 counter++;
1901 }
1902 }
1903 }
1904 for (const auto& personFlow : myDemandElements.at(SUMO_TAG_PERSONFLOW)) {
1905 for (const auto& personPlan : personFlow.second->getChildDemandElements()) {
1906 if (personPlan->getTagProperty()->isPlanStopPerson() && personPlan->isAttributeCarrierSelected()) {
1907 counter++;
1908 }
1909 }
1910 }
1911 // containers
1912 for (const auto& container : myDemandElements.at(SUMO_TAG_CONTAINER)) {
1913 for (const auto& containerPlan : container.second->getChildDemandElements()) {
1914 if (containerPlan->getTagProperty()->isPlanStopContainer() && containerPlan->isAttributeCarrierSelected()) {
1915 counter++;
1916 }
1917 }
1918 }
1919 for (const auto& containerFlow : myDemandElements.at(SUMO_TAG_CONTAINERFLOW)) {
1920 for (const auto& containerPlan : containerFlow.second->getChildDemandElements()) {
1921 if (containerPlan->getTagProperty()->isPlanStopContainer() && containerPlan->isAttributeCarrierSelected()) {
1922 counter++;
1923 }
1924 }
1925 }
1926 return counter;
1927}
1928
1929
1931GNENetHelper::AttributeCarriers::retrieveDataSet(const std::string& id, bool hardFail) const {
1932 for (const auto& dataSet : myDataSets) {
1933 if (dataSet.second->getID() == id) {
1934 return dataSet.second;
1935 }
1936 }
1937 if (hardFail) {
1938 throw ProcessError("Attempted to retrieve non-existant data set");
1939 } else {
1940 return nullptr;
1941 }
1942}
1943
1944
1945const std::map<const std::string, GNEDataSet*>&
1947 return myDataSets;
1948}
1949
1950
1951std::string
1953 // get prefix
1954 const auto prefix = OptionsCont::getOptions().getString("dataSet-prefix");
1955 int counter = 0;
1956 while (retrieveDataSet(prefix + "_" + toString(counter), false) != nullptr) {
1957 counter++;
1958 }
1959 return (prefix + "_" + toString(counter));
1960}
1961
1962
1965 if (myDataIntervals.count(AC)) {
1966 return myDataIntervals.at(AC);
1967 } else if (hardFail) {
1968 throw ProcessError("Attempted to retrieve non-existant data interval");
1969 } else {
1970 return nullptr;
1971 }
1972}
1973
1974
1975const std::unordered_map<const GNEAttributeCarrier*, GNEDataInterval*>&
1977 return myDataIntervals;
1978}
1979
1980
1981void
1983 if (myDataIntervals.count(AC) > 0) {
1984 throw ProcessError(dataInterval->getTagStr() + " with ID='" + dataInterval->getID() + "' already exist");
1985 } else {
1986 myDataIntervals[AC] = dataInterval;
1987 }
1988 // mark interval toolbar for update
1989 myNet->getViewNet()->getIntervalBar().markForUpdate();
1990}
1991
1992
1993void
1995 const auto finder = myDataIntervals.find(dataInterval);
1996 if (finder == myDataIntervals.end()) {
1997 throw ProcessError(dataInterval->getTagStr() + " with ID='" + dataInterval->getID() + "' wasn't previously inserted");
1998 } else {
1999 myDataIntervals.erase(finder);
2000 }
2001 // remove it from inspected elements and GNEElementTree
2002 myNet->getViewNet()->getInspectedElements().uninspectAC(dataInterval);
2003 dataInterval->unmarkForDrawingFront();
2004 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(dataInterval);
2005 // mark interval toolbar for update
2006 myNet->getViewNet()->getIntervalBar().markForUpdate();
2007}
2008
2009
2012 // iterate over all genericDatas
2013 for (const auto& genericDataTag : myGenericDatas) {
2014 auto it = genericDataTag.second.find(glObject);
2015 if (it != genericDataTag.second.end()) {
2016 return it->second;
2017 }
2018 }
2019 if (hardFail) {
2020 throw ProcessError("Attempted to retrieve non-existant generic (glObject)");
2021 } else {
2022 return nullptr;
2023 }
2024}
2025
2026
2027std::vector<GNEGenericData*>
2029 std::vector<GNEGenericData*> result;
2030 // returns generic datas depending of selection
2031 for (const auto& genericDataTag : myGenericDatas) {
2032 for (const auto& genericData : genericDataTag.second) {
2033 if (genericData.second->isAttributeCarrierSelected()) {
2034 result.push_back(genericData.second);
2035 }
2036 }
2037 }
2038 return result;
2039}
2040
2041
2042const std::unordered_map<SumoXMLTag, std::unordered_map<const GUIGlObject*, GNEGenericData*>, std::hash<int> >&
2044 return myGenericDatas;
2045}
2046
2047
2048std::vector<GNEGenericData*>
2049GNENetHelper::AttributeCarriers::retrieveGenericDatas(const SumoXMLTag genericDataTag, const double begin, const double end) {
2050 // declare generic data vector
2051 std::vector<GNEGenericData*> genericDatas;
2052 // iterate over all data sets
2053 for (const auto& genericData : myGenericDatas.at(genericDataTag)) {
2054 // check interval
2055 if ((genericData.second->getDataIntervalParent()->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) &&
2056 (genericData.second->getDataIntervalParent()->getAttributeDouble(SUMO_ATTR_END) <= end)) {
2057 genericDatas.push_back(genericData.second);
2058 }
2059 }
2060 return genericDatas;
2061}
2062
2063
2064int
2066 int counter = 0;
2067 // iterate over all generic datas
2068 for (const auto& genericDataTag : myGenericDatas) {
2069 counter += (int)genericDataTag.second.size();
2070 }
2071 return counter;
2072}
2073
2074
2075int
2077 int counter = 0;
2078 // iterate over all edgeDatas
2079 for (const auto& genericData : myGenericDatas.at(GNE_TAG_EDGEREL_SINGLE)) {
2080 if (genericData.second->isAttributeCarrierSelected()) {
2081 counter++;
2082 }
2083 }
2084 return counter;
2085}
2086
2087
2088int
2090 int counter = 0;
2091 // iterate over all edgeDatas
2092 for (const auto& genericData : myGenericDatas.at(SUMO_TAG_EDGEREL)) {
2093 if (genericData.second->isAttributeCarrierSelected()) {
2094 counter++;
2095 }
2096 }
2097 return counter;
2098}
2099
2100
2101int
2103 int counter = 0;
2104 // iterate over all edgeDatas
2105 for (const auto& genericData : myGenericDatas.at(SUMO_TAG_TAZREL)) {
2106 if (genericData.second->isAttributeCarrierSelected()) {
2107 counter++;
2108 }
2109 }
2110 return counter;
2111}
2112
2113
2114void
2116 if (myGenericDatas.at(genericData->getTagProperty()->getTag()).count(genericData->getGUIGlObject()) > 0) {
2117 throw ProcessError(genericData->getTagStr() + " with ID='" + genericData->getID() + "' already exist");
2118 } else {
2119 myGenericDatas.at(genericData->getTagProperty()->getTag()).insert(std::make_pair(genericData->getGUIGlObject(), genericData));
2120 }
2121 // mark interval toolbar for update
2122 myNet->getViewNet()->getIntervalBar().markForUpdate();
2123}
2124
2125
2126void
2128 const auto finder = myGenericDatas.at(genericData->getTagProperty()->getTag()).find(genericData);
2129 if (finder == myGenericDatas.at(genericData->getTagProperty()->getTag()).end()) {
2130 throw ProcessError(genericData->getTagStr() + " with ID='" + genericData->getID() + "' wasn't previously inserted");
2131 } else {
2132 myGenericDatas.at(genericData->getTagProperty()->getTag()).erase(finder);
2133 }
2134 // remove it from inspected elements and GNEElementTree
2135 myNet->getViewNet()->getInspectedElements().uninspectAC(genericData);
2136 genericData->unmarkForDrawingFront();
2137 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(genericData);
2138 // delete path element
2139 myNet->getDataPathManager()->removePath(genericData);
2140 // mark interval toolbar for update
2141 myNet->getViewNet()->getIntervalBar().markForUpdate();
2142}
2143
2144
2145std::set<std::string>
2146GNENetHelper::AttributeCarriers::retrieveGenericDataParameters(const std::string& genericDataTag, const double begin, const double end) const {
2147 // declare solution
2148 std::set<std::string> attributesSolution;
2149 // declare generic data vector
2150 std::vector<GNEGenericData*> genericDatas;
2151 // iterate over all data sets
2152 for (const auto& interval : myDataIntervals) {
2153 // check interval
2154 if ((interval.second->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) && (interval.second->getAttributeDouble(SUMO_ATTR_END) <= end)) {
2155 // iterate over generic datas
2156 for (const auto& genericData : interval.second->getGenericDataChildren()) {
2157 if (genericDataTag.empty() || (genericData->getTagProperty()->getTagStr() == genericDataTag)) {
2158 genericDatas.push_back(genericData);
2159 }
2160 }
2161 }
2162 }
2163 // iterate over generic datas
2164 for (const auto& genericData : genericDatas) {
2165 for (const auto& attribute : genericData->getParametersMap()) {
2166 attributesSolution.insert(attribute.first);
2167 }
2168 }
2169 return attributesSolution;
2170}
2171
2172
2173std::set<std::string>
2174GNENetHelper::AttributeCarriers::retrieveGenericDataParameters(const std::string& dataSetID, const std::string& genericDataTag,
2175 const std::string& beginStr, const std::string& endStr) const {
2176 // declare solution
2177 std::set<std::string> attributesSolution;
2178 // vector of data sets and intervals
2179 std::vector<GNEDataSet*> dataSets;
2180 std::vector<GNEDataInterval*> dataIntervals;
2181 // get dataSet
2182 GNEDataSet* retrievedDataSet = retrieveDataSet(dataSetID, false);
2183 // if dataSetID is empty, return all parameters
2184 if (dataSetID.empty()) {
2185 // add all data sets
2186 dataSets.reserve(myDataSets.size());
2187 for (const auto& dataSet : myDataSets) {
2188 dataSets.push_back(dataSet.second);
2189 }
2190 } else if (retrievedDataSet) {
2191 dataSets.push_back(retrievedDataSet);
2192 } else {
2193 return attributesSolution;
2194 }
2195 // now continue with data intervals
2196 int numberOfIntervals = 0;
2197 for (const auto& dataSet : dataSets) {
2198 numberOfIntervals += (int)dataSet->getDataIntervalChildren().size();
2199 }
2200 // resize dataIntervals
2201 dataIntervals.reserve(numberOfIntervals);
2202 // add intervals
2203 for (const auto& dataSet : dataSets) {
2204 for (const auto& dataInterval : dataSet->getDataIntervalChildren()) {
2205 // continue depending of begin and end
2206 if (beginStr.empty() && endStr.empty()) {
2207 dataIntervals.push_back(dataInterval.second);
2208 } else if (endStr.empty()) {
2209 // parse begin
2210 const double begin = GNEAttributeCarrier::parse<double>(beginStr);
2211 if (dataInterval.second->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) {
2212 dataIntervals.push_back(dataInterval.second);
2213 }
2214 } else if (beginStr.empty()) {
2215 // parse end
2216 const double end = GNEAttributeCarrier::parse<double>(endStr);
2217 if (dataInterval.second->getAttributeDouble(SUMO_ATTR_END) <= end) {
2218 dataIntervals.push_back(dataInterval.second);
2219 }
2220 } else {
2221 // parse both begin end
2222 const double begin = GNEAttributeCarrier::parse<double>(beginStr);
2223 const double end = GNEAttributeCarrier::parse<double>(endStr);
2224 if ((dataInterval.second->getAttributeDouble(SUMO_ATTR_BEGIN) >= begin) &&
2225 (dataInterval.second->getAttributeDouble(SUMO_ATTR_END) <= end)) {
2226 dataIntervals.push_back(dataInterval.second);
2227 }
2228 }
2229 }
2230 }
2231 // finally iterate over intervals and get attributes
2232 for (const auto& dataInterval : dataIntervals) {
2233 for (const auto& genericData : dataInterval->getGenericDataChildren()) {
2234 // check generic data tag
2235 if (genericDataTag.empty() || (genericData->getTagProperty()->getTagStr() == genericDataTag)) {
2236 for (const auto& attribute : genericData->getParametersMap()) {
2237 attributesSolution.insert(attribute.first);
2238 }
2239 }
2240 }
2241 }
2242 return attributesSolution;
2243}
2244
2245
2247GNENetHelper::AttributeCarriers::retrieveMeanData(SumoXMLTag type, const std::string& id, bool hardFail) const {
2248 for (const auto& meanData : myMeanDatas.at(type)) {
2249 if (meanData.second->getID() == id) {
2250 return meanData.second;
2251 }
2252 }
2253 if (hardFail) {
2254 throw ProcessError("Attempted to retrieve non-existant meanData (string)");
2255 } else {
2256 return nullptr;
2257 }
2258}
2259
2260
2261const std::unordered_map<SumoXMLTag, std::map<const std::string, GNEMeanData*>, std::hash<int> >&
2263 return myMeanDatas;
2264}
2265
2266
2267int
2269 return myNumberOfMeanDataElements;
2270}
2271
2272
2273void
2275 // iterate over myMeanDatas and clear all meanDatas
2276 for (auto& meanDatas : myMeanDatas) {
2277 meanDatas.second.clear();
2278 }
2279}
2280
2281
2282void
2284 const auto tag = meanData->getTagProperty()->getTag();
2285 const auto it = myMeanDatas.at(tag).find(meanData->getID());
2286 if (it == myMeanDatas.at(tag).end()) {
2287 throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' doesn't exist in AttributeCarriers.meanDatas");
2288 } else {
2289 // remove from container, set new Id, and insert it again
2290 myMeanDatas.at(tag).erase(it);
2291 myMeanDatas.at(tag)[newID] = meanData;
2292 }
2293}
2294
2295
2296std::string
2298 // obtain option container
2299 const auto& neteditOptions = OptionsCont::getOptions();
2300 // get prefix
2301 std::string prefix;
2302 if (tag == SUMO_TAG_MEANDATA_EDGE) {
2303 prefix = neteditOptions.getString("meanDataEdge-prefix");
2304 } else if (tag == SUMO_TAG_MEANDATA_LANE) {
2305 prefix = neteditOptions.getString("meanDataLane-prefix");
2306 }
2307 int counter = 0;
2308 while (retrieveMeanData(tag, prefix + "_" + toString(counter), false) != nullptr) {
2309 counter++;
2310 }
2311 return (prefix + "_" + toString(counter));
2312}
2313
2314
2315void
2317 myNet->getNetBuilder()->getNodeCont().insert(junction->getNBNode());
2318 registerJunction(junction);
2319}
2320
2321
2322void
2324 // remove it from inspected elements and GNEElementTree
2325 myNet->getViewNet()->getInspectedElements().uninspectAC(junction);
2326 junction->unmarkForDrawingFront();
2327 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(junction);
2328 // Remove from grid and container
2329 myNet->removeGLObjectFromGrid(junction);
2330 myJunctions.erase(junction->getMicrosimID());
2331 myNumberOfNetworkElements--;
2332 myNet->getNetBuilder()->getNodeCont().extract(junction->getNBNode());
2333 junction->decRef("GNENet::deleteSingleJunction");
2334 junction->setResponsible(true);
2335}
2336
2337
2338void
2340 // get pointer to create edge frame
2341 const auto& createEdgeFrame = myNet->getViewNet()->getViewParent()->getCreateEdgeFrame();
2342 // insert in myEdgeTypes
2343 myEdgeTypes[edgeType->getMicrosimID()] = edgeType;
2344 myNumberOfNetworkElements++;
2345 // update edge selector
2346 if (myNet->getViewNet()->getViewParent()->getCreateEdgeFrame()->shown()) {
2347 myNet->getViewNet()->getViewParent()->getCreateEdgeFrame()->getEdgeTypeSelector()->refreshEdgeTypeSelector();
2348 }
2349 // set current edge type inspected
2350 createEdgeFrame->getEdgeTypeSelector()->setCurrentEdgeType(edgeType);
2351}
2352
2353
2354void
2356 // get pointer to create edge frame
2357 const auto& createEdgeFrame = myNet->getViewNet()->getViewParent()->getCreateEdgeFrame();
2358 // remove it from inspected elements and GNEElementTree
2359 myNet->getViewNet()->getInspectedElements().uninspectAC(edgeType);
2360 edgeType->unmarkForDrawingFront();
2361 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(edgeType);
2362 // remove from edge types
2363 myEdgeTypes.erase(edgeType->getMicrosimID());
2364 myNumberOfNetworkElements--;
2365 // check if this is the selected edge type in edgeSelector
2366 if (createEdgeFrame->getEdgeTypeSelector()->getEdgeTypeSelected() == edgeType) {
2367 createEdgeFrame->getEdgeTypeSelector()->clearEdgeTypeSelected();
2368 }
2369 // update edge selector
2370 createEdgeFrame->getEdgeTypeSelector()->refreshEdgeTypeSelector();
2371}
2372
2373
2374void
2376 NBEdge* nbe = edge->getNBEdge();
2377 myNet->getNetBuilder()->getEdgeCont().insert(nbe); // should we ignore pruning double edges?
2378 // if this edge was previouls extracted from the edgeContainer we have to rewire the nodes
2379 nbe->getFromNode()->addOutgoingEdge(nbe);
2380 nbe->getToNode()->addIncomingEdge(nbe);
2381 // register edge
2382 registerEdge(edge);
2383}
2384
2385
2386void
2388 // remove it from inspected elements and GNEElementTree
2389 myNet->getViewNet()->getInspectedElements().uninspectAC(edge);
2390 edge->unmarkForDrawingFront();
2391 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(edge);
2392 // remove edge from visual grid and container
2393 myNet->removeGLObjectFromGrid(edge);
2394 myEdges.erase(edge->getMicrosimID());
2395 myNumberOfNetworkElements--;
2396 // remove all lanes
2397 for (const auto& lane : edge->getChildLanes()) {
2398 deleteLane(lane);
2399 }
2400 // extract edge of district container
2401 myNet->getNetBuilder()->getEdgeCont().extract(myNet->getNetBuilder()->getDistrictCont(), edge->getNBEdge());
2402 edge->decRef("GNENet::deleteSingleEdge");
2403 edge->setResponsible(true);
2404 // Remove refrences from GNEJunctions
2406 edge->getToJunction()->removeIncomingGNEEdge(edge);
2407 // update boundaries of both junctions (to remove it from Grid)
2410 // get template editor
2411 GNEInspectorFrame::TemplateEditor* templateEditor = myNet->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
2412 // check if we have to remove template
2413 if (templateEditor->getEdgeTemplate() && (templateEditor->getEdgeTemplate()->getID() == edge->getID())) {
2414 templateEditor->setEdgeTemplate(nullptr);
2415 }
2416}
2417
2418
2419void
2421 if (myLanes.count(lane->getGUIGlObject()) > 0) {
2422 throw ProcessError(lane->getTagStr() + " with ID='" + lane->getID() + "' already exist");
2423 } else {
2424 myLanes[lane->getGUIGlObject()] = lane;
2425 myNumberOfNetworkElements++;
2426 }
2427}
2428
2429
2430void
2432 const auto finder = myLanes.find(lane->getGUIGlObject());
2433 if (finder == myLanes.end()) {
2434 throw ProcessError(lane->getTagStr() + " with ID='" + lane->getID() + "' wasn't previously inserted");
2435 } else {
2436 myLanes.erase(finder);
2437 myNumberOfNetworkElements--;
2438 // remove it from inspected elements and GNEElementTree
2439 myNet->getViewNet()->getInspectedElements().uninspectAC(lane);
2440 lane->unmarkForDrawingFront();
2441 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(lane);
2442 }
2443}
2444
2445
2446void
2448 if (myCrossings.count(crossing->getGUIGlObject()) > 0) {
2449 throw ProcessError(crossing->getTagStr() + " with ID='" + crossing->getID() + "' already exist");
2450 } else {
2451 myCrossings[crossing->getGUIGlObject()] = crossing;
2452 myNumberOfNetworkElements++;
2453 }
2454}
2455
2456
2457void
2459 const auto finder = myCrossings.find(crossing->getGUIGlObject());
2460 if (finder == myCrossings.end()) {
2461 throw ProcessError(crossing->getTagStr() + " with ID='" + crossing->getID() + "' wasn't previously inserted");
2462 } else {
2463 myCrossings.erase(finder);
2464 myNumberOfNetworkElements--;
2465 // remove it from inspected elements and GNEElementTree
2466 if (myNet->getViewNet()) {
2467 myNet->getViewNet()->getInspectedElements().uninspectAC(crossing);
2468 crossing->unmarkForDrawingFront();
2469 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(crossing);
2470 }
2471 }
2472}
2473
2474
2475void
2477 if (myWalkingAreas.count(walkingArea->getGUIGlObject()) > 0) {
2478 throw ProcessError(walkingArea->getTagStr() + " with ID='" + walkingArea->getID() + "' already exist");
2479 } else {
2480 myWalkingAreas[walkingArea->getGUIGlObject()] = walkingArea;
2481 myNumberOfNetworkElements++;
2482 }
2483}
2484
2485
2486void
2488 const auto finder = myWalkingAreas.find(walkingArea->getGUIGlObject());
2489 if (finder == myWalkingAreas.end()) {
2490 throw ProcessError(walkingArea->getTagStr() + " with ID='" + walkingArea->getID() + "' wasn't previously inserted");
2491 } else {
2492 myWalkingAreas.erase(finder);
2493 myNumberOfNetworkElements--;
2494 // remove it from inspected elements and GNEElementTree
2495 myNet->getViewNet()->getInspectedElements().uninspectAC(walkingArea);
2496 walkingArea->unmarkForDrawingFront();
2497 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(walkingArea);
2498 }
2499}
2500
2501
2502void
2504 if (myConnections.count(connection->getGUIGlObject()) > 0) {
2505 throw ProcessError(connection->getTagStr() + " with ID='" + connection->getID() + "' already exist");
2506 } else {
2507 myConnections[connection->getGUIGlObject()] = connection;
2508 myNumberOfNetworkElements++;
2509 }
2510}
2511
2512
2513void
2515 const auto finder = myConnections.find(connection->getGUIGlObject());
2516 if (finder == myConnections.end()) {
2517 throw ProcessError(connection->getTagStr() + " with ID='" + connection->getID() + "' wasn't previously inserted");
2518 } else {
2519 myConnections.erase(finder);
2520 myNumberOfNetworkElements--;
2521 // remove it from inspected elements and GNEElementTree
2522 myNet->getViewNet()->getInspectedElements().uninspectAC(connection);
2523 connection->unmarkForDrawingFront();
2524 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(connection);
2525 }
2526}
2527
2528
2529void
2531 if (myInternalLanes.count(internalLane->getGUIGlObject()) > 0) {
2532 throw ProcessError(internalLane->getTagStr() + " with ID='" + internalLane->getMicrosimID() + "' already exist");
2533 } else {
2534 myInternalLanes[internalLane->getGUIGlObject()] = internalLane;
2535 myNumberOfNetworkElements++;
2536 }
2537}
2538
2539
2540void
2542 const auto finder = myInternalLanes.find(internalLane->getGUIGlObject());
2543 if (finder == myInternalLanes.end()) {
2544 throw ProcessError(internalLane->getTagStr() + " with ID='" + internalLane->getID() + "' wasn't previously inserted");
2545 } else {
2546 myInternalLanes.erase(finder);
2547 myNumberOfNetworkElements--;
2548 }
2549}
2550
2551
2552void
2554 const auto tag = additional->getTagProperty()->getTag();
2555 if (myAdditionals.at(tag).count(additional) > 0) {
2556 throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' already exist");
2557 } else {
2558 // insert in both containers
2559 myAdditionals.at(tag)[additional->getGUIGlObject()] = additional;
2560 if (additional->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2561 myAdditionalIDs.at(tag)[additional->getID()] = additional;
2562 }
2563 myNumberOfNetworkElements++;
2564 // add element in grid
2565 if (additional->getTagProperty()->isPlacedInRTree()) {
2566 myNet->addGLObjectIntoGrid(additional);
2567 }
2568 // update geometry after insertion of additionals if myUpdateGeometryEnabled is enabled
2569 if (myNet->isUpdateGeometryEnabled()) {
2570 additional->updateGeometry();
2571 }
2572 // additionals has to be saved
2573 myNet->getSavingStatus()->requireSaveAdditionals();
2574 }
2575}
2576
2577
2578void
2580 const auto tag = additional->getTagProperty()->getTag();
2581 // find demanElement in additionalTag
2582 auto itFind = myAdditionals.at(tag).find(additional->getGUIGlObject());
2583 // check if additional was previously inserted
2584 if (itFind == myAdditionals.at(tag).end()) {
2585 throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' wasn't previously inserted");
2586 } else {
2587 // remove from both container
2588 myAdditionals.at(tag).erase(itFind);
2589 if (additional->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2590 myAdditionalIDs.at(tag).erase(myAdditionalIDs.at(tag).find(additional->getID()));
2591 }
2592 myNumberOfNetworkElements--;
2593 // remove it from inspected elements and GNEElementTree
2594 myNet->getViewNet()->getInspectedElements().uninspectAC(additional);
2595 additional->unmarkForDrawingFront();
2596 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(additional);
2597 // remove element from grid
2598 if (additional->getTagProperty()->isPlacedInRTree()) {
2599 myNet->removeGLObjectFromGrid(additional);
2600 }
2601 // delete path element
2602 myNet->getNetworkPathManager()->removePath(additional);
2603 // additionals has to be saved
2604 myNet->getSavingStatus()->requireSaveAdditionals();
2605 }
2606}
2607
2608
2609
2610
2611void
2613 const auto sourceSinkTag = sourceSink->getTagProperty()->getTag();
2614 if (myTAZSourceSinks.at(sourceSinkTag).count(sourceSink) > 0) {
2615 throw ProcessError(sourceSink->getTagStr() + " with ID='" + sourceSink->getID() + "' already exist");
2616 } else {
2617 myTAZSourceSinks.at(sourceSinkTag)[sourceSink] = sourceSink;
2618 myNumberOfNetworkElements++;
2619 // additionals has to be saved
2620 myNet->getSavingStatus()->requireSaveAdditionals();
2621 }
2622}
2623
2624
2625void
2627 const auto tag = sourceSink->getTagProperty()->getTag();
2628 // find demanElement in additionalTag
2629 auto itFind = myTAZSourceSinks.at(tag).find(sourceSink);
2630 // check if sourceSink was previously inserted
2631 if (itFind == myTAZSourceSinks.at(tag).end()) {
2632 throw ProcessError(sourceSink->getTagStr() + " with ID='" + sourceSink->getID() + "' wasn't previously inserted");
2633 } else {
2634 // remove from both container
2635 myTAZSourceSinks.at(tag).erase(itFind);
2636 myNumberOfNetworkElements--;
2637 // remove it from inspected elements and GNEElementTree
2638 myNet->getViewNet()->getInspectedElements().uninspectAC(sourceSink);
2639 sourceSink->unmarkForDrawingFront();
2640 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(sourceSink);
2641 // additionals has to be saved
2642 myNet->getSavingStatus()->requireSaveAdditionals();
2643 }
2644}
2645
2646
2647void
2649 const auto tag = demandElement->getTagProperty()->getTag();
2650 if (myDemandElements.at(tag).count(demandElement) > 0) {
2651 throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' already exist");
2652 } else {
2653 myDemandElements.at(tag)[demandElement->getGUIGlObject()] = demandElement;
2654 myNumberOfDemandElements++;
2655 if (demandElement->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2656 myDemandElementIDs.at(tag)[demandElement->getID()] = demandElement;
2657 }
2658 // add element in grid
2659 myNet->addGLObjectIntoGrid(demandElement);
2660 // update geometry after insertion of demandElements if myUpdateGeometryEnabled is enabled
2661 if (myNet->isUpdateGeometryEnabled()) {
2662 demandElement->updateGeometry();
2663 }
2664 // compute path element
2665 if (myNet->getViewNet()->getEditModes().isCurrentSupermodeDemand()) {
2666 demandElement->computePathElement();
2667 }
2668 // update demand elements frames
2669 updateDemandElementFrames(demandElement->getTagProperty());
2670 // demandElements has to be saved
2671 myNet->getSavingStatus()->requireSaveDemandElements();
2672 }
2673}
2674
2675
2676void
2678 const auto tag = demandElement->getTagProperty()->getTag();
2679 auto viewParent = myNet->getViewNet()->getViewParent();
2680 // find demanElement in demandElementTag
2681 auto itFind = myDemandElements.at(tag).find(demandElement->getGUIGlObject());
2682 // check if demandElement was previously inserted
2683 if (itFind == myDemandElements.at(tag).end()) {
2684 throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' wasn't previously inserted");
2685 } else {
2686 // erase it from container
2687 myDemandElements.at(tag).erase(itFind);
2688 if (demandElement->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2689 myDemandElementIDs.at(tag).erase(myDemandElementIDs.at(tag).find(demandElement->getID()));
2690 }
2691 myNumberOfDemandElements--;
2692 // remove element from grid
2693 myNet->removeGLObjectFromGrid(demandElement);
2694 // remove it from inspected elements and GNEElementTree
2695 myNet->getViewNet()->getInspectedElements().uninspectAC(demandElement);
2696 demandElement->unmarkForDrawingFront();
2697 viewParent->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(demandElement);
2698 viewParent->getPersonPlanFrame()->getPersonHierarchy()->removeCurrentEditedAttributeCarrier(demandElement);
2699 viewParent->getContainerPlanFrame()->getContainerHierarchy()->removeCurrentEditedAttributeCarrier(demandElement);
2700 if (viewParent->getRouteDistributionFrame()->getDistributionSelector()->getCurrentDistribution() == demandElement) {
2701 viewParent->getRouteDistributionFrame()->getDistributionSelector()->setDistribution(nullptr);
2702 }
2703 if (viewParent->getTypeDistributionFrame()->getDistributionSelector()->getCurrentDistribution() == demandElement) {
2704 viewParent->getTypeDistributionFrame()->getDistributionSelector()->setDistribution(nullptr);
2705 }
2706 // if is the last inserted route, remove it from GNEViewNet
2707 if (myNet->getViewNet()->getLastCreatedRoute() == demandElement) {
2708 myNet->getViewNet()->setLastCreatedRoute(nullptr);
2709 }
2710 // delete path element
2711 myNet->getDemandPathManager()->removePath(demandElement);
2712 // check if update demand elements frames
2713 if (updateFrames) {
2714 updateDemandElementFrames(demandElement->getTagProperty());
2715 }
2716 // demandElements has to be saved
2717 myNet->getSavingStatus()->requireSaveDemandElements();
2718 }
2719}
2720
2721
2722void
2724 if (myDataSets.count(dataSet->getID()) > 0) {
2725 throw ProcessError(dataSet->getTagStr() + " with ID='" + dataSet->getID() + "' already exist");
2726 } else {
2727 myDataSets[dataSet->getID()] = dataSet;
2728 myNumberOfDataElements++;
2729 // dataSets has to be saved
2730 myNet->getSavingStatus()->requireSaveDataElements();
2731 // mark interval toolbar for update
2732 myNet->getViewNet()->getIntervalBar().markForUpdate();
2733 }
2734}
2735
2736
2737void
2739 const auto finder = myDataSets.find(dataSet->getID());
2740 if (finder == myDataSets.end()) {
2741 throw ProcessError(dataSet->getTagStr() + " with ID='" + dataSet->getID() + "' wasn't previously inserted");
2742 } else {
2743 myDataSets.erase(finder);
2744 myNumberOfDataElements--;
2745 // remove it from inspected elements and GNEElementTree
2746 myNet->getViewNet()->getInspectedElements().uninspectAC(dataSet);
2747 dataSet->unmarkForDrawingFront();
2748 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(dataSet);
2749 // dataSets has to be saved
2750 myNet->getSavingStatus()->requireSaveDataElements();
2751 // mark interval toolbar for update
2752 myNet->getViewNet()->getIntervalBar().markForUpdate();
2753 }
2754}
2755
2756
2757void
2759 if (myMeanDatas.at(meanData->getTagProperty()->getTag()).count(meanData->getID()) > 0) {
2760 throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' already exist");
2761 } else {
2762 myMeanDatas.at(meanData->getTagProperty()->getTag()).insert(std::make_pair(meanData->getID(), meanData));
2763 myNumberOfMeanDataElements++;
2764 // meanDatas has to be saved
2765 myNet->getSavingStatus()->requireSaveMeanDatas();
2766 }
2767}
2768
2769
2770void
2772 // find demanElement in meanDataTag
2773 auto itFind = myMeanDatas.at(meanData->getTagProperty()->getTag()).find(meanData->getID());
2774 // check if meanData was previously inserted
2775 if (itFind == myMeanDatas.at(meanData->getTagProperty()->getTag()).end()) {
2776 throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' wasn't previously inserted");
2777 } else {
2778 // remove from container
2779 myMeanDatas.at(meanData->getTagProperty()->getTag()).erase(itFind);
2780 myNumberOfMeanDataElements--;
2781 // remove it from inspected elements and GNEElementTree
2782 myNet->getViewNet()->getInspectedElements().uninspectAC(meanData);
2783 meanData->unmarkForDrawingFront();
2784 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(meanData);
2785 // remove element from grid
2786 if (meanData->getTagProperty()->isPlacedInRTree()) {
2787 myNet->removeGLObjectFromGrid(meanData);
2788 }
2789 // meanDatas has to be saved
2790 myNet->getSavingStatus()->requireSaveMeanDatas();
2791 }
2792}
2793
2794
2795void
2797 if (myNet->getViewNet()->getEditModes().isCurrentSupermodeDemand()) {
2798 // continue depending of demand mode
2799 switch (myNet->getViewNet()->getEditModes().demandEditMode) {
2801 if (tagProperty->isType()) {
2802 myNet->getViewNet()->getViewParent()->getVehicleFrame()->getTypeSelector()->refreshDemandElementSelector();
2803 }
2804 break;
2806 if (tagProperty->isType()) {
2807 myNet->getViewNet()->getViewParent()->getTypeFrame()->getTypeSelector()->refreshTypeSelector(true);
2808 }
2809 break;
2811 if (tagProperty->isType()) {
2812 myNet->getViewNet()->getViewParent()->getTypeDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
2813 }
2814 break;
2816 if (tagProperty->isRoute()) {
2817 myNet->getViewNet()->getViewParent()->getRouteDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
2818 }
2819 break;
2821 if (tagProperty->isType()) {
2822 myNet->getViewNet()->getViewParent()->getPersonFrame()->getTypeSelector()->refreshDemandElementSelector();
2823 }
2824 break;
2826 if (tagProperty->isPerson()) {
2827 myNet->getViewNet()->getViewParent()->getPersonPlanFrame()->getPersonSelector()->refreshDemandElementSelector();
2828 }
2829 break;
2831 if (tagProperty->isType()) {
2832 myNet->getViewNet()->getViewParent()->getContainerFrame()->getTypeSelector()->refreshDemandElementSelector();
2833 }
2834 break;
2836 if (tagProperty->isContainer()) {
2837 myNet->getViewNet()->getViewParent()->getContainerPlanFrame()->getContainerSelector()->refreshDemandElementSelector();
2838 }
2839 break;
2841 myNet->getViewNet()->getViewParent()->getStopFrame()->getStopParentSelector()->refreshDemandElementSelector();
2842 break;
2843 default:
2844 // nothing to update
2845 break;
2846 }
2847 }
2848}
2849
2850
2851void
2853 // fill network elements
2854 if (tag->getTag() == SUMO_TAG_JUNCTION) {
2855 for (const auto& junction : myJunctions) {
2856 ACs.push_back(junction.second);
2857 }
2858 }
2859 if (tag->getTag() == SUMO_TAG_EDGE) {
2860 for (const auto& edge : myEdges) {
2861 ACs.push_back(edge.second);
2862 }
2863 }
2864 if (tag->getTag() == SUMO_TAG_LANE) {
2865 for (const auto& lane : myLanes) {
2866 ACs.push_back(lane.second);
2867 }
2868 }
2869 if (tag->getTag() == SUMO_TAG_CONNECTION) {
2870 for (const auto& connection : myConnections) {
2871 ACs.push_back(connection.second);
2872 }
2873 }
2874 if (tag->getTag() == SUMO_TAG_CROSSING) {
2875 for (const auto& crossing : myCrossings) {
2876 ACs.push_back(crossing.second);
2877 }
2878 }
2879 if (tag->getTag() == SUMO_TAG_WALKINGAREA) {
2880 for (const auto& walkingArea : myWalkingAreas) {
2881 ACs.push_back(walkingArea.second);
2882 }
2883 }
2884 // fill additional elements
2885 if (tag->isAdditionalElement()) {
2886 for (const auto& additionalTag : myAdditionals) {
2887 if (additionalTag.first == tag->getTag()) {
2888 for (const auto& additional : additionalTag.second) {
2889 ACs.push_back(additional.second);
2890 }
2891 }
2892 }
2893 }
2894 // fill demand elements
2895 if (tag->isDemandElement()) {
2896 for (const auto& demandElementTag : myDemandElements) {
2897 if (demandElementTag.first == tag->getTag()) {
2898 for (const auto& demandElemet : demandElementTag.second) {
2899 ACs.push_back(demandElemet.second);
2900 }
2901 }
2902 }
2903 }
2904 // fill data elements
2905 if (tag->isDataElement()) {
2906 if (tag->getTag() == SUMO_TAG_DATASET) {
2907 for (const auto& dataSet : myDataSets) {
2908 ACs.push_back(dataSet.second);
2909 }
2910 }
2911 if (tag->getTag() == SUMO_TAG_DATAINTERVAL) {
2912 for (const auto& dataInterval : myDataIntervals) {
2913 ACs.push_back(dataInterval.second);
2914 }
2915 }
2916 for (const auto& genericDataTag : myGenericDatas) {
2917 if (genericDataTag.first == tag->getTag()) {
2918 for (const auto& genericData : genericDataTag.second) {
2919 ACs.push_back(genericData.second);
2920 }
2921 }
2922 }
2923 for (const auto& meanDataTag : myMeanDatas) {
2924 if (meanDataTag.first == tag->getTag()) {
2925 for (const auto& meanData : meanDataTag.second) {
2926 ACs.push_back(meanData.second);
2927 }
2928 }
2929 }
2930 }
2931 // iterate over children
2932 for (const auto child : tag->getHierarchicalChildren()) {
2933 retrieveAttributeCarriersRecursively(child, ACs);
2934 }
2935}
2936
2937// ---------------------------------------------------------------------------
2938// GNENetHelper::GNETagSelector - methods
2939// ---------------------------------------------------------------------------
2940
2942 myNet(net) {
2943}
2944
2945
2946void
2948 // network
2949 myTemplates[SUMO_TAG_CROSSING] = new GNECrossing(myNet);
2950 // additionals
2951 myTemplates[SUMO_TAG_BUS_STOP] = GNEBusStop::buildBusStop(myNet);
2952 myTemplates[SUMO_TAG_TRAIN_STOP] = GNEBusStop::buildTrainStop(myNet);
2953 myTemplates[SUMO_TAG_ACCESS] = new GNEAccess(myNet);
2954 myTemplates[SUMO_TAG_CONTAINER_STOP] = new GNEContainerStop(myNet);
2955 myTemplates[SUMO_TAG_CHARGING_STATION] = new GNEChargingStation(myNet);
2956 myTemplates[SUMO_TAG_PARKING_AREA] = new GNEParkingArea(myNet);
2957 myTemplates[SUMO_TAG_PARKING_SPACE] = new GNEParkingSpace(myNet);
2958 myTemplates[SUMO_TAG_INDUCTION_LOOP] = new GNEInductionLoopDetector(myNet);
2963 myTemplates[SUMO_TAG_DET_EXIT] = new GNEEntryExitDetector(SUMO_TAG_DET_EXIT, myNet);
2965 myTemplates[SUMO_TAG_VSS] = new GNEVariableSpeedSign(myNet);
2966 myTemplates[SUMO_TAG_STEP] = new GNEVariableSpeedSignStep(myNet);
2967 myTemplates[SUMO_TAG_CALIBRATOR] = new GNECalibrator(SUMO_TAG_CALIBRATOR, myNet);
2969 myTemplates[GNE_TAG_CALIBRATOR_FLOW] = new GNECalibratorFlow(myNet);
2970 myTemplates[SUMO_TAG_REROUTER] = new GNERerouter(myNet);
2971 myTemplates[SUMO_TAG_INTERVAL] = new GNERerouterInterval(myNet);
2972 myTemplates[SUMO_TAG_CLOSING_REROUTE] = new GNEClosingReroute(myNet);
2973 myTemplates[SUMO_TAG_CLOSING_LANE_REROUTE] = new GNEClosingLaneReroute(myNet);
2974 myTemplates[SUMO_TAG_DEST_PROB_REROUTE] = new GNEDestProbReroute(myNet);
2975 myTemplates[SUMO_TAG_PARKING_AREA_REROUTE] = new GNEParkingAreaReroute(myNet);
2976 myTemplates[SUMO_TAG_ROUTE_PROB_REROUTE] = new GNERouteProbReroute(myNet);
2977 myTemplates[SUMO_TAG_ROUTEPROBE] = new GNERouteProbe(myNet);
2978 myTemplates[SUMO_TAG_VAPORIZER] = new GNEVaporizer(myNet);
2979 // symbols
2980 myTemplates[GNE_TAG_REROUTER_SYMBOL] = new GNERerouterSymbol(myNet);
2981 myTemplates[GNE_TAG_VSS_SYMBOL] = new GNEVariableSpeedSignSymbol(myNet);
2982 // shapes
2983 myTemplates[SUMO_TAG_POLY] = new GNEPoly(SUMO_TAG_POLY, myNet);
2984 myTemplates[SUMO_TAG_POI] = new GNEPOI(SUMO_TAG_POI, myNet);
2985 myTemplates[GNE_TAG_POILANE] = new GNEPOI(GNE_TAG_POILANE, myNet);
2986 myTemplates[GNE_TAG_POIGEO] = new GNEPOI(GNE_TAG_POIGEO, myNet);
2987 // TAZs
2988 myTemplates[SUMO_TAG_TAZ] = new GNETAZ(myNet);
2989 myTemplates[SUMO_TAG_TAZSOURCE] = new GNETAZSourceSink(SUMO_TAG_TAZSOURCE, myNet);
2990 myTemplates[SUMO_TAG_TAZSINK] = new GNETAZSourceSink(SUMO_TAG_TAZSINK, myNet);
2991 // wires
2992 myTemplates[SUMO_TAG_TRACTION_SUBSTATION] = new GNETractionSubstation(myNet);
2993 myTemplates[SUMO_TAG_OVERHEAD_WIRE_SECTION] = new GNEOverheadWire(myNet);
2994 //myTemplates[SUMO_TAG_OVERHEAD_WIRE_CLAMP] = nullptr; // TMP
2995 // JuPedSim elements
2997 myTemplates[GNE_TAG_JPS_OBSTACLE] = new GNEPoly(GNE_TAG_JPS_OBSTACLE, myNet);
2998 // vTypes
2999 const auto vTypes = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::VTYPE);
3000 for (const auto vType : vTypes) {
3001 myTemplates[vType->getTag()] = new GNEVType(vType->getTag(), myNet);
3002 }
3003 // vType distributions
3004 myTemplates[SUMO_TAG_VTYPE_DISTRIBUTION] = new GNEVTypeDistribution(myNet);
3005 myTemplates[GNE_TAG_VTYPEREF] = new GNEVTypeRef(myNet);
3006 // routes (basic and embedded)
3007 const auto routes = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::ROUTE);
3008 for (const auto route : routes) {
3009 myTemplates[route->getTag()] = new GNERoute(route->getTag(), myNet);
3010 }
3011 // route distribution
3012 myTemplates[SUMO_TAG_ROUTE_DISTRIBUTION] = new GNERouteDistribution(myNet);
3013 myTemplates[GNE_TAG_ROUTEREF] = new GNERouteRef(myNet);
3014 // vehicles
3015 const auto vehicles = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::VEHICLE);
3016 for (const auto vehicle : vehicles) {
3017 myTemplates[vehicle->getTag()] = new GNEVehicle(vehicle->getTag(), myNet);
3018 }
3019 // persons
3020 const auto persons = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::PERSON);
3021 for (const auto person : persons) {
3022 myTemplates[person->getTag()] = new GNEPerson(person->getTag(), myNet);
3023 }
3024 // container
3025 const auto containers = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::CONTAINER);
3026 for (const auto container : containers) {
3027 myTemplates[container->getTag()] = new GNEContainer(container->getTag(), myNet);
3028 }
3029 // stops and waypoints
3030 const auto stopAndWaypoints = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_VEHICLE);
3031 for (const auto stopAndWaypoint : stopAndWaypoints) {
3032 myTemplates[stopAndWaypoint->getTag()] = new GNEStop(stopAndWaypoint->getTag(), myNet);
3033 }
3034 // personTrip
3035 const auto personTrips = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::PERSONTRIP);
3036 for (const auto personTrip : personTrips) {
3037 myTemplates[personTrip->getTag()] = new GNEPersonTrip(personTrip->getTag(), myNet);
3038 }
3039 // walk
3040 const auto walks = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::WALK);
3041 for (const auto walk : walks) {
3042 myTemplates[walk->getTag()] = new GNEWalk(walk->getTag(), myNet);
3043 }
3044 // ride
3045 const auto rides = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::RIDE);
3046 for (const auto ride : rides) {
3047 myTemplates[ride->getTag()] = new GNERide(ride->getTag(), myNet);
3048 }
3049 // stop person
3050 const auto stopPersons = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_PERSON);
3051 for (const auto stopPerson : stopPersons) {
3052 myTemplates[stopPerson->getTag()] = new GNEStopPlan(stopPerson->getTag(), myNet);
3053 }
3054 // transport
3055 const auto transports = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::TRANSPORT);
3056 for (const auto transport : transports) {
3057 myTemplates[transport->getTag()] = new GNETransport(transport->getTag(), myNet);
3058 }
3059 // tranship
3060 const auto tranships = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::TRANSHIP);
3061 for (const auto tranship : tranships) {
3062 myTemplates[tranship->getTag()] = new GNETranship(tranship->getTag(), myNet);
3063 }
3064 // stop container
3065 const auto stopContainers = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_CONTAINER);
3066 for (const auto stopContainer : stopContainers) {
3067 myTemplates[stopContainer->getTag()] = new GNEStopPlan(stopContainer->getTag(), myNet);
3068 }
3069 // reset all to their default values
3070 for (const auto& AC : myTemplates) {
3071 AC.second->resetDefaultValues(false);
3072 }
3073}
3074
3075
3077 for (auto& AC : myTemplates) {
3078 delete AC.second;
3079 }
3080}
3081
3082
3083std::map<SumoXMLTag, GNEAttributeCarrier*>
3085 return myTemplates;
3086}
3087
3088
3091 if (myTemplates.count(tag) > 0) {
3092 return myTemplates.at(tag);
3093 } else {
3094 return nullptr;
3095 }
3096}
3097
3098
3100GNENetHelper::ACTemplate::getTemplateAC(const std::string& selectorText) const {
3101 for (const auto& templateAC : myTemplates) {
3102 if (templateAC.second->getTagProperty()->getSelectorText() == selectorText) {
3103 return templateAC.second;
3104 }
3105 }
3106 return nullptr;
3107}
3108
3109// ---------------------------------------------------------------------------
3110// GNENetHelper::SavingFilesHandler - methods
3111// ---------------------------------------------------------------------------
3112
3116
3117
3118void
3120 auto& neteditOptions = OptionsCont::getOptions();
3121 // get files
3122 const auto additionalFiles = parsingSavingFiles(myAdditionalElementsSavingFiles);
3123 const auto demandElementFiles = parsingSavingFiles(myDemandElementsSavingFiles);
3124 const auto dataElementFiles = parsingSavingFiles(myDataElementsSavingFiles);
3125 const auto meanDataElementFiles = parsingSavingFiles(myMeanDataElementsSavingFiles);
3126 // additionals
3127 neteditOptions.resetWritable();
3128 if (additionalFiles.size() > 0) {
3129 neteditOptions.set("additional-files", additionalFiles);
3130 } else {
3131 neteditOptions.resetDefault("additional-files");
3132 }
3133 // route files
3134 neteditOptions.resetWritable();
3135 if (demandElementFiles.size() > 0) {
3136 neteditOptions.set("route-files", demandElementFiles);
3137 } else {
3138 neteditOptions.resetDefault("route-files");
3139 }
3140 // data files
3141 neteditOptions.resetWritable();
3142 if (dataElementFiles.size() > 0) {
3143 neteditOptions.set("data-files", dataElementFiles);
3144 } else {
3145 neteditOptions.resetDefault("data-files");
3146 }
3147 // meanData files
3148 neteditOptions.resetWritable();
3149 if (meanDataElementFiles.size() > 0) {
3150 neteditOptions.set("meandata-files", meanDataElementFiles);
3151 } else {
3152 neteditOptions.resetDefault("meandata-files");
3153 }
3154}
3155
3156
3157void
3159 if ((additionalElement->getFilename().size() > 0) && !existAdditionalFilename(additionalElement->getFilename())) {
3160 if (myAdditionalElementsSavingFiles.empty()) {
3161 updateAdditionalEmptyFilenames(additionalElement->getFilename());
3162 } else {
3163 myAdditionalElementsSavingFiles.push_back(additionalElement->getFilename());
3164 }
3165 }
3166}
3167
3168
3169void
3171 for (const auto& additionalTag : myNet->getAttributeCarriers()->getAdditionals()) {
3172 for (const auto& additional : additionalTag.second) {
3173 additional.second->changeDefaultFilename(file);
3174 }
3175 }
3176 // update all templates
3177 for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3178 if (templateAC.second->getTagProperty()->isAdditionalElement() && templateAC.second->getFilename().empty()) {
3179 templateAC.second->changeDefaultFilename(file);
3180 }
3181 }
3182 // add it to current files
3183 if (!existAdditionalFilename(file)) {
3184 myAdditionalElementsSavingFiles.push_back(file);
3185 }
3186}
3187
3188
3189const std::vector<std::string>&
3191 return myAdditionalElementsSavingFiles;
3192}
3193
3194
3197 ACsbyFilename additionalsbyFilenames;
3198 for (const auto& additionalTag : myNet->getAttributeCarriers()->getAdditionals()) {
3199 for (const auto& additional : additionalTag.second) {
3200 additionalsbyFilenames[additional.second->getFilename()].insert(additional.second);
3201 }
3202 }
3203 // special case for routes (due calibrators)
3204 for (const auto& route : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE)) {
3205 if (std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), route.second->getFilename()) != myAdditionalElementsSavingFiles.end()) {
3206 additionalsbyFilenames[route.second->getFilename()].insert(route.second);
3207 }
3208 }
3209 // clear empty saving files
3210 auto it = myAdditionalElementsSavingFiles.begin();
3211 while (it != myAdditionalElementsSavingFiles.end()) {
3212 if (it->empty() || (additionalsbyFilenames.find(*it) == additionalsbyFilenames.end())) {
3213 it = myAdditionalElementsSavingFiles.erase(it);
3214 } else {
3215 it++;
3216 }
3217 }
3218 return additionalsbyFilenames;
3219}
3220
3221
3222bool
3224 const auto it = std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), file);
3225 return it != myAdditionalElementsSavingFiles.end();
3226}
3227
3228
3229void
3231 if ((demandElement->getFilename().size() > 0) && !existDemandFilename(demandElement->getFilename())) {
3232 if (myDemandElementsSavingFiles.empty()) {
3233 updateDemandEmptyFilenames(demandElement->getFilename());
3234 } else {
3235 myDemandElementsSavingFiles.push_back(demandElement->getFilename());
3236 }
3237 }
3238}
3239
3240
3241void
3243 for (const auto& demandTag : myNet->getAttributeCarriers()->getDemandElements()) {
3244 for (const auto& demand : demandTag.second) {
3245 demand.second->changeDefaultFilename(file);
3246 }
3247 }
3248 // update all templates
3249 for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3250 if (templateAC.second->getTagProperty()->isDemandElement() && templateAC.second->getFilename().empty()) {
3251 templateAC.second->changeDefaultFilename(file);
3252 }
3253 }
3254 // add it to current files
3255 if (!existDemandFilename(file)) {
3256 myDemandElementsSavingFiles.push_back(file);
3257 }
3258}
3259
3260
3261const std::vector<std::string>&
3263 return myDemandElementsSavingFiles;
3264}
3265
3266
3269 ACsbyFilename demandsbyFilenames;
3270 for (const auto& demandTag : myNet->getAttributeCarriers()->getDemandElements()) {
3271 for (const auto& demand : demandTag.second) {
3272 if (std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), demand.second->getFilename()) == myAdditionalElementsSavingFiles.end()) {
3273 demandsbyFilenames[demand.second->getFilename()].insert(demand.second);
3274 }
3275 }
3276 }
3277 // clear empty saving files
3278 auto it = myDemandElementsSavingFiles.begin();
3279 while (it != myDemandElementsSavingFiles.end()) {
3280 if (it->empty() || (demandsbyFilenames.find(*it) == demandsbyFilenames.end())) {
3281 it = myDemandElementsSavingFiles.erase(it);
3282 } else {
3283 it++;
3284 }
3285 }
3286 return demandsbyFilenames;
3287}
3288
3289
3290bool
3292 const auto it = std::find(myDemandElementsSavingFiles.begin(), myDemandElementsSavingFiles.end(), file);
3293 return it != myDemandElementsSavingFiles.end();
3294}
3295
3296
3297void
3299 if ((dataElement->getFilename().size() > 0) && !existDataFilename(dataElement->getFilename())) {
3300 if (myDataElementsSavingFiles.empty()) {
3301 updateDataEmptyFilenames(dataElement->getFilename());
3302 } else {
3303 myDataElementsSavingFiles.push_back(dataElement->getFilename());
3304 }
3305 }
3306}
3307
3308
3309void
3311 if (file.size() > 0) {
3312 for (const auto& dataSet : myNet->getAttributeCarriers()->getDataSets()) {
3313 dataSet.second->changeDefaultFilename(file);
3314 }
3315 // add it to current files
3316 if (!existDataFilename(file)) {
3317 myDataElementsSavingFiles.push_back(file);
3318 }
3319 }
3320}
3321
3322
3323const std::vector<std::string>&
3325 return myDataElementsSavingFiles;
3326}
3327
3328
3331 ACsbyFilename datasbyFilenames;
3332 for (const auto& dataSet : myNet->getAttributeCarriers()->getDataSets()) {
3333 datasbyFilenames[dataSet.second->getFilename()].insert(dataSet.second);
3334 }
3335 // clear empty saving files
3336 auto it = myDataElementsSavingFiles.begin();
3337 while (it != myDataElementsSavingFiles.end()) {
3338 if (it->empty() || (datasbyFilenames.find(*it) == datasbyFilenames.end())) {
3339 it = myDataElementsSavingFiles.erase(it);
3340 } else {
3341 it++;
3342 }
3343 }
3344 return datasbyFilenames;
3345}
3346
3347
3348bool
3350 const auto it = std::find(myDataElementsSavingFiles.begin(), myDataElementsSavingFiles.end(), file);
3351 return it != myDataElementsSavingFiles.end();
3352}
3353
3354
3355void
3357 if ((meanDataElement->getFilename().size() > 0) && !existMeanDataFilename(meanDataElement->getFilename())) {
3358 if (myMeanDataElementsSavingFiles.empty()) {
3359 updateMeanDataEmptyFilenames(meanDataElement->getFilename());
3360 } else {
3361 myMeanDataElementsSavingFiles.push_back(meanDataElement->getFilename());
3362 }
3363 }
3364}
3365
3366
3367void
3369 for (const auto& meanDataTag : myNet->getAttributeCarriers()->getMeanDatas()) {
3370 for (const auto& meanData : meanDataTag.second) {
3371 meanData.second->changeDefaultFilename(file);
3372 }
3373 }
3374 // update all templates
3375 for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3376 if (templateAC.second->getTagProperty()->isMeanData() && templateAC.second->getFilename().empty()) {
3377 templateAC.second->changeDefaultFilename(file);
3378 }
3379 }
3380 // add it to current files
3381 if (!existMeanDataFilename(file)) {
3382 myMeanDataElementsSavingFiles.push_back(file);
3383 }
3384}
3385
3386
3387const std::vector<std::string>&
3389 return myMeanDataElementsSavingFiles;
3390}
3391
3392
3395 ACsbyFilename meanDatasbyFilenames;
3396 for (const auto& meanDataTag : myNet->getAttributeCarriers()->getMeanDatas()) {
3397 for (const auto& meanData : meanDataTag.second) {
3398 meanDatasbyFilenames[meanData.second->getFilename()].insert(meanData.second);
3399 }
3400 }
3401 // clear empty saving files
3402 auto it = myMeanDataElementsSavingFiles.begin();
3403 while (it != myMeanDataElementsSavingFiles.end()) {
3404 if (it->empty() || (meanDatasbyFilenames.find(*it) == meanDatasbyFilenames.end())) {
3405 it = myMeanDataElementsSavingFiles.erase(it);
3406 } else {
3407 it++;
3408 }
3409 }
3410 return meanDatasbyFilenames;
3411}
3412
3413
3414bool
3416 const auto it = std::find(myMeanDataElementsSavingFiles.begin(), myMeanDataElementsSavingFiles.end(), file);
3417 return it != myMeanDataElementsSavingFiles.end();
3418}
3419
3420
3421std::string
3422GNENetHelper::SavingFilesHandler::parsingSavingFiles(const std::vector<std::string>& savingFiles) const {
3423 std::string savingFileNames;
3424 // group all saving files in a single string separated with comma
3425 for (const auto& savingFile : savingFiles) {
3426 savingFileNames.append(savingFile + ",");
3427 }
3428 // remove last ','
3429 if (savingFileNames.size() > 0) {
3430 savingFileNames.pop_back();
3431 }
3432 return savingFileNames;
3433}
3434
3435// ---------------------------------------------------------------------------
3436// GNENetHelper::SavingStatus - methods
3437// ---------------------------------------------------------------------------
3438
3440 myNet(net) {
3441}
3442
3443
3444void
3446 mySumoConfigSaved = false;
3447}
3448
3449
3450void
3452 mySumoConfigSaved = true;
3453}
3454
3455
3456bool
3458 return mySumoConfigSaved;
3459}
3460
3461
3462
3463void
3465 myNeteditConfigSaved = false;
3466}
3467
3468
3469void
3471 myNeteditConfigSaved = true;
3472}
3473
3474
3475bool
3477 return myNeteditConfigSaved;
3478}
3479
3480
3481void
3483 myNetworkSaved = false;
3484 // implies requiere save netedit config and sumo config
3485 myNeteditConfigSaved = false;
3486 mySumoConfigSaved = false;
3487}
3488
3489
3490void
3492 myNetworkSaved = true;
3493}
3494
3495
3496bool
3498 return myNetworkSaved;
3499}
3500
3501
3502void
3504 myTLSSaved = false;
3505}
3506
3507
3508void
3510 myTLSSaved = true;
3511}
3512
3513
3514bool
3516 return myTLSSaved;
3517}
3518
3519
3520void
3522 myEdgeTypeSaved = false;
3523}
3524
3525
3526void
3528 myEdgeTypeSaved = true;
3529}
3530
3531
3532bool
3534 return myEdgeTypeSaved;
3535}
3536
3537
3538void
3540 myAdditionalSaved = false;
3541 // implies requiere save netedit config and sumo config
3542 myNeteditConfigSaved = false;
3543 mySumoConfigSaved = false;
3544}
3545
3546
3547void
3549 myAdditionalSaved = true;
3550}
3551
3552
3553bool
3555 return myAdditionalSaved;
3556}
3557
3558
3559void
3561 myDemandElementSaved = false;
3562 // implies requiere save netedit config and sumo config
3563 myNeteditConfigSaved = false;
3564 mySumoConfigSaved = false;
3565}
3566
3567
3568void
3570 myDemandElementSaved = true;
3571}
3572
3573
3574bool
3576 return myDemandElementSaved;
3577}
3578
3579
3580void
3582 myDataElementSaved = false;
3583 // implies requiere save netedit config and sumo config
3584 myNeteditConfigSaved = false;
3585 mySumoConfigSaved = false;
3586}
3587
3588
3589void
3591 myDataElementSaved = true;
3592}
3593
3594
3595bool
3597 return myDataElementSaved;
3598}
3599
3600
3601void
3603 myMeanDataElementSaved = false;
3604 // implies requiere save netedit config and sumo config
3605 myNeteditConfigSaved = false;
3606 mySumoConfigSaved = false;
3607}
3608
3609
3610void
3612 myMeanDataElementSaved = true;
3613}
3614
3615
3616bool
3618 return myMeanDataElementSaved;
3619}
3620
3621
3624 // Check if there are non saved network elements
3625 if (commonResult == GNEDialog::Result::ABORT) {
3627 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3629 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3631 } else if (myNetworkSaved) {
3633 } else {
3634 // open save dialog
3635 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3636 TL("network"));
3637 // continue depending of result
3638 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3639 commonResult = GNEDialog::Result::ABORT;
3641 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3642 commonResult = GNEDialog::Result::ACCEPT_ALL;
3644 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3645 commonResult = GNEDialog::Result::CANCEL_ALL;
3647 } else {
3648 return saveDialog.getResult();
3649 }
3650 }
3651}
3652
3653
3656 // Check if there are non saved additional elements
3657 if (commonResult == GNEDialog::Result::ABORT) {
3659 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3661 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3663 } else if (myAdditionalSaved) {
3665 } else {
3666 // open save dialog
3667 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3668 TL("additional elements"));
3669 // continue depending of result
3670 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3671 commonResult = GNEDialog::Result::ABORT;
3673 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3674 commonResult = GNEDialog::Result::ACCEPT_ALL;
3676 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3677 commonResult = GNEDialog::Result::CANCEL_ALL;
3679 } else {
3680 return saveDialog.getResult();
3681 }
3682 }
3683}
3684
3685
3688 // Check if there are non saved demand elements
3689 if (commonResult == GNEDialog::Result::ABORT) {
3691 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3693 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3695 } else if (myDemandElementSaved) {
3697 } else {
3698 // open save dialog
3699 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3700 TL("demand elements"));
3701 // continue depending of result
3702 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3703 commonResult = GNEDialog::Result::ABORT;
3705 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3706 commonResult = GNEDialog::Result::ACCEPT_ALL;
3708 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3709 commonResult = GNEDialog::Result::CANCEL_ALL;
3711 } else {
3712 return saveDialog.getResult();
3713 }
3714 }
3715}
3716
3717
3720 // Check if there are non saved data elements
3721 if (commonResult == GNEDialog::Result::ABORT) {
3723 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3725 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3727 } else if (myDataElementSaved) {
3729 } else {
3730 // open save dialog
3731 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3732 TL("data elements"));
3733 // continue depending of result
3734 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3735 commonResult = GNEDialog::Result::ABORT;
3737 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3738 commonResult = GNEDialog::Result::ACCEPT_ALL;
3740 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3741 commonResult = GNEDialog::Result::CANCEL_ALL;
3743 } else {
3744 return saveDialog.getResult();
3745 }
3746 }
3747}
3748
3749
3752 // Check if there are non saved mean data elements
3753 if (commonResult == GNEDialog::Result::ABORT) {
3755 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3757 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3759 } else if (myMeanDataElementSaved) {
3761 } else {
3762 // open save dialog
3763 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3764 TL("meanData elements"));
3765 // continue depending of result
3766 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3767 commonResult = GNEDialog::Result::ABORT;
3769 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3770 commonResult = GNEDialog::Result::ACCEPT_ALL;
3772 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3773 commonResult = GNEDialog::Result::CANCEL_ALL;
3775 } else {
3776 return saveDialog.getResult();
3777 }
3778 }
3779}
3780
3781// ---------------------------------------------------------------------------
3782// GNENetHelper::GNEChange_ReplaceEdgeInTLS - methods
3783// ---------------------------------------------------------------------------
3784
3786 GNEChange(Supermode::NETWORK, true, false),
3787 myTllcont(tllcont),
3788 myReplaced(replaced),
3789 myBy(by) {
3790}
3791
3792
3794
3795
3796void
3798 // assuming this is only used for replacing incoming connections (GNENet::replaceIncomingEdge)
3799 myTllcont.replaceRemoved(myBy, -1, myReplaced, -1, true);
3800}
3801
3802
3803void
3805 // assuming this is only used for replacing incoming connections (GNENet::replaceIncomingEdge)
3806 myTllcont.replaceRemoved(myReplaced, -1, myBy, -1, true);
3807}
3808
3809
3810std::string
3812 return TL("Redo replace in TLS");
3813}
3814
3815
3816std::string
3818 return TL("Undo replace in TLS");
3819}
3820
3821
3822bool
3824 return myReplaced != myBy;
3825}
3826
3827/****************************************************************************/
Supermode
@brie enum for supermodes
@ NETWORK
Network mode (Edges, junctions, etc..)
@ DATA
Data mode (edgeData, LaneData etc..)
@ DEMAND
Demand mode (Routes, Vehicles etc..)
@ DEMAND_PERSONPLAN
Mode for editing person plan.
@ DEMAND_CONTAINER
Mode for editing container.
@ DEMAND_ROUTEDISTRIBUTION
Mode for editing route distributions.
@ DEMAND_PERSON
Mode for editing person.
@ DEMAND_TYPEDISTRIBUTION
Mode for editing type distributions.
@ DEMAND_VEHICLE
Mode for editing vehicles.
@ DEMAND_STOP
Mode for editing stops.
@ DEMAND_CONTAINERPLAN
Mode for editing container plan.
@ DEMAND_TYPE
Mode for editing types.
long long int SUMOTime
Definition GUI.h:36
unsigned int GUIGlID
Definition GUIGlObject.h:44
GUISelectedStorage gSelected
A global holder of selected objects.
#define TL(string)
Definition MsgHandler.h:304
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
const long long int VTYPEPARS_VEHICLECLASS_SET
const std::string DEFAULT_TAXITYPE_ID
const std::string DEFAULT_RAILTYPE_ID
const std::string DEFAULT_PEDTYPE_ID
const std::string DEFAULT_VTYPE_ID
const std::string DEFAULT_CONTAINERTYPE_ID
@ SVC_IGNORING
vehicles ignoring classes
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_TAXI
vehicle is a taxi
@ SVC_PEDESTRIAN
pedestrian
const std::string DEFAULT_BIKETYPE_ID
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ GNE_TAG_TRIP_JUNCTIONS
a trip between junctions
@ SUMO_TAG_TRACTION_SUBSTATION
A traction substation.
@ GNE_TAG_TRIP_TAZS
a single trip definition that uses TAZs
@ GNE_TAG_VTYPEREF
reference to a vType (used in VType distributions)
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_CLOSING_REROUTE
reroute of type closing
@ SUMO_TAG_REROUTER
A rerouter.
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_DATAINTERVAL
@ GNE_TAG_MULTI_LANE_AREA_DETECTOR
an e2 detector over multiple lanes (placed here due create Additional Frame)
@ SUMO_TAG_ROUTEPROBE
a routeprobe detector
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_ACCESS
An access point for a train stop.
@ SUMO_TAG_NOTHING
invalid tag, must be the last one
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_CONTAINERFLOW
@ SUMO_TAG_PARKING_AREA_REROUTE
entry for an alternative parking zone
@ SUMO_TAG_ROOTFILE
root file
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ GNE_TAG_EDGEREL_SINGLE
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_POI
begin/end of the description of a Point of interest
@ SUMO_TAG_MEANDATA_LANE
a lane based mean data detector
@ SUMO_TAG_STEP
trigger: a step description
@ SUMO_TAG_VEHICLE
description of a vehicle
@ GNE_TAG_FLOW_ROUTE
a flow definition using a route instead of a from-to edges route
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ GNE_TAG_VSS_SYMBOL
VSS Symbol.
@ GNE_TAG_POIGEO
Point of interest over view with GEO attributes.
@ GNE_TAG_FLOW_WITHROUTE
description of a vehicle with an embedded route
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_WALKINGAREA
walking area for pedestrians
@ SUMO_TAG_ROUTE_PROB_REROUTE
probability of route of a reroute
@ GNE_TAG_CALIBRATOR_LANE
A calibrator placed over lane.
@ SUMO_TAG_DET_ENTRY
an e3 entry point
@ SUMO_TAG_PARKING_SPACE
A parking space for a single vehicle within a parking area.
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_CROSSING
crossing between edges for pedestrians
@ SUMO_TAG_ROUTE
description of a route
@ SUMO_TAG_MEANDATA_EDGE
an edge based mean data detector
@ SUMO_TAG_POLY
begin/end of the description of a polygon
@ SUMO_TAG_OVERHEAD_WIRE_SECTION
An overhead wire section.
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_TAG_VTYPE_DISTRIBUTION
distribution of a vehicle type
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_INSTANT_INDUCTION_LOOP
An instantenous induction loop.
@ GNE_TAG_VEHICLE_WITHROUTE
description of a vehicle with an embedded route
@ GNE_TAG_CALIBRATOR_FLOW
a flow definition within in Calibrator
@ SUMO_TAG_DEST_PROB_REROUTE
probability of destination of a reroute
@ GNE_TAG_POILANE
Point of interest over Lane.
@ SUMO_TAG_DATASET
@ GNE_TAG_JPS_OBSTACLE
polygon used for draw juPedSim obstacles
@ SUMO_TAG_PERSON
@ SUMO_TAG_DET_EXIT
an e3 exit point
@ SUMO_TAG_VAPORIZER
vaporizer of vehicles
@ SUMO_TAG_LANE_AREA_DETECTOR
alternative tag for e2 detector
@ GNE_TAG_REROUTER_SYMBOL
Rerouter Symbol.
@ SUMO_TAG_TAZREL
a relation between two TAZs
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ SUMO_TAG_CLOSING_LANE_REROUTE
lane of a reroute of type closing
@ GNE_TAG_ROUTEREF
virtual element used to reference routes with distributions
@ SUMO_TAG_INDUCTION_LOOP
alternative tag for e1 detector
@ GNE_TAG_JPS_WALKABLEAREA
polygon used for draw juPedSim walkable areas
@ SUMO_TAG_CALIBRATOR
A calibrator placed over edge.
@ SUMO_TAG_ENTRY_EXIT_DETECTOR
alternative tag for e3 detector
@ SUMO_TAG_VSS
A variable speed sign.
@ SUMO_TAG_PERSONFLOW
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ 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
const GUIGeometry & getAdditionalGeometry() const
obtain additional geometry
GUIGlObject * getGUIGlObject() override
get GUIGlObject associated with this additional
virtual Position getPositionInView() const =0
Returns position of additional in view.
const std::string getID() const
get ID (all Attribute Carriers have one)
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
const std::string & getTagStr() const
get tag assigned to this object in string format
const std::string & getFilename() const
get filename in which save this AC
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
void unmarkForDrawingFront()
unmark for drawing front
virtual void updateGeometry()=0
update pre-computed geometry information
virtual GUIGlObject * getGUIGlObject()=0
get GUIGlObject associated with this AttributeCarrier
static GNEBusStop * buildTrainStop(GNENet *net)
default constructor
static GNEBusStop * buildBusStop(GNENet *net)
default constructor
the function-object for an editing operation (abstract base)
Definition GNEChange.h:56
GUIGlObject * getGUIGlObject() override
get GUIGlObject associated with this GNEDemandElement
Result
list of possible results when closing the dialog
Definition GNEDialog.h:70
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
Definition GNEEdge.cpp:632
void setResponsible(bool newVal)
set responsibility for deleting internal structures
Definition GNEEdge.cpp:1496
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:753
void setEdgeID(const std::string &newID)
set edge ID
Definition GNEEdge.cpp:2227
GNEJunction * getFromJunction() const
get from Junction (only used to increase readability)
Definition GNEEdge.h:87
Boundary getCenteringBoundary() const override
Returns the boundary to which the view shall be centered in order to show the object.
Definition GNEEdge.cpp:626
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
Definition GNEEdge.h:92
GUIGlObject * getGUIGlObject() override
get GUIGlObject associated with this genericData
const GNEHierarchicalContainerChildren< GNELane * > & getChildLanes() const
get child lanes
const GNEHierarchicalContainerChildren< GNEAdditional * > & getChildAdditionals() const
return child additionals
void setEdgeTemplate(const GNEEdge *edge)
set edge template
GNEEdgeTemplate * getEdgeTemplate() const
get edge template (to copy attributes from)
void setResponsible(bool newVal)
set responsibility for deleting internal structures
void updateGeometry() override
update pre-computed geometry information (including crossings)
Boundary getCenteringBoundary() const override
Returns the boundary to which the view shall be centered in order to show the object.
void removeOutgoingGNEEdge(GNEEdge *edge)
remove outgoing GNEEdge
void removeIncomingGNEEdge(GNEEdge *edge)
remove incoming GNEEdge
void addIncomingGNEEdge(GNEEdge *edge)
add incoming GNEEdge
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
const std::vector< GNEEdge * > & getGNEOutgoingEdges() const
Returns incoming GNEEdges.
NBNode * getNBNode() const
Return net build node.
void addOutgoingGNEEdge(GNEEdge *edge)
add outgoing GNEEdge
int getIndex() const
returns the index of the lane
Definition GNELane.cpp:624
std::map< SumoXMLTag, GNEAttributeCarrier * > getACTemplates() const
get all AC templates
void buildTemplates()
build templates
ACTemplate()=delete
Invalidated default constructor.
GNEAttributeCarrier * getTemplateAC(const SumoXMLTag tag) const
get template AC by tag
std::vector< GNEEdge * > retrieveEdges(GNEJunction *from, GNEJunction *to) const
get all edges by from and to GNEJunction
const std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEDemandElement * >, std::hash< int > > & getDemandElements() const
get demand elements
GNETAZSourceSink * retrieveTAZSourceSink(const GNEAttributeCarrier *sourceSink, bool hardFail=true) const
Returns the named sourceSink.
void insertWalkingArea(GNEWalkingArea *walkingArea)
insert walkingArea in container
GNEAttributeCarrier * retrieveAttributeCarrier(const GUIGlID id, bool hardFail=true) const
get a single attribute carrier based on a GLID
int getNumberOfSelectedAdditionals() const
get number of selected additionals (Including POIs, Polygons, TAZs and Wires)
const std::unordered_map< const GUIGlObject *, GNEConnection * > & getConnections() const
get connections
int getNumberOfSelectedJpsObstacles() const
get number of selected obstacles
int getNumberOfSelectedConnections() const
get number of selected connections
void deleteDataSet(GNEDataSet *dataSet)
delete data set of container
std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEGenericData * >, std::hash< int > > myGenericDatas
map with the tag and pointer to all generic datas
void addPrefixToJunctions(const std::string &prefix)
add prefix to all junctions
void insertLane(GNELane *lane)
insert lane in container
int getNumberOfSelectedEdgeRelDatas() const
get number of selected edge rel datas
int getNumberOfSelectedCrossings() const
get number of selected crossings
GNEEdgeType * registerEdgeType(GNEEdgeType *edgeType)
registers a edge in containers
std::vector< GNEAdditional * > getSelectedShapes() const
get selected shapes
GNELane * retrieveLane(const std::string &id, bool hardFail=true, bool checkVolatileChange=false) const
get lane by id
void insertDataSet(GNEDataSet *dataSet)
Insert a data set in container.
int getNumberOfSelectedRides() const
get number of selected rides
void clearDemandElements()
clear demand elements
void clearTAZSourceSinks()
clear sourceSinks
const std::unordered_map< const GUIGlObject *, GNECrossing * > & getCrossings() const
get crossings
void insertGenericData(GNEGenericData *genericData)
insert generic data in container
GNEEdge * registerEdge(GNEEdge *edge)
registers an edge with containers
void deleteDemandElement(GNEDemandElement *demandElement, const bool updateFrames)
delete demand element of container
void insertDataInterval(const GNEAttributeCarrier *AC, GNEDataInterval *dataInterval)
insert data interval in container
const std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEGenericData * >, std::hash< int > > & getGenericDatas() const
get all generic datas
int getNumberOfSelectedPersonTrips() const
get number of selected person trips
std::string generateDemandElementID(SumoXMLTag tag) const
generate demand element id
int getNumberOfMeanDatas() const
get number of meanDatas
GNECrossing * retrieveCrossing(const GUIGlObject *glObject, bool hardFail=true) const
get Crossing by AC
void addPrefixToEdges(const std::string &prefix)
add prefix to all edges
void remapJunctionAndEdgeIds()
remap junction and edge IDs
std::vector< GNEAttributeCarrier * > retrieveAttributeCarriers(SumoXMLTag tag=SUMO_TAG_NOTHING)
get the attribute carriers based on Type
AttributeCarriers()=delete
Invalidated default constructor.
void clearEdgeTypes()
clear edgeTypes
std::string generateEdgeID() const
generate edge ID
int getNumberOfSelectedTranships() const
get number of selected tranships
const std::unordered_map< SumoXMLTag, std::unordered_map< const GNEAttributeCarrier *, GNETAZSourceSink * >, std::hash< int > > & getTAZSourceSinks() const
get sourceSinks
int getNumberOfSelectedVehicles() const
get number of selected vehicles
int getNumberOfSelectedWalks() const
get number of selected walks
void deleteEdgeType(GNEEdgeType *edgeType)
delete edge type from container
int getNumberOfSelectedJpsWalkableAreas() const
get number of selected walkable areas
void deleteInternalLane(GNEInternalLane *internalLane)
delete internalLane from container
void deleteConnection(GNEConnection *connection)
delete connection from container
void clearAdditionals()
clear additionals
GNEAdditional * retrieveAdditional(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named additional.
std::vector< GNEGenericData * > retrieveGenericDatas(const SumoXMLTag genericDataTag, const double begin, const double end)
retrieve generic datas within the given interval
void insertInternalLane(GNEInternalLane *internalLane)
insert internalLane in container
int getStopIndex()
get (and update) stop index
std::set< std::string > retrieveGenericDataParameters(const std::string &genericDataTag, const double begin, const double end) const
return a set of parameters for the given data Interval
std::vector< GNEWalkingArea * > getSelectedWalkingAreas() const
return all selected walkingAreas
GNENet * myNet
pointer to net
void deleteSingleJunction(GNEJunction *junction)
delete junction from container
GNEMeanData * retrieveMeanData(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named meanData.
GNEJunction * registerJunction(GNEJunction *junction)
registers a junction in containers
const std::unordered_map< SumoXMLTag, std::map< const std::string, GNEMeanData * >, std::hash< int > > & getMeanDatas() const
get meanDatas
int getNumberOfSelectedWalkingAreas() const
get number of selected walkingAreas
GNEWalkingArea * retrieveWalkingArea(const GUIGlObject *glObject, bool hardFail=true) const
get WalkingArea by GlObject
GNEJunction * retrieveJunction(const std::string &id, bool hardFail=true) const
get junction by id
const std::map< const std::string, GNEDataSet * > & getDataSets() const
get demand elements
std::vector< GNEDemandElement * > getSelectedDemandElements() const
get selected demand elements
void updateJunctionID(GNEJunction *junction, const std::string &newID)
update junction ID in container
void deleteGenericData(GNEGenericData *genericData)
delete generic data of container
void insertCrossing(GNECrossing *crossing)
insert crossing in container
int getNumberOfSelectedWires() const
get number of selected Wires
std::string generateMeanDataID(SumoXMLTag type) const
generate meanData id
std::unordered_map< SumoXMLTag, std::map< const std::string, GNEMeanData * >, std::hash< int > > myMeanDatas
map with the tag and pointer to meanData elements of net
void insertMeanData(GNEMeanData *meanData)
Insert a meanData element in container.
GNEDataSet * retrieveDataSet(const std::string &id, bool hardFail=true) const
Returns the named data set.
int getNumberOfSelectedTAZs() const
get number of selected TAZs
void deleteWalkingArea(GNEWalkingArea *walkingArea)
delete walkingArea from container
int getNumberOfSelectedTransport() const
get number of selected transports
void updateMeanDataID(GNEMeanData *meanData, const std::string &newID)
update meanData ID in container
std::vector< GNELane * > getSelectedLanes() const
get selected lanes
void insertConnection(GNEConnection *connection)
insert connection in container
std::vector< GNEAdditional * > getSelectedAdditionals() const
get selected additionals
int getNumberOfSelectedJunctions() const
get number of selected junctions
const std::map< std::string, GNEEdge * > & getEdges() const
map with the ID and pointer to edges of net
std::unordered_map< SumoXMLTag, std::map< const std::string, GNEAdditional * >, std::hash< int > > myAdditionalIDs
map with the tag and pointer to additional elements of net, sorted by IDs
int getNumberOfDataElements() const
get number of current data elements saved in AttributeCarriers
int getNumberOfGenericDatas() const
Return the number of generic datas.
void updateAdditionalID(GNEAdditional *additional, const std::string &newID)
update additional ID in container
int getNumberOfSelectedDemandElements() const
get number of selected demand elements
std::unordered_map< SumoXMLTag, std::unordered_map< const GNEAttributeCarrier *, GNETAZSourceSink * >, std::hash< int > > myTAZSourceSinks
map with the tag and pointer to TAZSourceSinks elements of net
int getNumberOfSelectedPersons() const
get number of selected persons
int getNumberOfSelectedPureAdditionals() const
get number of selected pure additionals (Except POIs, Polygons, TAZs and Wires)
GNEEdgeType * retrieveEdgeType(const std::string &id, bool hardFail=true) const
get edge type by id
void deleteMeanData(GNEMeanData *meanData)
delete meanData element of container
GNEAdditional * retrieveAdditionals(const std::vector< SumoXMLTag > types, const std::string &id, bool hardFail=true) const
Returns the named additional.
int getNumberOfSelectedRoutes() const
get number of selected routes
void addDefaultVTypes()
add default VTypes
int getNumberOfSelectedPOIs() const
get number of selected POIs
void deleteSingleEdge(GNEEdge *edge)
delete edge from container
GNEDemandElement * retrieveDemandElements(const std::vector< SumoXMLTag > types, const std::string &id, bool hardFail=true) const
Returns the named demand element.
std::string generateAdditionalID(SumoXMLTag type) const
generate additional id
void deleteAdditional(GNEAdditional *additional)
delete additional element of container
int getNumberOfDemandElements() const
get number of current demand elements saved in AttributeCarriers (default vTypes are NOT included)
int getNumberOfSelectedPolygons() const
get number of selected polygons
std::vector< GNEJunction * > getSelectedJunctions() const
return selected junctions
std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEAdditional * >, std::hash< int > > myAdditionals
map with the tag and pointer to additional elements of net
int getNumberOfAdditionals() const
get number of additionals
std::unordered_map< SumoXMLTag, std::map< const std::string, GNEDemandElement * >, std::hash< int > > myDemandElementIDs
map with the tag and pointer to demand elements of net, sorted by IDs
void updateDemandElementID(GNEDemandElement *demandElement, const std::string &newID)
update demand element ID in container
bool isNetworkElementAroundTriangle(GNEAttributeCarrier *AC, const Triangle &triangle) const
check if shape of given AC (network element) is around the given triangle
void insertDemandElement(GNEDemandElement *demandElement)
Insert a demand element in container.
void insertTAZSourceSink(GNETAZSourceSink *sourceSink)
Insert a sourceSink element in container.
void updateEdgeID(GNEEdge *edge, const std::string &newID)
update edge ID in container
GNEDataInterval * retrieveDataInterval(const GNEAttributeCarrier *AC, bool hardFail=true) const
Returns the data interval.
std::vector< GNECrossing * > getSelectedCrossings() const
return all selected crossings
int getNumberOfSelectedLanes() const
get number of selected lanes
GNEAdditional * retrieveRerouterInterval(const std::string &rerouterID, const SUMOTime begin, const SUMOTime end) const
Returns the rerouter interval defined by given begin and end.
int getNumberOfSelectedEdgeDatas() const
get number of selected edge datas
void updateEdgeTypeID(GNEEdgeType *edgeType, const std::string &newID)
update edgeType ID in container
GNEInternalLane * retrieveInternalLane(const GUIGlObject *glObject, bool hardFail=true) const
get InternalLane by GUIGlObject
void updateDemandElementFrames(const GNETagProperties *tagProperty)
update demand element frames (called after insert/delete demand element)
void insertAdditional(GNEAdditional *additional)
Insert a additional element in container.
void retrieveAttributeCarriersRecursively(const GNETagProperties *tag, std::vector< GNEAttributeCarrier * > &ACs)
retrieve attribute carriers recursively
void insertEdgeType(GNEEdgeType *edgeType)
insert edge type in container
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
const std::unordered_map< const GUIGlObject *, GNELane * > & getLanes() const
get lanes
const std::unordered_map< const GNEAttributeCarrier *, GNEDataInterval * > & getDataIntervals() const
get all data intervals of network
int getNumberOfSelectedEdgeTAZRel() const
get number of selected edge TAZ Rels
std::vector< GNEGenericData * > getSelectedGenericDatas() const
get selected generic datas
void deleteLane(GNELane *lane)
delete lane from container
void insertJunction(GNEJunction *junction)
insert junction in container
std::vector< GNEEdge * > getSelectedEdges() const
return all edges
int getNumberOfNetworkElements() const
functions related with number of elements sorted by categories
const std::map< std::string, GNEJunction * > & getJunctions() const
get junctions
int getNumberOfSelectedEdges() const
get number of selected edges
const std::map< std::string, GNEEdgeType * > & getEdgeTypes() const
map with the ID and pointer to edgeTypes of net
void clearMeanDatas()
clear meanDatas
GNEDemandElement * retrieveDemandElement(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named demand element.
std::vector< GNEConnection * > getSelectedConnections() const
get selected connections
std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEDemandElement * >, std::hash< int > > myDemandElements
map with the tag and pointer to demand elements elements of net
void clearJunctions()
clear junctions
const std::unordered_map< const GUIGlObject *, GNEWalkingArea * > & getWalkingAreas() const
get walkingAreas
void deleteCrossing(GNECrossing *crossing)
delete crossing from container
GNEDemandElement * getDefaultType() const
get default type
const std::unordered_map< SumoXMLTag, std::unordered_map< const GUIGlObject *, GNEAdditional * >, std::hash< int > > & getAdditionals() const
get additionals
std::vector< std::string > getPOIParamKeys() const
return list of available POI parameters
GNEGenericData * retrieveGenericData(const GUIGlObject *glObject, bool hardFail=true) const
Returns the generic data.
std::vector< GNEAttributeCarrier * > getSelectedAttributeCarriers(const bool ignoreCurrentSupermode)
get all selected attribute carriers (or only relative to current supermode
int getNumberOfSelectedStops() const
get number of selected stops
std::string generateEdgeTypeID() const
generate edgeType id
void deleteDataInterval(GNEDataInterval *dataInterval)
delete data interval of container
GNEConnection * retrieveConnection(const std::string &id, bool hardFail=true) const
get Connection by id
void deleteTAZSourceSink(GNETAZSourceSink *sourceSink)
delete sourceSink element of container
int getNumberOfSelectedContainers() const
get number of selected containers
std::string generateDataSetID() const
generate data set id
int getNumberOfTAZSourceSinks() const
get number of TAZSourceSinks
std::string undoName() const
undo name
GNEChange_ReplaceEdgeInTLS(NBTrafficLightLogicCont &tllcont, NBEdge *replaced, NBEdge *by)
constructor
std::string redoName() const
get Redo name
bool trueChange()
wether original and new value differ
bool existMeanDataFilename(const std::string &file) const
check if the given meanData file was already registered
ACsbyFilename getMeanDatasByFilename()
get meanDatas sorted by filenames (and also clear unused filenames)
std::string parsingSavingFiles(const std::vector< std::string > &savingFiles) const
parsing saving files
const std::vector< std::string > & getAdditionalFilenames() const
get vector with additional elements saving files (starting with default)
void addDataFilename(const GNEAttributeCarrier *dataElement)
data elements
void updateMeanDataEmptyFilenames(const std::string &file)
update meanData elements with empty filenames with the given file
void addMeanDataFilename(const GNEAttributeCarrier *meanDataElement)
meanData elements
ACsbyFilename getDatasByFilename()
get datas sorted by filenames (and also clear unused filenames)
void updateAdditionalEmptyFilenames(const std::string &file)
update additional elements with empty filenames with the given file
const std::vector< std::string > & getDemandFilenames() const
get vector with demand elements saving files (starting with default)
bool existAdditionalFilename(const std::string &file) const
check if the given additional file was already registered
void updateDataEmptyFilenames(const std::string &file)
update data elements with empty filenames with the given file
bool existDataFilename(const std::string &file) const
check if the given data file was already registered
void updateNeteditConfig()
update netedit config
ACsbyFilename getAdditionalsByFilename()
get additionals sorted by filenames (and also clear unused filenames)
ACsbyFilename getDemandsByFilename()
get demands sorted by filenames (and also clear unused filenames)
void updateDemandEmptyFilenames(const std::string &file)
update demand elements with empty filenames with the given file
const std::vector< std::string > & getMeanDataFilenames() const
get vector with meanData elements saving files (starting with default)
const std::vector< std::string > & getDataFilenames() const
get vector with data elements saving files (starting with default)
std::map< std::string, std::unordered_set< const GNEAttributeCarrier * > > ACsbyFilename
typedef used for group ACs by filename
void addDemandFilename(const GNEAttributeCarrier *demandElement)
demand elements
SavingFilesHandler()=delete
Invalidated default constructor.
bool existDemandFilename(const std::string &file) const
check if the given demand file was already registered
void addAdditionalFilename(const GNEAttributeCarrier *additionalElement)
additional elements
void requireSaveTLS()
inform that TLS has to be saved
GNEDialog::Result askSaveMeanDataElements(GNEDialog::Result &commonResult) const
warns about unsaved changes in meanData elements and gives the user the option to abort
void dataElementsSaved()
mark demand elements as saved
bool isEdgeTypeSaved() const
check if edgeType are saved
GNEDialog::Result askSaveDemandElements(GNEDialog::Result &commonResult) const
warns about unsaved changes in demand elements and gives the user the option to abort
void requireSaveNetwork()
inform that network has to be saved
void requireSaveEdgeType()
inform that edgeType has to be saved
bool isTLSSaved() const
check if TLS are saved
void demandElementsSaved()
mark demand elements as saved
void SumoConfigSaved()
mark SumoConfig as saved
void additionalsSaved()
mark additionals as saved
void requireSaveNeteditConfig()
inform that netedit config has to be saved
void requireSaveSumoConfig()
inform that SumoConfig has to be saved
void TLSSaved()
mark TLS as saved
bool isSumoConfigSaved() const
check if SumoConfig is saved
void neteditConfigSaved()
mark netedit config as saved
void requireSaveMeanDatas()
inform that mean data elements has to be saved
void meanDatasSaved()
mark mean data elements as saved
bool isDemandElementsSaved() const
check if demand elements are saved
GNEDialog::Result askSaveAdditionalElements(GNEDialog::Result &commonResult) const
warns about unsaved changes in additionals and gives the user the option to abort
void requireSaveAdditionals()
inform that additionals has to be saved
bool isDataElementsSaved() const
check if data elements are saved
bool isNetworkSaved() const
check if network is saved
bool isMeanDatasSaved() const
check if mean data elements are saved
void requireSaveDataElements()
inform that data elements has to be saved
bool isNeteditConfigSaved() const
check if netedit config is saved
void networkSaved()
mark network as saved
GNEDialog::Result askSaveNetwork(GNEDialog::Result &commonResult) const
warns about unsaved changes in network and gives the user the option to abort
bool isAdditionalsSaved() const
check if additionals are saved
SavingStatus()=delete
invalidate default constructor
void requireSaveDemandElements()
inform that demand elements has to be saved
void edgeTypeSaved()
mark edgeType as saved
GNEDialog::Result askSaveDataElements(GNEDialog::Result &commonResult) const
warns about unsaved changes in data elements and gives the user the option to abort
A NBNetBuilder extended by visualisation and editing capabilities.
Definition GNENet.h:42
const GNETagPropertiesDatabase * getTagPropertiesDatabase() const
get tag properties database
Definition GNENet.cpp:138
GUIGlObject * getGUIGlObject() override
get GUIGlObject associated with this AttributeCarrier
void setNetworkElementID(const std::string &newID)
set network element id
virtual void computePathElement()=0
implement in children+
void decRef(const std::string &debugMsg="")
Decrease reference.
void incRef(const std::string &debugMsg="")
Increase reference.
const std::vector< const GNETagProperties * > getTagPropertiesByType(const GNETagProperties::Type type) const
get tagProperties associated to the given GNETagProperties::Type (NETWORKELEMENT, ADDITIONALELEMENT,...
bool isContainer() const
return true if tag correspond to a container element
bool isNetworkElement() const
network elements
bool isDataElement() const
return true if tag correspond to a data element
bool isType() const
demand elements
bool isRoute() const
return true if tag correspond to a route element
bool isPlacedInRTree() const
return true if Tag correspond to an element that has to be placed in RTREE
const std::vector< const GNETagProperties * > & getHierarchicalChildren() const
get children of this tag property
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
bool isDemandElement() const
return true if tag correspond to a demand element
bool isAdditionalElement() const
return true if tag correspond to an additional element (note: this include TAZ, shapes and wires)
bool hasAttribute(SumoXMLAttr attr) const
check if current TagProperties owns the attribute "attr"
bool isPerson() const
return true if tag correspond to a person element
const PositionVector & getShape() const
The shape of the additional element.
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
virtual void setMicrosimID(const std::string &newID)
Changes the microsimID of the object.
void unblockObject(GUIGlID id)
Marks an object as unblocked.
GUIGlObject * getObjectBlocking(GUIGlID id) const
Returns the object from the container locking it.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
const std::unordered_set< GUIGlID > & getSelected() const
Returns the set of ids of all selected objects.
The representation of a single edge during network building.
Definition NBEdge.h:92
NBNode * getToNode() const
Returns the destination node of the edge.
Definition NBEdge.h:552
const std::string & getID() const
Definition NBEdge.h:1551
NBNode * getFromNode() const
Returns the origin node of the edge.
Definition NBEdge.h:545
void addIncomingEdge(NBEdge *edge)
adds an incoming edge
Definition NBNode.cpp:531
Position getCenter() const
Returns a position that is guaranteed to lie within the node shape.
Definition NBNode.cpp:4221
int buildCrossings()
build pedestrian crossings
Definition NBNode.cpp:3154
void addOutgoingEdge(NBEdge *edge)
adds an outgoing edge
Definition NBNode.cpp:541
const Position & getPosition() const
Definition NBNode.h:260
const PositionVector & getShape() const
retrieve the junction shape
Definition NBNode.cpp:2781
A container for traffic light definitions and built programs.
const std::string & getID() const
Returns the id.
Definition Named.h:74
static const std::vector< SumoXMLTag > types
type namespace
static const std::vector< SumoXMLTag > busStops
busStops namespace
static const std::vector< SumoXMLTag > vehicles
vehicles namespace
static const std::vector< SumoXMLTag > laneAreaDetectors
lane area detectors namespace
static const std::vector< SumoXMLTag > POIs
POIs namespace.
static const std::vector< SumoXMLTag > routes
route namespace
static const std::vector< SumoXMLTag > persons
persons namespace
static const std::vector< SumoXMLTag > calibrators
calibrators namespace
static const std::vector< SumoXMLTag > polygons
polygon namespace
static const std::vector< SumoXMLTag > containers
containers namespace
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
static OptionsCont & getOptions()
Retrieves the options.
C++ TraCI client API implementation.
double z() const
Returns the z-position.
Definition Position.h:62
long long int parametersSet
Information for the router which parameter were set.
static std::string getEdgeIDFromLane(const std::string laneID)
return edge id when given the lane ID
A simple triangle defined in 3D.
Definition Triangle.h:35
bool isPositionWithin(const Position &pos) const
check if the given position is within this triangle
Definition Triangle.cpp:53
bool intersectWithShape(const PositionVector &shape) const
check if the given shape is within or intersect with this triangle
Definition Triangle.cpp:68