Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEViewNetHelper.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-2026 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/****************************************************************************/
19// A file used to reduce the size of GNEViewNet.h grouping structs and classes
20/****************************************************************************/
21
44
46#include "GNENet.h"
47#include "GNEUndoList.h"
48#include "GNEViewNet.h"
49#include "GNEViewNetHelper.h"
50#include "GNEViewParent.h"
51
52// ===========================================================================
53// static members
54// ===========================================================================
55
56std::vector<RGBColor> GNEViewNetHelper::myRainbowScaledColors;
57
58// ---------------------------------------------------------------------------
59// GNEViewNetHelper::LockManager - methods
60// ---------------------------------------------------------------------------
61
63 myViewNet(viewNet) {
64 // fill myLockedElements objects
79 // fill myLockedElements objects
90 // fill myLockedElements objects
94}
95
96
98
99
100bool
102 if (selected && (myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands().menuCheckLockSelectedElements->getCheck() == TRUE)) {
103 return true;
104 } else if ((objectType >= GLO_ADDITIONALELEMENT) && (objectType <= GLO_ACCESS)) {
105 // additionals
106 return myLockedElements.at(GLO_ADDITIONALELEMENT).lock;
107 } else if ((objectType >= GLO_WIRE) && (objectType <= GLO_TRACTIONSUBSTATION)) {
108 // wires
109 return myLockedElements.at(GLO_WIRE).lock;
110 } else if ((objectType >= GLO_ROUTE) && (objectType <= GLO_ROUTE_DISTRIBUTION)) {
111 // routes
112 return myLockedElements.at(GLO_ROUTE).lock;
113 } else if ((objectType >= GLO_VEHICLE) && (objectType <= GLO_ROUTEFLOW)) {
114 // vehicles
115 return myLockedElements.at(GLO_VEHICLE).lock;
116 } else if ((objectType >= GLO_PERSON) && (objectType <= GLO_PERSONFLOW)) {
117 // persons
118 return myLockedElements.at(GLO_PERSON).lock;
119 } else if ((objectType >= GLO_CONTAINER) && (objectType <= GLO_CONTAINERFLOW)) {
120 // containers
121 return myLockedElements.at(GLO_CONTAINER).lock;
122 } else if ((objectType >= GLO_STOP) && (objectType <= GLO_STOP_PLAN)) {
123 // stops
124 return myLockedElements.at(GLO_STOP).lock;
125 } else {
126 return myLockedElements.at(objectType).lock;
127 }
128}
129
130
131void
133 // get lock menu commands
134 GNEApplicationWindowHelper::LockMenuCommands& lockMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands();
135 // network
136 myLockedElements[GLO_JUNCTION].lock = lockMenuCommands.menuCheckLockJunctions->getCheck() == TRUE;
137 myLockedElements[GLO_EDGE].lock = lockMenuCommands.menuCheckLockEdges->getCheck() == TRUE;
138 myLockedElements[GLO_LANE].lock = lockMenuCommands.menuCheckLockLanes->getCheck() == TRUE;
139 myLockedElements[GLO_CONNECTION].lock = lockMenuCommands.menuCheckLockConnections->getCheck() == TRUE;
140 myLockedElements[GLO_CROSSING].lock = lockMenuCommands.menuCheckLockCrossings->getCheck() == TRUE;
141 myLockedElements[GLO_WALKINGAREA].lock = lockMenuCommands.menuCheckLockWalkingAreas->getCheck() == TRUE;
142 myLockedElements[GLO_ADDITIONALELEMENT].lock = lockMenuCommands.menuCheckLockAdditionals->getCheck() == TRUE;
143 myLockedElements[GLO_WIRE].lock = lockMenuCommands.menuCheckLockWires->getCheck() == TRUE;
144 myLockedElements[GLO_TAZ].lock = lockMenuCommands.menuCheckLockTAZs->getCheck() == TRUE;
145 myLockedElements[GLO_POLYGON].lock = lockMenuCommands.menuCheckLockPolygons->getCheck() == TRUE;
146 myLockedElements[GLO_POI].lock = lockMenuCommands.menuCheckLockPOIs->getCheck() == TRUE;
147 myLockedElements[GLO_JPS_WALKABLEAREA].lock = lockMenuCommands.menuCheckLockJpsWalkableAreas->getCheck() == TRUE;
148 myLockedElements[GLO_JPS_OBSTACLE].lock = lockMenuCommands.menuCheckLockJpsObstacles->getCheck() == TRUE;
149 // demand
150 myLockedElements[GLO_ROUTE].lock = lockMenuCommands.menuCheckLockRoutes->getCheck() == TRUE;
151 myLockedElements[GLO_VEHICLE].lock = lockMenuCommands.menuCheckLockVehicles->getCheck() == TRUE;
152 myLockedElements[GLO_PERSON].lock = lockMenuCommands.menuCheckLockPersons->getCheck() == TRUE;
153 myLockedElements[GLO_PERSONTRIP].lock = lockMenuCommands.menuCheckLockPersonTrips->getCheck() == TRUE;
154 myLockedElements[GLO_WALK].lock = lockMenuCommands.menuCheckLockWalks->getCheck() == TRUE;
155 myLockedElements[GLO_RIDE].lock = lockMenuCommands.menuCheckLockRides->getCheck() == TRUE;
156 myLockedElements[GLO_CONTAINER].lock = lockMenuCommands.menuCheckLockContainers->getCheck() == TRUE;
157 myLockedElements[GLO_TRANSPORT].lock = lockMenuCommands.menuCheckLockTransports->getCheck() == TRUE;
158 myLockedElements[GLO_TRANSHIP].lock = lockMenuCommands.menuCheckLockTranships->getCheck() == TRUE;
159 myLockedElements[GLO_STOP].lock = lockMenuCommands.menuCheckLockStops->getCheck() == TRUE;
160 // data
161 myLockedElements[GLO_EDGEDATA].lock = lockMenuCommands.menuCheckLockEdgeDatas->getCheck() == TRUE;
162 myLockedElements[GLO_EDGERELDATA].lock = lockMenuCommands.menuCheckLockEdgeRelDatas->getCheck() == TRUE;
163 myLockedElements[GLO_TAZRELDATA].lock = lockMenuCommands.menuCheckLockEdgeTAZRels->getCheck() == TRUE;
164}
165
166
167void
169 // get lock menu commands
170 GNEApplicationWindowHelper::LockMenuCommands& lockMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands();
171 // network
172 lockMenuCommands.menuCheckLockJunctions->setCheck(myLockedElements[GLO_JUNCTION].lock);
173 lockMenuCommands.menuCheckLockEdges->setCheck(myLockedElements[GLO_EDGE].lock);
174 lockMenuCommands.menuCheckLockLanes->setCheck(myLockedElements[GLO_LANE].lock);
175 lockMenuCommands.menuCheckLockConnections->setCheck(myLockedElements[GLO_CONNECTION].lock);
176 lockMenuCommands.menuCheckLockCrossings->setCheck(myLockedElements[GLO_CROSSING].lock);
177 lockMenuCommands.menuCheckLockWalkingAreas->setCheck(myLockedElements[GLO_WALKINGAREA].lock);
178 lockMenuCommands.menuCheckLockAdditionals->setCheck(myLockedElements[GLO_ADDITIONALELEMENT].lock);
179 lockMenuCommands.menuCheckLockWires->setCheck(myLockedElements[GLO_WIRE].lock);
180 lockMenuCommands.menuCheckLockTAZs->setCheck(myLockedElements[GLO_TAZ].lock);
181 lockMenuCommands.menuCheckLockPolygons->setCheck(myLockedElements[GLO_POLYGON].lock);
182 lockMenuCommands.menuCheckLockPOIs->setCheck(myLockedElements[GLO_POI].lock);
183 lockMenuCommands.menuCheckLockJpsWalkableAreas->setCheck(myLockedElements[GLO_JPS_WALKABLEAREA].lock);
184 lockMenuCommands.menuCheckLockJpsObstacles->setCheck(myLockedElements[GLO_JPS_OBSTACLE].lock);
185 // demand
186 lockMenuCommands.menuCheckLockRoutes->setCheck(myLockedElements[GLO_ROUTE].lock);
187 lockMenuCommands.menuCheckLockVehicles->setCheck(myLockedElements[GLO_VEHICLE].lock);
188 lockMenuCommands.menuCheckLockPersons->setCheck(myLockedElements[GLO_PERSON].lock);
189 lockMenuCommands.menuCheckLockPersonTrips->setCheck(myLockedElements[GLO_PERSONTRIP].lock);
190 lockMenuCommands.menuCheckLockWalks->setCheck(myLockedElements[GLO_WALK].lock);
191 lockMenuCommands.menuCheckLockRides->setCheck(myLockedElements[GLO_RIDE].lock);
192 lockMenuCommands.menuCheckLockContainers->setCheck(myLockedElements[GLO_CONTAINER].lock);
193 lockMenuCommands.menuCheckLockTransports->setCheck(myLockedElements[GLO_TRANSPORT].lock);
194 lockMenuCommands.menuCheckLockTranships->setCheck(myLockedElements[GLO_TRANSHIP].lock);
195 lockMenuCommands.menuCheckLockStops->setCheck(myLockedElements[GLO_STOP].lock);
196 // data
197 lockMenuCommands.menuCheckLockEdgeDatas->setCheck(myLockedElements[GLO_EDGEDATA].lock);
198 lockMenuCommands.menuCheckLockEdgeRelDatas->setCheck(myLockedElements[GLO_EDGERELDATA].lock);
199 lockMenuCommands.menuCheckLockEdgeTAZRels->setCheck(myLockedElements[GLO_TAZRELDATA].lock);
200}
201
202
206
207
211
212
214
215
220
221// ---------------------------------------------------------------------------
222// GNEViewNetHelper::InspectedElements - methods
223// ---------------------------------------------------------------------------
224
226
227
228void
230 myInspectedACs.clear();
231 if (AC) {
232 myFirstInspectedAC = AC;
233 myInspectedACs.insert(AC);
234 } else {
235 myFirstInspectedAC = nullptr;
236 }
237}
238
239
240void
241GNEViewNetHelper::InspectedElements::inspectACs(const std::vector<GNEAttributeCarrier*>& ACs) {
242 myInspectedACs.clear();
243 if (ACs.size() > 0) {
244 myFirstInspectedAC = ACs.front();
245 for (const auto& AC : ACs) {
246 myInspectedACs.insert(AC);
247 }
248 } else {
249 myFirstInspectedAC = nullptr;
250 }
251}
252
253
254void
256 auto it = myInspectedACs.find(AC);
257 if (it != myInspectedACs.end()) {
258 myInspectedACs.erase(it);
259 if (myInspectedACs.size() == 0) {
260 myInspectedACs.clear();
261 myFirstInspectedAC = nullptr;
262 } else if (myFirstInspectedAC == AC) {
263 myFirstInspectedAC = (*myInspectedACs.begin());
264 }
265 }
266}
267
268
269void
271 myFirstInspectedAC = nullptr;
272 myInspectedACs.clear();
273}
274
275
278 return myFirstInspectedAC;
279}
280
281
282const std::unordered_set<GNEAttributeCarrier*>&
284 return myInspectedACs;
285}
286
287
288bool
290 if (myInspectedACs.empty()) {
291 return false;
292 } else if (myFirstInspectedAC == AC) {
293 return true;
294 } else {
295 return myInspectedACs.find(AC) != myInspectedACs.end();
296 }
297}
298
299
300bool
302 if (myInspectedACs.empty()) {
303 return false;
304 } else if (myFirstInspectedAC == AC) {
305 return true;
306 } else {
307 // we need a const_cast because our myInspectedACs is a set of non-constant ACs (in this case is safe)
308 return myInspectedACs.find(const_cast<GNEAttributeCarrier*>(AC)) != myInspectedACs.end();
309 }
310}
311
312
313bool
315 return myInspectedACs.size() > 0;
316}
317
318
319bool
321 return myInspectedACs.size() == 1;
322}
323
324
325bool
327 return myInspectedACs.size() > 1;
328}
329
330// ---------------------------------------------------------------------------
331// GNEViewNetHelper::MarkFrontElements - methods
332// ---------------------------------------------------------------------------
333
335
336
337const std::unordered_set<GNEAttributeCarrier*>&
339 return myMarkedACs;
340}
341
342
343void
345 // make a copy because container is modified in every iteration
346 const auto copy = myMarkedACs;
347 for (auto& AC : copy) {
349 }
350}
351
352
353void
357
358
359void
361 if (myMarkedACs.size() > 0) {
362 auto it = myMarkedACs.find(AC);
363 if (it != myMarkedACs.end()) {
364 myMarkedACs.erase(it);
365 }
366 }
367}
368
369// ---------------------------------------------------------------------------
370// GNEViewNetHelper::ViewObjectsSelector - methods
371// ---------------------------------------------------------------------------
372
376
377
378void
380 // clear elements and reserve space
381 myViewObjects.clearElements();
382 myViewObjects.reserve(gViewObjectsHandler.getNumberOfSelectedObjects());
383 // process GUIGLObjects using elements under cursor
384 processGUIGlObjects(gViewObjectsHandler.getSelectedObjects());
385}
386
387
388void
392
393
394void
396 if (myViewObjects.junctions.size() > 0) {
397 baseObjet->addParentID(SUMO_TAG_JUNCTION, myViewObjects.junctions.front()->getID());
398 }
399 if (myViewObjects.edges.size() > 0) {
400 baseObjet->addParentID(SUMO_TAG_EDGE, myViewObjects.edges.front()->getID());
401 }
402 if (myViewObjects.lanes.size() > 0) {
403 baseObjet->addParentID(SUMO_TAG_LANE, myViewObjects.lanes.front()->getID());
404 }
405 if (myViewObjects.crossings.size() > 0) {
406 baseObjet->addParentID(SUMO_TAG_CROSSING, myViewObjects.crossings.front()->getID());
407 }
408 if (myViewObjects.connections.size() > 0) {
409 baseObjet->addParentID(SUMO_TAG_CONNECTION, myViewObjects.connections.front()->getID());
410 }
411 if (myViewObjects.walkingAreas.size() > 0) {
412 baseObjet->addParentID(SUMO_TAG_WALKINGAREA, myViewObjects.walkingAreas.front()->getID());
413 }
414 if (myViewObjects.lanes.size() > 0) {
415 baseObjet->addParentID(SUMO_TAG_LANE, myViewObjects.lanes.front()->getID());
416 }
417 if (myViewObjects.additionals.size() > 0) {
418 baseObjet->addParentID(myViewObjects.additionals.front()->getTagProperty()->getTag(), myViewObjects.additionals.front()->getID());
419 }
420 if (myViewObjects.demandElements.size() > 0) {
421 baseObjet->addParentID(myViewObjects.demandElements.front()->getTagProperty()->getTag(), myViewObjects.demandElements.front()->getID());
422 }
423 if (myViewObjects.genericDatas.size() > 0) {
424 baseObjet->addParentID(myViewObjects.genericDatas.front()->getTagProperty()->getTag(), myViewObjects.genericDatas.front()->getID());
425 }
426}
427
428
429void
431 // get all elements to filter
432 std::vector<const GUIGlObject*> glElements;
433 for (const auto& glElement : myViewObjects.GUIGlObjects) {
434 if (glElement->getType() != exception) {
435 glElements.push_back(glElement);
436 }
437 }
438 myViewObjects.filterElements(glElements);
439}
440
441
442void
444 if (myViewNet->getEditModes().isCurrentSupermodeNetwork()) {
445 filterDemandElements(true);
446 filterDataElements();
447 } else if (myViewNet->getEditModes().isCurrentSupermodeDemand()) {
448 filterNetworkElements();
449 filterAdditionals(true, true);
450 filterDataElements();
451 } else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
452 filterNetworkElements();
453 filterDemandElements(true);
454 }
455}
456
457
458void
460 // get all edges to filter
461 std::vector<const GUIGlObject*> junctions;
462 for (const auto& junction : myViewObjects.junctions) {
463 junctions.push_back(junction);
464 }
465 myViewObjects.filterElements(junctions);
466}
467
468
469void
471 // get all edges to filter
472 std::vector<const GUIGlObject*> edges;
473 for (const auto& edge : myViewObjects.edges) {
474 edges.push_back(edge);
475 }
476 myViewObjects.filterElements(edges);
477}
478
479
480void
482 // get all lanes to filter
483 std::vector<const GUIGlObject*> lanes;
484 for (const auto& lane : myViewObjects.lanes) {
485 lanes.push_back(lane);
486 }
487 myViewObjects.filterElements(lanes);
488}
489
490
491void
493 // get all connections to filter
494 std::vector<const GUIGlObject*> connections;
495 for (const auto& connection : myViewObjects.connections) {
496 connections.push_back(connection);
497 }
498 myViewObjects.filterElements(connections);
499}
500
501
502void
504 // get all crossings to filter
505 std::vector<const GUIGlObject*> crossings;
506 for (const auto& crossing : myViewObjects.crossings) {
507 crossings.push_back(crossing);
508 }
509 myViewObjects.filterElements(crossings);
510}
511
512
513void
515 // get all walkingAreas to filter
516 std::vector<const GUIGlObject*> walkingAreas;
517 for (const auto& walkingArea : myViewObjects.walkingAreas) {
518 walkingAreas.push_back(walkingArea);
519 }
520 myViewObjects.filterElements(walkingAreas);
521}
522
523
524void
526 // get all elements to filter
527 std::vector<const GUIGlObject*> shapes;
528 for (const auto& poly : myViewObjects.polys) {
529 shapes.push_back(poly);
530 }
531 for (const auto& POI : myViewObjects.POIs) {
532 shapes.push_back(POI);
533 }
534 myViewObjects.filterElements(shapes);
535}
536
537
538void
539GNEViewNetHelper::ViewObjectsSelector::filterAdditionals(const bool includeStoppigPlaces, const bool includeTAZs) {
540 // get all elements to filter
541 std::vector<const GUIGlObject*> additionals;
542 for (const auto& additional : myViewObjects.additionals) {
543 if (!includeStoppigPlaces && (additional->getType() > GLO_STOPPING_PLACE) && (additional->getType() < GLO_STOPPING_PLACE_LAST)) {
544 continue;
545 } else if (!includeTAZs && (additional->getType() == GLO_TAZ)) {
546 continue;
547 } else {
548 additionals.push_back(additional);
549 }
550 }
551 myViewObjects.filterElements(additionals);
552}
553
554
555void
557 // get all elements to filter
558 std::vector<const GUIGlObject*> networkElements;
559 for (const auto& networkElement : myViewObjects.networkElements) {
560 networkElements.push_back(networkElement);
561 }
562 myViewObjects.filterElements(networkElements);
563}
564
565
566void
568 // get all elements to filter
569 std::vector<const GUIGlObject*> demandElements;
570 for (const auto& demandElement : myViewObjects.demandElements) {
571 if (!includeRoutes && (demandElement->getType() == GLO_ROUTE)) {
572 continue;
573 } else {
574 demandElements.push_back(demandElement);
575 }
576 }
577 myViewObjects.filterElements(demandElements);
578}
579
580
581void
583 // get all elements to filter
584 std::vector<const GUIGlObject*> datadElements;
585 for (const auto& datadElement : myViewObjects.edgeDatas) {
586 datadElements.push_back(datadElement);
587 }
588 for (const auto& datadElement : myViewObjects.edgeRelDatas) {
589 datadElements.push_back(datadElement);
590 }
591 for (const auto& datadElement : myViewObjects.TAZRelDatas) {
592 datadElements.push_back(datadElement);
593 }
594 myViewObjects.filterElements(datadElements);
595
596}
597
598
599void
600GNEViewNetHelper::ViewObjectsSelector::filterLockedElements(const std::vector<GUIGlObjectType> ignoreFilter) {
601 std::vector<const GUIGlObject*> GUIGlObjects;
602 // get all locked elements
603 for (const auto& GUIGlObject : myViewObjects.GUIGlObjects) {
605 GUIGlObjects.push_back(GUIGlObject);
606 }
607 }
608 // apply ignore filter
609 for (const auto& ignoredType : ignoreFilter) {
610 auto it = GUIGlObjects.begin();
611 while (it != GUIGlObjects.end()) {
612 if ((*it)->getType() == ignoredType) {
613 it = GUIGlObjects.erase(it);
614 } else {
615 it++;
616 }
617 }
618 }
619 // filter objects
620 myViewObjects.filterElements(GUIGlObjects);
621}
622
623
624const GUIGlObject*
626 if (myViewObjects.GUIGlObjects.size() > 0) {
627 return myViewObjects.GUIGlObjects.front();
628 } else {
629 return nullptr;
630 }
631}
632
633
636 if (myViewObjects.attributeCarriers.size() > 0) {
637 return myViewObjects.attributeCarriers.front();
638 } else {
639 return nullptr;
640 }
641}
642
643
646 if (myViewObjects.networkElements.size() > 0) {
647 return myViewObjects.networkElements.front();
648 } else {
649 return nullptr;
650 }
651}
652
653
656 if (myViewObjects.additionals.size() > 0) {
657 return myViewObjects.additionals.front();
658 } else {
659 return nullptr;
660 }
661}
662
663
666 if (myViewObjects.demandElements.size() > 0) {
667 return myViewObjects.demandElements.front();
668 } else {
669 return nullptr;
670 }
671}
672
673
676 if (myViewObjects.genericDatas.size() > 0) {
677 return myViewObjects.genericDatas.front();
678 } else {
679 return nullptr;
680 }
681}
682
683
686 if (myViewObjects.junctions.size() > 0) {
687 return myViewObjects.junctions.front();
688 } else {
689 return nullptr;
690 }
691}
692
693
694GNEEdge*
696 if (myViewObjects.edges.size() > 0) {
697 return myViewObjects.edges.front();
698 } else {
699 return nullptr;
700 }
701}
702
703
704GNELane*
706 if (myViewObjects.lanes.size() > 0) {
707 return myViewObjects.lanes.front();
708 } else {
709 return nullptr;
710 }
711}
712
713
714GNELane*
716 if (myViewObjects.lanes.size() > 0) {
717 for (auto& lane : myViewObjects.lanes) {
718 if (!(lane->isAttributeCarrierSelected() || lane->getParentEdge()->isAttributeCarrierSelected()) ||
719 !myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands().menuCheckLockSelectedElements->getCheck()) {
720 return lane;
721 }
722 }
723 // all locked, then return nullptr
724 return nullptr;
725 } else {
726 return nullptr;
727 }
728}
729
730
731const std::vector<GNELane*>&
733 return myViewObjects.lanes;
734}
735
736
739 if (myViewObjects.crossings.size() > 0) {
740 return myViewObjects.crossings.front();
741 } else {
742 return nullptr;
743 }
744}
745
746
749 if (myViewObjects.walkingAreas.size() > 0) {
750 return myViewObjects.walkingAreas.front();
751 } else {
752 return nullptr;
753 }
754}
755
756
759 if (myViewObjects.connections.size() > 0) {
760 return myViewObjects.connections.front();
761 } else {
762 return nullptr;
763 }
764}
765
766
769 if (myViewObjects.internalLanes.size() > 0) {
770 return myViewObjects.internalLanes.front();
771 } else {
772 return nullptr;
773 }
774}
775
776
777GNEPOI*
779 if (myViewObjects.POIs.size() > 0) {
780 return myViewObjects.POIs.front();
781 } else {
782 return nullptr;
783 }
784}
785
786
787GNEPoly*
789 if (myViewObjects.polys.size() > 0) {
790 return myViewObjects.polys.front();
791 } else {
792 return nullptr;
793 }
794}
795
796
797GNETAZ*
799 if (myViewObjects.TAZs.size() > 0) {
800 return myViewObjects.TAZs.front();
801 } else {
802 return nullptr;
803 }
804}
805
806
809 if (myViewObjects.edgeDatas.size() > 0) {
810 return myViewObjects.edgeDatas.front();
811 } else {
812 return nullptr;
813 }
814}
815
816
819 if (myViewObjects.edgeRelDatas.size() > 0) {
820 return myViewObjects.edgeRelDatas.front();
821 } else {
822 return nullptr;
823 }
824}
825
826
829 if (myViewObjects.TAZRelDatas.size() > 0) {
830 return myViewObjects.TAZRelDatas.front();
831 } else {
832 return nullptr;
833 }
834}
835
836
837const std::vector<GUIGlObject*>&
839 return myViewObjects.GUIGlObjects;
840}
841
842
843const std::vector<GNEAttributeCarrier*>&
845 return myViewObjects.attributeCarriers;
846}
847
848
849const std::vector<GNEJunction*>&
851 return myViewObjects.junctions;
852}
853
854
855const std::vector<GNEEdge*>&
857 return myViewObjects.edges;
858}
859
860
861const std::vector<GNETAZ*>&
863 return myViewObjects.TAZs;
864}
865
866
867const std::vector<GNEAdditional*>&
869 return myViewObjects.additionals;
870}
871
872
873const std::vector<GNEDemandElement*>&
875 return myViewObjects.demandElements;
876}
877
878
879const std::vector<const GNEJunction*>&
881 return myMergingJunctions;
882}
883
884
886
887
888void
890 GUIGlObjects.clear();
891 attributeCarriers.clear();
892 networkElements.clear();
893 additionals.clear();
894 demandElements.clear();
895 junctions.clear();
896 edges.clear();
897 lanes.clear();
898 crossings.clear();
899 walkingAreas.clear();
900 connections.clear();
901 internalLanes.clear();
902 TAZs.clear();
903 POIs.clear();
904 polys.clear();
905 genericDatas.clear();
906 edgeDatas.clear();
907 edgeRelDatas.clear();
908 TAZRelDatas.clear();
909}
910
911
912void
914 GUIGlObjects.reserve(size);
915 attributeCarriers.reserve(size);
916 networkElements.reserve(size);
917 additionals.reserve(size);
918 demandElements.reserve(size);
919 junctions.reserve(size);
920 edges.reserve(size);
921 lanes.reserve(size);
922 crossings.reserve(size);
923 walkingAreas.reserve(size);
924 connections.reserve(size);
925 internalLanes.reserve(size);
926 TAZs.reserve(size);
927 POIs.reserve(size);
928 polys.reserve(size);
929 genericDatas.reserve(size);
930 edgeDatas.reserve(size);
931 edgeRelDatas.reserve(size);
932 TAZRelDatas.reserve(size);
933}
934
935
936void
938 for (const auto& object : objects) {
939 // remove from GUIGlObjects
940 auto itGlObjects = GUIGlObjects.begin();
941 while (itGlObjects != GUIGlObjects.end()) {
942 if (*itGlObjects == object) {
943 itGlObjects = GUIGlObjects.erase(itGlObjects);
944 } else {
945 itGlObjects++;
946 }
947 }
948 // remove from attributeCarriers
949 auto itACs = attributeCarriers.begin();
950 while (itACs != attributeCarriers.end()) {
951 if ((*itACs)->getGUIGlObject() == object) {
952 itACs = attributeCarriers.erase(itACs);
953 } else {
954 itACs++;
955 }
956 }
957 // remove from networkElements
958 auto itNetworkElements = networkElements.begin();
959 while (itNetworkElements != networkElements.end()) {
960 if ((*itNetworkElements)->getGUIGlObject() == object) {
961 itNetworkElements = networkElements.erase(itNetworkElements);
962 } else {
963 itNetworkElements++;
964 }
965 }
966 // remove from additionals
967 auto itAdditionals = additionals.begin();
968 while (itAdditionals != additionals.end()) {
969 if ((*itAdditionals)->getGUIGlObject() == object) {
970 itAdditionals = additionals.erase(itAdditionals);
971 } else {
972 itAdditionals++;
973 }
974 }
975 // remove from demandElements
976 auto itDemandElements = demandElements.begin();
977 while (itDemandElements != demandElements.end()) {
978 if ((*itDemandElements)->getGUIGlObject() == object) {
979 itDemandElements = demandElements.erase(itDemandElements);
980 } else {
981 itDemandElements++;
982 }
983 }
984 // remove from genericDatas
985 auto itGenericDatas = genericDatas.begin();
986 while (itGenericDatas != genericDatas.end()) {
987 if ((*itGenericDatas)->getGUIGlObject() == object) {
988 itGenericDatas = genericDatas.erase(itGenericDatas);
989 } else {
990 itGenericDatas++;
991 }
992 }
993 // remove from junctions
994 auto itJunctions = junctions.begin();
995 while (itJunctions != junctions.end()) {
996 if ((*itJunctions)->getGUIGlObject() == object) {
997 itJunctions = junctions.erase(itJunctions);
998 } else {
999 itJunctions++;
1000 }
1001 }
1002 // remove from edges
1003 auto itEdges = edges.begin();
1004 while (itEdges != edges.end()) {
1005 if ((*itEdges)->getGUIGlObject() == object) {
1006 itEdges = edges.erase(itEdges);
1007 } else {
1008 itEdges++;
1009 }
1010 }
1011 // remove from lanes
1012 auto itLanes = lanes.begin();
1013 while (itLanes != lanes.end()) {
1014 if ((*itLanes)->getGUIGlObject() == object) {
1015 itLanes = lanes.erase(itLanes);
1016 } else {
1017 itLanes++;
1018 }
1019 }
1020 // remove from crossings
1021 auto itCrossings = crossings.begin();
1022 while (itCrossings != crossings.end()) {
1023 if ((*itCrossings)->getGUIGlObject() == object) {
1024 itCrossings = crossings.erase(itCrossings);
1025 } else {
1026 itCrossings++;
1027 }
1028 }
1029 // remove from walkingAreas
1030 auto itWalkingAreas = walkingAreas.begin();
1031 while (itWalkingAreas != walkingAreas.end()) {
1032 if ((*itWalkingAreas)->getGUIGlObject() == object) {
1033 itWalkingAreas = walkingAreas.erase(itWalkingAreas);
1034 } else {
1035 itWalkingAreas++;
1036 }
1037 }
1038 // remove from connections
1039 auto itConnections = connections.begin();
1040 while (itConnections != connections.end()) {
1041 if ((*itConnections)->getGUIGlObject() == object) {
1042 itConnections = connections.erase(itConnections);
1043 } else {
1044 itConnections++;
1045 }
1046 }
1047 // remove from internalLanes
1048 auto itInternalLanes = internalLanes.begin();
1049 while (itInternalLanes != internalLanes.end()) {
1050 if ((*itInternalLanes)->getGUIGlObject() == object) {
1051 itInternalLanes = internalLanes.erase(itInternalLanes);
1052 } else {
1053 itInternalLanes++;
1054 }
1055 }
1056 // remove from TAZs
1057 auto itTAZs = TAZs.begin();
1058 while (itTAZs != TAZs.end()) {
1059 if ((*itTAZs)->getGUIGlObject() == object) {
1060 itTAZs = TAZs.erase(itTAZs);
1061 } else {
1062 itTAZs++;
1063 }
1064 }
1065 // remove from POIs
1066 auto itPOIs = POIs.begin();
1067 while (itPOIs != POIs.end()) {
1068 if ((*itPOIs)->getGUIGlObject() == object) {
1069 itPOIs = POIs.erase(itPOIs);
1070 } else {
1071 itPOIs++;
1072 }
1073 }
1074 // remove from polys
1075 auto itPolys = polys.begin();
1076 while (itPolys != polys.end()) {
1077 if ((*itPolys)->getGUIGlObject() == object) {
1078 itPolys = polys.erase(itPolys);
1079 } else {
1080 itPolys++;
1081 }
1082 }
1083 // remove from edgeDatas
1084 auto itEdgeDatas = edgeDatas.begin();
1085 while (itEdgeDatas != edgeDatas.end()) {
1086 if ((*itEdgeDatas)->getGUIGlObject() == object) {
1087 itEdgeDatas = edgeDatas.erase(itEdgeDatas);
1088 } else {
1089 itEdgeDatas++;
1090 }
1091 }
1092 // remove from edgeRelDatas
1093 auto itEdgeRelDatas = edgeRelDatas.begin();
1094 while (itEdgeRelDatas != edgeRelDatas.end()) {
1095 if ((*itEdgeRelDatas)->getGUIGlObject() == object) {
1096 itEdgeRelDatas = edgeRelDatas.erase(itEdgeRelDatas);
1097 } else {
1098 itEdgeRelDatas++;
1099 }
1100 }
1101 // remove from TAZRelDatas
1102 auto itTAZRelDatas = TAZRelDatas.begin();
1103 while (itTAZRelDatas != TAZRelDatas.end()) {
1104 if ((*itTAZRelDatas)->getGUIGlObject() == object) {
1105 itTAZRelDatas = TAZRelDatas.erase(itTAZRelDatas);
1106 } else {
1107 itTAZRelDatas++;
1108 }
1109 }
1110 }
1111}
1112
1113
1114void
1116 // cast specific network element
1117 switch (glObject->getType()) {
1118 case GLO_JUNCTION: {
1119 // get junction
1120 auto junction = myViewNet->getNet()->getAttributeCarriers()->retrieveJunction(glObject->getMicrosimID());
1121 // check front element
1122 if (junction->isMarkedForDrawingFront()) {
1123 // insert at front
1124 container.junctions.insert(container.junctions.begin(), junction);
1125 container.networkElements.insert(container.networkElements.begin(), junction);
1126 container.attributeCarriers.insert(container.attributeCarriers.begin(), junction);
1127 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), junction);
1128 } else {
1129 // insert at back
1130 container.junctions.push_back(junction);
1131 container.networkElements.push_back(junction);
1132 container.attributeCarriers.push_back(junction);
1133 container.GUIGlObjects.push_back(junction);
1134 }
1135 break;
1136 }
1137 case GLO_EDGE: {
1138 // get edge
1139 auto edge = myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(glObject->getMicrosimID());
1140 // check front element
1141 if (edge->isMarkedForDrawingFront()) {
1142 // insert at front
1143 container.edges.insert(container.edges.begin(), edge);
1144 container.networkElements.insert(container.networkElements.begin(), edge);
1145 container.attributeCarriers.insert(container.attributeCarriers.begin(), edge);
1146 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edge);
1147 } else {
1148 // insert at back
1149 container.edges.push_back(edge);
1150 container.networkElements.push_back(edge);
1151 container.attributeCarriers.push_back(edge);
1152 container.GUIGlObjects.push_back(edge);
1153 }
1154 break;
1155 }
1156 case GLO_LANE: {
1157 // get lane
1158 auto lane = myViewNet->getNet()->getAttributeCarriers()->retrieveLane(glObject);
1159 // check front element
1160 if (lane->isMarkedForDrawingFront()) {
1161 // insert at front
1162 container.lanes.insert(container.lanes.begin(), lane);
1163 container.networkElements.insert(container.networkElements.begin(), lane);
1164 container.attributeCarriers.insert(container.attributeCarriers.begin(), lane);
1165 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), lane);
1166 } else {
1167 // insert at back
1168 container.lanes.push_back(lane);
1169 container.networkElements.push_back(lane);
1170 container.attributeCarriers.push_back(lane);
1171 container.GUIGlObjects.push_back(lane);
1172 }
1173 break;
1174 }
1175 case GLO_CROSSING: {
1176 // get crossing
1177 auto crossing = myViewNet->getNet()->getAttributeCarriers()->retrieveCrossing(glObject);
1178 // check front element
1179 if (crossing->isMarkedForDrawingFront()) {
1180 // insert at front
1181 container.crossings.insert(container.crossings.begin(), crossing);
1182 container.networkElements.insert(container.networkElements.begin(), crossing);
1183 container.attributeCarriers.insert(container.attributeCarriers.begin(), crossing);
1184 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), crossing);
1185 } else {
1186 // insert at back
1187 container.crossings.push_back(crossing);
1188 container.networkElements.push_back(crossing);
1189 container.attributeCarriers.push_back(crossing);
1190 container.GUIGlObjects.push_back(crossing);
1191 }
1192 break;
1193 }
1194 case GLO_WALKINGAREA: {
1195 // get walkingArea
1196 auto walkingArea = myViewNet->getNet()->getAttributeCarriers()->retrieveWalkingArea(glObject);
1197 // check front element
1198 if (walkingArea->isMarkedForDrawingFront()) {
1199 // insert at front
1200 container.walkingAreas.insert(container.walkingAreas.begin(), walkingArea);
1201 container.networkElements.insert(container.networkElements.begin(), walkingArea);
1202 container.attributeCarriers.insert(container.attributeCarriers.begin(), walkingArea);
1203 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), walkingArea);
1204 } else {
1205 // insert at back
1206 container.walkingAreas.push_back(walkingArea);
1207 container.networkElements.push_back(walkingArea);
1208 container.attributeCarriers.push_back(walkingArea);
1209 container.GUIGlObjects.push_back(walkingArea);
1210 }
1211 break;
1212 }
1213 case GLO_CONNECTION: {
1214 // get connection
1215 auto connection = myViewNet->getNet()->getAttributeCarriers()->retrieveConnection(glObject);
1216 // check front element
1217 if (connection->isMarkedForDrawingFront()) {
1218 // insert at front
1219 container.connections.insert(container.connections.begin(), connection);
1220 container.networkElements.insert(container.networkElements.begin(), connection);
1221 container.attributeCarriers.insert(container.attributeCarriers.begin(), connection);
1222 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), connection);
1223 } else {
1224 // insert at back
1225 container.connections.push_back(connection);
1226 container.networkElements.push_back(connection);
1227 container.attributeCarriers.push_back(connection);
1228 container.GUIGlObjects.push_back(connection);
1229 }
1230 break;
1231 }
1232 case GLO_TLLOGIC: {
1233 // get internal lane
1234 auto internalLane = myViewNet->getNet()->getAttributeCarriers()->retrieveInternalLane(glObject);
1235 // check front element
1236 if (internalLane->isMarkedForDrawingFront()) {
1237 // insert at front
1238 container.internalLanes.insert(container.internalLanes.begin(), internalLane);
1239 container.attributeCarriers.insert(container.attributeCarriers.begin(), internalLane);
1240 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), internalLane);
1241 } else {
1242 // insert at back
1243 container.internalLanes.push_back(internalLane);
1244 container.attributeCarriers.push_back(internalLane);
1245 container.GUIGlObjects.push_back(internalLane);
1246 }
1247 break;
1248 }
1249 default:
1250 break;
1251 }
1252}
1253
1254
1255void
1257 // get additional element
1258 auto additionalElement = myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject, false);
1259 if (additionalElement) {
1260 // insert depending if is the front attribute carrier
1261 if (additionalElement->isMarkedForDrawingFront()) {
1262 // insert at front
1263 container.additionals.insert(container.additionals.begin(), additionalElement);
1264 container.attributeCarriers.insert(container.attributeCarriers.begin(), additionalElement);
1265 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), additionalElement);
1266 } else {
1267 // insert at back
1268 container.additionals.push_back(additionalElement);
1269 container.attributeCarriers.push_back(additionalElement);
1270 container.GUIGlObjects.push_back(additionalElement);
1271 }
1272 }
1273}
1274
1275
1276void
1278 // cast specific shape
1279 if (glObject->getType() == GLO_POI) {
1280 // cast POI
1281 auto POI = dynamic_cast<GNEPOI*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
1282 // check front element
1283 if (POI->isMarkedForDrawingFront()) {
1284 // insert at front
1285 container.POIs.insert(container.POIs.begin(), POI);
1286 } else {
1287 // insert at back
1288 container.POIs.push_back(POI);
1289 }
1290 } else if ((glObject->getType() == GLO_POLYGON) || (glObject->getType() == GLO_JPS_WALKABLEAREA) || (glObject->getType() == GLO_JPS_OBSTACLE)) {
1291 // cast poly
1292 auto poly = dynamic_cast<GNEPoly*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
1293 // check front element
1294 if (poly->isMarkedForDrawingFront()) {
1295 // insert at front
1296 container.polys.insert(container.polys.begin(), poly);
1297 } else {
1298 // insert at back
1299 container.polys.push_back(poly);
1300 }
1301 }
1302}
1303
1304
1305void
1307 // cast specific TAZ
1308 if (glObject->getType() == GLO_TAZ) {
1309 // cast TAZ
1310 auto TAZ = dynamic_cast<GNETAZ*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
1311 // check front element
1312 if (TAZ->isMarkedForDrawingFront()) {
1313 // insert at front
1314 container.TAZs.insert(container.TAZs.begin(), TAZ);
1315 } else {
1316 // insert at back
1317 container.TAZs.push_back(TAZ);
1318 }
1319 }
1320}
1321
1322
1323void
1325 // get demandElement
1326 GNEDemandElement* demandElement = myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(glObject, false);
1327 if (demandElement) {
1328 // insert depending if is the front attribute carrier
1329 if (demandElement->isMarkedForDrawingFront()) {
1330 // insert at front
1331 container.demandElements.insert(container.demandElements.begin(), demandElement);
1332 container.attributeCarriers.insert(container.attributeCarriers.begin(), demandElement);
1333 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), demandElement);
1334 } else {
1335 // insert at back
1336 container.demandElements.push_back(demandElement);
1337 container.attributeCarriers.push_back(demandElement);
1338 container.GUIGlObjects.push_back(demandElement);
1339 }
1340 }
1341}
1342
1343
1344void
1346 // cast specific generic data
1347 switch (glObject->getType()) {
1348 case GLO_EDGEDATA: {
1349 // cast EdgeData
1350 auto edgeData = dynamic_cast<GNEEdgeData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
1351 // check front element
1352 if (edgeData->isMarkedForDrawingFront()) {
1353 // insert at front
1354 container.edgeDatas.insert(container.edgeDatas.begin(), edgeData);
1355 container.genericDatas.insert(container.genericDatas.begin(), edgeData);
1356 container.attributeCarriers.insert(container.attributeCarriers.begin(), edgeData);
1357 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edgeData);
1358 } else {
1359 // insert at back
1360 container.edgeDatas.push_back(edgeData);
1361 container.genericDatas.push_back(edgeData);
1362 container.attributeCarriers.push_back(edgeData);
1363 container.GUIGlObjects.push_back(edgeData);
1364 }
1365 break;
1366 }
1367 case GLO_EDGERELDATA: {
1368 // cast EdgeData
1369 auto edgeRelData = dynamic_cast<GNEEdgeRelData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
1370 // check front element
1371 if (edgeRelData->isMarkedForDrawingFront()) {
1372 // insert at front
1373 container.edgeRelDatas.insert(container.edgeRelDatas.begin(), edgeRelData);
1374 container.genericDatas.insert(container.genericDatas.begin(), edgeRelData);
1375 container.attributeCarriers.insert(container.attributeCarriers.begin(), edgeRelData);
1376 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edgeRelData);
1377 } else {
1378 // insert at back
1379 container.edgeRelDatas.push_back(edgeRelData);
1380 container.genericDatas.push_back(edgeRelData);
1381 container.attributeCarriers.push_back(edgeRelData);
1382 container.GUIGlObjects.push_back(edgeRelData);
1383 }
1384 break;
1385 }
1386 case GLO_TAZRELDATA: {
1387 // cast TAZRelData
1388 auto TAZRelData = dynamic_cast<GNETAZRelData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
1389 // check front element
1390 if (TAZRelData->isMarkedForDrawingFront()) {
1391 // insert at front
1392 container.TAZRelDatas.insert(container.TAZRelDatas.begin(), TAZRelData);
1393 container.genericDatas.insert(container.genericDatas.begin(), TAZRelData);
1394 container.attributeCarriers.insert(container.attributeCarriers.begin(), TAZRelData);
1395 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), TAZRelData);
1396 } else {
1397 // insert at back
1398 container.TAZRelDatas.push_back(TAZRelData);
1399 container.genericDatas.push_back(TAZRelData);
1400 container.attributeCarriers.push_back(TAZRelData);
1401 container.GUIGlObjects.push_back(TAZRelData);
1402 }
1403 break;
1404 }
1405 default:
1406 break;
1407 }
1408}
1409
1410
1411void
1413 // iterate over filtered edge objects
1414 for (const auto& glObjectLayer : objectsContainer) {
1415 for (const auto& glObject : glObjectLayer.second) {
1416 // update all elements by categories
1417 updateNetworkElements(myViewObjects, glObject.object);
1418 updateAdditionalElements(myViewObjects, glObject.object);
1419 updateShapeElements(myViewObjects, glObject.object);
1420 updateTAZElements(myViewObjects, glObject.object);
1421 updateDemandElements(myViewObjects, glObject.object);
1422 updateGenericDataElements(myViewObjects, glObject.object);
1423 }
1424 }
1425}
1426
1427
1431
1432// ---------------------------------------------------------------------------
1433// GNEViewNetHelper::MouseButtonKeyPressed - methods
1434// ---------------------------------------------------------------------------
1435
1439
1440
1441void
1443 myEventInfo = (FXEvent*) eventData;
1444}
1445
1446
1447bool
1449 if (myEventInfo) {
1450 return (myEventInfo->state & SHIFTMASK) != 0;
1451 } else {
1452 return false;
1453 }
1454}
1455
1456
1457bool
1459 if (myEventInfo) {
1460 return (myEventInfo->state & CONTROLMASK) != 0;
1461 } else {
1462 return false;
1463 }
1464}
1465
1466
1467bool
1469 if (myEventInfo) {
1470 return (myEventInfo->state & ALTMASK) != 0;
1471 } else {
1472 return false;
1473 }
1474}
1475
1476
1477bool
1479 if (myEventInfo) {
1480 return (myEventInfo->state & LEFTBUTTONMASK) != 0;
1481 } else {
1482 return false;
1483 }
1484}
1485
1486
1487bool
1489 if (myEventInfo) {
1490 return (myEventInfo->state & RIGHTBUTTONMASK) != 0;
1491 } else {
1492 return false;
1493 }
1494}
1495
1496// ---------------------------------------------------------------------------
1497// GNEViewNetHelper::MoveSingleElementValues - methods
1498// ---------------------------------------------------------------------------
1499
1503
1504
1505bool
1507 // first obtain moving reference (common for all)
1508 myRelativeClickedPosition = myViewNet->getPositionInformation();
1509 // get edited element
1510 const GNENetworkElement* editedElement = myViewNet->myEditNetworkElementShapes.getEditedNetworkElement();
1511 // check what type of AC will be moved
1512 if (myViewNet->myViewObjectsSelector.getJunctionFront() && (myViewNet->myViewObjectsSelector.getJunctionFront() == editedElement)) {
1513 // get move operation
1514 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getJunctionFront()->getMoveElement()->getMoveOperation();
1515 // continue if move operation is valid
1516 if (moveOperation) {
1517 myMoveOperation = moveOperation;
1518 return true;
1519 } else {
1520 return false;
1521 }
1522 } else if (myViewNet->myViewObjectsSelector.getLaneFront() && (myViewNet->myViewObjectsSelector.getLaneFront() == editedElement)) {
1523 // get move operation
1524 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getLaneFront()->getMoveElement()->getMoveOperation();
1525 // continue if move operation is valid
1526 if (moveOperation) {
1527 myMoveOperation = moveOperation;
1528 return true;
1529 } else {
1530 return false;
1531 }
1532 } else if (myViewNet->myViewObjectsSelector.getCrossingFront() && (myViewNet->myViewObjectsSelector.getCrossingFront() == editedElement)) {
1533 // get move operation
1534 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getCrossingFront()->getMoveElement()->getMoveOperation();
1535 // continue if move operation is valid
1536 if (moveOperation) {
1537 myMoveOperation = moveOperation;
1538 return true;
1539 } else {
1540 return false;
1541 }
1542 } else if (myViewNet->myViewObjectsSelector.getConnectionFront() && (myViewNet->myViewObjectsSelector.getConnectionFront() == editedElement)) {
1543 // get move operation
1544 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getConnectionFront()->getMoveElement()->getMoveOperation();
1545 // continue if move operation is valid
1546 if (moveOperation) {
1547 myMoveOperation = moveOperation;
1548 return true;
1549 } else {
1550 return false;
1551 }
1552 } else if (myViewNet->myViewObjectsSelector.getWalkingAreaFront() && (myViewNet->myViewObjectsSelector.getWalkingAreaFront() == editedElement)) {
1553 // currently walking areas cannot be moved (will be implemented in the future)
1554 return false;
1555 } else {
1556 // there isn't moved items, then return false
1557 return false;
1558 }
1559}
1560
1561
1562bool
1564 // first obtain moving reference (common for all)
1565 myRelativeClickedPosition = myViewNet->getPositionInformation();
1566 // get front AC
1567 const GNEAttributeCarrier* markAC = myViewNet->myViewObjectsSelector.getAttributeCarrierFront();
1568 // check what type of AC will be moved
1569 if (myViewNet->myViewObjectsSelector.getPolyFront() && (markAC == myViewNet->myViewObjectsSelector.getPolyFront())) {
1570 // get move operation
1571 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getPolyFront()->getMoveElement()->getMoveOperation();
1572 // continue if move operation is valid
1573 if (moveOperation) {
1574 myMoveOperation = moveOperation;
1575 return true;
1576 } else {
1577 return false;
1578 }
1579 } else if (myViewNet->myViewObjectsSelector.getPOIFront() && (markAC == myViewNet->myViewObjectsSelector.getPOIFront())) {
1580 // get move operation
1581 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getPOIFront()->getMoveElement()->getMoveOperation();
1582 // continue if move operation is valid
1583 if (moveOperation) {
1584 myMoveOperation = moveOperation;
1585 return true;
1586 } else {
1587 return false;
1588 }
1589 } else if (myViewNet->myViewObjectsSelector.getAdditionalFront() && (markAC == myViewNet->myViewObjectsSelector.getAdditionalFront()) &&
1590 myViewNet->myViewObjectsSelector.getAdditionalFront()->getMoveElement()) {
1591 // get move operation
1592 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getAdditionalFront()->getMoveElement()->getMoveOperation();
1593 // continue if move operation is valid
1594 if (moveOperation) {
1595 myMoveOperation = moveOperation;
1596 return true;
1597 } else {
1598 return false;
1599 }
1600 } else if (myViewNet->myViewObjectsSelector.getJunctionFront() && (markAC == myViewNet->myViewObjectsSelector.getJunctionFront())) {
1601 // check if over junction there is a geometry point
1602 if (myViewNet->myViewObjectsSelector.getEdgeFront() && (myViewNet->myViewObjectsSelector.getEdgeFront()->clickedOverGeometryPoint(myRelativeClickedPosition))) {
1603 // get move operation
1604 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getEdgeFront()->getMoveElement()->getMoveOperation();
1605 // continue if move operation is valid
1606 if (moveOperation) {
1607 myMoveOperation = moveOperation;
1608 return true;
1609 } else {
1610 return false;
1611 }
1612 } else {
1613 // get move operation
1614 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getJunctionFront()->getMoveElement()->getMoveOperation();
1615 // continue if move operation is valid
1616 if (moveOperation) {
1617 myMoveOperation = moveOperation;
1618 return true;
1619 } else {
1620 return false;
1621 }
1622 }
1623 } else if (myViewNet->myViewObjectsSelector.getEdgeFront() && (markAC == myViewNet->myViewObjectsSelector.getEdgeFront())) {
1624 // calculate Edge movement values (can be entire shape, single geometry points, altitude, etc.)
1625 if (myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
1626 // edit end point
1627 myViewNet->myViewObjectsSelector.getEdgeFront()->editEndpoint(myViewNet->getPositionInformation(), myViewNet->myUndoList);
1628 // edge values wasn't calculated, then return false
1629 return false;
1630 } else {
1631 // get move operation
1632 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getEdgeFront()->getMoveElement()->getMoveOperation();
1633 // continue if move operation is valid
1634 if (moveOperation) {
1635 myMoveOperation = moveOperation;
1636 return true;
1637 } else {
1638 return false;
1639 }
1640 }
1641 } else if (myViewNet->myViewObjectsSelector.getLaneFront() && (markAC == myViewNet->myViewObjectsSelector.getLaneFront())) {
1642 // get move operation
1643 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getLaneFront()->getMoveElement()->getMoveOperation();
1644 // continue if move operation is valid
1645 if (moveOperation) {
1646 myMoveOperation = moveOperation;
1647 return true;
1648 } else {
1649 return false;
1650 }
1651 } else {
1652 // there isn't moved items, then return false
1653 return false;
1654 }
1655}
1656
1657
1658bool
1660 // first obtain moving reference (common for all)
1661 myRelativeClickedPosition = myViewNet->getPositionInformation();
1662 // get front AC
1663 const GNEAttributeCarrier* markAC = myViewNet->myViewObjectsSelector.getAttributeCarrierFront();
1664 // check if demand element can be moved
1665 if (myViewNet->myViewObjectsSelector.getDemandElementFront() && (markAC == myViewNet->myViewObjectsSelector.getDemandElementFront() &&
1666 myViewNet->myViewObjectsSelector.getDemandElementFront()->getMoveElement())) {
1667 // get move operation
1668 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getDemandElementFront()->getMoveElement()->getMoveOperation();
1669 // continue if move operation is valid
1670 if (moveOperation) {
1671 myMoveOperation = moveOperation;
1672 return true;
1673 } else {
1674 return false;
1675 }
1676 } else {
1677 // there isn't moved items, then return false
1678 return false;
1679 }
1680}
1681
1682
1683void
1685 if (myMoveOperation) {
1686 // calculate moveOffset
1687 const GNEMoveOffset moveOffset = calculateMoveOffset();
1688 // check if mouse button is pressed
1689 if (mouseLeftButtonPressed) {
1690 // move elements
1691 GNEMoveElement::moveElement(myViewNet, myMoveOperation, moveOffset);
1692 } else {
1693 // commit move
1694 GNEMoveElement::commitMove(myViewNet, myMoveOperation, moveOffset, myViewNet->getUndoList());
1695 // don't forget delete move operation
1696 delete myMoveOperation;
1697 myMoveOperation = nullptr;
1698 }
1699 }
1700}
1701
1702
1703void
1705 if (myMoveOperation) {
1706 // calculate moveOffset
1707 const GNEMoveOffset moveOffset = calculateMoveOffset();
1708 GNEMoveElement::commitMove(myViewNet, myMoveOperation, moveOffset, myViewNet->getUndoList());
1709 // don't forget delete move operation
1710 delete myMoveOperation;
1711 myMoveOperation = nullptr;
1712 }
1713}
1714
1715
1716bool
1718 return myMoveOperation != nullptr;
1719}
1720
1721
1724 if (myMoveOperation) {
1725 return myMoveOperation->moveElement;
1726 } else {
1727 return nullptr;
1728 }
1729}
1730
1731
1732const GNEMoveOffset
1734 // calculate moveOffset depending of current mouse position and relative clicked position
1735 // @note #3521: Add checkBox to allow moving elements... has to be implemented and used here
1736 Position moveOffset = (myViewNet->getPositionInformation() - myViewNet->myMoveSingleElement.myRelativeClickedPosition);
1737 // calculate Z depending of moveElevation
1738 if (myViewNet->myNetworkViewOptions.menuCheckMoveElevation->shown() && myViewNet->myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
1739 // use Y as Z value and return Z move offset
1740 return GNEMoveOffset(moveOffset.y());
1741 } else {
1742 // return X-Y move offset
1743 return GNEMoveOffset(moveOffset.x(), moveOffset.y());
1744 }
1745}
1746
1747// ---------------------------------------------------------------------------
1748// GNEViewNetHelper::MoveMultipleElementValues - methods
1749// ---------------------------------------------------------------------------
1750
1752 myViewNet(viewNet),
1753 myMovingSelectedEdge(false),
1754 myEdgeOffset(0) {
1755}
1756
1757
1758void
1760 // save clicked position (to calculate offset)
1761 myClickedPosition = myViewNet->getPositionInformation();
1762 // continue depending of clicked element
1763 if (myViewNet->myViewObjectsSelector.getJunctionFront()) {
1764 calculateJunctionSelection();
1765 } else if (myViewNet->myViewObjectsSelector.getEdgeFront()) {
1766 calculateEdgeSelection(myViewNet->myViewObjectsSelector.getEdgeFront());
1767 }
1768 myViewNet->updateViewNet();
1769}
1770
1771
1772void
1774 // calculate moveOffset
1775 const GNEMoveOffset moveOffset = calculateMoveOffset();
1776 // check if mouse button is pressed
1777 if (mouseLeftButtonPressed) {
1778 // iterate over all operations
1779 for (const auto& moveOperation : myMoveOperations) {
1780 // move elements
1781 GNEMoveElement::moveElement(myViewNet, moveOperation, moveOffset);
1782 }
1783 } else if (myMoveOperations.size() > 0) {
1784 // begin undo list
1785 myViewNet->getUndoList()->begin(GUIIcon::MODEMOVE, TL("moving selection"));
1786 // iterate over all operations
1787 for (const auto& moveOperation : myMoveOperations) {
1788 // commit move
1789 GNEMoveElement::commitMove(myViewNet, moveOperation, moveOffset, myViewNet->getUndoList());
1790 // don't forget delete move operation
1791 delete moveOperation;
1792 }
1793 // end undo list
1794 myViewNet->getUndoList()->end();
1795 // clear move operations
1796 myMoveOperations.clear();
1797 }
1798}
1799
1800
1801void
1803 // calculate moveOffset
1804 const GNEMoveOffset moveOffset = calculateMoveOffset();
1805 // begin undo list
1806 myViewNet->getUndoList()->begin(GUIIcon::MODEMOVE, TL("moving selection"));
1807 // finish all move operations
1808 for (const auto& moveOperation : myMoveOperations) {
1809 GNEMoveElement::commitMove(myViewNet, moveOperation, moveOffset, myViewNet->getUndoList());
1810 // don't forget delete move operation
1811 delete moveOperation;
1812 }
1813 // end undo list
1814 myViewNet->getUndoList()->end();
1815 // clear move operations
1816 myMoveOperations.clear();
1817}
1818
1819
1820bool
1822 return (myMoveOperations.size() > 0);
1823}
1824
1825
1826bool
1828 return myMovingSelectedEdge;
1829}
1830
1831
1832void
1836
1837
1838double
1840 return myEdgeOffset;
1841}
1842
1843
1844bool
1846 return myMoveOperations.size() > 0;
1847}
1848
1849
1850const GNEMoveOffset
1852 // calculate moveOffset depending of current mouse position and relative clicked position
1853 // @note #3521: Add checkBox to allow moving elements... has to be implemented and used here
1854 Position moveOffset = (myViewNet->getPositionInformation() - myClickedPosition);
1855 // calculate Z depending of moveElevation
1856 if (myViewNet->myNetworkViewOptions.menuCheckMoveElevation->shown() && myViewNet->myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
1857 // use Y for Z and return X move offset
1858 return GNEMoveOffset(moveOffset.y());
1859 } else {
1860 // return X-Y move offset
1861 return GNEMoveOffset(moveOffset.x(), moveOffset.y());
1862 }
1863}
1864
1865
1866void
1868 // declare move operation
1869 GNEMoveOperation* moveOperation = nullptr;
1870 // first move all selected junctions
1871 const auto selectedJunctions = myViewNet->getNet()->getAttributeCarriers()->getSelectedJunctions();
1872 // iterate over selected junctions
1873 for (const auto& junction : selectedJunctions) {
1874 moveOperation = junction->getMoveElement()->getMoveOperation();
1875 if (moveOperation) {
1876 myMoveOperations.push_back(moveOperation);
1877 }
1878 }
1879 // now move all selected edges
1880 const auto selectedEdges = myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
1881 // iterate over selected edges
1882 for (const auto& edge : selectedEdges) {
1883 moveOperation = edge->getMoveElement()->getMoveOperation();
1884 if (moveOperation) {
1885 myMoveOperations.push_back(moveOperation);
1886 }
1887 }
1888}
1889
1890
1891void
1893 // first move all selected junctions
1894 const auto selectedJunctions = myViewNet->getNet()->getAttributeCarriers()->getSelectedJunctions();
1895 // iterate over selected junctions
1896 for (const auto& junction : selectedJunctions) {
1897 GNEMoveOperation* moveOperation = junction->getMoveElement()->getMoveOperation();
1898 if (moveOperation) {
1899 myMoveOperations.push_back(moveOperation);
1900 }
1901 }
1902 // enable moving selected edge flag
1903 myMovingSelectedEdge = true;
1904 // get edge shape
1905 const auto& shape = clickedEdge->getNBEdge()->getGeometry();
1906 // calculate offset based on the clicked edge shape and convex angle
1907 if (clickedEdge->isConvexAngle()) {
1908 myEdgeOffset = shape.nearest_offset_to_point2D(myViewNet->getPositionInformation());
1909 } else {
1910 myEdgeOffset = shape.length2D() - shape.nearest_offset_to_point2D(myViewNet->getPositionInformation());
1911 }
1912 // now move all selected edges
1913 const auto selectedEdges = myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
1914 // iterate over edges between 0 and 180 degrees
1915 for (const auto& edge : selectedEdges) {
1916 GNEMoveOperation* moveOperation = edge->getMoveElement()->getMoveOperation();
1917 // continue if move operation is valid
1918 if (moveOperation) {
1919 myMoveOperations.push_back(moveOperation);
1920 }
1921 }
1922}
1923
1924// ---------------------------------------------------------------------------
1925// GNEViewNetHelper::VehicleOptions - methods
1926// ---------------------------------------------------------------------------
1927
1929 myViewNet(viewNet) {
1930}
1931
1932
1933void
1938
1939
1940void
1944
1945// ---------------------------------------------------------------------------
1946// GNEViewNetHelper::VehicleTypeOptions - methods
1947// ---------------------------------------------------------------------------
1948
1952
1953
1954void
1959
1960
1961void
1965
1966// ---------------------------------------------------------------------------
1967// GNEViewNetHelper::SelectingArea - methods
1968// ---------------------------------------------------------------------------
1969
1971 selectingUsingRectangle(false),
1972 startDrawing(false),
1973 myViewNet(viewNet) {
1974}
1975
1976
1977void
1979 selectingUsingRectangle = true;
1980 selectionCorner1 = myViewNet->getPositionInformation();
1981 selectionCorner2 = selectionCorner1;
1982}
1983
1984
1985void
1987 // start drawing
1988 startDrawing = true;
1989 // only update selection corner 2
1990 selectionCorner2 = myViewNet->getPositionInformation();
1991 // update status bar
1992 myViewNet->setStatusBarText(TL("Selection width:") + toString(fabs(selectionCorner1.x() - selectionCorner2.x()))
1993 + TL(" height:") + toString(fabs(selectionCorner1.y() - selectionCorner2.y()))
1994 + TL(" diagonal:") + toString(selectionCorner1.distanceTo2D(selectionCorner2)));
1995}
1996
1997
1998void
2000 // finish rectangle selection
2001 selectingUsingRectangle = false;
2002 startDrawing = false;
2003 // clear status bar
2004 myViewNet->setStatusBarText("");
2005}
2006
2007
2008void
2010 // shift held down on mouse-down and mouse-up and check that rectangle exist
2011 if ((abs(selectionCorner1.x() - selectionCorner2.x()) > 0.01) &&
2012 (abs(selectionCorner1.y() - selectionCorner2.y()) > 0.01) &&
2013 myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
2014 // create boundary between two corners
2015 Boundary rectangleBoundary;
2016 rectangleBoundary.add(selectionCorner1);
2017 rectangleBoundary.add(selectionCorner2);
2018 // process selection within boundary
2019 processBoundarySelection(rectangleBoundary);
2020 }
2021}
2022
2023
2024std::vector<GNEEdge*>
2026 // shift held down on mouse-down and mouse-up and check that rectangle exist
2027 if ((abs(selectionCorner1.x() - selectionCorner2.x()) > 0.01) &&
2028 (abs(selectionCorner1.y() - selectionCorner2.y()) > 0.01) &&
2029 myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
2030 // create boundary between two corners
2031 Boundary rectangleBoundary;
2032 rectangleBoundary.add(selectionCorner1);
2033 rectangleBoundary.add(selectionCorner2);
2034 // get all elements in boundary
2035 myViewNet->updateObjectsInShape(rectangleBoundary.getShape(false));
2036 // return all edges
2037 return myViewNet->getViewObjectsSelector().getEdges();
2038 } else {
2039 return {};
2040 }
2041}
2042
2043
2044void
2046 if (selectingUsingRectangle) {
2048 glTranslated(0, 0, GLO_RECTANGLESELECTION);
2049 GLHelper::setColor(color);
2050 glLineWidth(2);
2051 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
2052 glBegin(GL_QUADS);
2053 glVertex2d(selectionCorner1.x(), selectionCorner1.y());
2054 glVertex2d(selectionCorner1.x(), selectionCorner2.y());
2055 glVertex2d(selectionCorner2.x(), selectionCorner2.y());
2056 glVertex2d(selectionCorner2.x(), selectionCorner1.y());
2057 glEnd();
2059 }
2060}
2061
2062
2063void
2065 const bool selEdges = myViewNet->myNetworkViewOptions.selectEdges();
2066 // obtain all elements in boundary
2067 myViewNet->updateObjectsInShape(boundary.getShape(false));
2068 // filter ACsInBoundary depending of current supermode
2069 std::vector<GNEAttributeCarrier*> ACsFiltered;
2070 ACsFiltered.reserve(myViewNet->getViewObjectsSelector().getAttributeCarriers().size());
2071 for (const auto& AC : myViewNet->getViewObjectsSelector().getAttributeCarriers()) {
2072 const auto tagProperty = AC->getTagProperty();
2073 if (tagProperty->isNetworkElement() || tagProperty->isAdditionalElement()) {
2074 // filter edges and lanes
2075 if (((tagProperty->getTag() == SUMO_TAG_EDGE) && !selEdges) ||
2076 ((tagProperty->getTag() == SUMO_TAG_LANE) && selEdges)) {
2077 continue;
2078 } else {
2079 ACsFiltered.push_back(AC);
2080 }
2081 } else if (tagProperty->isDemandElement()) {
2082 ACsFiltered.push_back(AC);
2083 } else if (tagProperty->isGenericData()) {
2084 ACsFiltered.push_back(AC);
2085 }
2086 }
2087 // filter ACsInBoundary depending if is locked
2088 std::vector<GNEAttributeCarrier*> ACsFilteredUnlocked;
2089 ACsFilteredUnlocked.reserve(ACsFiltered.size());
2090 for (const auto& AC : ACsFiltered) {
2091 // isGLObjectLockedcheck also if we're in their correspoindient supermode
2092 if (!AC->getGUIGlObject()->isGLObjectLocked()) {
2093 ACsFilteredUnlocked.push_back(AC);
2094 }
2095 }
2096 // declare two sets of attribute carriers, one for select and another for unselect
2097 std::vector<GNEAttributeCarrier*> ACToSelect;
2098 std::vector<GNEAttributeCarrier*> ACToUnselect;
2099 // reserve memory (we assume that in the worst case we're going to insert all elements of ACsInBoundaryFiltered
2100 ACToSelect.reserve(ACsFilteredUnlocked.size());
2101 ACToUnselect.reserve(ACsFilteredUnlocked.size());
2102 // in restrict AND replace mode all current selected attribute carriers will be unselected
2103 const auto modificationMode = myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode();
2105 // obtain selected ACs depending of current supermode
2106 const auto selectedAC = myViewNet->getNet()->getAttributeCarriers()->getSelectedAttributeCarriers(false);
2107 // add id into ACs to unselect
2108 for (const auto& AC : selectedAC) {
2109 ACToUnselect.push_back(AC);
2110 }
2111 }
2112 // iterate over AttributeCarriers obtained of boundary an place it in ACToSelect or ACToUnselect
2113 for (const auto& AC : ACsFilteredUnlocked) {
2114 switch (myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode()) {
2116 ACToUnselect.push_back(AC);
2117 break;
2119 if (std::find(ACToUnselect.begin(), ACToUnselect.end(), AC) != ACToUnselect.end()) {
2120 ACToSelect.push_back(AC);
2121 }
2122 break;
2123 default:
2124 ACToSelect.push_back(AC);
2125 break;
2126 }
2127 }
2128 // select junctions and their connections and crossings if Auto select junctions is enabled (note: only for "add mode")
2129 if (myViewNet->autoSelectNodes() && (myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode() == GNESelectorFrame::ModificationMode::Operation::ADD)) {
2130 std::vector<GNEEdge*> edgesToSelect;
2131 // iterate over ACToSelect and extract edges
2132 for (const auto& AC : ACToSelect) {
2133 if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
2134 edgesToSelect.push_back(dynamic_cast<GNEEdge*>(AC));
2135 }
2136 }
2137 // iterate over extracted edges
2138 for (const auto& edge : edgesToSelect) {
2139 // select junction source and all their connections and crossings
2140 ACToSelect.push_back(edge->getFromJunction());
2141 for (const auto& connection : edge->getFromJunction()->getGNEConnections()) {
2142 ACToSelect.push_back(connection);
2143 }
2144 for (const auto& crossing : edge->getFromJunction()->getGNECrossings()) {
2145 ACToSelect.push_back(crossing);
2146 }
2147 // select junction destination and all their connections crossings
2148 ACToSelect.push_back(edge->getToJunction());
2149 for (const auto& connection : edge->getToJunction()->getGNEConnections()) {
2150 ACToSelect.push_back(connection);
2151 }
2152 for (const auto& crossing : edge->getToJunction()->getGNECrossings()) {
2153 ACToSelect.push_back(crossing);
2154 }
2155 }
2156 }
2157 // only continue if there is ACs to select or unselect
2158 if ((ACToSelect.size() + ACToUnselect.size()) > 0) {
2159 // first unselect AC of ACToUnselect and then selects AC of ACToSelect
2160 myViewNet->myUndoList->begin(GUIIcon::MODESELECT, TL("selection using rectangle"));
2161 for (const auto& AC : ACToUnselect) {
2162 AC->setAttribute(GNE_ATTR_SELECTED, "0", myViewNet->myUndoList);
2163 }
2164 for (const auto& AC : ACToSelect) {
2165 if (AC->getTagProperty()->isSelectable()) {
2166 AC->setAttribute(GNE_ATTR_SELECTED, "1", myViewNet->myUndoList);
2167 }
2168 }
2169 myViewNet->myUndoList->end();
2170 }
2171 myViewNet->makeNonCurrent();
2172}
2173
2174// ---------------------------------------------------------------------------
2175// GNEViewNetHelper::TestingMode - methods
2176// ---------------------------------------------------------------------------
2177
2179 myViewNet(viewNet) {
2180}
2181
2182
2183void
2185 // first check if testing mode is enabled and window size is correct
2186 if (OptionsCont::getOptions().getBool("gui-testing") && OptionsCont::getOptions().isSet("window-size")) {
2187 std::vector<std::string> windowSize = OptionsCont::getOptions().getStringVector("window-size");
2188 // make sure that given windows size has exactly two valid int values
2189 if ((windowSize.size() == 2) && GNEAttributeCarrier::canParse<int>(windowSize[0]) && GNEAttributeCarrier::canParse<int>(windowSize[1])) {
2190 myTestingWidth = GNEAttributeCarrier::parse<int>(windowSize[0]);
2191 myTestingHeight = GNEAttributeCarrier::parse<int>(windowSize[1]);
2192 } else {
2193 WRITE_ERRORF(TL("Invalid windows size-format: %for option 'window-size'"), toString(windowSize));
2194 }
2195 }
2196}
2197
2198
2199void
2201 // first check if testing mode is enabled
2202 if (OptionsCont::getOptions().getBool("gui-testing")) {
2203 // check if main windows has to be resized
2204 if (myTestingWidth > 0) {
2205 mainWindow->resize(myTestingWidth, myTestingHeight);
2206 }
2207 //std::cout << " fixed: view=" << getWidth() << ", " << getHeight() << " app=" << mainWindow->getWidth() << ", " << mainWindow->getHeight() << "\n";
2208 // draw pink square in the upper left corner on top of everything
2209 const double size = myViewNet->p2m(32);
2210 Position center = myViewNet->screenPos2NetPos(8, 8);
2211 // magenta
2214 glTranslated(center.x(), center.y(), GLO_TESTELEMENT);
2215 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2216 glBegin(GL_QUADS);
2217 glVertex2d(0, 0);
2218 glVertex2d(0, -size);
2219 glVertex2d(size, -size);
2220 glVertex2d(size, 0);
2221 glEnd();
2223 // blue
2226 glTranslated(center.x(), center.y(), GLO_TESTELEMENT + 1);
2227 glScaled(0.7, 0.7, 0);
2228 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2229 glBegin(GL_QUADS);
2230 glVertex2d(0, 0);
2231 glVertex2d(0, -size);
2232 glVertex2d(size, -size);
2233 glVertex2d(size, 0);
2234 glEnd();
2236 // yellow
2239 glTranslated(center.x(), center.y(), GLO_TESTELEMENT + 2);
2240 glScaled(0.4, 0.4, 0);
2241 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2242 glBegin(GL_QUADS);
2243 glVertex2d(0, 0);
2244 glVertex2d(0, -size);
2245 glVertex2d(size, -size);
2246 glVertex2d(size, 0);
2247 glEnd();
2249 }
2250}
2251
2252// ---------------------------------------------------------------------------
2253// GNEViewNetHelper::SaveElements - methods
2254// ---------------------------------------------------------------------------
2255
2257 myViewNet(viewNet) {
2258}
2259
2260
2262 delete mySaveIndividualFilesPopup;
2263}
2264
2265
2266void
2268 // get save element grip
2269 auto gripSaveElements = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().saveElements;
2270 // get tooltip menu
2271 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2272 // create save sumo config button
2273 mySaveNeteditConfig = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
2274 std::string("\t") + TL("Save Netedit Config") + std::string("\t") + TL("Save Netedit Config. (Ctrl+Shift+E)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_NETEDITCONFIG),
2275 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_E_SAVENETEDITCONFIG, GUIDesignButtonToolbar);
2276 mySaveNeteditConfig->create();
2277 // create save sumo config button
2278 mySaveSumoConfig = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
2279 std::string("\t") + TL("Save Sumo Config") + std::string("\t") + TL("Save Sumo Config. (Ctrl+Shift+S)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_SUMOCONFIG),
2280 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_S_SAVESUMOCONFIG, GUIDesignButtonToolbar);
2281 mySaveSumoConfig->create();
2282 // create save network button
2283 mySaveNetwork = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
2284 std::string("\t") + TL("Save network") + std::string("\t") + TL("Save network. (Ctrl+S)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_NETWORKELEMENTS),
2285 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK, GUIDesignButtonToolbar);
2286 mySaveNetwork->create();
2287 // create popup for save individual files
2288 mySaveIndividualFilesPopup = new FXPopup(gripSaveElements, POPUP_VERTICAL);
2289 mySaveIndividualFilesPopup->create();
2290 // create save individual files button
2291 mySaveIndividualFiles = new MFXMenuButtonTooltip(gripSaveElements, tooltipMenu,
2292 std::string("\t") + TL("Save individual files") + std::string("\t") + TL("Save individual files."),
2293 GUIIconSubSys::getIcon(GUIIcon::SAVE_MULTIPLE), mySaveIndividualFilesPopup, nullptr, GUIDesignButtonToolbarLocator);
2294 mySaveIndividualFiles->create();
2295 // create save additional elements button
2296 mySaveAdditionalElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2297 std::string("\t") + TL("Save additional elements") + std::string("\t") + TL("Save additional elements. (Ctrl+Shift+A)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_ADDITIONALELEMENTS),
2298 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_A_SAVEADDITIONALELEMENTS, GUIDesignButtonPopup);
2299 mySaveAdditionalElements->create();
2300 // create save demand elements button
2301 mySaveDemandElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2302 std::string("\t") + TL("Save demand elements") + std::string("\t") + TL("Save demand elements. (Ctrl+Shift+D)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_DEMANDELEMENTS),
2303 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_D_SAVEDEMANDELEMENTS, GUIDesignButtonPopup);
2304 mySaveDemandElements->create();
2305 // create save data elements button
2306 mySaveDataElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2307 std::string("\t") + TL("Save data elements") + std::string("\t") + TL("Save data elements. (Ctrl+Shift+B)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_DATAELEMENTS),
2308 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_B_SAVEDATAELEMENTS, GUIDesignButtonPopup);
2309 mySaveDataElements->create();
2310 // create save mean datas elements button
2311 mySaveMeanDataElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2312 std::string("\t") + TL("Save mean data elements") + std::string("\t") + TL("Save mean data elements. (Ctrl+Shift+M)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_MEANDATAELEMENTS),
2313 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_M_SAVEMEANDATAELEMENTS, GUIDesignButtonPopup);
2314 mySaveMeanDataElements->create();
2315 // recalc menu bar because there is new elements
2316 gripSaveElements->recalc();
2317 // show menu bar modes
2318 gripSaveElements->show();
2319}
2320
2321
2322void
2324 if (value) {
2325 mySaveIndividualFiles->enable();
2326 } else {
2327 mySaveIndividualFiles->disable();
2328 }
2329}
2330
2331// ---------------------------------------------------------------------------
2332// GNEViewNetHelper::TimeFormat - methods
2333// ---------------------------------------------------------------------------
2334
2336 myViewNet(viewNet) {
2337}
2338
2339
2340void
2342 // create save sumo config button
2343 mySwitchButton = new MFXButtonTooltip(myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().timeSwitch,
2344 myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
2345 gHumanReadableTime ? "H" : "S" + std::string("\t") + TL("Switch between seconds and HH:MM:SS") + std::string("\t") + TL("Switch between seconds and HH:MM:SS"), nullptr,
2346 myViewNet->getViewParent()->getGNEAppWindows(), MID_GNE_TOGGLE_TIMEFORMAT, GUIDesignButtonToolbar);
2347 mySwitchButton->create();
2348}
2349
2350
2351void
2361
2362
2363void
2365 if (gHumanReadableTime) {
2366 mySwitchButton->setText("H");
2367 } else {
2368 mySwitchButton->setText("S");
2369 }
2370}
2371
2372// ---------------------------------------------------------------------------
2373// GNEViewNetHelper::EditModes - methods
2374// ---------------------------------------------------------------------------
2375
2377 currentSupermode(Supermode::NETWORK),
2378 networkEditMode(NetworkEditMode::NETWORK_INSPECT),
2379 demandEditMode(DemandEditMode::DEMAND_INSPECT),
2380 dataEditMode(DataEditMode::DATA_INSPECT),
2381 myViewNet(viewNet) {
2382 auto& neteditOptions = OptionsCont::getOptions();
2383 // if new option is enabled, start in create edge mode
2384 if (neteditOptions.getBool("new")) {
2386 neteditOptions.resetWritable();
2387 neteditOptions.set("new", "false");
2388 }
2389}
2390
2391
2393 delete myNeteditViewsPopup;
2394}
2395
2396
2397void
2399 // grip supermodes
2400 auto gripSupermodes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().superModes;
2401 // static toolTip menu
2402 auto toolTipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2403 // create network button
2404 networkButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
2405 TL("Network") + std::string("\t") + TL("Edit network elements") + std::string("\t") + TL("Set mode for editing network elements. (F2)"),
2407 networkButton->create();
2408 // create demand button
2409 demandButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
2410 TL("Demand") + std::string("\t") + TL("Edit traffic demand elements") + std::string("\t") + TL("Set mode for editing traffic demand. (F3)"),
2412 demandButton->create();
2413 // create data button
2414 dataButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
2415 TL("Data") + std::string("\t") + TL("Edit data elements") + std::string("\t") + TL("Set mode for editing data demand. (F4)"),
2417 dataButton->create();
2418 // build the views popup
2419 myNeteditViewsPopup = new FXPopup(gripSupermodes, POPUP_VERTICAL);
2420 myNeteditViewsPopup->create();
2421 // build views button
2422 myNeteditViewsButton = new MFXMenuButtonTooltip(gripSupermodes, toolTipMenu,
2423 (std::string("\t") + TL("Change netedit view") + std::string("\t") + TL("Change netedit view.")).c_str(),
2425 myNeteditViewsButton->create();
2426 // build default view button
2427 myDefaultViewButton = new MFXButtonTooltip(myNeteditViewsPopup, toolTipMenu,
2428 (std::string("Default\t") + TL("Set default view") + std::string("\t") + TL("Set default view.")).c_str(),
2430 myDefaultViewButton->create();
2431 // build jupedsim view button
2432 myJuPedSimViewButton = new MFXButtonTooltip(myNeteditViewsPopup, toolTipMenu,
2433 (std::string("JuPedSim\t") + TL("Set JuPedSim view") + std::string("\t") + TL("Set JuPedSim view.")).c_str(),
2435 myJuPedSimViewButton->create();
2436 myNeteditViewsPopup->recalc();
2437 // set width (grip + 3 large buttons + icon button)
2438 gripSupermodes->setWidth(353);
2439 // show menu bar modes
2440 gripSupermodes->show();
2441}
2442
2443
2444void
2446 if (!force && (supermode == currentSupermode)) {
2447 myViewNet->setStatusBarText(TL("Mode already selected"));
2448 if (myViewNet->myCurrentFrame != nullptr) {
2449 myViewNet->myCurrentFrame->focusUpperElement();
2450 }
2451 } else {
2452 myViewNet->setStatusBarText("");
2453 // abort current operation
2454 myViewNet->abortOperation(false);
2455 // set super mode
2456 currentSupermode = supermode;
2457 // set supermodes
2458 if (supermode == Supermode::NETWORK) {
2459 // change buttons
2460 networkButton->setChecked(true);
2461 demandButton->setChecked(false);
2462 dataButton->setChecked(false);
2463 // show network buttons
2464 myViewNet->myNetworkCheckableButtons.showNetworkCheckableButtons();
2465 // hide demand buttons
2466 myViewNet->myDemandCheckableButtons.hideDemandCheckableButtons();
2467 // hide data buttons
2468 myViewNet->myDataCheckableButtons.hideDataCheckableButtons();
2469 // force update network mode
2470 setNetworkEditMode(networkEditMode, true);
2471 } else if (supermode == Supermode::DEMAND) {
2472 // change buttons
2473 networkButton->setChecked(false);
2474 demandButton->setChecked(true);
2475 dataButton->setChecked(false);
2476 // hide network buttons
2477 myViewNet->myNetworkCheckableButtons.hideNetworkCheckableButtons();
2478 // show demand buttons
2479 myViewNet->myDemandCheckableButtons.showDemandCheckableButtons();
2480 // hide data buttons
2481 myViewNet->myDataCheckableButtons.hideDataCheckableButtons();
2482 // force update demand mode
2483 setDemandEditMode(demandEditMode, true);
2484 // demand modes require ALWAYS a recomputing
2485 myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
2486 // check if update path calculator
2487 if (!myViewNet->myNet->getDemandPathManager()->getPathCalculator()->isPathCalculatorUpdated()) {
2488 // update path calculator of demand path manager
2489 myViewNet->myNet->getDemandPathManager()->getPathCalculator()->updatePathCalculator();
2490 // compute all demand elements
2491 myViewNet->myNet->computeDemandElements(myViewNet->myViewParent->getGNEAppWindows());
2492 }
2493 } else if (supermode == Supermode::DATA) {
2494 // change buttons
2495 networkButton->setChecked(false);
2496 demandButton->setChecked(false);
2497 dataButton->setChecked(true);
2498 // hide network buttons
2499 myViewNet->myNetworkCheckableButtons.hideNetworkCheckableButtons();
2500 // hide demand buttons
2501 myViewNet->myDemandCheckableButtons.hideDemandCheckableButtons();
2502 // show data buttons
2503 myViewNet->myDataCheckableButtons.showDataCheckableButtons();
2504 // force update data mode
2505 setDataEditMode(dataEditMode, true);
2506 // check if recompute
2507 if (myViewNet->getViewParent()->getGNEAppWindows()->getProcessingMenuCommands().menuCheckRecomputeDataMode->getCheck() == TRUE) {
2508 // demand modes require ALWAYS a recomputing
2509 myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
2510 }
2511 // reset TAZ contours (due filling)
2512 for (const auto& TAZ : myViewNet->getNet()->getAttributeCarriers()->getAdditionals().at(SUMO_TAG_TAZ)) {
2513 TAZ.second->resetAdditionalContour();
2514 }
2515 }
2516 // update buttons
2517 networkButton->update();
2518 demandButton->update();
2519 dataButton->update();
2520 // update Supermode CommandButtons in GNEAppWindows
2521 myViewNet->myViewParent->getGNEAppWindows()->updateSuperModeMenuCommands(currentSupermode);
2522 }
2523}
2524
2525
2526void
2528 if ((mode == networkEditMode) && !force) {
2529 myViewNet->setStatusBarText(TL("Network mode already selected"));
2530 if (myViewNet->myCurrentFrame != nullptr) {
2531 myViewNet->myCurrentFrame->focusUpperElement();
2532 }
2533 } else if (networkEditMode == NetworkEditMode::NETWORK_TLS && !myViewNet->myViewParent->getTLSEditorFrame()->isTLSSaved()) {
2534 myViewNet->setStatusBarText(TL("Save modifications in TLS before change mode"));
2535 myViewNet->myCurrentFrame->focusUpperElement();
2536 } else {
2537 myViewNet->setStatusBarText("");
2538 myViewNet->abortOperation(false);
2539 // stop editing of custom shapes
2540 myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
2541 // set new Network mode
2542 networkEditMode = mode;
2543 // for common modes (Inspect/Delete/Select/move) change also the other supermode
2544 if (networkEditMode == NetworkEditMode::NETWORK_INSPECT) {
2545 demandEditMode = DemandEditMode::DEMAND_INSPECT;
2546 dataEditMode = DataEditMode::DATA_INSPECT;
2547 } else if (networkEditMode == NetworkEditMode::NETWORK_DELETE) {
2548 demandEditMode = DemandEditMode::DEMAND_DELETE;
2549 dataEditMode = DataEditMode::DATA_DELETE;
2550 } else if (networkEditMode == NetworkEditMode::NETWORK_SELECT) {
2551 demandEditMode = DemandEditMode::DEMAND_SELECT;
2552 dataEditMode = DataEditMode::DATA_SELECT;
2553 } else if (networkEditMode == NetworkEditMode::NETWORK_MOVE) {
2554 demandEditMode = DemandEditMode::DEMAND_MOVE;
2555 }
2556 // certain modes require a recomputing
2557 switch (mode) {
2562 // modes which depend on computed data
2563 myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
2564 break;
2565 default:
2566 break;
2567 }
2568 // update cursors
2569 myViewNet->updateCursor();
2570 // update network mode specific controls
2571 myViewNet->updateNetworkModeSpecificControls();
2572 }
2573}
2574
2575
2576void
2578 if ((mode == demandEditMode) && !force) {
2579 myViewNet->setStatusBarText(TL("Demand mode already selected"));
2580 if (myViewNet->myCurrentFrame != nullptr) {
2581 myViewNet->myCurrentFrame->focusUpperElement();
2582 }
2583 } else {
2584 myViewNet->setStatusBarText("");
2585 myViewNet->abortOperation(false);
2586 // stop editing of custom shapes
2587 myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
2588 // set new Demand mode
2589 demandEditMode = mode;
2590 // for common modes (Inspect/Delete/Select/Move) change also the other supermode
2591 if (demandEditMode == DemandEditMode::DEMAND_INSPECT) {
2592 networkEditMode = NetworkEditMode::NETWORK_INSPECT;
2593 dataEditMode = DataEditMode::DATA_INSPECT;
2594 } else if (demandEditMode == DemandEditMode::DEMAND_DELETE) {
2595 networkEditMode = NetworkEditMode::NETWORK_DELETE;
2596 dataEditMode = DataEditMode::DATA_DELETE;
2597 } else if (demandEditMode == DemandEditMode::DEMAND_SELECT) {
2598 networkEditMode = NetworkEditMode::NETWORK_SELECT;
2599 dataEditMode = DataEditMode::DATA_SELECT;
2600 } else if (demandEditMode == DemandEditMode::DEMAND_MOVE) {
2601 networkEditMode = NetworkEditMode::NETWORK_MOVE;
2602 }
2603 // update cursors
2604 myViewNet->updateCursor();
2605 // update network mode specific controls
2606 myViewNet->updateDemandModeSpecificControls();
2607 }
2608}
2609
2610
2611void
2613 if ((mode == dataEditMode) && !force) {
2614 myViewNet->setStatusBarText(TL("Data mode already selected"));
2615 if (myViewNet->myCurrentFrame != nullptr) {
2616 myViewNet->myCurrentFrame->focusUpperElement();
2617 }
2618 } else {
2619 myViewNet->setStatusBarText("");
2620 myViewNet->abortOperation(false);
2621 // stop editing of custom shapes
2622 myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
2623 // set new Data mode
2624 dataEditMode = mode;
2625 // for common modes (Inspect/Delete/Select/Move) change also the other supermode
2626 if (dataEditMode == DataEditMode::DATA_INSPECT) {
2627 networkEditMode = NetworkEditMode::NETWORK_INSPECT;
2628 demandEditMode = DemandEditMode::DEMAND_INSPECT;
2629 } else if (dataEditMode == DataEditMode::DATA_DELETE) {
2630 networkEditMode = NetworkEditMode::NETWORK_DELETE;
2631 demandEditMode = DemandEditMode::DEMAND_DELETE;
2632 } else if (dataEditMode == DataEditMode::DATA_SELECT) {
2633 networkEditMode = NetworkEditMode::NETWORK_SELECT;
2634 demandEditMode = DemandEditMode::DEMAND_SELECT;
2635 }
2636 // update all datasets
2637 for (const auto& dataSet : myViewNet->getNet()->getAttributeCarriers()->getDataSets()) {
2638 dataSet.second->updateAttributeColors();
2639 }
2640 // update cursors
2641 myViewNet->updateCursor();
2642 // update network mode specific controls
2643 myViewNet->updateDataModeSpecificControls();
2644 }
2645}
2646
2647
2648bool
2650 return (currentSupermode == Supermode::NETWORK);
2651}
2652
2653
2654bool
2656 return (currentSupermode == Supermode::DEMAND);
2657}
2658
2659
2660bool
2662 return (currentSupermode == Supermode::DATA);
2663}
2664
2665
2666void
2668 // grip supermodes
2669 auto gripSupermodes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().superModes;
2670 // file menu commands
2671 auto& fileMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getFileMenuCommands();
2672 // continue depending of selector
2673 if (sel == MID_GNE_VIEW_DEFAULT) {
2674 myNeteditViewsButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT));
2675 gripSupermodes->setWidth(353);
2676 // show menu commands
2677 fileMenuCommands.setDefaultView();
2678 // hide short edges in create edge frame
2679 myViewNet->getViewParent()->getCreateEdgeFrame()->getEdgeTypeSelector()->showDefaultShortEdgeCheckBox(false);
2680 } else if (sel == MID_GNE_VIEW_JUPEDSIM) {
2681 myNeteditViewsButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM));
2682 gripSupermodes->setWidth(250);
2683 // hide menu commands
2684 fileMenuCommands.setJuPedSimView();
2685 // show short edges in create edge frame
2686 myViewNet->getViewParent()->getCreateEdgeFrame()->getEdgeTypeSelector()->showDefaultShortEdgeCheckBox(true);
2687 }
2688 // update viewNet
2689 myViewNet->viewUpdated();
2690}
2691
2692
2693bool
2695 return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT);
2696}
2697
2698
2699bool
2701 return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM);
2702}
2703
2704// ---------------------------------------------------------------------------
2705// GNEViewNetHelper::NetworkViewOptions - methods
2706// ---------------------------------------------------------------------------
2707
2711
2712
2713void
2715 // get grip modes
2716 auto gripModes = myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().modes;
2717 // static toolTip menu
2718 auto toolTipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2719 // create menu checks
2720 menuCheckToggleGrid = new MFXCheckableButton(false, gripModes, toolTipMenu,
2721 (std::string("\t") + TL("Show grid") + std::string("\t") + TL("Show grid and restrict movement to the grid - define grid size in visualization options. (Ctrl+G)")),
2724 menuCheckToggleGrid->setChecked(false);
2725 menuCheckToggleGrid->create();
2726
2727 menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, toolTipMenu,
2728 (std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
2731 menuCheckToggleDrawJunctionShape->setChecked(false);
2732 menuCheckToggleDrawJunctionShape->create();
2733
2734 menuCheckDrawSpreadVehicles = new MFXCheckableButton(false, gripModes, toolTipMenu,
2735 (std::string("\t") + TL("Draw vehicles spread in lane or depart position") + std::string("\t") + TL("Draw vehicles spread in lane or in depart position.")),
2738 menuCheckDrawSpreadVehicles->setChecked(false);
2739 menuCheckDrawSpreadVehicles->create();
2740
2741 menuCheckShowDemandElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
2742 (std::string("\t") + TL("Show demand elements") + std::string("\t") + TL("Toggle show demand elements.")),
2745 menuCheckShowDemandElements->setChecked(false);
2746 menuCheckShowDemandElements->create();
2747
2748 menuCheckSelectEdges = new MFXCheckableButton(false, gripModes, toolTipMenu,
2749 (std::string("\t") + TL("Clicks target lanes") + std::string("\t") + TL("Toggle whether clicking should inspect/select/delete lanes instead of edges.")),
2752 menuCheckSelectEdges->create();
2753
2754 menuCheckShowConnections = new MFXCheckableButton(false, gripModes, toolTipMenu,
2755 (std::string("\t") + TL("Show connections over junctions") + std::string("\t") + TL("Toggle show connections over junctions.")),
2758 menuCheckShowConnections->setChecked(myViewNet->getVisualisationSettings().showLane2Lane);
2759 menuCheckShowConnections->create();
2760
2761 menuCheckHideConnections = new MFXCheckableButton(false, gripModes, toolTipMenu,
2762 (std::string("\t") + TL("Hide connections") + std::string("\t") + TL("Toggle hide connections.")),
2765 menuCheckHideConnections->setChecked(false);
2766 menuCheckHideConnections->create();
2767
2768 menuCheckShowAdditionalSubElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
2769 (std::string("\t") + TL("Show additional sub-elements") + std::string("\t") + TL("Toggle show additional sub-elements.")),
2772 menuCheckShowAdditionalSubElements->setChecked(false);
2773 menuCheckShowAdditionalSubElements->create();
2774
2775 menuCheckShowTAZElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
2776 (std::string("\t") + TL("Show TAZ elements") + std::string("\t") + TL("Toggle show TAZ elements.")),
2779 menuCheckShowTAZElements->setChecked(false);
2780 menuCheckShowTAZElements->create();
2781
2782 menuCheckExtendSelection = new MFXCheckableButton(false, gripModes, toolTipMenu,
2783 (std::string("\t") + TL("Automatic select junctions") + std::string("\t") + TL("Toggle whether selecting multiple edges should automatically select their junctions.")),
2786 menuCheckExtendSelection->setChecked(true);
2787 menuCheckExtendSelection->create();
2788
2789 menuCheckChangeAllPhases = new MFXCheckableButton(false, gripModes, toolTipMenu,
2790 (std::string("\t") + TL("Apply state to all phases") + std::string("\t") + TL("Toggle whether clicking should apply state changes to all phases of the current TLS plan.")),
2793 menuCheckChangeAllPhases->setChecked(false);
2794 menuCheckChangeAllPhases->create();
2795
2796 menuCheckMergeAutomatically = new MFXCheckableButton(false, gripModes, toolTipMenu,
2797 (std::string("\t") + TL("Automatic merging junction") + std::string("\t") + TL("Toggle ask for confirmation before merging junction.")),
2800 menuCheckMergeAutomatically->create();
2801
2802 menuCheckChainEdges = new MFXCheckableButton(false, gripModes, toolTipMenu,
2803 (std::string("\t") + TL("Edge chain mode") + std::string("\t") + TL("Create consecutive edges with a single click (hit ESC to cancel chain).")),
2806 menuCheckChainEdges->setChecked(false);
2807 menuCheckChainEdges->create();
2808
2809 menuCheckAutoOppositeEdge = new MFXCheckableButton(false, gripModes, toolTipMenu,
2810 (std::string("\t") + TL("Edge opposite direction") + std::string("\t") + TL("Automatically create an edge in the opposite direction.")),
2813 menuCheckAutoOppositeEdge->setChecked(false);
2814 menuCheckAutoOppositeEdge->create();
2815
2816 menuCheckMoveElevation = new MFXCheckableButton(false, gripModes, toolTipMenu,
2817 (std::string("\t") + TL("Move elevation") + std::string("\t") + TL("Apply mouse movement to elevation instead of x,y position.")),
2820 menuCheckMoveElevation->setChecked(false);
2821 menuCheckMoveElevation->create();
2822
2823 menuCheckShowJunctionBubble = new MFXCheckableButton(false, gripModes, toolTipMenu,
2824 (std::string("\t") + TL("Show bubbles") + std::string("\t") + TL("Toggle show bubbles over junctions shapes.")),
2827 menuCheckShowJunctionBubble->setChecked(false);
2828 menuCheckShowJunctionBubble->create();
2829
2830 menuCheckShowPolygonSymbols = new MFXCheckableButton(false, gripModes, toolTipMenu,
2831 (std::string("\t") + TL("Show polygon symbols") + std::string("\t") + TL("Show polygon symbols.")),
2834 menuCheckShowPolygonSymbols->setChecked(true);
2835 menuCheckShowPolygonSymbols->create();
2836
2837 menuCheckDrawFilledWalkingAreas = new MFXCheckableButton(false, gripModes, toolTipMenu,
2838 (std::string("\t") + TL("Draw filled walking areas") + std::string("\t") + TL("Draw filled walking areas.")),
2841 menuCheckDrawFilledWalkingAreas->setChecked(true);
2842 menuCheckDrawFilledWalkingAreas->create();
2843
2844 // always recalc after creating new elements
2845 gripModes->recalc();
2846}
2847
2848
2849void
2851 menuCheckToggleGrid->hide();
2852 menuCheckToggleDrawJunctionShape->hide();
2853 menuCheckDrawSpreadVehicles->hide();
2854 menuCheckShowDemandElements->hide();
2855 menuCheckSelectEdges->hide();
2856 menuCheckShowConnections->hide();
2857 menuCheckHideConnections->hide();
2858 menuCheckShowAdditionalSubElements->hide();
2859 menuCheckShowTAZElements->hide();
2860 menuCheckExtendSelection->hide();
2861 menuCheckChangeAllPhases->hide();
2862 menuCheckMergeAutomatically->hide();
2863 menuCheckShowJunctionBubble->hide();
2864 menuCheckMoveElevation->hide();
2865 menuCheckChainEdges->hide();
2866 menuCheckAutoOppositeEdge->hide();
2867 menuCheckShowPolygonSymbols->hide();
2868 menuCheckDrawFilledWalkingAreas->hide();
2869}
2870
2871
2872void
2873GNEViewNetHelper::NetworkViewOptions::getVisibleNetworkMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
2874 // save visible menu commands in commands vector
2875 if (menuCheckToggleGrid->shown()) {
2876 commands.push_back(menuCheckToggleGrid);
2877 }
2878 if (menuCheckToggleDrawJunctionShape->shown()) {
2879 commands.push_back(menuCheckToggleDrawJunctionShape);
2880 }
2881 if (menuCheckDrawSpreadVehicles->shown()) {
2882 commands.push_back(menuCheckDrawSpreadVehicles);
2883 }
2884 if (menuCheckShowDemandElements->shown()) {
2885 commands.push_back(menuCheckShowDemandElements);
2886 }
2887 if (menuCheckSelectEdges->shown()) {
2888 commands.push_back(menuCheckSelectEdges);
2889 }
2890 if (menuCheckShowConnections->shown()) {
2891 commands.push_back(menuCheckShowConnections);
2892 }
2893 if (menuCheckHideConnections->shown()) {
2894 commands.push_back(menuCheckHideConnections);
2895 }
2896 if (menuCheckShowAdditionalSubElements->shown()) {
2897 commands.push_back(menuCheckShowAdditionalSubElements);
2898 }
2899 if (menuCheckShowTAZElements->shown()) {
2900 commands.push_back(menuCheckShowTAZElements);
2901 }
2902 if (menuCheckExtendSelection->shown()) {
2903 commands.push_back(menuCheckExtendSelection);
2904 }
2905 if (menuCheckChangeAllPhases->shown()) {
2906 commands.push_back(menuCheckChangeAllPhases);
2907 }
2908 if (menuCheckMergeAutomatically->shown()) {
2909 commands.push_back(menuCheckMergeAutomatically);
2910 }
2911 if (menuCheckChainEdges->shown()) {
2912 commands.push_back(menuCheckChainEdges);
2913 }
2914 if (menuCheckAutoOppositeEdge->shown()) {
2915 commands.push_back(menuCheckAutoOppositeEdge);
2916 }
2917 if (menuCheckMoveElevation->shown()) {
2918 commands.push_back(menuCheckMoveElevation);
2919 }
2920 if (menuCheckShowJunctionBubble->shown()) {
2921 commands.push_back(menuCheckShowJunctionBubble);
2922 }
2923 if (menuCheckShowPolygonSymbols->shown()) {
2924 commands.push_back(menuCheckShowPolygonSymbols);
2925 }
2926 if (menuCheckDrawFilledWalkingAreas->shown()) {
2927 commands.push_back(menuCheckDrawFilledWalkingAreas);
2928 }
2929}
2930
2931
2932bool
2934 return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
2935}
2936
2937
2938bool
2940 if (menuCheckShowDemandElements->shown()) {
2941 return (menuCheckShowDemandElements->amChecked() == TRUE);
2942 } else {
2943 // by default, if menuCheckShowDemandElements isn't shown, always show demand elements
2944 return true;
2945 }
2946}
2947
2948
2949bool
2951 if (menuCheckSelectEdges->shown()) {
2952 return (menuCheckSelectEdges->amChecked() != TRUE);
2953 } else {
2954 // by default, if menuCheckSelectEdges isn't shown, always select edges
2955 return true;
2956 }
2957}
2958
2959
2960bool
2962 if (myViewNet->myEditModes.isCurrentSupermodeData()) {
2963 return false;
2964 } else if (myViewNet->myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
2965 if (myViewNet->getViewParent()->getConnectorFrame()->getConnectionVisualization()->showOnlyFromConnections() && myViewNet->getViewParent()->getConnectorFrame()->getCurrentEditedLane()) {
2966 for (const auto& outgoingConnection : myViewNet->getViewParent()->getConnectorFrame()->getCurrentEditedLane()->getParentEdge()->getGNEConnections()) {
2967 if ((connection == outgoingConnection) && (outgoingConnection->getLaneFrom() == myViewNet->getViewParent()->getConnectorFrame()->getCurrentEditedLane())) {
2968 return true;
2969 }
2970 }
2971 return false;
2972 } else {
2973 return (menuCheckHideConnections->amChecked() == false);
2974 }
2975 } else if (myViewNet->myEditModes.networkEditMode == NetworkEditMode::NETWORK_PROHIBITION) {
2976 return true;
2977 } else if (myViewNet->myEditModes.isCurrentSupermodeNetwork() && menuCheckShowConnections->shown() == false) {
2978 return false;
2979 } else {
2980 return (myViewNet->getVisualisationSettings().showLane2Lane);
2981 }
2982}
2983
2984
2985bool
2987 if (!myViewNet->myEditModes.isCurrentSupermodeNetwork()) {
2988 return false;
2989 } else if (menuCheckShowAdditionalSubElements->shown() == false) {
2990 return false;
2991 } else {
2992 return menuCheckShowAdditionalSubElements->amChecked();
2993 }
2994}
2995
2996
2997bool
2999 if (!myViewNet->myEditModes.isCurrentSupermodeNetwork()) {
3000 return false;
3001 } else if (menuCheckShowTAZElements->shown() == false) {
3002 return false;
3003 } else {
3004 return menuCheckShowTAZElements->amChecked();
3005 }
3006}
3007
3008
3009bool
3011 if (menuCheckMoveElevation->shown()) {
3012 return (menuCheckMoveElevation->amChecked() == TRUE);
3013 } else {
3014 return false;
3015 }
3016}
3017
3018
3019bool
3021 if (menuCheckShowPolygonSymbols->shown()) {
3022 return (menuCheckShowPolygonSymbols->amChecked() == TRUE);
3023 } else {
3024 return false;
3025 }
3026}
3027
3028
3029bool
3031 if (menuCheckDrawFilledWalkingAreas->shown()) {
3032 return (menuCheckDrawFilledWalkingAreas->amChecked() == TRUE);
3033 } else {
3034 return false;
3035 }
3036}
3037
3038// ---------------------------------------------------------------------------
3039// GNEViewNetHelper::DemandViewOptions - methods
3040// ---------------------------------------------------------------------------
3041
3043 myViewNet(viewNet) {
3044}
3045
3046
3047void
3049 // get grip modes
3050 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3051 // get tooltip menu
3052 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3053 // create menu checks
3054 menuCheckToggleGrid = new MFXCheckableButton(false, gripModes, tooltipMenu,
3055 (std::string("\t") + TL("Show grid") + std::string("\t") + TL("Show grid and restrict movement to the grid - define grid size in visualization options. (Ctrl+G)")),
3058 menuCheckToggleGrid->setChecked(false);
3059 menuCheckToggleGrid->create();
3060
3061 menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, tooltipMenu,
3062 (std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
3065 menuCheckToggleDrawJunctionShape->setChecked(false);
3066 menuCheckToggleDrawJunctionShape->create();
3067
3068 menuCheckDrawSpreadVehicles = new MFXCheckableButton(false, gripModes, tooltipMenu,
3069 (std::string("\t") + TL("Draw vehicles spread/depart position") + std::string("\t") + TL("Draw vehicles spread in lane or in depart position.")),
3072 menuCheckDrawSpreadVehicles->setChecked(false);
3073 menuCheckDrawSpreadVehicles->create();
3074
3075 menuCheckHideShapes = new MFXCheckableButton(false, gripModes, tooltipMenu,
3076 (std::string("\t") + TL("Show shapes") + std::string("\t") + TL("Toggle show shapes (Polygons and POIs).")),
3079 menuCheckHideShapes->setChecked(false);
3080 menuCheckHideShapes->create();
3081
3082 menuCheckShowAllTrips = new MFXCheckableButton(false, gripModes, tooltipMenu,
3083 (std::string("\t") + TL("Show all trips") + std::string("\t") + TL("Toggle show all trips (requires updated demand - F5).")),
3086 menuCheckShowAllTrips->setChecked(false);
3087 menuCheckShowAllTrips->create();
3088
3089 menuCheckShowAllPersonPlans = new MFXCheckableButton(false, gripModes, tooltipMenu,
3090 (std::string("\t") + TL("Show all person plans") + std::string("\t") + TL("Toggle show all person plans.")),
3093 menuCheckShowAllPersonPlans->setChecked(false);
3094 menuCheckShowAllPersonPlans->create();
3095
3096 menuCheckLockPerson = new MFXCheckableButton(false, gripModes, tooltipMenu,
3097 (std::string("\t") + TL("Lock selected person") + std::string("\t") + TL("Toggle lock selected person.")),
3100 menuCheckLockPerson->setChecked(false);
3101 menuCheckLockPerson->create();
3102
3103 menuCheckShowAllContainerPlans = new MFXCheckableButton(false, gripModes, tooltipMenu,
3104 (std::string("\t") + TL("Show all containers plans") + std::string("\t") + TL("Toggle show all container plans.")),
3107 menuCheckShowAllContainerPlans->setChecked(false);
3108 menuCheckShowAllContainerPlans->create();
3109
3110 menuCheckLockContainer = new MFXCheckableButton(false, gripModes, tooltipMenu,
3111 (std::string("\t") + TL("Lock selected container") + std::string("\t") + TL("Toggle lock selected container.")),
3114 menuCheckLockContainer->setChecked(false);
3115 menuCheckLockContainer->create();
3116
3117 menuCheckHideNonInspectedDemandElements = new MFXCheckableButton(false, gripModes, tooltipMenu,
3118 (std::string("\t") + TL("Show non-inspected demand elements") + std::string("\t") + TL("Toggle show non-inspected demand elements.")),
3121 menuCheckHideNonInspectedDemandElements->setChecked(false);
3122 menuCheckHideNonInspectedDemandElements->create();
3123
3124 menuCheckShowOverlappedRoutes = new MFXCheckableButton(false, gripModes, tooltipMenu,
3125 (std::string("\t") + TL("Show number of overlapped routes") + std::string("\t") + TL("Toggle show number of overlapped routes.")),
3128 menuCheckShowOverlappedRoutes->setChecked(false);
3129 menuCheckShowOverlappedRoutes->create();
3130
3131 // always recalc after creating new elements
3132 gripModes->recalc();
3133}
3134
3135
3136void
3138 menuCheckToggleGrid->hide();
3139 menuCheckToggleDrawJunctionShape->hide();
3140 menuCheckDrawSpreadVehicles->hide();
3141 menuCheckHideShapes->hide();
3142 menuCheckShowAllTrips->hide();
3143 menuCheckShowAllPersonPlans->hide();
3144 menuCheckLockPerson->hide();
3145 menuCheckShowAllContainerPlans->hide();
3146 menuCheckLockContainer->hide();
3147 menuCheckHideNonInspectedDemandElements->hide();
3148 menuCheckShowOverlappedRoutes->hide();
3149}
3150
3151
3152void
3153GNEViewNetHelper::DemandViewOptions::getVisibleDemandMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
3154 // save visible menu commands in commands vector
3155 if (menuCheckToggleGrid->shown()) {
3156 commands.push_back(menuCheckToggleGrid);
3157 }
3158 if (menuCheckToggleDrawJunctionShape->shown()) {
3159 commands.push_back(menuCheckToggleDrawJunctionShape);
3160 }
3161 if (menuCheckDrawSpreadVehicles->shown()) {
3162 commands.push_back(menuCheckDrawSpreadVehicles);
3163 }
3164 if (menuCheckHideShapes->shown()) {
3165 commands.push_back(menuCheckHideShapes);
3166 }
3167 if (menuCheckShowAllTrips->shown()) {
3168 commands.push_back(menuCheckShowAllTrips);
3169 }
3170 if (menuCheckShowAllPersonPlans->shown() && menuCheckShowAllPersonPlans->isEnabled()) {
3171 commands.push_back(menuCheckShowAllPersonPlans);
3172 }
3173 if (menuCheckLockPerson->shown() && menuCheckLockPerson->isEnabled()) {
3174 commands.push_back(menuCheckLockPerson);
3175 }
3176 if (menuCheckShowAllContainerPlans->shown() && menuCheckShowAllContainerPlans->isEnabled()) {
3177 commands.push_back(menuCheckShowAllContainerPlans);
3178 }
3179 if (menuCheckLockContainer->shown() && menuCheckLockContainer->isEnabled()) {
3180 commands.push_back(menuCheckLockContainer);
3181 }
3182 if (menuCheckHideNonInspectedDemandElements->shown()) {
3183 commands.push_back(menuCheckHideNonInspectedDemandElements);
3184 }
3185 if (menuCheckShowOverlappedRoutes->shown()) {
3186 commands.push_back(menuCheckShowOverlappedRoutes);
3187 }
3188}
3189
3190
3191bool
3193 return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
3194}
3195
3196
3197bool
3199 if (menuCheckHideNonInspectedDemandElements->shown()) {
3200 const auto& inspectedElements = myViewNet->getInspectedElements();
3201 // check conditions
3202 if ((menuCheckHideNonInspectedDemandElements->amChecked() == FALSE) || (inspectedElements.getFirstAC() == nullptr)) {
3203 // if checkbox is disabled or there isn't an inspected element, then return true
3204 return true;
3205 } else if (inspectedElements.getFirstAC() && inspectedElements.getFirstAC()->getTagProperty()->isDemandElement()) {
3206 if (inspectedElements.isACInspected(demandElement)) {
3207 // if inspected element correspond to demandElement, return true
3208 return true;
3209 } else {
3210 // if demandElement is a route, check if dottedAC is one of their children (Vehicle or Stop)
3211 for (const auto& demandElementChild : demandElement->getChildDemandElements()) {
3212 if (inspectedElements.isACInspected(demandElementChild)) {
3213 return true;
3214 }
3215 }
3216 // if demandElement is a vehicle, check if dottedAC is one of his route Parent
3217 for (const auto& demandElementParent : demandElement->getParentDemandElements()) {
3218 if (inspectedElements.isACInspected(demandElementParent)) {
3219 return true;
3220 }
3221 }
3222 // dottedAC isn't one of their parent, then return false
3223 return false;
3224 }
3225 } else {
3226 // we're inspecting a demand element, then return true
3227 return true;
3228 }
3229 } else {
3230 // we're inspecting a demand element, then return true
3231 return true;
3232 }
3233}
3234
3235
3236bool
3238 if (menuCheckHideShapes->shown()) {
3239 return (menuCheckHideShapes->amChecked() == FALSE);
3240 } else {
3241 return true;
3242 }
3243}
3244
3245
3246bool
3248 return (menuCheckShowAllTrips->amChecked() == TRUE);
3249}
3250
3251
3252bool
3254 if (menuCheckShowAllPersonPlans->isEnabled()) {
3255 return (menuCheckShowAllPersonPlans->amChecked() == TRUE);
3256 } else {
3257 return false;
3258 }
3259}
3260
3261
3262void
3264 myLockedPerson = person;
3265}
3266
3267
3268void
3270 myLockedPerson = nullptr;
3271}
3272
3273
3274const GNEDemandElement*
3276 return myLockedPerson;
3277}
3278
3279
3280bool
3282 if (menuCheckShowAllContainerPlans->isEnabled()) {
3283 return (menuCheckShowAllContainerPlans->amChecked() == TRUE);
3284 } else {
3285 return false;
3286 }
3287}
3288
3289
3290void
3292 myLockedContainer = container;
3293}
3294
3295
3296void
3298 myLockedContainer = nullptr;
3299}
3300
3301
3302bool
3304 if (menuCheckShowOverlappedRoutes->isEnabled()) {
3305 return (menuCheckShowOverlappedRoutes->amChecked() == TRUE);
3306 } else {
3307 return false;
3308 }
3309}
3310
3311
3312const GNEDemandElement*
3314 return myLockedContainer;
3315}
3316
3317// ---------------------------------------------------------------------------
3318// GNEViewNetHelper::DataViewOptions - methods
3319// ---------------------------------------------------------------------------
3320
3322 myViewNet(viewNet) {
3323}
3324
3325
3326void
3328 // get grip modes
3329 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3330 // get tooltip menu
3331 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3332 // create menu checks
3333 menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, tooltipMenu,
3334 (std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
3337 menuCheckToggleDrawJunctionShape->setChecked(false);
3338 menuCheckToggleDrawJunctionShape->create();
3339
3340 menuCheckShowAdditionals = new MFXCheckableButton(false, gripModes, tooltipMenu,
3341 (std::string("\t") + TL("Show additionals") + std::string("\t") + TL("Toggle show additionals.")),
3344 menuCheckShowAdditionals->create();
3345
3346 menuCheckShowShapes = new MFXCheckableButton(false, gripModes, tooltipMenu,
3347 (std::string("\t") + TL("Show shapes") + std::string("\t") + TL("Toggle show shapes (Polygons and POIs).")),
3350 menuCheckShowShapes->create();
3351
3352 menuCheckShowDemandElements = new MFXCheckableButton(false, gripModes, tooltipMenu,
3353 (std::string("\t") + TL("Show demand elements") + std::string("\t") + TL("Toggle show demand elements.")),
3356 menuCheckShowDemandElements->create();
3357
3358 menuCheckToggleTAZRelDrawing = new MFXCheckableButton(false, gripModes, tooltipMenu,
3359 (std::string("\t") + TL("Draw TAZREL drawing mode") + std::string("\t") + TL("Toggle draw TAZREL drawing mode.")),
3362 menuCheckToggleTAZRelDrawing->create();
3363
3364 menuCheckToggleTAZDrawFill = new MFXCheckableButton(false, gripModes, tooltipMenu,
3365 (std::string("\t") + TL("Toggle draw TAZ fill") + std::string("\t") + TL("Toggle draw TAZ fill")),
3368 menuCheckToggleTAZDrawFill->create();
3369
3370 menuCheckToggleTAZRelOnlyFrom = new MFXCheckableButton(false, gripModes, tooltipMenu,
3371 (std::string("\t") + TL("Toggle draw TAZRel only from") + std::string("\t") + TL("Toggle draw TAZRel only from")),
3374 menuCheckToggleTAZRelOnlyFrom->create();
3375
3376 menuCheckToggleTAZRelOnlyTo = new MFXCheckableButton(false, gripModes, tooltipMenu,
3377 (std::string("\t") + TL("Toggle draw TAZRel only to") + std::string("\t") + TL("Toggle draw TAZRel only to")),
3380 menuCheckToggleTAZRelOnlyTo->create();
3381
3382 // always recalc after creating new elements
3383 gripModes->recalc();
3384}
3385
3386
3387void
3389 menuCheckToggleDrawJunctionShape->hide();
3390 menuCheckShowAdditionals->hide();
3391 menuCheckShowShapes->hide();
3392 menuCheckShowDemandElements->hide();
3393 menuCheckToggleTAZRelDrawing->hide();
3394 menuCheckToggleTAZDrawFill->hide();
3395 menuCheckToggleTAZRelOnlyFrom->hide();
3396 menuCheckToggleTAZRelOnlyTo->hide();
3397}
3398
3399
3400void
3401GNEViewNetHelper::DataViewOptions::getVisibleDataMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
3402 // save visible menu commands in commands vector
3403 if (menuCheckToggleDrawJunctionShape->shown()) {
3404 commands.push_back(menuCheckToggleDrawJunctionShape);
3405 }
3406 if (menuCheckShowAdditionals->shown()) {
3407 commands.push_back(menuCheckShowAdditionals);
3408 }
3409 if (menuCheckShowShapes->shown()) {
3410 commands.push_back(menuCheckShowShapes);
3411 }
3412 if (menuCheckShowDemandElements->shown()) {
3413 commands.push_back(menuCheckShowDemandElements);
3414 }
3415 if (menuCheckToggleTAZRelDrawing->shown()) {
3416 commands.push_back(menuCheckToggleTAZRelDrawing);
3417 }
3418 if (menuCheckToggleTAZDrawFill->shown()) {
3419 commands.push_back(menuCheckToggleTAZDrawFill);
3420 }
3421 if (menuCheckToggleTAZRelOnlyFrom->shown()) {
3422 commands.push_back(menuCheckToggleTAZRelOnlyFrom);
3423 }
3424 if (menuCheckToggleTAZRelOnlyTo->shown()) {
3425 commands.push_back(menuCheckToggleTAZRelOnlyTo);
3426 }
3427}
3428
3429
3430bool
3432 if (menuCheckShowAdditionals->shown()) {
3433 return (menuCheckShowAdditionals->amChecked() == TRUE);
3434 } else {
3435 return true;
3436 }
3437}
3438
3439
3440bool
3442 if (menuCheckShowShapes->shown()) {
3443 return (menuCheckShowShapes->amChecked() == TRUE);
3444 } else {
3445 return true;
3446 }
3447}
3448
3449
3450bool
3452 if (menuCheckShowDemandElements->shown()) {
3453 return (menuCheckShowDemandElements->amChecked() == TRUE);
3454 } else {
3455 return true;
3456 }
3457}
3458
3459
3460bool
3462 return (menuCheckToggleTAZRelDrawing->amChecked() != TRUE);
3463}
3464
3465
3466bool
3468 if (menuCheckToggleTAZDrawFill->shown()) {
3469 return (menuCheckToggleTAZDrawFill->amChecked() != TRUE);
3470 } else {
3471 return false;
3472 }
3473}
3474
3475
3476bool
3478 if (menuCheckToggleTAZRelOnlyFrom->shown()) {
3479 return (menuCheckToggleTAZRelOnlyFrom->amChecked() != TRUE);
3480 } else {
3481 return false;
3482 }
3483}
3484
3485
3486bool
3488 if (menuCheckToggleTAZRelOnlyTo->shown()) {
3489 return (menuCheckToggleTAZRelOnlyTo->amChecked() != TRUE);
3490 } else {
3491 return false;
3492 }
3493}
3494
3495// ---------------------------------------------------------------------------
3496// GNEViewNetHelper::IntervalBar - methods
3497// ---------------------------------------------------------------------------
3498
3500 myViewNet(viewNet) {
3501}
3502
3503
3504void
3506 const auto staticTooltip = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3507 // create interval label
3508 FXLabel* genericDataLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3509 TL("Data type"), 0, GUIDesignLabelThickedFixed(100));
3510 genericDataLabel->create();
3511 // create combo box for generic datas
3512 myGenericDataTypesComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3513 staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed, myViewNet,
3515 myGenericDataTypesComboBox->create();
3516 // fill combo box
3517 myGenericDataTypesComboBox->appendIconItem("<all>");
3518 myGenericDataTypesComboBox->appendIconItem(toString(GNE_TAG_EDGEREL_SINGLE).c_str());
3519 myGenericDataTypesComboBox->appendIconItem(toString(SUMO_TAG_EDGEREL).c_str());
3520 myGenericDataTypesComboBox->appendIconItem(toString(SUMO_TAG_TAZREL).c_str());
3521 // create dataSet label
3522 FXLabel* dataSetLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3523 TL("Data sets"), 0, GUIDesignLabelThickedFixed(100));
3524 dataSetLabel->create();
3525 // create combo box for sets
3526 myDataSetsComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3527 staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed,
3529 myDataSetsComboBox->create();
3530 // create checkbutton for myLimitByInterval
3531 myIntervalCheckBox = new FXCheckButton(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3533 myIntervalCheckBox->create();
3534 // create textfield for begin
3535 myBeginTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3537 myBeginTextField->create();
3538 // create text field for end
3539 myEndTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3541 myEndTextField->create();
3542 // create parameter label
3543 FXLabel* parameterLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3544 TL("Parameter"), 0, GUIDesignLabelThickedFixed(100));
3545 parameterLabel->create();
3546 // create combo box for attributes
3547 myParametersComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3548 staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed,
3550 myParametersComboBox->create();
3551 // always recalc after creating new elements
3552 myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->recalc();
3553}
3554
3555
3556void
3558 // first update interval bar
3559 updateIntervalBar();
3560 // show toolbar grip
3561 myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->show();
3562}
3563
3564
3565void
3567 // hide toolbar grip
3568 myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->hide();
3569}
3570
3571
3572void
3574 // check if intervalBar has to be updated
3575 if (myUpdateInterval && myViewNet->getNet()) {
3576 // clear data sets
3577 myDataSets.clear();
3578 // declare intervals
3579 double begin = INVALID_DOUBLE;
3580 double end = INVALID_DOUBLE;
3581 // clear parameters
3582 myParameters.clear();
3583 // iterate over all data elements
3584 for (const auto& dataSet : myViewNet->getNet()->getAttributeCarriers()->getDataSets()) {
3585 // add data set ID
3586 myDataSets.push_back(dataSet.second->getID());
3587 // iterate over all intervals
3588 for (const auto& interval : dataSet.second->getDataIntervalChildren()) {
3589 // set intervals
3590 if ((begin == INVALID_DOUBLE) || (interval.first < begin)) {
3591 begin = interval.first;
3592 }
3593 if ((end == INVALID_DOUBLE) || (interval.first > end)) {
3594 end = interval.first;
3595 }
3596 // iterate over all generic datas
3597 for (const auto& genericData : interval.second->getGenericDataChildren()) {
3598 // iterate over parameters
3599 for (const auto& parameter : genericData->getParametersMap()) {
3600 myParameters.insert(parameter.first);
3601 }
3602 }
3603 }
3604 }
3605 // get previous dataSet
3606 const std::string previousDataSet = myDataSetsComboBox->getText().text();
3607 // get previous interval
3608 const std::string previousBegin = (myIntervalCheckBox->getCheck() == TRUE) ? myBeginTextField->getText().text() : "";
3609 const std::string previousEnd = (myIntervalCheckBox->getCheck() == TRUE) ? myEndTextField->getText().text() : "";
3610 // get previous parameter
3611 const std::string previousParameter = myParametersComboBox->getText().text();
3612 // clear comboBoxes
3613 myDataSetsComboBox->clearItems();
3614 myParametersComboBox->clearItems();
3615 // add first item (all)
3616 myDataSetsComboBox->appendIconItem("<all>");
3617 myParametersComboBox->appendIconItem("<all>");
3618 // fill dataSet comboBox
3619 for (const auto& dataSet : myDataSets) {
3620 myDataSetsComboBox->appendIconItem(dataSet.c_str());
3621 }
3622 // set begin/end
3623 myBeginTextField->setText(toString(begin).c_str());
3624 myEndTextField->setText(toString(end).c_str());
3625 // fill parameter comboBox
3626 for (const auto& parameter : myParameters) {
3627 myParametersComboBox->appendIconItem(parameter.c_str());
3628 }
3629 // check previous dataSet
3630 myDataSetsComboBox->setCurrentItem(0, FALSE);
3631 for (int i = 0; i < myDataSetsComboBox->getNumItems(); i++) {
3632 if (myDataSetsComboBox->getItemText(i) == previousDataSet) {
3633 myDataSetsComboBox->setCurrentItem(i);
3634 }
3635 }
3636 // set previous interval
3637 if (myIntervalCheckBox->getCheck() == TRUE) {
3638 myBeginTextField->setText(previousBegin.c_str());
3639 myEndTextField->setText(previousEnd.c_str());
3640 }
3641 // check previous parameter
3642 myParametersComboBox->setCurrentItem(0, FALSE);
3643 for (int i = 0; i < myParametersComboBox->getNumItems(); i++) {
3644 if (myParametersComboBox->getItemText(i) == previousParameter) {
3645 myParametersComboBox->setCurrentItem(i);
3646 }
3647 }
3648 // check if enable or disable
3649 if ((myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_INSPECT) ||
3650 (myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_SELECT) ||
3651 (myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_DELETE)) {
3652 enableIntervalBar();
3653 } else {
3654 disableIntervalBar();
3655 }
3656 // intervalBar updated, then change flag
3657 myUpdateInterval = false;
3658 }
3659}
3660
3661
3662void
3664 myUpdateInterval = true;
3665}
3666
3667
3670 if (myGenericDataTypesComboBox->isEnabled() && (myGenericDataTypesComboBox->getTextColor() == GUIDesignTextColorBlack)) {
3671 if (myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) {
3673 } else if (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_EDGEREL).c_str()) {
3674 return SUMO_TAG_EDGEREL;
3675 } else if (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_TAZREL).c_str()) {
3676 return SUMO_TAG_TAZREL;
3677 }
3678 }
3679 return SUMO_TAG_NOTHING;
3680}
3681
3682
3685 if (!myDataSetsComboBox->isEnabled() ||
3686 (myDataSetsComboBox->getCurrentItem() == 0) ||
3687 (myDataSetsComboBox->getTextColor() == GUIDesignTextColorRed)) {
3688 return nullptr;
3689 } else {
3690 return myViewNet->getNet()->getAttributeCarriers()->retrieveDataSet(myDataSetsComboBox->getText().text());
3691 }
3692}
3693
3694
3695double
3697 if (!myIntervalCheckBox->isEnabled() || (myIntervalCheckBox->getCheck() == FALSE)) {
3698 return INVALID_DOUBLE;
3699 } else {
3700 return GNEAttributeCarrier::parse<double>(myBeginTextField->getText().text());
3701 }
3702}
3703
3704
3705double
3707 if (!myIntervalCheckBox->isEnabled() || (myIntervalCheckBox->getCheck() == FALSE)) {
3708 return INVALID_DOUBLE;
3709 } else {
3710 return GNEAttributeCarrier::parse<double>(myEndTextField->getText().text());
3711 }
3712}
3713
3714
3715std::string
3717 if (!myParametersComboBox->isEnabled() ||
3718 (myParametersComboBox->getCurrentItem() == 0) ||
3719 (myParametersComboBox->getTextColor() == GUIDesignTextColorRed)) {
3720 return "";
3721 } else {
3722 return myParametersComboBox->getText().text();
3723 }
3724}
3725
3726
3727void
3729 if ((myGenericDataTypesComboBox->getText() == "<all>") ||
3730 (myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) ||
3731 (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_EDGEREL).c_str()) ||
3732 (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_TAZREL).c_str())) {
3733 myGenericDataTypesComboBox->setTextColor(GUIDesignTextColorBlack);
3734 } else {
3735 myGenericDataTypesComboBox->setTextColor(GUIDesignTextColorRed);
3736 }
3737 // update view net
3738 myViewNet->updateViewNet();
3739}
3740
3741
3742void
3744 // check if exist
3745 if (std::find(myDataSets.begin(), myDataSets.end(), myDataSetsComboBox->getText().text()) != myDataSets.end()) {
3746 myDataSetsComboBox->setTextColor(GUIDesignTextColorBlack);
3747 } else {
3748 myDataSetsComboBox->setTextColor(GUIDesignTextColorRed);
3749 }
3750 // update view net
3751 myViewNet->updateViewNet();
3752}
3753
3754
3755void
3757 // enable or disable text fields
3758 if (myIntervalCheckBox->isEnabled() && (myIntervalCheckBox->getCheck() == TRUE)) {
3759 myBeginTextField->enable();
3760 myEndTextField->enable();
3761 } else {
3762 myBeginTextField->disable();
3763 myEndTextField->disable();
3764 }
3765 // update view net
3766 myViewNet->updateViewNet();
3767}
3768
3769
3770void
3772 if (myBeginTextField->getText().empty()) {
3773 myBeginTextField->setText(toString(myViewNet->getNet()->getDataSetIntervalMinimumBegin()).c_str());
3774 myBeginTextField->setTextColor(GUIDesignTextColorBlack);
3775 } else if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text())) {
3776 myBeginTextField->setTextColor(GUIDesignTextColorBlack);
3777 } else {
3778 myBeginTextField->setTextColor(GUIDesignTextColorRed);
3779 }
3780 // update view net
3781 myViewNet->updateViewNet();
3782}
3783
3784
3785void
3787 if (myEndTextField->getText().empty()) {
3788 myEndTextField->setText(toString(myViewNet->getNet()->getDataSetIntervalMaximumEnd()).c_str());
3789 myEndTextField->setTextColor(GUIDesignTextColorBlack);
3790 } else if (GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {
3791 myEndTextField->setTextColor(GUIDesignTextColorBlack);
3792 } else {
3793 myEndTextField->setTextColor(GUIDesignTextColorRed);
3794 }
3795 // update view net
3796 myViewNet->updateViewNet();
3797}
3798
3799
3800void
3802 // check if exist
3803 if (myParameters.count(myParametersComboBox->getText().text()) > 0) {
3804 myParametersComboBox->setTextColor(GUIDesignTextColorBlack);
3805 } else {
3806 myParametersComboBox->setTextColor(GUIDesignTextColorRed);
3807 }
3808 // update view net
3809 myViewNet->updateViewNet();
3810}
3811
3812
3813
3814void
3816 // enable elements
3817 myGenericDataTypesComboBox->enable();
3818 myDataSetsComboBox->enable();
3819 myIntervalCheckBox->enable();
3820 if (myIntervalCheckBox->getCheck() == TRUE) {
3821 myBeginTextField->enable();
3822 myEndTextField->enable();
3823 } else {
3824 myBeginTextField->disable();
3825 myEndTextField->disable();
3826 }
3827 myParametersComboBox->enable();
3828}
3829
3830
3831void
3833 // disable all elements
3834 myGenericDataTypesComboBox->disable();
3835 myDataSetsComboBox->disable();
3836 myIntervalCheckBox->disable();
3837 myBeginTextField->disable();
3838 myEndTextField->disable();
3839 myParametersComboBox->disable();
3840}
3841
3842// ---------------------------------------------------------------------------
3843// GNEViewNetHelper::CommonCheckableButtons - methods
3844// ---------------------------------------------------------------------------
3845
3849
3850
3851void
3853 // get grip modes
3854 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3855 // get tooltip menu
3856 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3857 // inspect button
3858 inspectButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3859 std::string("\t") + TL("Inspect mode") + std::string("\t") + TL("Mode to inspect elements and change their attributes. (I)"),
3861 inspectButton->create();
3862 // delete button
3863 deleteButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3864 std::string("\t") + TL("Delete mode") + std::string("\t") + TL("Mode for deleting elements. (D)"),
3866 deleteButton->create();
3867 // select button
3868 selectButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3869 std::string("\t") + TL("Select mode") + std::string("\t") + TL("Mode for selecting elements. (S)"),
3871 selectButton->create();
3872 // always recalc menu bar after creating new elements
3873 gripModes->recalc();
3874}
3875
3876
3877void
3879 inspectButton->show();
3880 deleteButton->show();
3881 selectButton->show();
3882}
3883
3884
3885void
3887 inspectButton->hide();
3888 deleteButton->hide();
3889 selectButton->hide();
3890}
3891
3892
3893void
3895 inspectButton->setChecked(false);
3896 deleteButton->setChecked(false);
3897 selectButton->setChecked(false);
3898}
3899
3900
3901void
3903 inspectButton->update();
3904 deleteButton->update();
3905 selectButton->update();
3906}
3907
3908// ---------------------------------------------------------------------------
3909// GNEViewNetHelper::NetworkCheckableButtons - methods
3910// ---------------------------------------------------------------------------
3911
3915
3916
3917void
3919 // get grip modes
3920 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3921 // get tooltip menu
3922 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3923 // move button
3924 moveNetworkElementsButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3925 std::string("\t") + TL("Move mode") + std::string("\t") + TL("Mode for moving elements. (M)"),
3927 moveNetworkElementsButton->create();
3928 // create edge
3929 createEdgeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3930 std::string("\t") + TL("Edge mode") + std::string("\t") + TL("Mode for creating junctions and edges. (E)"),
3932 createEdgeButton->create();
3933 // traffic light mode
3934 trafficLightButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3935 std::string("\t") + TL("Traffic light mode") + std::string("\t") + TL("Mode for editing traffic lights over junctions. (T)"),
3937 trafficLightButton->create();
3938 // connection mode
3939 connectionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3940 std::string("\t") + TL("Connection mode") + std::string("\t") + TL("Mode for editing connections between lanes. (C)"),
3942 connectionButton->create();
3943 // prohibition mode
3944 prohibitionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3945 std::string("\t") + TL("Prohibition mode") + std::string("\t") + TL("Mode for editing connection prohibitions. (H)"),
3947 prohibitionButton->create();
3948 // crossing mode
3949 crossingButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3950 std::string("\t") + TL("Crossing mode") + std::string("\t") + TL("Mode for creating crossings between edges. (R)"),
3952 crossingButton->create();
3953 // additional mode
3954 additionalButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3955 std::string("\t") + TL("Additional mode") + std::string("\t") + TL("Mode for creating additional elements. (A)"),
3957 additionalButton->create();
3958 // wire mode
3959 wireButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3960 std::string("\t") + TL("Wire mode") + std::string("\t") + TL("Mode for editing overhead wires. (W)"),
3962 wireButton->create();
3963 // TAZ Mode
3964 TAZButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3965 std::string("\t") + TL("TAZ mode") + std::string("\t") + TL("Mode for creating Traffic Assignment Zones. (Z)"),
3967 TAZButton->create();
3968 // shape mode
3969 shapeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3970 std::string("\t") + TL("Polygon mode") + std::string("\t") + TL("Mode for creating polygons and POIs. (P)"),
3972 shapeButton->create();
3973 // decal mode
3974 decalButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3975 std::string("\t") + TL("Decal mode") + std::string("\t") + TL("Mode for editing decals. (U)"),
3977 decalButton->create();
3978 // always recalc after creating new elements
3979 gripModes->recalc();
3980}
3981
3982
3983void
3985 // continue depending of view
3986 if (myViewNet->getEditModes().isJuPedSimView()) {
3987 moveNetworkElementsButton->show();
3988 createEdgeButton->show();
3989 connectionButton->hide();
3990 trafficLightButton->hide();
3991 additionalButton->show();
3992 crossingButton->show();
3993 TAZButton->show();
3994 shapeButton->show();
3995 prohibitionButton->hide();
3996 wireButton->hide();
3997 decalButton->hide();
3998 } else {
3999 moveNetworkElementsButton->show();
4000 createEdgeButton->show();
4001 connectionButton->show();
4002 trafficLightButton->show();
4003 additionalButton->show();
4004 crossingButton->show();
4005 TAZButton->show();
4006 shapeButton->show();
4007 prohibitionButton->show();
4008 wireButton->show();
4009 decalButton->show();
4010 }
4011}
4012
4013
4014void
4016 moveNetworkElementsButton->hide();
4017 createEdgeButton->hide();
4018 connectionButton->hide();
4019 trafficLightButton->hide();
4020 additionalButton->hide();
4021 crossingButton->hide();
4022 TAZButton->hide();
4023 shapeButton->hide();
4024 prohibitionButton->hide();
4025 wireButton->hide();
4026 decalButton->hide();
4027}
4028
4029
4030void
4032 moveNetworkElementsButton->setChecked(false);
4033 createEdgeButton->setChecked(false);
4034 connectionButton->setChecked(false);
4035 trafficLightButton->setChecked(false);
4036 additionalButton->setChecked(false);
4037 crossingButton->setChecked(false);
4038 TAZButton->setChecked(false);
4039 shapeButton->setChecked(false);
4040 prohibitionButton->setChecked(false);
4041 wireButton->setChecked(false);
4042 decalButton->setChecked(false);
4043}
4044
4045
4046void
4048 moveNetworkElementsButton->update();
4049 createEdgeButton->update();
4050 connectionButton->update();
4051 trafficLightButton->update();
4052 additionalButton->update();
4053 crossingButton->update();
4054 TAZButton->update();
4055 shapeButton->update();
4056 prohibitionButton->update();
4057 wireButton->update();
4058 decalButton->update();
4059}
4060
4061// ---------------------------------------------------------------------------
4062// GNEViewNetHelper::DemandCheckableButtons - methods
4063// ---------------------------------------------------------------------------
4064
4068
4069
4070void
4072 // get grip modes
4073 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
4074 // get tooltip menu
4075 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
4076 // move button
4077 moveDemandElementsButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4078 std::string("\t") + TL("Move mode") + std::string("\t") + TL("Mode for moving elements. (M)"),
4080 moveDemandElementsButton->create();
4081 // route mode
4082 routeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4083 std::string("\t") + TL("Route mode") + std::string("\t") + TL("Mode for creating routes. (R)"),
4085 routeButton->create();
4086 // rout distribution mode
4087 routeDistributionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4088 std::string("\t") + TL("Route distribution mode") + std::string("\t") + TL("Mode for creating and editing rout distributions. (W)"),
4090 routeDistributionButton->create();
4091 // vehicle mode
4092 vehicleButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4093 std::string("\t") + TL("Vehicle mode") + std::string("\t") + TL("Mode for creating vehicles. (V)"),
4095 vehicleButton->create();
4096 // type mode
4097 typeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4098 std::string("\t") + TL("Type mode") + std::string("\t") + TL("Mode for creating types (of vehicles, persons and containers). (T)"),
4100 typeButton->create();
4101 // type distribution mode
4102 typeDistributionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4103 std::string("\t") + TL("Type distribution mode") + std::string("\t") + TL("Mode for creating and editing type distribution. (U)"),
4105 typeDistributionButton->create();
4106 // stop mode
4107 stopButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4108 std::string("\t") + TL("Stop mode") + std::string("\t") + TL("Mode for creating stops. (A)"),
4110 stopButton->create();
4111 // person mode
4112 personButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4113 std::string("\t") + TL("Person mode") + std::string("\t") + TL("Mode for creating persons. (P)"),
4115 personButton->create();
4116 // person plan mode
4117 personPlanButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4118 std::string("\t") + TL("Person plan mode") + std::string("\t") + TL("Mode for creating person plans. (L)"),
4120 personPlanButton->create();
4121 // container mode
4122 containerButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4123 std::string("\t") + TL("Container mode") + std::string("\t") + TL("Mode for creating containers. (C)"),
4125 containerButton->create();
4126 // container plan mode
4127 containerPlanButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4128 std::string("\t") + TL("Container plan mode") + std::string("\t") + TL("Mode for creating container plans. (H)"),
4130 containerPlanButton->create();
4131 // always recalc after creating new elements
4132 gripModes->recalc();
4133}
4134
4135
4136void
4138 if (myViewNet->getEditModes().isJuPedSimView()) {
4139 moveDemandElementsButton->hide();
4140 routeButton->show();
4141 routeDistributionButton->show();
4142 vehicleButton->hide();
4143 typeButton->show();
4144 typeDistributionButton->show();
4145 stopButton->hide();
4146 personButton->show();
4147 personPlanButton->show();
4148 containerButton->hide();
4149 containerPlanButton->hide();
4150 } else {
4151 moveDemandElementsButton->show();
4152 routeButton->show();
4153 routeDistributionButton->show();
4154 vehicleButton->show();
4155 typeButton->show();
4156 typeDistributionButton->show();
4157 stopButton->show();
4158 personButton->show();
4159 personPlanButton->show();
4160 containerButton->show();
4161 containerPlanButton->show();
4162 }
4163}
4164
4165
4166void
4168 moveDemandElementsButton->hide();
4169 routeButton->hide();
4170 routeDistributionButton->hide();
4171 vehicleButton->hide();
4172 typeButton->hide();
4173 typeDistributionButton->hide();
4174 stopButton->hide();
4175 personButton->hide();
4176 personPlanButton->hide();
4177 containerButton->hide();
4178 containerPlanButton->hide();
4179}
4180
4181
4182void
4184 moveDemandElementsButton->setChecked(false);
4185 routeButton->setChecked(false);
4186 routeDistributionButton->setChecked(false);
4187 vehicleButton->setChecked(false);
4188 typeButton->setChecked(false);
4189 typeDistributionButton->setChecked(false);
4190 stopButton->setChecked(false);
4191 personButton->setChecked(false);
4192 personPlanButton->setChecked(false);
4193 containerButton->setChecked(false);
4194 containerPlanButton->setChecked(false);
4195}
4196
4197
4198void
4200 moveDemandElementsButton->update();
4201 routeButton->update();
4202 routeDistributionButton->update();
4203 vehicleButton->update();
4204 typeButton->update();
4205 typeDistributionButton->update();
4206 stopButton->update();
4207 personButton->update();
4208 personPlanButton->update();
4209 containerButton->update();
4210 containerPlanButton->update();
4211}
4212
4213// ---------------------------------------------------------------------------
4214// GNEViewNetHelper::DataCheckableButtons - methods
4215// ---------------------------------------------------------------------------
4216
4220
4221
4222void
4224 // get grip modes
4225 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
4226 // get tooltip menu
4227 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
4228 // edgeData mode
4229 edgeDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4230 std::string("\t") + TL("Edge data mode") + std::string("\t") + TL("Mode for creating edge datas. (E)"),
4232 edgeDataButton->create();
4233 // edgeRelData mode
4234 edgeRelDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4235 std::string("\t") + TL("Edge relation data mode") + std::string("\t") + TL("Mode for creating edge relation datas. (R)"),
4237 edgeRelDataButton->create();
4238 // TAZRelData mode
4239 TAZRelDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4240 std::string("\t") + TL("TAZ relation data mode") + std::string("\t") + TL("Mode for creating TAZ relation datas. (Z)"),
4242 TAZRelDataButton->create();
4243 // meanData button
4244 meanDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4245 std::string("\t") + TL("MeanData mode") + std::string("\t") + TL("Mode for MeanData elements. (M)"),
4247 meanDataButton->create();
4248 // always recalc after creating new elements
4249 gripModes->recalc();
4250}
4251
4252
4253void
4255 edgeDataButton->show();
4256 edgeRelDataButton->show();
4257 TAZRelDataButton->show();
4258 meanDataButton->show();
4259}
4260
4261
4262void
4264 edgeDataButton->hide();
4265 edgeRelDataButton->hide();
4266 TAZRelDataButton->hide();
4267 meanDataButton->hide();
4268}
4269
4270
4271void
4273 edgeDataButton->setChecked(false);
4274 edgeRelDataButton->setChecked(false);
4275 TAZRelDataButton->setChecked(false);
4276 meanDataButton->setChecked(false);
4277}
4278
4279
4280void
4282 edgeDataButton->update();
4283 edgeRelDataButton->update();
4284 TAZRelDataButton->update();
4285 meanDataButton->update();
4286}
4287
4288// ---------------------------------------------------------------------------
4289// GNEViewNetHelper::EditNetworkElementShapes - methods
4290// ---------------------------------------------------------------------------
4291
4293 myViewNet(viewNet),
4294 myPreviousNetworkEditMode(NetworkEditMode::NETWORK_NONE) {
4295}
4296
4297
4298void
4300 if (element && (myEditedNetworkElement == nullptr)) {
4301 // save current edit mode before starting
4302 myPreviousNetworkEditMode = myViewNet->myEditModes.networkEditMode;
4303 // set move mode
4304 myViewNet->myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_MOVE);
4305 //set editedNetworkElement
4306 myEditedNetworkElement = element;
4307 // enable shape edited flag
4308 myEditedNetworkElement->setShapeEdited(true);
4309 // update view net to show the new editedShapePoly
4310 myViewNet->updateViewNet();
4311 }
4312}
4313
4314
4315void
4317 // stop edit shape junction deleting editedShapePoly
4318 if (myEditedNetworkElement != nullptr) {
4319 // disable shape edited flag
4320 myEditedNetworkElement->setShapeEdited(false);
4321 // reset editedNetworkElement
4322 myEditedNetworkElement = nullptr;
4323 // restore previous edit mode
4324 if (myViewNet->myEditModes.networkEditMode != myPreviousNetworkEditMode) {
4325 myViewNet->myEditModes.setNetworkEditMode(myPreviousNetworkEditMode);
4326 }
4327 }
4328}
4329
4330
4331void
4333 // save edited junction's shape
4334 if (myEditedNetworkElement != nullptr) {
4335 // stop edit custom shape
4336 stopEditCustomShape();
4337 }
4338}
4339
4340
4343 return myEditedNetworkElement;
4344}
4345
4346// ---------------------------------------------------------------------------
4347// GNEViewNetHelper::BlockIcon - methods
4348// ---------------------------------------------------------------------------
4349
4350void
4352 const GNEAttributeCarrier* AC, GUIGlObjectType type, const Position position, const double exaggeration,
4353 const double size, const double offsetx, const double offsety) {
4354 // first check if icon can be drawn
4355 if (checkDrawing(d, AC, type, exaggeration)) {
4356 // Start pushing matrix
4358 // Traslate to position
4359 glTranslated(position.x(), position.y(), GLO_LOCKICON);
4360 // Traslate depending of the offset
4361 glTranslated(offsetx, offsety, 0);
4362 // rotate to avoid draw invert
4363 glRotated(180, 0, 0, 1);
4364 // Set draw color
4365 glColor3d(1, 1, 1);
4366 // Draw lock icon
4368 // Pop matrix
4370 }
4371}
4372
4373
4375
4376
4377bool
4379 GUIGlObjectType type, const double exaggeration) {
4380 // check detail
4382 return false;
4383 }
4384 // get view net
4385 const auto viewNet = AC->getNet()->getViewNet();
4386 // check exaggeration
4387 if (exaggeration == 0) {
4388 return false;
4389 }
4390 // check supermodes
4391 if (viewNet->getEditModes().isCurrentSupermodeNetwork() &&
4393 return false;
4394 }
4395 if (viewNet->getEditModes().isCurrentSupermodeDemand() && (!AC->getTagProperty()->isDemandElement())) {
4396 return false;
4397 }
4398 if (viewNet->getEditModes().isCurrentSupermodeData() && (!AC->getTagProperty()->isDataElement())) {
4399 return false;
4400 }
4401 // check if is locked
4402 if (!viewNet->getLockManager().isObjectLocked(type, AC->isAttributeCarrierSelected())) {
4403 return false;
4404 }
4405 // all ok, then draw
4406 return true;
4407}
4408
4409// ---------------------------------------------------------------------------
4410// GNEViewNetHelper - methods
4411// ---------------------------------------------------------------------------
4412
4413const std::vector<RGBColor>&
4415 // if is empty, fill it
4416 if (myRainbowScaledColors.empty()) {
4417 // fill scale colors (10)
4418 myRainbowScaledColors.push_back(RGBColor(232, 35, 0, 255));
4419 myRainbowScaledColors.push_back(RGBColor(255, 165, 0, 255));
4420 myRainbowScaledColors.push_back(RGBColor(255, 255, 0, 255));
4421 myRainbowScaledColors.push_back(RGBColor(28, 215, 0, 255));
4422 myRainbowScaledColors.push_back(RGBColor(0, 181, 100, 255));
4423 myRainbowScaledColors.push_back(RGBColor(0, 255, 191, 255));
4424 myRainbowScaledColors.push_back(RGBColor(178, 255, 255, 255));
4425 myRainbowScaledColors.push_back(RGBColor(0, 112, 184, 255));
4426 myRainbowScaledColors.push_back(RGBColor(56, 41, 131, 255));
4427 myRainbowScaledColors.push_back(RGBColor(127, 0, 255, 255));
4428 }
4429 return myRainbowScaledColors;
4430}
4431
4432
4433const RGBColor&
4434GNEViewNetHelper::getRainbowScaledColor(const double min, const double max, const double value) {
4435 // check extremes
4436 if (value <= min) {
4437 return getRainbowScaledColors().front();
4438 } else if (value >= max) {
4439 return getRainbowScaledColors().back();
4440 } else {
4441 // calculate value procent between [min, max]
4442 const double procent = ((value - min) * 100) / (max - min);
4443 // check if is valid
4444 if (procent <= 0) {
4445 return getRainbowScaledColors().front();
4446 } else if (procent >= 100) {
4447 return getRainbowScaledColors().back();
4448 } else {
4449 // return scaled color
4450 return getRainbowScaledColors().at((int)(procent / 10.0));
4451 }
4452 }
4453}
4454
4455
4456std::vector<GUIGlObject*>
4457GNEViewNetHelper::filterElementsByLayer(const std::vector<GUIGlObject*>& GLObjects) {
4458 std::vector<GUIGlObject*> filteredGLObjects;
4459 if (GLObjects.size() > 0) {
4460 const auto firstLayer = GLObjects.front()->getType();
4461 for (const auto& GLObject : GLObjects) {
4462 if ((GLO_RIDE <= firstLayer) && (firstLayer <= GLO_TRANSHIP) &&
4463 (GLO_RIDE <= GLObject->getType()) && (GLObject->getType() <= GLO_TRANSHIP)) {
4464 filteredGLObjects.push_back(GLObject);
4465 } else if ((GLO_STOP <= firstLayer) && (firstLayer <= GLO_STOP_PLAN) &&
4466 (GLO_STOP <= GLObject->getType()) && (GLObject->getType() <= GLO_STOP_PLAN)) {
4467 filteredGLObjects.push_back(GLObject);
4468 } else if ((GLO_VEHICLE <= firstLayer) && (firstLayer <= GLO_ROUTEFLOW) &&
4469 (GLO_VEHICLE <= GLObject->getType()) && (GLObject->getType() <= GLO_ROUTEFLOW)) {
4470 filteredGLObjects.push_back(GLObject);
4471 } else if ((GLO_PERSON <= firstLayer) && (firstLayer <= GLO_PERSONFLOW) &&
4472 (GLO_PERSON <= GLObject->getType()) && (GLObject->getType() <= GLO_PERSONFLOW)) {
4473 filteredGLObjects.push_back(GLObject);
4474 } else if ((GLO_CONTAINER <= firstLayer) && (firstLayer <= GLO_CONTAINERFLOW) &&
4475 (GLO_CONTAINER <= GLObject->getType()) && (GLObject->getType() <= GLO_CONTAINERFLOW)) {
4476 filteredGLObjects.push_back(GLObject);
4477 } else if (GLObject->getType() == firstLayer) {
4478 filteredGLObjects.push_back(GLObject);
4479 }
4480 }
4481 }
4482 return filteredGLObjects;
4483}
4484
4485/****************************************************************************/
DataEditMode
enum for data edit modes
@ DATA_SELECT
mode for selecting data elements
@ DATA_INSPECT
mode for inspecting data elements
@ DATA_DELETE
mode for deleting data elements
Supermode
@brie enum for supermodes
@ NETWORK
Network mode (Edges, junctions, etc..)
@ DATA
Data mode (edgeData, LaneData etc..)
@ DEMAND
Demand mode (Routes, Vehicles etc..)
NetworkEditMode
@brie enum for network edit modes
@ NETWORK_DELETE
mode for deleting network elements
@ NETWORK_MOVE
mode for moving network elements
@ NETWORK_WIRE
Mode for editing wires.
@ NETWORK_CREATE_EDGE
mode for creating new edges
@ NETWORK_TLS
mode for editing tls
@ NETWORK_SELECT
mode for selecting network elements
@ NETWORK_INSPECT
mode for inspecting network elements
@ NETWORK_PROHIBITION
Mode for editing connection prohibitions.
@ NETWORK_NONE
empty Network mode
@ NETWORK_CONNECT
mode for connecting lanes
DemandEditMode
@brie enum for demand edit modes
@ DEMAND_INSPECT
mode for inspecting demand elements
@ DEMAND_DELETE
mode for deleting demand elements
@ DEMAND_SELECT
mode for selecting demand elements
@ DEMAND_MOVE
mode for moving demand elements
@ MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES
automatically create opposite edge
Definition GUIAppEnum.h:861
@ MID_HOTKEY_CTRL_SHIFT_B_SAVEDATAELEMENTS
save Data Elements
Definition GUIAppEnum.h:204
@ MID_HOTKEY_F3_SUPERMODE_DEMAND
select demand supermode in netedit
Definition GUIAppEnum.h:236
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS
show all person plans
Definition GUIAppEnum.h:949
@ MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING
toggle TAZRel drawing
Definition GUIAppEnum.h:973
@ MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION
hotkey for mode decal AND type distribution
Definition GUIAppEnum.h:69
@ MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition GUIAppEnum.h:835
@ MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION
move elevation instead of x,y
Definition GUIAppEnum.h:857
@ MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS
hide connections
Definition GUIAppEnum.h:843
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS
show connections
Definition GUIAppEnum.h:841
@ MID_GNE_INTERVALBAR_BEGIN
begin changed in InterbalBar
Definition GUIAppEnum.h:993
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO
toggle draw TAZRel only to
Definition GUIAppEnum.h:979
@ MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:965
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS
show TAZ elements
Definition GUIAppEnum.h:847
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON
lock person
Definition GUIAppEnum.h:951
@ MID_HOTKEY_Z_MODE_TAZ_TAZREL
hotkey for mode editing TAZ and TAZRel
Definition GUIAppEnum.h:75
@ MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:939
@ MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS
hotkey for start simulation in SUMO and set editing mode additionals AND stops in netedit
Definition GUIAppEnum.h:43
@ MID_GNE_TOGGLE_TIMEFORMAT
switch time format
Definition GUIAppEnum.h:815
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID
show grid
Definition GUIAppEnum.h:937
@ MID_HOTKEY_CTRL_SHIFT_D_SAVEDEMANDELEMENTS
Save Demand Elements.
Definition GUIAppEnum.h:208
@ MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK
Stop the simulation in SUMO and save network in netedit.
Definition GUIAppEnum.h:117
@ MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE
hotkey for perform a single simulation step in SUMO and set delete mode in netedit
Definition GUIAppEnum.h:49
@ MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES
create edges in chain mode
Definition GUIAppEnum.h:859
@ MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition GUIAppEnum.h:971
@ MID_HOTKEY_C_MODE_CONNECT_CONTAINER
hotkey for mode connecting lanes AND container
Definition GUIAppEnum.h:45
@ MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN
hotkey for mode prohibition AND container plan
Definition GUIAppEnum.h:53
@ MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION
hotkey for mode editing overhead wires AND route distributions
Definition GUIAppEnum.h:73
@ MID_HOTKEY_T_MODE_TLS_TYPE
hotkey for mode editing TLS AND Vehicle Types
Definition GUIAppEnum.h:67
@ MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES
hide shapes
Definition GUIAppEnum.h:945
@ MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS
show additionals
Definition GUIAppEnum.h:967
@ MID_GNE_NETWORKVIEWOPTIONS_DRAWFILLEDWALKINGAREAS
draw filled walking areas
Definition GUIAppEnum.h:865
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES
show junctions as bubbles
Definition GUIAppEnum.h:855
@ MID_GNE_INTERVALBAR_END
end changed in InterbalBar
Definition GUIAppEnum.h:995
@ MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION
extend selection
Definition GUIAppEnum.h:849
@ MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT
hotkey for stop simulation in SUMO and set select mode in netedit
Definition GUIAppEnum.h:63
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS
show sub-additionals
Definition GUIAppEnum.h:845
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS
show all container plans
Definition GUIAppEnum.h:953
@ MID_GNE_VIEW_DEFAULT
set default view
Definition GUIAppEnum.h:797
@ MID_HOTKEY_F4_SUPERMODE_DATA
select data supermode in netedit
Definition GUIAppEnum.h:238
@ MID_GNE_VIEW_JUPEDSIM
set juPedSim view
Definition GUIAppEnum.h:799
@ MID_GNE_INTERVALBAR_PARAMETER
parameter changed in InterbalBar
Definition GUIAppEnum.h:997
@ MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA
hotkey for mode editing crossing, routes and edge rel datas
Definition GUIAppEnum.h:65
@ MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL
toggle draw TAZ fill
Definition GUIAppEnum.h:975
@ MID_HOTKEY_L_MODE_PERSONPLAN
hotkey for mode person plan
Definition GUIAppEnum.h:57
@ MID_HOTKEY_V_MODE_VEHICLE
hotkey for mode create vehicles
Definition GUIAppEnum.h:71
@ MID_HOTKEY_I_MODE_INSPECT
hotkey for mode inspecting object attributes
Definition GUIAppEnum.h:55
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWPOLYGONSYMBOLS
show polygon symbols
Definition GUIAppEnum.h:863
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition GUIAppEnum.h:837
@ MID_HOTKEY_CTRL_SHIFT_E_SAVENETEDITCONFIG
save netedit Config
Definition GUIAppEnum.h:210
@ MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED
hide non-inspected demand element
Definition GUIAppEnum.h:943
@ MID_GNE_INTERVALBAR_GENERICDATATYPE
generic data selected
Definition GUIAppEnum.h:987
@ MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY
don't ask before merging junctions
Definition GUIAppEnum.h:853
@ MID_HOTKEY_CTRL_SHIFT_M_SAVEMEANDATAELEMENTS
save Mean Datas
Definition GUIAppEnum.h:216
@ MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES
change all phases
Definition GUIAppEnum.h:851
@ MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES
show shapes
Definition GUIAppEnum.h:969
@ MID_HOTKEY_E_MODE_EDGE_EDGEDATA
hotkey for mode adding edges AND edgeDatas
Definition GUIAppEnum.h:51
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM
toggle draw TAZRel only from
Definition GUIAppEnum.h:977
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:833
@ MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition GUIAppEnum.h:941
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES
show overlapped routes
Definition GUIAppEnum.h:957
@ MID_HOTKEY_CTRL_SHIFT_S_SAVESUMOCONFIG
save SUMOConfig (SUMO AND netedit)
Definition GUIAppEnum.h:222
@ MID_GNE_INTERVALBAR_DATASET
data set selected
Definition GUIAppEnum.h:989
@ MID_HOTKEY_M_MODE_MOVE_MEANDATA
hotkey for mode moving element AND mean data
Definition GUIAppEnum.h:59
@ MID_HOTKEY_F2_SUPERMODE_NETWORK
select network supermode in netedit
Definition GUIAppEnum.h:234
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER
lock container
Definition GUIAppEnum.h:955
@ MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES
select edges
Definition GUIAppEnum.h:839
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS
show all trips
Definition GUIAppEnum.h:947
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID
show grid
Definition GUIAppEnum.h:831
@ MID_GNE_INTERVALBAR_LIMITED
enable/disable show data elements by interval
Definition GUIAppEnum.h:991
@ MID_HOTKEY_P_MODE_POLYGON_PERSON
hotkey for mode creating polygons
Definition GUIAppEnum.h:61
@ MID_HOTKEY_CTRL_SHIFT_A_SAVEADDITIONALELEMENTS
Save Additional Elements.
Definition GUIAppEnum.h:202
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButtonPopup
checkable button placed in popup (for example, locate buttons)
Definition GUIDesigns.h:130
#define GUIDesignButtonToolbar
little button with icon placed in navigation toolbar
Definition GUIDesigns.h:144
#define GUIDesignButtonLeft
button extended over over Frame with thick and raise frame
Definition GUIDesigns.h:103
#define GUIDesignComboBoxFixed(customWidth)
comboBox with thick frame, fixed width
Definition GUIDesigns.h:307
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition GUIDesigns.h:92
#define GUIDesignTLSTableCheckableButtonIcon
checkable button only with icon used in TLSTable
Definition GUIDesigns.h:127
#define GUIDesignComboBoxVisibleItemsFixed
combo box size fixed
Definition GUIDesigns.h:67
#define GUIDesignTextColorBlack
black color (for correct text)
Definition GUIDesigns.h:38
#define GUIDesignTextFieldFixedRestricted(width, type)
text field with fixed width
Definition GUIDesigns.h:83
#define GUIDesignMFXCheckableButtonSquare
Definition GUIDesigns.h:158
#define GUIDesignButtonToolbarLocator
little checkable button with icon placed in navigation toolbar used specify for Locator
Definition GUIDesigns.h:150
#define GUIDesignMFXCheckableButtonSupermode
checkable button with icon placed in navigation toolbar for supermodes
Definition GUIDesigns.h:161
#define GUIDesignCheckButtonAttribute
checkButton without thick extended over the frame used for attributes
Definition GUIDesigns.h:203
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition GUIDesigns.h:254
GUIGlObjectType
@ GLO_EDGERELDATA
edge relation data
@ GLO_TAZRELDATA
TAZ relation data.
@ GLO_WALKINGAREA
a walkingArea
@ GLO_JPS_WALKABLEAREA
walkable area
@ GLO_TESTELEMENT
test element (used in netedit)
@ GLO_TRANSHIP
a container tranship
@ GLO_STOPPING_PLACE_LAST
reserved GLO type for packing all StoppingPlace elements
@ GLO_STOP_PLAN
a stop plan stop
@ GLO_ACCESS
a Acces
@ GLO_ROUTEFLOW
a routeFlow
@ GLO_WALK
a walk
@ GLO_ROUTE
a route
@ GLO_WIRE
reserved GLO type for packing all wire elements
@ GLO_JUNCTION
a junction
@ GLO_LANE
a lane
@ GLO_RIDE
a ride
@ GLO_TAZ
Traffic Assignment Zones (TAZs)
@ GLO_CONTAINER
a container
@ GLO_JPS_OBSTACLE
obstacles
@ GLO_EDGEDATA
edge data
@ GLO_CONNECTION
a connection
@ GLO_ADDITIONALELEMENT
reserved GLO type for packing all additionals elements
@ GLO_PERSONTRIP
a person trip
@ GLO_EDGE
an edge
@ GLO_STOPPING_PLACE
reserved GLO type for packing all StoppingPlace elements
@ GLO_VEHICLE
a vehicle
@ GLO_PERSON
a person
@ GLO_TRANSPORT
a container transport
@ GLO_POI
poi (over view, geo and lane)
@ GLO_RECTANGLESELECTION
rectangle selection shape (used in netedit)
@ GLO_STOP
a stop
@ GLO_CONTAINERFLOW
a person flow
@ GLO_POLYGON
polygon
@ GLO_TLLOGIC
a tl-logic
@ GLO_CROSSING
a tl-logic
@ GLO_PERSONFLOW
a person flow
@ GLO_TRACTIONSUBSTATION
a segment of an overhead line
@ GLO_ROUTE_DISTRIBUTION
route distribution
@ GLO_LOCKICON
Lock icon (used in netedit)
GUIViewObjectsHandler gViewObjectsHandler
@ DATAMODE_CHECKBOX_SHOWADDITIONALS
@ SAVE_NETEDITCONFIG
@ SAVE_DATAELEMENTS
@ NETWORKMODE_CHECKBOX_BUBBLES
@ SAVE_NETWORKELEMENTS
@ DATAMODE_CHECKBOX_TAZRELONLYFROM
@ MODEPERSONPLAN
@ NETWORKMODE_CHECKBOX_SHOWPOLYGONSYMBOLS
@ MODECROSSING
@ MODEMEANDATA
@ MODEADDITIONAL
@ MODEEDGERELDATA
@ SUPERMODEDEMAND
@ MODEPROHIBITION
@ SAVE_ADDITIONALELEMENTS
@ DEMANDMODE_CHECKBOX_HIDENONINSPECTEDDEMANDELEMENTS
@ NETWORKMODE_CHECKBOX_HIDECONNECTIONS
@ DEMANDMODE_CHECKBOX_SHOWTRIPS
@ COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE
@ DATAMODE_CHECKBOX_SHOWSHAPES
@ NETWORKMODE_CHECKBOX_SELECTEDGES
@ COMMONMODE_CHECKBOX_SHOWDEMANDELEMENTS
@ DEMANDMODE_CHECKBOX_LOCKPERSON
@ NETWORKMODE_CHECKBOX_MERGEAUTOMATICALLY
@ NETWORKMODE_CHECKBOX_APPLYTOALLPHASES
@ MODECREATEEDGE
@ DATAMODE_CHECKBOX_TAZRELONLYTO
@ NETWORKMODE_CHECKBOX_AUTOSELECTJUNCTIONS
@ SAVE_MEANDATAELEMENTS
@ DATAMODE_CHECKBOX_TAZRELDRAWING
@ NETWORKMODE_CHECKBOX_SHOWCONNECTIONS
@ DEMANDMODE_CHECKBOX_SHOWPERSONPLANS
@ MODECONTAINER
@ DEMANDMODE_CHECKBOX_HIDESHAPES
@ DATAMODE_CHECKBOX_TAZDRAWFILL
@ MODEEDGEDATA
@ NETWORKMODE_CHECKBOX_ELEVATION
@ SUPERMODENETWORK
@ COMMONMODE_CHECKBOX_SPREADVEHICLE
@ SAVE_DEMANDELEMENTS
@ DEMANDMODE_CHECKBOX_LOCKCONTAINER
@ NETWORKMODE_CHECKBOX_SHOWSUBADDITIONALS
@ NETWORKMODE_CHECKBOX_SHOWTAZELEMENTS
@ SUPERMODEDATA
@ MODECONNECTION
@ MODECONTAINERPLAN
@ SAVE_MULTIPLE
@ NETWORKMODE_CHECKBOX_DRAWFILLEDWALKINGAREAS
@ NETWORKMODE_CHECKBOX_CHAIN
@ DEMANDMODE_CHECKBOX_SHOWOVERLAPPEDROUTES
@ SAVE_SUMOCONFIG
@ VIEWJUPEDSIM
@ MODETYPEDISTRIBUTION
@ COMMONMODE_CHECKBOX_TOGGLEGRID
@ MODEROUTEDISTRIBUTION
@ MODETAZRELDATA
@ DEMANDMODE_CHECKBOX_SHOWCONTAINERPLANS
@ NETWORKMODE_CHECKBOX_TWOWAY
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define TL(string)
Definition MsgHandler.h:304
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_NOTHING
invalid tag, must be the last one
@ GNE_TAG_EDGEREL_SINGLE
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_WALKINGAREA
walking area for pedestrians
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_CROSSING
crossing between edges for pedestrians
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_TAZREL
a relation between two TAZs
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ GNE_ATTR_SELECTED
element is selected
bool gHumanReadableTime
Definition StdDefs.cpp:31
const double INVALID_DOUBLE
invalid double
Definition StdDefs.h:68
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition Boundary.cpp:75
PositionVector getShape(const bool closeShape) const
get position vector (shape) based on this boundary
Definition Boundary.cpp:444
void addParentID(const SumoXMLTag tag, const std::string &ID)
add parent (string) attribute into current SumoBaseObject node
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:649
static void popMatrix()
pop matrix
Definition GLHelper.cpp:131
static void pushMatrix()
push matrix
Definition GLHelper.cpp:118
bool isAttributeCarrierSelected() const
check if attribute carrier is selected
bool isMarkedForDrawingFront() const
check if this AC is marked for drawing front
virtual GNEMoveElement * getMoveElement() const =0
get GNEMoveElement associated with this AttributeCarrier
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
void unmarkForDrawingFront()
unmark for drawing front
GNENet * getNet() const
get pointer to net
An Element which don't belong to GNENet but has influence in the simulation.
Definition GNEEdgeData.h:32
bool isConvexAngle() const
check if edge makes a convex angle [0 - 180) degrees
Definition GNEEdge.cpp:1752
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:773
An Element which don't belong to GNENet but has influence in the simulation.
const GNEHierarchicalContainerParents< GNEDemandElement * > & getParentDemandElements() const
get parent demand elements
const GNEHierarchicalContainerChildren< GNEDemandElement * > & getChildDemandElements() const
return child demand elements
static void commitMove(const GNEViewNet *viewNet, GNEMoveOperation *moveOperation, const GNEMoveOffset &offset, GNEUndoList *undoList)
commit move element for the given offset
static void moveElement(const GNEViewNet *viewNet, GNEMoveOperation *moveOperation, const GNEMoveOffset &offset)
move element the for given offset (note: offset can be X-Y-0, 0-0-Z or X-Y-Z)
GNEJunction * retrieveJunction(const std::string &id, bool hardFail=true) const
get junction by id
GNEDataSet * retrieveDataSet(const std::string &id, bool hardFail=true) const
Returns the named data set.
GNEDemandElement * retrieveDemandElement(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named demand element.
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:174
GNEViewNet * getViewNet() const
get view net (used for simplify code)
Definition GNENet.cpp:144
void setShapeEdited(const bool value)
set shape edited
An Element which don't belong to GNENet but has influence in the simulation.
bool isNetworkElement() const
network elements
bool isDataElement() const
return true if tag correspond to a data element
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 isInspectingElements() const
check if we're inspecting at least one element
void inspectAC(GNEAttributeCarrier *AC)
void inspectACs(const std::vector< GNEAttributeCarrier * > &ACs)
inspect multiple ACs
bool isACInspected(GNEAttributeCarrier *AC) const
const std::unordered_set< GNEAttributeCarrier * > & getACs() const
get hash table with all inspected ACs
GNEAttributeCarrier * getFirstAC() const
void uninspectAC(GNEAttributeCarrier *AC)
uninspect AC
bool isInspectingSingleElement() const
check if we're inspecting exactly one element
bool isInspectingMultipleElements() const
check if we're inspecting more than one elements
void clearInspectedElements()
clear inspected AC
std::string getParameter() const
get parameter
void hideIntervalBar()
hide all options menu checks
void setGenericDataType()
set generic data type
double getBegin() const
get begin
void showIntervalBar()
show interval option bar
void disableIntervalBar()
disable interval bar
void updateIntervalBar()
update interval bar
void buildIntervalBarElements()
build interval bar elements
GNEDataSet * getDataSet() const
get dataSet
IntervalBar(GNEViewNet *viewNet)
default constructor
void enableIntervalBar()
enable interval bar
void setInterval()
update limit by interval
SumoXMLTag getGenericDataType() const
get generic data type
void updateLockMenuBar()
update lock inspect menuBar
bool isObjectLocked(GUIGlObjectType objectType, const bool selected) const
check if given GLObject is locked for inspect, select, delete and move
LockManager(GNEViewNet *viewNet)
constructor
std::map< GUIGlObjectType, OperationLocked > myLockedElements
map with locked elements
GNEViewNet * myViewNet
pointer to viewNet
void unmarkAC(GNEAttributeCarrier *AC)
unmark AC for drawing front
void markAC(GNEAttributeCarrier *AC)
mark AC as drawing front
const std::unordered_set< GNEAttributeCarrier * > & getACs() const
get hash table with all fronted ACs
std::vector< GNEConnection * > connections
vector with the connections
std::vector< GNEGenericData * > genericDatas
vector with the generic datas
std::vector< GNEPOI * > POIs
vector with the POIs
std::vector< GNEInternalLane * > internalLanes
vector with the internal lanes
std::vector< GUIGlObject * > GUIGlObjects
vector with the GUIGlObjects
std::vector< GNELane * > lanes
vector with the lanes
std::vector< GNETAZRelData * > TAZRelDatas
vector with the TAZ relation datas
void reserve(int size)
reseve memory for all elements
std::vector< GNECrossing * > crossings
vector with the crossings
std::vector< GNEPoly * > polys
vector with the polys
std::vector< GNETAZ * > TAZs
vector with the TAZ elements
std::vector< GNEAdditional * > additionals
vector with the additional elements
std::vector< GNEAttributeCarrier * > attributeCarriers
vector with the attribute carriers
std::vector< GNENetworkElement * > networkElements
vector with the network elements
std::vector< GNEEdgeData * > edgeDatas
vector with the edge datas
std::vector< GNEEdgeRelData * > edgeRelDatas
vector with the edge relation datas
std::vector< GNEEdge * > edges
vector with the edges
void filterElements(const std::vector< const GUIGlObject * > &objects)
filter elements
std::vector< GNEJunction * > junctions
vector with the junctions
std::vector< GNEWalkingArea * > walkingAreas
vector with the walkingAreas
std::vector< GNEDemandElement * > demandElements
vector with the demand elements
GNEEdgeRelData * getEdgeRelDataElementFront() const
get edge rel data element or a pointer to nullptr
void updateObjects()
update objects (using gViewObjectsHandler)
void filterConnections()
filter (remove) connections
void filterAllExcept(GUIGlObjectType exception)
filter all elements except the given GLO type
GNEEdgeData * getEdgeDataElementFront() const
get edge data element or a pointer to nullptr
const std::vector< const GNEJunction * > & getMergingJunctions() const
get merging junctions
void updateShapeElements(ViewObjectsContainer &container, const GUIGlObject *glObject)
update shape elements
void updateMergingJunctions()
update merging junctions
GNEConnection * getConnectionFront() const
get front connection or a pointer to nullptr
const std::vector< GNEAttributeCarrier * > & getAttributeCarriers() const
get vector with ACs
void filterEdges()
filter (remove) edges
GNEPoly * getPolyFront() const
get front Poly or a pointer to nullptr
void updateDemandElements(ViewObjectsContainer &container, const GUIGlObject *glObject)
update demand elements
void filterLockedElements(const std::vector< GUIGlObjectType > ignoreFilter={})
filter locked elements (except the ignoreFilter)
void filterCrossings()
filter (remove) crossings
GNEPOI * getPOIFront() const
get front POI or a pointer to nullptr
GNEInternalLane * getInternalLaneFront() const
get front internal lane or a pointer to nullptr
void filterNetworkElements()
filter (remove) network elements
void processGUIGlObjects(const GUIViewObjectsHandler::GLObjectsSortedContainer &objectsContainer)
process GL objects
const std::vector< GNETAZ * > & getTAZs() const
get vector with TAZs
GNEWalkingArea * getWalkingAreaFront() const
get front walkingArea or a pointer to nullptr
void filterBySuperMode()
filter by supermode
GNEEdge * getEdgeFront() const
get front edge or a pointer to nullptr
GNEAttributeCarrier * getAttributeCarrierFront() const
get front attribute carrier or a pointer to nullptr
void updateAdditionalElements(ViewObjectsContainer &container, const GUIGlObject *glObject)
update additional elements
void updateGenericDataElements(ViewObjectsContainer &container, const GUIGlObject *glObject)
update generic data elements
void filterDemandElements(const bool includeRoutes)
filter (remove) demand elements
void updateTAZElements(ViewObjectsContainer &container, const GUIGlObject *glObject)
update TAZ elements
const std::vector< GNEDemandElement * > & getDemandElements() const
get vector with Demand Elements
void filterWalkingAreas()
filter (remove) walkingAreas
GNETAZ * getTAZFront() const
get front TAZ or a pointer to nullptr
void filterAdditionals(const bool includeStoppigPlaces, const bool includeTAZs)
filter (remove) additionals
GNELane * getLaneFront() const
get front lane or a pointer to nullptr
void updateNetworkElements(ViewObjectsContainer &container, const GUIGlObject *glObject)
update network elements
GNEGenericData * getGenericDataElementFront() const
get generic data element or a pointer to nullptr
void fillSumoBaseObject(CommonXMLStructure::SumoBaseObject *baseObjet) const
fill the given SUMO base object with the current single objects
GNEAdditional * getAdditionalFront() const
get front additional element or a pointer to nullptr
GNELane * getLaneFrontNonLocked() const
get front lane or a pointer to nullptr checking if is locked
const GUIGlObject * getGUIGlObjectFront() const
get front GUIGLObject or a pointer to nullptr
GNENetworkElement * getNetworkElementFront() const
get front network element or a pointer to nullptr
const std::vector< GNEEdge * > & getEdges() const
get vector with edges
GNECrossing * getCrossingFront() const
get front crossing or a pointer to nullptr
GNEJunction * getJunctionFront() const
get front junction or a pointer to nullptr
void filterLanes()
filter (remove) lanes
void filterJunctions()
filter (remove) junctions
GNETAZRelData * getTAZRelDataElementFront() const
get TAZ rel data element or a pointer to nullptr
const std::vector< GUIGlObject * > & getGLObjects() const
get vector with GL objects
void filterShapes()
filter (remove) polys and POIs
const std::vector< GNEJunction * > & getJunctions() const
get vector with junctions
GNEDemandElement * getDemandElementFront() const
get front demand element or a pointer to nullptr
void filterDataElements()
filter (remove) datga elements
const std::vector< GNELane * > & getLanes() const
get lanes
const std::vector< GNEAdditional * > & getAdditionals() const
get vector with additionals
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
virtual bool isGLObjectLocked() const
check if element is locked (Currently used only in netedit)
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
static GUIGlID getTexture(GUITexture which)
returns a texture previously defined in the enum GUITexture
static void drawTexturedBox(int which, double size)
Draws a named texture as a box with the given size.
int getNumberOfSelectedObjects() const
get number of selected objects
std::map< double, ObjectContainerLayer > GLObjectsSortedContainer
typedef for pack elements sorted by layer
const GLObjectsSortedContainer & getSelectedObjects() const
get all elements under cursor sorted by layer
const std::vector< const GNEJunction * > & getMergingJunctions() const
FXbool getCheck() const
Get check state (TRUE, FALSE or MAYBE)
void setCheck(FXbool s=TRUE)
Set check state (TRUE, FALSE or MAYBE)
const PositionVector & getGeometry() const
Returns the geometry of the edge.
Definition NBEdge.h:789
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
void resetWritable()
Resets all options to be writeable.
static OptionsCont & getOptions()
Retrieves the options.
C++ TraCI client API implementation.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double x() const
Returns the x-position.
Definition Position.h:52
double y() const
Returns the y-position.
Definition Position.h:57
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
static const RGBColor BLUE
Definition RGBColor.h:200
static const RGBColor YELLOW
Definition RGBColor.h:201
static const RGBColor MAGENTA
Definition RGBColor.h:203
#define UNUSED_PARAMETER(x)
MFXMenuCheckIcon * menuCheckLockConnections
menu check to lock connections
MFXMenuCheckIcon * menuCheckLockPersons
menu check to lock persons
MFXMenuCheckIcon * menuCheckLockVehicles
menu check to lock vehicles
MFXMenuCheckIcon * menuCheckLockCrossings
menu check to lock crossings
MFXMenuCheckIcon * menuCheckLockTAZs
menu check to lock TAZs
MFXMenuCheckIcon * menuCheckLockEdgeTAZRels
menu check to lock edgeTAZRels
MFXMenuCheckIcon * menuCheckLockPersonTrips
menu check to lock personTrips
MFXMenuCheckIcon * menuCheckLockWires
menu check to lock Wires
MFXMenuCheckIcon * menuCheckLockPOIs
menu check to lock POIs
MFXMenuCheckIcon * menuCheckLockPolygons
menu check to lock polygons
MFXMenuCheckIcon * menuCheckLockWalkingAreas
menu check to lock walkingAreas
MFXMenuCheckIcon * menuCheckLockEdges
menu check to lock edges
MFXMenuCheckIcon * menuCheckLockRides
menu check to lock rides
MFXMenuCheckIcon * menuCheckLockContainers
menu check to lock containers
MFXMenuCheckIcon * menuCheckLockJpsWalkableAreas
menu check to lock jps walkableareas
MFXMenuCheckIcon * menuCheckLockEdgeRelDatas
menu check to lock edgeRelDatas
MFXMenuCheckIcon * menuCheckLockStops
menu check to lock stops
MFXMenuCheckIcon * menuCheckLockLanes
menu check to lock lanes
MFXMenuCheckIcon * menuCheckLockAdditionals
menu check to lock additionals
MFXMenuCheckIcon * menuCheckLockWalks
menu check to lock walks
MFXMenuCheckIcon * menuCheckLockJpsObstacles
menu check to lock jps obstacles
MFXMenuCheckIcon * menuCheckLockTranships
menu check to lock tranships
MFXMenuCheckIcon * menuCheckLockTransports
menu check to lock transports
CommonCheckableButtons(GNEViewNet *viewNet)
default constructor
void buildCommonCheckableButtons()
build checkable buttons
void updateCommonCheckableButtons()
update Common checkable buttons
void disableCommonCheckableButtons()
hide all options menu checks
void hideCommonCheckableButtons()
hide all Common Checkable Buttons
void showCommonCheckableButtons()
show all Common Checkable Buttons
void hideDataCheckableButtons()
hide all Data Checkable Buttons
void showDataCheckableButtons()
show all Data Checkable Buttons
void disableDataCheckableButtons()
hide all options menu checks
void buildDataCheckableButtons()
build checkable buttons
void updateDataCheckableButtons()
update Data checkable buttons
DataCheckableButtons(GNEViewNet *viewNet)
default constructor
DataViewOptions(GNEViewNet *viewNet)
default constructor
bool TAZRelOnlyTo() const
check if toggle TAZRel only to checkbox is enabled
void hideDataViewOptionsMenuChecks()
hide all options menu checks
bool showAdditionals() const
check if additionals has to be drawn
bool showDemandElements() const
check if show demand elements checkbox is enabled
bool TAZRelOnlyFrom() const
check if toggle TAZRel only from checkbox is enabled
bool TAZDrawFill() const
check if toggle TAZ draw fill checkbox is enabled
void buildDataViewOptionsMenuChecks()
build menu checks
void getVisibleDataMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible demand menu commands
bool showShapes() const
check if shapes has to be drawn
bool TAZRelDrawing() const
check if toggle TAZRel drawing checkbox is enabled
void hideDemandCheckableButtons()
hide all Demand Checkable Buttons
DemandCheckableButtons(GNEViewNet *viewNet)
default constructor
void buildDemandCheckableButtons()
build checkable buttons
void showDemandCheckableButtons()
show all Demand Checkable Buttons
void updateDemandCheckableButtons()
update Demand checkable buttons
void disableDemandCheckableButtons()
hide all options menu checks
void lockPerson(const GNEDemandElement *person)
lock person
bool showAllPersonPlans() const
check all person plans has to be show
void lockContainer(const GNEDemandElement *container)
lock container
void buildDemandViewOptionsMenuChecks()
build menu checks
const GNEDemandElement * getLockedPerson() const
get locked person
const GNEDemandElement * getLockedContainer() const
get locked container
bool showShapes() const
check if shapes has to be drawn
void hideDemandViewOptionsMenuChecks()
hide all options menu checks
bool showAllContainerPlans() const
check all container plans has to be show
bool drawSpreadVehicles() const
check if vehicles must be drawn spread
bool showNonInspectedDemandElements(const GNEDemandElement *demandElement) const
check if non inspected element has to be hidden
DemandViewOptions(GNEViewNet *viewNet)
default constructor
bool showOverlappedRoutes() const
show overlapped routes
void getVisibleDemandMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible demand menu commands
bool showAllTrips() const
check if trips has to be drawn
void buildSuperModeButtons()
build checkable buttons
bool isDefaultView() const
check if default view is enabled
NetworkEditMode networkEditMode
the current Network edit mode
bool isCurrentSupermodeDemand() const
@check if current supermode is Demand
void setDemandEditMode(DemandEditMode demandMode, const bool force=false)
set Demand edit mode
bool isCurrentSupermodeData() const
@check if current supermode is Data
void setView(FXSelector sel)
set view
bool isCurrentSupermodeNetwork() const
@check if current supermode is Network
bool isJuPedSimView() const
check if default view is enabled
void setSupermode(Supermode supermode, const bool force)
set supermode
void setNetworkEditMode(NetworkEditMode networkMode, const bool force=false)
set Network edit mode
EditModes(GNEViewNet *viewNet)
constructor
void setDataEditMode(DataEditMode dataMode, const bool force=false)
set Data edit mode
GNENetworkElement * getEditedNetworkElement() const
pointer to edited network element
EditNetworkElementShapes(GNEViewNet *viewNet)
default constructor
void startEditCustomShape(GNENetworkElement *element)
start edit custom shape
static bool checkDrawing(const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, GUIGlObjectType type, const double exaggeration)
check if icon can be drawn
static void drawLockIcon(const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier *AC, GUIGlObjectType type, const Position position, const double exaggeration, const double size=0.5, const double offsetx=0, const double offsety=0)
draw lock icon
bool shiftKeyPressed() const
check if SHIFT is pressed during current event
bool altKeyPressed() const
check if ALT is pressed during current event
void update(void *eventData)
update status of MouseButtonKeyPressed during current event
bool mouseRightButtonPressed() const
check if mouse right button is pressed during current event
bool controlKeyPressed() const
check if CONTROL is pressed during current event
bool mouseLeftButtonPressed() const
check if mouse left button is pressed during current event
void moveSelection(const bool mouseLeftButtonPressed)
move selection
void calculateEdgeSelection(const GNEEdge *clickedEdge)
calculate edge selection
const GNEMoveOffset calculateMoveOffset() const
calculate move offset
bool isCurrentlyMovingMultipleElements() const
check if there are moving elements
void finishMoveSelection()
finish moving selection
bool isMovingSelection() const
check if currently there is element being moved
void resetMovingSelectedEdge()
reset flag for moving edge
void calculateJunctionSelection()
calculate junction selection
MoveMultipleElementModul(GNEViewNet *viewNet)
constructor
bool isMovingSelectedEdge() const
flag for moving edge
const GNEMoveOffset calculateMoveOffset() const
calculate offset
MoveSingleElementModul(GNEViewNet *viewNet)
constructor
bool beginMoveSingleElementDemandMode()
begin move single element in Demand mode
void moveSingleElement(const bool mouseLeftButtonPressed)
move single element in Network AND Demand mode
GNEMoveElement * getMovedElement() const
get moved element
bool isCurrentlyMovingSingleElement() const
check if there are moving elements
bool beginMoveSingleElementNetworkMode()
begin move single element in Network mode
bool beginMoveNetworkElementShape()
begin move network elementshape
void finishMoveSingleElement()
finish moving single elements in Network AND Demand mode
void updateNetworkCheckableButtons()
update network checkable buttons
void showNetworkCheckableButtons()
show all Network Checkable Buttons
void buildNetworkCheckableButtons()
build checkable buttons
NetworkCheckableButtons(GNEViewNet *viewNet)
default constructor
void hideNetworkCheckableButtons()
hide all Network Checkable Buttons
void disableNetworkCheckableButtons()
hide all options menu checks
bool drawFilledWalkingAreas() const
draw filled walking areas
bool drawSpreadVehicles() const
check if vehicles must be drawn spread
bool editingElevation() const
check if we're editing elevation
void getVisibleNetworkMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible network menu commands
bool showDemandElements() const
check if show demand elements checkbox is enabled
bool showSubAdditionals() const
check if show sub-additionals
bool showPolygonSymbols() const
check if draw polygon symbols
bool selectEdges() const
check if select edges checkbox is enabled
bool showConnections(const GNEConnection *connection) const
check if select show connections checkbox is enabled
bool showTAZElements() const
check if show TAZ Elements
NetworkViewOptions(GNEViewNet *viewNet)
default constructor
void hideNetworkViewOptionsMenuChecks()
hide all options menu checks
void buildNetworkViewOptionsMenuChecks()
build menu checks
SaveElements(GNEViewNet *viewNet)
default constructor
void setSaveIndividualFiles(bool value)
enable or disable save individual files
void buildSaveElementsButtons()
build save buttons
void finishRectangleSelection()
finish rectangle selection
void drawRectangleSelection(const RGBColor &color) const
draw rectangle selection
void beginRectangleSelection()
begin rectangle selection
void moveRectangleSelection()
move rectangle selection
void processBoundarySelection(const Boundary &boundary)
Process boundary Selection.
void processRectangleSelection()
process rectangle Selection
std::vector< GNEEdge * > processEdgeRectangleSelection()
process rectangle Selection (only limited to Edges)
SelectingArea(GNEViewNet *viewNet)
default constructor
void drawTestingElements(GUIMainWindow *mainWindow)
draw testing element
TestingMode(GNEViewNet *viewNet)
default constructor
void initTestingMode()
init testing mode
void buildTimeFormatButtons()
build time format buttons
TimeFormat(GNEViewNet *viewNet)
default constructor
void switchTimeFormat()
switch time format
void updateButtonLabel()
update button label
void buildVehicleOptionsMenuChecks()
build menu checks
VehicleOptions(GNEViewNet *viewNet)
constructor
void hideVehicleOptionsMenuChecks()
hide all options menu checks
VehicleTypeOptions(GNEViewNet *viewNet)
constructor
void buildVehicleTypeOptionsMenuChecks()
build menu checks
void hideVehicleTypeOptionsMenuChecks()
hide all options menu checks
static std::vector< RGBColor > myRainbowScaledColors
scale (rainbow) colors
static const RGBColor & getRainbowScaledColor(const double min, const double max, const double value)
get rainbow scaled color
static std::vector< GUIGlObject * > filterElementsByLayer(const std::vector< GUIGlObject * > &GLObjects)
filter elements based on the layer
static const std::vector< RGBColor > & getRainbowScaledColors()
get scaled rainbow colors