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 myNet->addGLObjectIntoGrid(additional);
2566 // update geometry after insertion of additionals if myUpdateGeometryEnabled is enabled
2567 if (myNet->isUpdateGeometryEnabled()) {
2568 additional->updateGeometry();
2569 }
2570 // additionals has to be saved
2571 myNet->getSavingStatus()->requireSaveAdditionals();
2572 }
2573}
2574
2575
2576void
2578 const auto tag = additional->getTagProperty()->getTag();
2579 // find demanElement in additionalTag
2580 auto itFind = myAdditionals.at(tag).find(additional->getGUIGlObject());
2581 // check if additional was previously inserted
2582 if (itFind == myAdditionals.at(tag).end()) {
2583 throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' wasn't previously inserted");
2584 } else {
2585 // remove from both container
2586 myAdditionals.at(tag).erase(itFind);
2587 if (additional->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2588 myAdditionalIDs.at(tag).erase(myAdditionalIDs.at(tag).find(additional->getID()));
2589 }
2590 myNumberOfNetworkElements--;
2591 // remove it from inspected elements and GNEElementTree
2592 myNet->getViewNet()->getInspectedElements().uninspectAC(additional);
2593 additional->unmarkForDrawingFront();
2594 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(additional);
2595 // remove element from grid
2596 myNet->removeGLObjectFromGrid(additional);
2597 // delete path element
2598 myNet->getNetworkPathManager()->removePath(additional);
2599 // additionals has to be saved
2600 myNet->getSavingStatus()->requireSaveAdditionals();
2601 }
2602}
2603
2604
2605
2606
2607void
2609 const auto sourceSinkTag = sourceSink->getTagProperty()->getTag();
2610 if (myTAZSourceSinks.at(sourceSinkTag).count(sourceSink) > 0) {
2611 throw ProcessError(sourceSink->getTagStr() + " with ID='" + sourceSink->getID() + "' already exist");
2612 } else {
2613 myTAZSourceSinks.at(sourceSinkTag)[sourceSink] = sourceSink;
2614 myNumberOfNetworkElements++;
2615 // additionals has to be saved
2616 myNet->getSavingStatus()->requireSaveAdditionals();
2617 }
2618}
2619
2620
2621void
2623 const auto tag = sourceSink->getTagProperty()->getTag();
2624 // find demanElement in additionalTag
2625 auto itFind = myTAZSourceSinks.at(tag).find(sourceSink);
2626 // check if sourceSink was previously inserted
2627 if (itFind == myTAZSourceSinks.at(tag).end()) {
2628 throw ProcessError(sourceSink->getTagStr() + " with ID='" + sourceSink->getID() + "' wasn't previously inserted");
2629 } else {
2630 // remove from both container
2631 myTAZSourceSinks.at(tag).erase(itFind);
2632 myNumberOfNetworkElements--;
2633 // remove it from inspected elements and GNEElementTree
2634 myNet->getViewNet()->getInspectedElements().uninspectAC(sourceSink);
2635 sourceSink->unmarkForDrawingFront();
2636 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(sourceSink);
2637 // additionals has to be saved
2638 myNet->getSavingStatus()->requireSaveAdditionals();
2639 }
2640}
2641
2642
2643void
2645 const auto tag = demandElement->getTagProperty()->getTag();
2646 if (myDemandElements.at(tag).count(demandElement) > 0) {
2647 throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' already exist");
2648 } else {
2649 myDemandElements.at(tag)[demandElement->getGUIGlObject()] = demandElement;
2650 myNumberOfDemandElements++;
2651 if (demandElement->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2652 myDemandElementIDs.at(tag)[demandElement->getID()] = demandElement;
2653 }
2654 // add element in grid
2655 myNet->addGLObjectIntoGrid(demandElement);
2656 // update geometry after insertion of demandElements if myUpdateGeometryEnabled is enabled
2657 if (myNet->isUpdateGeometryEnabled()) {
2658 demandElement->updateGeometry();
2659 }
2660 // compute path element
2661 if (myNet->getViewNet()->getEditModes().isCurrentSupermodeDemand()) {
2662 demandElement->computePathElement();
2663 }
2664 // update demand elements frames
2665 updateDemandElementFrames(demandElement->getTagProperty());
2666 // demandElements has to be saved
2667 myNet->getSavingStatus()->requireSaveDemandElements();
2668 }
2669}
2670
2671
2672void
2674 const auto tag = demandElement->getTagProperty()->getTag();
2675 auto viewParent = myNet->getViewNet()->getViewParent();
2676 // find demanElement in demandElementTag
2677 auto itFind = myDemandElements.at(tag).find(demandElement->getGUIGlObject());
2678 // check if demandElement was previously inserted
2679 if (itFind == myDemandElements.at(tag).end()) {
2680 throw ProcessError(demandElement->getTagStr() + " with ID='" + demandElement->getID() + "' wasn't previously inserted");
2681 } else {
2682 // erase it from container
2683 myDemandElements.at(tag).erase(itFind);
2684 if (demandElement->getTagProperty()->hasAttribute(SUMO_ATTR_ID)) {
2685 myDemandElementIDs.at(tag).erase(myDemandElementIDs.at(tag).find(demandElement->getID()));
2686 }
2687 myNumberOfDemandElements--;
2688 // remove element from grid
2689 myNet->removeGLObjectFromGrid(demandElement);
2690 // remove it from inspected elements and GNEElementTree
2691 myNet->getViewNet()->getInspectedElements().uninspectAC(demandElement);
2692 demandElement->unmarkForDrawingFront();
2693 // if is the last inserted route, remove it from GNEViewNet
2694 if (myNet->getViewNet()->getLastCreatedRoute() == demandElement) {
2695 myNet->getViewNet()->setLastCreatedRoute(nullptr);
2696 }
2697 // delete path element
2698 myNet->getDemandPathManager()->removePath(demandElement);
2699 // check if update demand elements frames
2700 if (updateFrames) {
2701 updateDemandElementFrames(demandElement->getTagProperty());
2702 viewParent->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(demandElement);
2703 viewParent->getPersonPlanFrame()->getPersonHierarchy()->removeCurrentEditedAttributeCarrier(demandElement);
2704 viewParent->getContainerPlanFrame()->getContainerHierarchy()->removeCurrentEditedAttributeCarrier(demandElement);
2705 // update distribution frames
2706 if (viewParent->getRouteDistributionFrame()->getDistributionSelector()->getCurrentDistribution() == demandElement) {
2707 viewParent->getRouteDistributionFrame()->getDistributionSelector()->setDistribution(nullptr);
2708 }
2709 if (viewParent->getTypeDistributionFrame()->getDistributionSelector()->getCurrentDistribution() == demandElement) {
2710 viewParent->getTypeDistributionFrame()->getDistributionSelector()->setDistribution(nullptr);
2711 }
2712 // special case for distribution references
2713 if (demandElement->getTagProperty()->getTag() == GNE_TAG_VTYPEREF) {
2714 viewParent->getTypeDistributionFrame()->getDistributionValuesEditor()->refreshRows();
2715 }
2716 if (demandElement->getTagProperty()->getTag() == GNE_TAG_ROUTEREF) {
2717 viewParent->getRouteDistributionFrame()->getDistributionValuesEditor()->refreshRows();
2718 }
2719 }
2720 // demandElements has to be saved
2721 myNet->getSavingStatus()->requireSaveDemandElements();
2722 }
2723}
2724
2725
2726void
2728 if (myDataSets.count(dataSet->getID()) > 0) {
2729 throw ProcessError(dataSet->getTagStr() + " with ID='" + dataSet->getID() + "' already exist");
2730 } else {
2731 myDataSets[dataSet->getID()] = dataSet;
2732 myNumberOfDataElements++;
2733 // dataSets has to be saved
2734 myNet->getSavingStatus()->requireSaveDataElements();
2735 // mark interval toolbar for update
2736 myNet->getViewNet()->getIntervalBar().markForUpdate();
2737 }
2738}
2739
2740
2741void
2743 const auto finder = myDataSets.find(dataSet->getID());
2744 if (finder == myDataSets.end()) {
2745 throw ProcessError(dataSet->getTagStr() + " with ID='" + dataSet->getID() + "' wasn't previously inserted");
2746 } else {
2747 myDataSets.erase(finder);
2748 myNumberOfDataElements--;
2749 // remove it from inspected elements and GNEElementTree
2750 myNet->getViewNet()->getInspectedElements().uninspectAC(dataSet);
2751 dataSet->unmarkForDrawingFront();
2752 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(dataSet);
2753 // dataSets has to be saved
2754 myNet->getSavingStatus()->requireSaveDataElements();
2755 // mark interval toolbar for update
2756 myNet->getViewNet()->getIntervalBar().markForUpdate();
2757 }
2758}
2759
2760
2761void
2763 if (myMeanDatas.at(meanData->getTagProperty()->getTag()).count(meanData->getID()) > 0) {
2764 throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' already exist");
2765 } else {
2766 myMeanDatas.at(meanData->getTagProperty()->getTag()).insert(std::make_pair(meanData->getID(), meanData));
2767 myNumberOfMeanDataElements++;
2768 // meanDatas has to be saved
2769 myNet->getSavingStatus()->requireSaveMeanDatas();
2770 }
2771}
2772
2773
2774void
2776 // find demanElement in meanDataTag
2777 auto itFind = myMeanDatas.at(meanData->getTagProperty()->getTag()).find(meanData->getID());
2778 // check if meanData was previously inserted
2779 if (itFind == myMeanDatas.at(meanData->getTagProperty()->getTag()).end()) {
2780 throw ProcessError(meanData->getTagStr() + " with ID='" + meanData->getID() + "' wasn't previously inserted");
2781 } else {
2782 // remove from container
2783 myMeanDatas.at(meanData->getTagProperty()->getTag()).erase(itFind);
2784 myNumberOfMeanDataElements--;
2785 // remove it from inspected elements and GNEElementTree
2786 myNet->getViewNet()->getInspectedElements().uninspectAC(meanData);
2787 meanData->unmarkForDrawingFront();
2788 myNet->getViewNet()->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(meanData);
2789 // remove element from grid
2790 myNet->removeGLObjectFromGrid(meanData);
2791 // meanDatas has to be saved
2792 myNet->getSavingStatus()->requireSaveMeanDatas();
2793 }
2794}
2795
2796
2797void
2799 if (myNet->getViewNet()->getEditModes().isCurrentSupermodeDemand()) {
2800 // continue depending of demand mode
2801 switch (myNet->getViewNet()->getEditModes().demandEditMode) {
2803 if (tagProperty->isType()) {
2804 myNet->getViewNet()->getViewParent()->getVehicleFrame()->getTypeSelector()->refreshDemandElementSelector();
2805 }
2806 break;
2808 if (tagProperty->isType()) {
2809 myNet->getViewNet()->getViewParent()->getTypeFrame()->getTypeSelector()->refreshTypeSelector(true);
2810 }
2811 break;
2813 if (tagProperty->isType()) {
2814 myNet->getViewNet()->getViewParent()->getTypeDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
2815 }
2816 break;
2818 if (tagProperty->isRoute()) {
2819 myNet->getViewNet()->getViewParent()->getRouteDistributionFrame()->getDistributionSelector()->refreshDistributionSelector();
2820 }
2821 break;
2823 if (tagProperty->isType()) {
2824 myNet->getViewNet()->getViewParent()->getPersonFrame()->getTypeSelector()->refreshDemandElementSelector();
2825 }
2826 break;
2828 if (tagProperty->isPerson()) {
2829 myNet->getViewNet()->getViewParent()->getPersonPlanFrame()->getPersonSelector()->refreshDemandElementSelector();
2830 }
2831 break;
2833 if (tagProperty->isType()) {
2834 myNet->getViewNet()->getViewParent()->getContainerFrame()->getTypeSelector()->refreshDemandElementSelector();
2835 }
2836 break;
2838 if (tagProperty->isContainer()) {
2839 myNet->getViewNet()->getViewParent()->getContainerPlanFrame()->getContainerSelector()->refreshDemandElementSelector();
2840 }
2841 break;
2843 myNet->getViewNet()->getViewParent()->getStopFrame()->getStopParentSelector()->refreshDemandElementSelector();
2844 break;
2845 default:
2846 // nothing to update
2847 break;
2848 }
2849 }
2850}
2851
2852
2853void
2855 // fill network elements
2856 if (tag->getTag() == SUMO_TAG_JUNCTION) {
2857 for (const auto& junction : myJunctions) {
2858 ACs.push_back(junction.second);
2859 }
2860 }
2861 if (tag->getTag() == SUMO_TAG_EDGE) {
2862 for (const auto& edge : myEdges) {
2863 ACs.push_back(edge.second);
2864 }
2865 }
2866 if (tag->getTag() == SUMO_TAG_LANE) {
2867 for (const auto& lane : myLanes) {
2868 ACs.push_back(lane.second);
2869 }
2870 }
2871 if (tag->getTag() == SUMO_TAG_CONNECTION) {
2872 for (const auto& connection : myConnections) {
2873 ACs.push_back(connection.second);
2874 }
2875 }
2876 if (tag->getTag() == SUMO_TAG_CROSSING) {
2877 for (const auto& crossing : myCrossings) {
2878 ACs.push_back(crossing.second);
2879 }
2880 }
2881 if (tag->getTag() == SUMO_TAG_WALKINGAREA) {
2882 for (const auto& walkingArea : myWalkingAreas) {
2883 ACs.push_back(walkingArea.second);
2884 }
2885 }
2886 // fill additional elements
2887 if (tag->isAdditionalElement()) {
2888 for (const auto& additionalTag : myAdditionals) {
2889 if (additionalTag.first == tag->getTag()) {
2890 for (const auto& additional : additionalTag.second) {
2891 ACs.push_back(additional.second);
2892 }
2893 }
2894 }
2895 }
2896 // fill demand elements
2897 if (tag->isDemandElement()) {
2898 for (const auto& demandElementTag : myDemandElements) {
2899 if (demandElementTag.first == tag->getTag()) {
2900 for (const auto& demandElemet : demandElementTag.second) {
2901 ACs.push_back(demandElemet.second);
2902 }
2903 }
2904 }
2905 }
2906 // fill data elements
2907 if (tag->isDataElement()) {
2908 if (tag->getTag() == SUMO_TAG_DATASET) {
2909 for (const auto& dataSet : myDataSets) {
2910 ACs.push_back(dataSet.second);
2911 }
2912 }
2913 if (tag->getTag() == SUMO_TAG_DATAINTERVAL) {
2914 for (const auto& dataInterval : myDataIntervals) {
2915 ACs.push_back(dataInterval.second);
2916 }
2917 }
2918 for (const auto& genericDataTag : myGenericDatas) {
2919 if (genericDataTag.first == tag->getTag()) {
2920 for (const auto& genericData : genericDataTag.second) {
2921 ACs.push_back(genericData.second);
2922 }
2923 }
2924 }
2925 for (const auto& meanDataTag : myMeanDatas) {
2926 if (meanDataTag.first == tag->getTag()) {
2927 for (const auto& meanData : meanDataTag.second) {
2928 ACs.push_back(meanData.second);
2929 }
2930 }
2931 }
2932 }
2933 // iterate over children
2934 for (const auto child : tag->getHierarchicalChildren()) {
2935 retrieveAttributeCarriersRecursively(child, ACs);
2936 }
2937}
2938
2939// ---------------------------------------------------------------------------
2940// GNENetHelper::GNETagSelector - methods
2941// ---------------------------------------------------------------------------
2942
2944 myNet(net) {
2945}
2946
2947
2948void
2950 // network
2951 myTemplates[SUMO_TAG_CROSSING] = new GNECrossing(myNet);
2952 // additionals
2953 myTemplates[SUMO_TAG_BUS_STOP] = GNEBusStop::buildBusStop(myNet);
2954 myTemplates[SUMO_TAG_TRAIN_STOP] = GNEBusStop::buildTrainStop(myNet);
2955 myTemplates[SUMO_TAG_ACCESS] = new GNEAccess(myNet);
2956 myTemplates[SUMO_TAG_CONTAINER_STOP] = new GNEContainerStop(myNet);
2957 myTemplates[SUMO_TAG_CHARGING_STATION] = new GNEChargingStation(myNet);
2958 myTemplates[SUMO_TAG_PARKING_AREA] = new GNEParkingArea(myNet);
2959 myTemplates[SUMO_TAG_PARKING_SPACE] = new GNEParkingSpace(myNet);
2960 myTemplates[SUMO_TAG_INDUCTION_LOOP] = new GNEInductionLoopDetector(myNet);
2965 myTemplates[SUMO_TAG_DET_EXIT] = new GNEEntryExitDetector(SUMO_TAG_DET_EXIT, myNet);
2967 myTemplates[SUMO_TAG_VSS] = new GNEVariableSpeedSign(myNet);
2968 myTemplates[SUMO_TAG_STEP] = new GNEVariableSpeedSignStep(myNet);
2969 myTemplates[SUMO_TAG_CALIBRATOR] = new GNECalibrator(SUMO_TAG_CALIBRATOR, myNet);
2971 myTemplates[GNE_TAG_CALIBRATOR_FLOW] = new GNECalibratorFlow(myNet);
2972 myTemplates[SUMO_TAG_REROUTER] = new GNERerouter(myNet);
2973 myTemplates[SUMO_TAG_INTERVAL] = new GNERerouterInterval(myNet);
2974 myTemplates[SUMO_TAG_CLOSING_REROUTE] = new GNEClosingReroute(myNet);
2975 myTemplates[SUMO_TAG_CLOSING_LANE_REROUTE] = new GNEClosingLaneReroute(myNet);
2976 myTemplates[SUMO_TAG_DEST_PROB_REROUTE] = new GNEDestProbReroute(myNet);
2977 myTemplates[SUMO_TAG_PARKING_AREA_REROUTE] = new GNEParkingAreaReroute(myNet);
2978 myTemplates[SUMO_TAG_ROUTE_PROB_REROUTE] = new GNERouteProbReroute(myNet);
2979 myTemplates[SUMO_TAG_ROUTEPROBE] = new GNERouteProbe(myNet);
2980 myTemplates[SUMO_TAG_VAPORIZER] = new GNEVaporizer(myNet);
2981 // symbols
2982 myTemplates[GNE_TAG_REROUTER_SYMBOL] = new GNERerouterSymbol(myNet);
2983 myTemplates[GNE_TAG_VSS_SYMBOL] = new GNEVariableSpeedSignSymbol(myNet);
2984 // shapes
2985 myTemplates[SUMO_TAG_POLY] = new GNEPoly(SUMO_TAG_POLY, myNet);
2986 myTemplates[SUMO_TAG_POI] = new GNEPOI(SUMO_TAG_POI, myNet);
2987 myTemplates[GNE_TAG_POILANE] = new GNEPOI(GNE_TAG_POILANE, myNet);
2988 myTemplates[GNE_TAG_POIGEO] = new GNEPOI(GNE_TAG_POIGEO, myNet);
2989 // TAZs
2990 myTemplates[SUMO_TAG_TAZ] = new GNETAZ(myNet);
2991 myTemplates[SUMO_TAG_TAZSOURCE] = new GNETAZSourceSink(SUMO_TAG_TAZSOURCE, myNet);
2992 myTemplates[SUMO_TAG_TAZSINK] = new GNETAZSourceSink(SUMO_TAG_TAZSINK, myNet);
2993 // wires
2994 myTemplates[SUMO_TAG_TRACTION_SUBSTATION] = new GNETractionSubstation(myNet);
2995 myTemplates[SUMO_TAG_OVERHEAD_WIRE_SECTION] = new GNEOverheadWire(myNet);
2996 //myTemplates[SUMO_TAG_OVERHEAD_WIRE_CLAMP] = nullptr; // TMP
2997 // JuPedSim elements
2999 myTemplates[GNE_TAG_JPS_OBSTACLE] = new GNEPoly(GNE_TAG_JPS_OBSTACLE, myNet);
3000 // vTypes
3001 myTemplates[SUMO_TAG_VTYPE] = new GNEVType(SUMO_TAG_VTYPE, myNet);
3002 // vType distributions
3003 myTemplates[SUMO_TAG_VTYPE_DISTRIBUTION] = new GNEVTypeDistribution(myNet);
3004 myTemplates[GNE_TAG_VTYPEREF] = new GNEVTypeRef(myNet);
3005 // routes
3006 myTemplates[SUMO_TAG_ROUTE] = new GNERoute(SUMO_TAG_ROUTE, myNet);
3007 myTemplates[GNE_TAG_ROUTE_EMBEDDED] = new GNERoute(GNE_TAG_ROUTE_EMBEDDED, myNet);
3008 // route distribution
3009 myTemplates[SUMO_TAG_ROUTE_DISTRIBUTION] = new GNERouteDistribution(myNet);
3010 myTemplates[GNE_TAG_ROUTEREF] = new GNERouteRef(myNet);
3011 // vehicles
3012 const auto vehicles = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::VEHICLE);
3013 for (const auto vehicle : vehicles) {
3014 myTemplates[vehicle->getTag()] = new GNEVehicle(vehicle->getTag(), myNet);
3015 }
3016 // persons
3017 const auto persons = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::PERSON);
3018 for (const auto person : persons) {
3019 myTemplates[person->getTag()] = new GNEPerson(person->getTag(), myNet);
3020 }
3021 // container
3022 const auto containers = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::CONTAINER);
3023 for (const auto container : containers) {
3024 myTemplates[container->getTag()] = new GNEContainer(container->getTag(), myNet);
3025 }
3026 // stops and waypoints
3027 const auto stopAndWaypoints = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_VEHICLE);
3028 for (const auto stopAndWaypoint : stopAndWaypoints) {
3029 myTemplates[stopAndWaypoint->getTag()] = new GNEStop(stopAndWaypoint->getTag(), myNet);
3030 }
3031 // personTrip
3032 const auto personTrips = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::PERSONTRIP);
3033 for (const auto personTrip : personTrips) {
3034 myTemplates[personTrip->getTag()] = new GNEPersonTrip(personTrip->getTag(), myNet);
3035 }
3036 // walk
3037 const auto walks = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::WALK);
3038 for (const auto walk : walks) {
3039 myTemplates[walk->getTag()] = new GNEWalk(walk->getTag(), myNet);
3040 }
3041 // ride
3042 const auto rides = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::RIDE);
3043 for (const auto ride : rides) {
3044 myTemplates[ride->getTag()] = new GNERide(ride->getTag(), myNet);
3045 }
3046 // stop person
3047 const auto stopPersons = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_PERSON);
3048 for (const auto stopPerson : stopPersons) {
3049 myTemplates[stopPerson->getTag()] = new GNEStopPlan(stopPerson->getTag(), myNet);
3050 }
3051 // transport
3052 const auto transports = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::TRANSPORT);
3053 for (const auto transport : transports) {
3054 myTemplates[transport->getTag()] = new GNETransport(transport->getTag(), myNet);
3055 }
3056 // tranship
3057 const auto tranships = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::TRANSHIP);
3058 for (const auto tranship : tranships) {
3059 myTemplates[tranship->getTag()] = new GNETranship(tranship->getTag(), myNet);
3060 }
3061 // stop container
3062 const auto stopContainers = myNet->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::STOP_CONTAINER);
3063 for (const auto stopContainer : stopContainers) {
3064 myTemplates[stopContainer->getTag()] = new GNEStopPlan(stopContainer->getTag(), myNet);
3065 }
3066 // reset all to their default values
3067 for (const auto& AC : myTemplates) {
3068 AC.second->resetDefaultValues(false);
3069 }
3070}
3071
3072
3074 for (auto& AC : myTemplates) {
3075 delete AC.second;
3076 }
3077}
3078
3079
3080std::map<SumoXMLTag, GNEAttributeCarrier*>
3082 return myTemplates;
3083}
3084
3085
3088 if (myTemplates.count(tag) > 0) {
3089 return myTemplates.at(tag);
3090 } else {
3091 return nullptr;
3092 }
3093}
3094
3095
3097GNENetHelper::ACTemplate::getTemplateAC(const std::string& selectorText) const {
3098 for (const auto& templateAC : myTemplates) {
3099 if (templateAC.second->getTagProperty()->getSelectorText() == selectorText) {
3100 return templateAC.second;
3101 }
3102 }
3103 return nullptr;
3104}
3105
3106// ---------------------------------------------------------------------------
3107// GNENetHelper::SavingFilesHandler - methods
3108// ---------------------------------------------------------------------------
3109
3113
3114
3115void
3117 auto& neteditOptions = OptionsCont::getOptions();
3118 // get files
3119 const auto additionalFiles = parsingSavingFiles(myAdditionalElementsSavingFiles);
3120 const auto demandElementFiles = parsingSavingFiles(myDemandElementsSavingFiles);
3121 const auto dataElementFiles = parsingSavingFiles(myDataElementsSavingFiles);
3122 const auto meanDataElementFiles = parsingSavingFiles(myMeanDataElementsSavingFiles);
3123 // additionals
3124 neteditOptions.resetWritable();
3125 if (additionalFiles.size() > 0) {
3126 neteditOptions.set("additional-files", additionalFiles);
3127 } else {
3128 neteditOptions.resetDefault("additional-files");
3129 }
3130 // route files
3131 neteditOptions.resetWritable();
3132 if (demandElementFiles.size() > 0) {
3133 neteditOptions.set("route-files", demandElementFiles);
3134 } else {
3135 neteditOptions.resetDefault("route-files");
3136 }
3137 // data files
3138 neteditOptions.resetWritable();
3139 if (dataElementFiles.size() > 0) {
3140 neteditOptions.set("data-files", dataElementFiles);
3141 } else {
3142 neteditOptions.resetDefault("data-files");
3143 }
3144 // meanData files
3145 neteditOptions.resetWritable();
3146 if (meanDataElementFiles.size() > 0) {
3147 neteditOptions.set("meandata-files", meanDataElementFiles);
3148 } else {
3149 neteditOptions.resetDefault("meandata-files");
3150 }
3151}
3152
3153
3154void
3156 if ((additionalElement->getFilename().size() > 0) && !existAdditionalFilename(additionalElement->getFilename())) {
3157 if (myAdditionalElementsSavingFiles.empty()) {
3158 updateAdditionalEmptyFilenames(additionalElement->getFilename());
3159 } else {
3160 myAdditionalElementsSavingFiles.push_back(additionalElement->getFilename());
3161 }
3162 }
3163}
3164
3165
3166void
3168 for (const auto& additionalTag : myNet->getAttributeCarriers()->getAdditionals()) {
3169 for (const auto& additional : additionalTag.second) {
3170 additional.second->changeDefaultFilename(file);
3171 }
3172 }
3173 // update all templates
3174 for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3175 if (templateAC.second->getTagProperty()->isAdditionalElement() && templateAC.second->getFilename().empty()) {
3176 templateAC.second->changeDefaultFilename(file);
3177 }
3178 }
3179 // add it to current files
3180 if (!existAdditionalFilename(file)) {
3181 myAdditionalElementsSavingFiles.push_back(file);
3182 }
3183}
3184
3185
3186const std::vector<std::string>&
3188 return myAdditionalElementsSavingFiles;
3189}
3190
3191
3194 ACsbyFilename additionalsbyFilenames;
3195 for (const auto& additionalTag : myNet->getAttributeCarriers()->getAdditionals()) {
3196 for (const auto& additional : additionalTag.second) {
3197 additionalsbyFilenames[additional.second->getFilename()].insert(additional.second);
3198 }
3199 }
3200 // special case for routes (due calibrators)
3201 for (const auto& route : myNet->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE)) {
3202 if (std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), route.second->getFilename()) != myAdditionalElementsSavingFiles.end()) {
3203 additionalsbyFilenames[route.second->getFilename()].insert(route.second);
3204 }
3205 }
3206 // clear empty saving files
3207 auto it = myAdditionalElementsSavingFiles.begin();
3208 while (it != myAdditionalElementsSavingFiles.end()) {
3209 if (it->empty() || (additionalsbyFilenames.find(*it) == additionalsbyFilenames.end())) {
3210 it = myAdditionalElementsSavingFiles.erase(it);
3211 } else {
3212 it++;
3213 }
3214 }
3215 return additionalsbyFilenames;
3216}
3217
3218
3219bool
3221 const auto it = std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), file);
3222 return it != myAdditionalElementsSavingFiles.end();
3223}
3224
3225
3226void
3228 if ((demandElement->getFilename().size() > 0) && !existDemandFilename(demandElement->getFilename())) {
3229 if (myDemandElementsSavingFiles.empty()) {
3230 updateDemandEmptyFilenames(demandElement->getFilename());
3231 } else {
3232 myDemandElementsSavingFiles.push_back(demandElement->getFilename());
3233 }
3234 }
3235}
3236
3237
3238void
3240 for (const auto& demandTag : myNet->getAttributeCarriers()->getDemandElements()) {
3241 for (const auto& demand : demandTag.second) {
3242 demand.second->changeDefaultFilename(file);
3243 }
3244 }
3245 // update all templates
3246 for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3247 if (templateAC.second->getTagProperty()->isDemandElement() && templateAC.second->getFilename().empty()) {
3248 templateAC.second->changeDefaultFilename(file);
3249 }
3250 }
3251 // add it to current files
3252 if (!existDemandFilename(file)) {
3253 myDemandElementsSavingFiles.push_back(file);
3254 }
3255}
3256
3257
3258const std::vector<std::string>&
3260 return myDemandElementsSavingFiles;
3261}
3262
3263
3266 ACsbyFilename demandsbyFilenames;
3267 for (const auto& demandTag : myNet->getAttributeCarriers()->getDemandElements()) {
3268 for (const auto& demand : demandTag.second) {
3269 if (std::find(myAdditionalElementsSavingFiles.begin(), myAdditionalElementsSavingFiles.end(), demand.second->getFilename()) == myAdditionalElementsSavingFiles.end()) {
3270 demandsbyFilenames[demand.second->getFilename()].insert(demand.second);
3271 }
3272 }
3273 }
3274 // clear empty saving files
3275 auto it = myDemandElementsSavingFiles.begin();
3276 while (it != myDemandElementsSavingFiles.end()) {
3277 if (it->empty() || (demandsbyFilenames.find(*it) == demandsbyFilenames.end())) {
3278 it = myDemandElementsSavingFiles.erase(it);
3279 } else {
3280 it++;
3281 }
3282 }
3283 return demandsbyFilenames;
3284}
3285
3286
3287bool
3289 const auto it = std::find(myDemandElementsSavingFiles.begin(), myDemandElementsSavingFiles.end(), file);
3290 return it != myDemandElementsSavingFiles.end();
3291}
3292
3293
3294void
3296 if ((dataElement->getFilename().size() > 0) && !existDataFilename(dataElement->getFilename())) {
3297 if (myDataElementsSavingFiles.empty()) {
3298 updateDataEmptyFilenames(dataElement->getFilename());
3299 } else {
3300 myDataElementsSavingFiles.push_back(dataElement->getFilename());
3301 }
3302 }
3303}
3304
3305
3306void
3308 if (file.size() > 0) {
3309 for (const auto& dataSet : myNet->getAttributeCarriers()->getDataSets()) {
3310 dataSet.second->changeDefaultFilename(file);
3311 }
3312 // add it to current files
3313 if (!existDataFilename(file)) {
3314 myDataElementsSavingFiles.push_back(file);
3315 }
3316 }
3317}
3318
3319
3320const std::vector<std::string>&
3322 return myDataElementsSavingFiles;
3323}
3324
3325
3328 ACsbyFilename datasbyFilenames;
3329 for (const auto& dataSet : myNet->getAttributeCarriers()->getDataSets()) {
3330 datasbyFilenames[dataSet.second->getFilename()].insert(dataSet.second);
3331 }
3332 // clear empty saving files
3333 auto it = myDataElementsSavingFiles.begin();
3334 while (it != myDataElementsSavingFiles.end()) {
3335 if (it->empty() || (datasbyFilenames.find(*it) == datasbyFilenames.end())) {
3336 it = myDataElementsSavingFiles.erase(it);
3337 } else {
3338 it++;
3339 }
3340 }
3341 return datasbyFilenames;
3342}
3343
3344
3345bool
3347 const auto it = std::find(myDataElementsSavingFiles.begin(), myDataElementsSavingFiles.end(), file);
3348 return it != myDataElementsSavingFiles.end();
3349}
3350
3351
3352void
3354 if ((meanDataElement->getFilename().size() > 0) && !existMeanDataFilename(meanDataElement->getFilename())) {
3355 if (myMeanDataElementsSavingFiles.empty()) {
3356 updateMeanDataEmptyFilenames(meanDataElement->getFilename());
3357 } else {
3358 myMeanDataElementsSavingFiles.push_back(meanDataElement->getFilename());
3359 }
3360 }
3361}
3362
3363
3364void
3366 for (const auto& meanDataTag : myNet->getAttributeCarriers()->getMeanDatas()) {
3367 for (const auto& meanData : meanDataTag.second) {
3368 meanData.second->changeDefaultFilename(file);
3369 }
3370 }
3371 // update all templates
3372 for (auto& templateAC : myNet->getACTemplates()->getACTemplates()) {
3373 if (templateAC.second->getTagProperty()->isMeanData() && templateAC.second->getFilename().empty()) {
3374 templateAC.second->changeDefaultFilename(file);
3375 }
3376 }
3377 // add it to current files
3378 if (!existMeanDataFilename(file)) {
3379 myMeanDataElementsSavingFiles.push_back(file);
3380 }
3381}
3382
3383
3384const std::vector<std::string>&
3386 return myMeanDataElementsSavingFiles;
3387}
3388
3389
3392 ACsbyFilename meanDatasbyFilenames;
3393 for (const auto& meanDataTag : myNet->getAttributeCarriers()->getMeanDatas()) {
3394 for (const auto& meanData : meanDataTag.second) {
3395 meanDatasbyFilenames[meanData.second->getFilename()].insert(meanData.second);
3396 }
3397 }
3398 // clear empty saving files
3399 auto it = myMeanDataElementsSavingFiles.begin();
3400 while (it != myMeanDataElementsSavingFiles.end()) {
3401 if (it->empty() || (meanDatasbyFilenames.find(*it) == meanDatasbyFilenames.end())) {
3402 it = myMeanDataElementsSavingFiles.erase(it);
3403 } else {
3404 it++;
3405 }
3406 }
3407 return meanDatasbyFilenames;
3408}
3409
3410
3411bool
3413 const auto it = std::find(myMeanDataElementsSavingFiles.begin(), myMeanDataElementsSavingFiles.end(), file);
3414 return it != myMeanDataElementsSavingFiles.end();
3415}
3416
3417
3418std::string
3419GNENetHelper::SavingFilesHandler::parsingSavingFiles(const std::vector<std::string>& savingFiles) const {
3420 std::string savingFileNames;
3421 // group all saving files in a single string separated with comma
3422 for (const auto& savingFile : savingFiles) {
3423 savingFileNames.append(savingFile + ",");
3424 }
3425 // remove last ','
3426 if (savingFileNames.size() > 0) {
3427 savingFileNames.pop_back();
3428 }
3429 return savingFileNames;
3430}
3431
3432// ---------------------------------------------------------------------------
3433// GNENetHelper::SavingStatus - methods
3434// ---------------------------------------------------------------------------
3435
3437 myNet(net) {
3438}
3439
3440
3441void
3443 mySumoConfigSaved = false;
3444}
3445
3446
3447void
3449 mySumoConfigSaved = true;
3450}
3451
3452
3453bool
3455 return mySumoConfigSaved;
3456}
3457
3458
3459
3460void
3462 myNeteditConfigSaved = false;
3463}
3464
3465
3466void
3468 myNeteditConfigSaved = true;
3469}
3470
3471
3472bool
3474 return myNeteditConfigSaved;
3475}
3476
3477
3478void
3480 myNetworkSaved = false;
3481 // implies requiere save netedit config and sumo config
3482 myNeteditConfigSaved = false;
3483 mySumoConfigSaved = false;
3484}
3485
3486
3487void
3489 myNetworkSaved = true;
3490}
3491
3492
3493bool
3495 return myNetworkSaved;
3496}
3497
3498
3499void
3501 myTLSSaved = false;
3502}
3503
3504
3505void
3507 myTLSSaved = true;
3508}
3509
3510
3511bool
3513 return myTLSSaved;
3514}
3515
3516
3517void
3519 myEdgeTypeSaved = false;
3520}
3521
3522
3523void
3525 myEdgeTypeSaved = true;
3526}
3527
3528
3529bool
3531 return myEdgeTypeSaved;
3532}
3533
3534
3535void
3537 myAdditionalSaved = false;
3538 // implies requiere save netedit config and sumo config
3539 myNeteditConfigSaved = false;
3540 mySumoConfigSaved = false;
3541}
3542
3543
3544void
3546 myAdditionalSaved = true;
3547}
3548
3549
3550bool
3552 return myAdditionalSaved;
3553}
3554
3555
3556void
3558 myDemandElementSaved = false;
3559 // implies requiere save netedit config and sumo config
3560 myNeteditConfigSaved = false;
3561 mySumoConfigSaved = false;
3562}
3563
3564
3565void
3567 myDemandElementSaved = true;
3568}
3569
3570
3571bool
3573 return myDemandElementSaved;
3574}
3575
3576
3577void
3579 myDataElementSaved = false;
3580 // implies requiere save netedit config and sumo config
3581 myNeteditConfigSaved = false;
3582 mySumoConfigSaved = false;
3583}
3584
3585
3586void
3588 myDataElementSaved = true;
3589}
3590
3591
3592bool
3594 return myDataElementSaved;
3595}
3596
3597
3598void
3600 myMeanDataElementSaved = false;
3601 // implies requiere save netedit config and sumo config
3602 myNeteditConfigSaved = false;
3603 mySumoConfigSaved = false;
3604}
3605
3606
3607void
3609 myMeanDataElementSaved = true;
3610}
3611
3612
3613bool
3615 return myMeanDataElementSaved;
3616}
3617
3618
3621 // Check if there are non saved network elements
3622 if (commonResult == GNEDialog::Result::ABORT) {
3624 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3626 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3628 } else if (myNetworkSaved) {
3630 } else {
3631 // open save dialog
3632 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3633 TL("network"));
3634 // continue depending of result
3635 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3636 commonResult = GNEDialog::Result::ABORT;
3638 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3639 commonResult = GNEDialog::Result::ACCEPT_ALL;
3641 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3642 commonResult = GNEDialog::Result::CANCEL_ALL;
3644 } else {
3645 return saveDialog.getResult();
3646 }
3647 }
3648}
3649
3650
3653 // Check if there are non saved additional elements
3654 if (commonResult == GNEDialog::Result::ABORT) {
3656 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3658 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3660 } else if (myAdditionalSaved) {
3662 } else {
3663 // open save dialog
3664 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3665 TL("additional elements"));
3666 // continue depending of result
3667 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3668 commonResult = GNEDialog::Result::ABORT;
3670 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3671 commonResult = GNEDialog::Result::ACCEPT_ALL;
3673 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3674 commonResult = GNEDialog::Result::CANCEL_ALL;
3676 } else {
3677 return saveDialog.getResult();
3678 }
3679 }
3680}
3681
3682
3685 // Check if there are non saved demand elements
3686 if (commonResult == GNEDialog::Result::ABORT) {
3688 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3690 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3692 } else if (myDemandElementSaved) {
3694 } else {
3695 // open save dialog
3696 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3697 TL("demand elements"));
3698 // continue depending of result
3699 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3700 commonResult = GNEDialog::Result::ABORT;
3702 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3703 commonResult = GNEDialog::Result::ACCEPT_ALL;
3705 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3706 commonResult = GNEDialog::Result::CANCEL_ALL;
3708 } else {
3709 return saveDialog.getResult();
3710 }
3711 }
3712}
3713
3714
3717 // Check if there are non saved data elements
3718 if (commonResult == GNEDialog::Result::ABORT) {
3720 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3722 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3724 } else if (myDataElementSaved) {
3726 } else {
3727 // open save dialog
3728 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3729 TL("data elements"));
3730 // continue depending of result
3731 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3732 commonResult = GNEDialog::Result::ABORT;
3734 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3735 commonResult = GNEDialog::Result::ACCEPT_ALL;
3737 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3738 commonResult = GNEDialog::Result::CANCEL_ALL;
3740 } else {
3741 return saveDialog.getResult();
3742 }
3743 }
3744}
3745
3746
3749 // Check if there are non saved mean data elements
3750 if (commonResult == GNEDialog::Result::ABORT) {
3752 } else if (commonResult == GNEDialog::Result::ACCEPT_ALL) {
3754 } else if (commonResult == GNEDialog::Result::CANCEL_ALL) {
3756 } else if (myMeanDataElementSaved) {
3758 } else {
3759 // open save dialog
3760 const auto saveDialog = GNESaveDialog(myNet->getViewNet()->getViewParent()->getGNEAppWindows(),
3761 TL("meanData elements"));
3762 // continue depending of result
3763 if (saveDialog.getResult() == GNEDialog::Result::ABORT) {
3764 commonResult = GNEDialog::Result::ABORT;
3766 } else if (saveDialog.getResult() == GNEDialog::Result::ACCEPT_ALL) {
3767 commonResult = GNEDialog::Result::ACCEPT_ALL;
3769 } else if (saveDialog.getResult() == GNEDialog::Result::CANCEL_ALL) {
3770 commonResult = GNEDialog::Result::CANCEL_ALL;
3772 } else {
3773 return saveDialog.getResult();
3774 }
3775 }
3776}
3777
3778// ---------------------------------------------------------------------------
3779// GNENetHelper::GNEChange_ReplaceEdgeInTLS - methods
3780// ---------------------------------------------------------------------------
3781
3783 GNEChange(Supermode::NETWORK, true, false),
3784 myTllcont(tllcont),
3785 myReplaced(replaced),
3786 myBy(by) {
3787}
3788
3789
3791
3792
3793void
3795 // assuming this is only used for replacing incoming connections (GNENet::replaceIncomingEdge)
3796 myTllcont.replaceRemoved(myBy, -1, myReplaced, -1, true);
3797}
3798
3799
3800void
3802 // assuming this is only used for replacing incoming connections (GNENet::replaceIncomingEdge)
3803 myTllcont.replaceRemoved(myReplaced, -1, myBy, -1, true);
3804}
3805
3806
3807std::string
3809 return TL("Redo replace in TLS");
3810}
3811
3812
3813std::string
3815 return TL("Undo replace in TLS");
3816}
3817
3818
3819bool
3821 return myReplaced != myBy;
3822}
3823
3824/****************************************************************************/
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
@ GNE_TAG_ROUTE_EMBEDDED
embedded route
@ 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.
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
const std::string getID() const override
get ID (all Attribute Carriers have one)
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
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:533
Position getCenter() const
Returns a position that is guaranteed to lie within the node shape.
Definition NBNode.cpp:4212
int buildCrossings()
build pedestrian crossings
Definition NBNode.cpp:3156
void addOutgoingEdge(NBEdge *edge)
adds an outgoing edge
Definition NBNode.cpp:543
const Position & getPosition() const
Definition NBNode.h:260
const PositionVector & getShape() const
retrieve the junction shape
Definition NBNode.cpp:2783
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