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
42
44#include "GNENet.h"
45#include "GNEUndoList.h"
46#include "GNEViewNet.h"
47#include "GNEViewNetHelper.h"
48#include "GNEViewParent.h"
49
50// ===========================================================================
51// static members
52// ===========================================================================
53
54std::vector<RGBColor> GNEViewNetHelper::myRainbowScaledColors;
55
56// ---------------------------------------------------------------------------
57// GNEViewNetHelper::LockManager - methods
58// ---------------------------------------------------------------------------
59
61 myViewNet(viewNet) {
62 // fill myLockedElements objects
77 // fill myLockedElements objects
88 // fill myLockedElements objects
92}
93
94
96
97
98bool
99GNEViewNetHelper::LockManager::isObjectLocked(GUIGlObjectType objectType, const bool selected) const {
100 if (selected && (myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands().menuCheckLockSelectedElements->getCheck() == TRUE)) {
101 return true;
102 } else if ((objectType >= GLO_ADDITIONALELEMENT) && (objectType <= GLO_ACCESS)) {
103 // additionals
104 return myLockedElements.at(GLO_ADDITIONALELEMENT).lock;
105 } else if ((objectType >= GLO_WIRE) && (objectType <= GLO_TRACTIONSUBSTATION)) {
106 // wires
107 return myLockedElements.at(GLO_WIRE).lock;
108 } else if ((objectType >= GLO_ROUTE) && (objectType <= GLO_ROUTE_DISTRIBUTION)) {
109 // routes
110 return myLockedElements.at(GLO_ROUTE).lock;
111 } else if ((objectType >= GLO_VEHICLE) && (objectType <= GLO_ROUTEFLOW)) {
112 // vehicles
113 return myLockedElements.at(GLO_VEHICLE).lock;
114 } else if ((objectType >= GLO_PERSON) && (objectType <= GLO_PERSONFLOW)) {
115 // persons
116 return myLockedElements.at(GLO_PERSON).lock;
117 } else if ((objectType >= GLO_CONTAINER) && (objectType <= GLO_CONTAINERFLOW)) {
118 // containers
119 return myLockedElements.at(GLO_CONTAINER).lock;
120 } else if ((objectType >= GLO_STOP) && (objectType <= GLO_STOP_PLAN)) {
121 // stops
122 return myLockedElements.at(GLO_STOP).lock;
123 } else {
124 return myLockedElements.at(objectType).lock;
125 }
126}
127
128
129void
131 // get lock menu commands
132 GNEApplicationWindowHelper::LockMenuCommands& lockMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands();
133 // network
134 myLockedElements[GLO_JUNCTION].lock = lockMenuCommands.menuCheckLockJunctions->getCheck() == TRUE;
135 myLockedElements[GLO_EDGE].lock = lockMenuCommands.menuCheckLockEdges->getCheck() == TRUE;
136 myLockedElements[GLO_LANE].lock = lockMenuCommands.menuCheckLockLanes->getCheck() == TRUE;
137 myLockedElements[GLO_CONNECTION].lock = lockMenuCommands.menuCheckLockConnections->getCheck() == TRUE;
138 myLockedElements[GLO_CROSSING].lock = lockMenuCommands.menuCheckLockCrossings->getCheck() == TRUE;
139 myLockedElements[GLO_WALKINGAREA].lock = lockMenuCommands.menuCheckLockWalkingAreas->getCheck() == TRUE;
140 myLockedElements[GLO_ADDITIONALELEMENT].lock = lockMenuCommands.menuCheckLockAdditionals->getCheck() == TRUE;
141 myLockedElements[GLO_WIRE].lock = lockMenuCommands.menuCheckLockWires->getCheck() == TRUE;
142 myLockedElements[GLO_TAZ].lock = lockMenuCommands.menuCheckLockTAZs->getCheck() == TRUE;
143 myLockedElements[GLO_POLYGON].lock = lockMenuCommands.menuCheckLockPolygons->getCheck() == TRUE;
144 myLockedElements[GLO_POI].lock = lockMenuCommands.menuCheckLockPOIs->getCheck() == TRUE;
145 myLockedElements[GLO_JPS_WALKABLEAREA].lock = lockMenuCommands.menuCheckLockJpsWalkableAreas->getCheck() == TRUE;
146 myLockedElements[GLO_JPS_OBSTACLE].lock = lockMenuCommands.menuCheckLockJpsObstacles->getCheck() == TRUE;
147 // demand
148 myLockedElements[GLO_ROUTE].lock = lockMenuCommands.menuCheckLockRoutes->getCheck() == TRUE;
149 myLockedElements[GLO_VEHICLE].lock = lockMenuCommands.menuCheckLockVehicles->getCheck() == TRUE;
150 myLockedElements[GLO_PERSON].lock = lockMenuCommands.menuCheckLockPersons->getCheck() == TRUE;
151 myLockedElements[GLO_PERSONTRIP].lock = lockMenuCommands.menuCheckLockPersonTrips->getCheck() == TRUE;
152 myLockedElements[GLO_WALK].lock = lockMenuCommands.menuCheckLockWalks->getCheck() == TRUE;
153 myLockedElements[GLO_RIDE].lock = lockMenuCommands.menuCheckLockRides->getCheck() == TRUE;
154 myLockedElements[GLO_CONTAINER].lock = lockMenuCommands.menuCheckLockContainers->getCheck() == TRUE;
155 myLockedElements[GLO_TRANSPORT].lock = lockMenuCommands.menuCheckLockTransports->getCheck() == TRUE;
156 myLockedElements[GLO_TRANSHIP].lock = lockMenuCommands.menuCheckLockTranships->getCheck() == TRUE;
157 myLockedElements[GLO_STOP].lock = lockMenuCommands.menuCheckLockStops->getCheck() == TRUE;
158 // data
159 myLockedElements[GLO_EDGEDATA].lock = lockMenuCommands.menuCheckLockEdgeDatas->getCheck() == TRUE;
160 myLockedElements[GLO_EDGERELDATA].lock = lockMenuCommands.menuCheckLockEdgeRelDatas->getCheck() == TRUE;
161 myLockedElements[GLO_TAZRELDATA].lock = lockMenuCommands.menuCheckLockEdgeTAZRels->getCheck() == TRUE;
162}
163
164
165void
167 // get lock menu commands
168 GNEApplicationWindowHelper::LockMenuCommands& lockMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands();
169 // network
170 lockMenuCommands.menuCheckLockJunctions->setCheck(myLockedElements[GLO_JUNCTION].lock);
171 lockMenuCommands.menuCheckLockEdges->setCheck(myLockedElements[GLO_EDGE].lock);
172 lockMenuCommands.menuCheckLockLanes->setCheck(myLockedElements[GLO_LANE].lock);
173 lockMenuCommands.menuCheckLockConnections->setCheck(myLockedElements[GLO_CONNECTION].lock);
174 lockMenuCommands.menuCheckLockCrossings->setCheck(myLockedElements[GLO_CROSSING].lock);
175 lockMenuCommands.menuCheckLockWalkingAreas->setCheck(myLockedElements[GLO_WALKINGAREA].lock);
176 lockMenuCommands.menuCheckLockAdditionals->setCheck(myLockedElements[GLO_ADDITIONALELEMENT].lock);
177 lockMenuCommands.menuCheckLockWires->setCheck(myLockedElements[GLO_WIRE].lock);
178 lockMenuCommands.menuCheckLockTAZs->setCheck(myLockedElements[GLO_TAZ].lock);
179 lockMenuCommands.menuCheckLockPolygons->setCheck(myLockedElements[GLO_POLYGON].lock);
180 lockMenuCommands.menuCheckLockPOIs->setCheck(myLockedElements[GLO_POI].lock);
181 lockMenuCommands.menuCheckLockJpsWalkableAreas->setCheck(myLockedElements[GLO_JPS_WALKABLEAREA].lock);
182 lockMenuCommands.menuCheckLockJpsObstacles->setCheck(myLockedElements[GLO_JPS_OBSTACLE].lock);
183 // demand
184 lockMenuCommands.menuCheckLockRoutes->setCheck(myLockedElements[GLO_ROUTE].lock);
185 lockMenuCommands.menuCheckLockVehicles->setCheck(myLockedElements[GLO_VEHICLE].lock);
186 lockMenuCommands.menuCheckLockPersons->setCheck(myLockedElements[GLO_PERSON].lock);
187 lockMenuCommands.menuCheckLockPersonTrips->setCheck(myLockedElements[GLO_PERSONTRIP].lock);
188 lockMenuCommands.menuCheckLockWalks->setCheck(myLockedElements[GLO_WALK].lock);
189 lockMenuCommands.menuCheckLockRides->setCheck(myLockedElements[GLO_RIDE].lock);
190 lockMenuCommands.menuCheckLockContainers->setCheck(myLockedElements[GLO_CONTAINER].lock);
191 lockMenuCommands.menuCheckLockTransports->setCheck(myLockedElements[GLO_TRANSPORT].lock);
192 lockMenuCommands.menuCheckLockTranships->setCheck(myLockedElements[GLO_TRANSHIP].lock);
193 lockMenuCommands.menuCheckLockStops->setCheck(myLockedElements[GLO_STOP].lock);
194 // data
195 lockMenuCommands.menuCheckLockEdgeDatas->setCheck(myLockedElements[GLO_EDGEDATA].lock);
196 lockMenuCommands.menuCheckLockEdgeRelDatas->setCheck(myLockedElements[GLO_EDGERELDATA].lock);
197 lockMenuCommands.menuCheckLockEdgeTAZRels->setCheck(myLockedElements[GLO_TAZRELDATA].lock);
198}
199
200
204
205
209
210
212
213
218
219// ---------------------------------------------------------------------------
220// GNEViewNetHelper::InspectedElements - methods
221// ---------------------------------------------------------------------------
222
224
225
226void
228 myInspectedACs.clear();
229 if (AC) {
230 myFirstInspectedAC = AC;
231 myInspectedACs.insert(AC);
232 } else {
233 myFirstInspectedAC = nullptr;
234 }
235}
236
237
238void
239GNEViewNetHelper::InspectedElements::inspectACs(const std::vector<GNEAttributeCarrier*>& ACs) {
240 myInspectedACs.clear();
241 if (ACs.size() > 0) {
242 myFirstInspectedAC = ACs.front();
243 for (const auto& AC : ACs) {
244 myInspectedACs.insert(AC);
245 }
246 } else {
247 myFirstInspectedAC = nullptr;
248 }
249}
250
251
252void
254 auto it = myInspectedACs.find(AC);
255 if (it != myInspectedACs.end()) {
256 myInspectedACs.erase(it);
257 if (myInspectedACs.size() == 0) {
258 myInspectedACs.clear();
259 myFirstInspectedAC = nullptr;
260 } else if (myFirstInspectedAC == AC) {
261 myFirstInspectedAC = (*myInspectedACs.begin());
262 }
263 }
264}
265
266
267void
269 myFirstInspectedAC = nullptr;
270 myInspectedACs.clear();
271}
272
273
276 return myFirstInspectedAC;
277}
278
279
280const std::unordered_set<GNEAttributeCarrier*>&
282 return myInspectedACs;
283}
284
285
286bool
288 if (myInspectedACs.empty()) {
289 return false;
290 } else if (myFirstInspectedAC == AC) {
291 return true;
292 } else {
293 return myInspectedACs.find(AC) != myInspectedACs.end();
294 }
295}
296
297
298bool
300 if (myInspectedACs.empty()) {
301 return false;
302 } else if (myFirstInspectedAC == AC) {
303 return true;
304 } else {
305 // we need a const_cast because our myInspectedACs is a set of non-constant ACs (in this case is safe)
306 return myInspectedACs.find(const_cast<GNEAttributeCarrier*>(AC)) != myInspectedACs.end();
307 }
308}
309
310
311bool
313 return myInspectedACs.size() > 0;
314}
315
316
317bool
319 return myInspectedACs.size() == 1;
320}
321
322
323bool
325 return myInspectedACs.size() > 1;
326}
327
328// ---------------------------------------------------------------------------
329// GNEViewNetHelper::MarkFrontElements - methods
330// ---------------------------------------------------------------------------
331
333
334
335const std::unordered_set<GNEAttributeCarrier*>&
337 return myMarkedACs;
338}
339
340
341void
343 // make a copy because container is modified in every iteration
344 const auto copy = myMarkedACs;
345 for (auto& AC : copy) {
347 }
348}
349
350
351void
355
356
357void
359 if (myMarkedACs.size() > 0) {
360 auto it = myMarkedACs.find(AC);
361 if (it != myMarkedACs.end()) {
362 myMarkedACs.erase(it);
363 }
364 }
365}
366
367// ---------------------------------------------------------------------------
368// GNEViewNetHelper::ViewObjectsSelector - methods
369// ---------------------------------------------------------------------------
370
374
375
376void
378 // clear elements and reserve space
379 myViewObjects.clearElements();
380 myViewObjects.reserve(gViewObjectsHandler.getNumberOfSelectedObjects());
381 // process GUIGLObjects using elements under cursor
382 processGUIGlObjects(gViewObjectsHandler.getSelectedObjects());
383}
384
385
386void
390
391
392void
394 if (myViewObjects.junctions.size() > 0) {
395 baseObjet->addParentID(SUMO_TAG_JUNCTION, myViewObjects.junctions.front()->getID());
396 }
397 if (myViewObjects.edges.size() > 0) {
398 baseObjet->addParentID(SUMO_TAG_EDGE, myViewObjects.edges.front()->getID());
399 }
400 if (myViewObjects.lanes.size() > 0) {
401 baseObjet->addParentID(SUMO_TAG_LANE, myViewObjects.lanes.front()->getID());
402 }
403 if (myViewObjects.crossings.size() > 0) {
404 baseObjet->addParentID(SUMO_TAG_CROSSING, myViewObjects.crossings.front()->getID());
405 }
406 if (myViewObjects.connections.size() > 0) {
407 baseObjet->addParentID(SUMO_TAG_CONNECTION, myViewObjects.connections.front()->getID());
408 }
409 if (myViewObjects.walkingAreas.size() > 0) {
410 baseObjet->addParentID(SUMO_TAG_WALKINGAREA, myViewObjects.walkingAreas.front()->getID());
411 }
412 if (myViewObjects.lanes.size() > 0) {
413 baseObjet->addParentID(SUMO_TAG_LANE, myViewObjects.lanes.front()->getID());
414 }
415 if (myViewObjects.additionals.size() > 0) {
416 baseObjet->addParentID(myViewObjects.additionals.front()->getTagProperty()->getTag(), myViewObjects.additionals.front()->getID());
417 }
418 if (myViewObjects.demandElements.size() > 0) {
419 baseObjet->addParentID(myViewObjects.demandElements.front()->getTagProperty()->getTag(), myViewObjects.demandElements.front()->getID());
420 }
421 if (myViewObjects.genericDatas.size() > 0) {
422 baseObjet->addParentID(myViewObjects.genericDatas.front()->getTagProperty()->getTag(), myViewObjects.genericDatas.front()->getID());
423 }
424}
425
426
427void
429 // get all elements to filter
430 std::vector<const GUIGlObject*> glElements;
431 for (const auto& glElement : myViewObjects.GUIGlObjects) {
432 if (glElement->getType() != exception) {
433 glElements.push_back(glElement);
434 }
435 }
436 myViewObjects.filterElements(glElements);
437}
438
439
440void
442 if (myViewNet->getEditModes().isCurrentSupermodeNetwork()) {
443 filterDemandElements(true);
444 filterDataElements();
445 } else if (myViewNet->getEditModes().isCurrentSupermodeDemand()) {
446 filterNetworkElements();
447 filterAdditionals(true, true);
448 filterDataElements();
449 } else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
450 filterNetworkElements();
451 filterDemandElements(true);
452 }
453}
454
455
456void
458 // get all edges to filter
459 std::vector<const GUIGlObject*> junctions;
460 for (const auto& junction : myViewObjects.junctions) {
461 junctions.push_back(junction);
462 }
463 myViewObjects.filterElements(junctions);
464}
465
466
467void
469 // get all edges to filter
470 std::vector<const GUIGlObject*> edges;
471 for (const auto& edge : myViewObjects.edges) {
472 edges.push_back(edge);
473 }
474 myViewObjects.filterElements(edges);
475}
476
477
478void
480 // get all lanes to filter
481 std::vector<const GUIGlObject*> lanes;
482 for (const auto& lane : myViewObjects.lanes) {
483 lanes.push_back(lane);
484 }
485 myViewObjects.filterElements(lanes);
486}
487
488
489void
491 // get all connections to filter
492 std::vector<const GUIGlObject*> connections;
493 for (const auto& connection : myViewObjects.connections) {
494 connections.push_back(connection);
495 }
496 myViewObjects.filterElements(connections);
497}
498
499
500void
502 // get all crossings to filter
503 std::vector<const GUIGlObject*> crossings;
504 for (const auto& crossing : myViewObjects.crossings) {
505 crossings.push_back(crossing);
506 }
507 myViewObjects.filterElements(crossings);
508}
509
510
511void
513 // get all walkingAreas to filter
514 std::vector<const GUIGlObject*> walkingAreas;
515 for (const auto& walkingArea : myViewObjects.walkingAreas) {
516 walkingAreas.push_back(walkingArea);
517 }
518 myViewObjects.filterElements(walkingAreas);
519}
520
521
522void
524 // get all elements to filter
525 std::vector<const GUIGlObject*> shapes;
526 for (const auto& poly : myViewObjects.polys) {
527 shapes.push_back(poly);
528 }
529 for (const auto& POI : myViewObjects.POIs) {
530 shapes.push_back(POI);
531 }
532 myViewObjects.filterElements(shapes);
533}
534
535
536void
537GNEViewNetHelper::ViewObjectsSelector::filterAdditionals(const bool includeStoppigPlaces, const bool includeTAZs) {
538 // get all elements to filter
539 std::vector<const GUIGlObject*> additionals;
540 for (const auto& additional : myViewObjects.additionals) {
541 if (!includeStoppigPlaces && (additional->getType() > GLO_STOPPING_PLACE) && (additional->getType() < GLO_STOPPING_PLACE_LAST)) {
542 continue;
543 } else if (!includeTAZs && (additional->getType() == GLO_TAZ)) {
544 continue;
545 } else {
546 additionals.push_back(additional);
547 }
548 }
549 myViewObjects.filterElements(additionals);
550}
551
552
553void
555 // get all elements to filter
556 std::vector<const GUIGlObject*> networkElements;
557 for (const auto& networkElement : myViewObjects.networkElements) {
558 networkElements.push_back(networkElement);
559 }
560 myViewObjects.filterElements(networkElements);
561}
562
563
564void
566 // get all elements to filter
567 std::vector<const GUIGlObject*> demandElements;
568 for (const auto& demandElement : myViewObjects.demandElements) {
569 if (!includeRoutes && (demandElement->getType() == GLO_ROUTE)) {
570 continue;
571 } else {
572 demandElements.push_back(demandElement);
573 }
574 }
575 myViewObjects.filterElements(demandElements);
576}
577
578
579void
581 // get all elements to filter
582 std::vector<const GUIGlObject*> datadElements;
583 for (const auto& datadElement : myViewObjects.edgeDatas) {
584 datadElements.push_back(datadElement);
585 }
586 for (const auto& datadElement : myViewObjects.edgeRelDatas) {
587 datadElements.push_back(datadElement);
588 }
589 for (const auto& datadElement : myViewObjects.TAZRelDatas) {
590 datadElements.push_back(datadElement);
591 }
592 myViewObjects.filterElements(datadElements);
593
594}
595
596
597void
598GNEViewNetHelper::ViewObjectsSelector::filterLockedElements(const std::vector<GUIGlObjectType> ignoreFilter) {
599 std::vector<const GUIGlObject*> GUIGlObjects;
600 // get all locked elements
601 for (const auto& GUIGlObject : myViewObjects.GUIGlObjects) {
603 GUIGlObjects.push_back(GUIGlObject);
604 }
605 }
606 // apply ignore filter
607 for (const auto& ignoredType : ignoreFilter) {
608 auto it = GUIGlObjects.begin();
609 while (it != GUIGlObjects.end()) {
610 if ((*it)->getType() == ignoredType) {
611 it = GUIGlObjects.erase(it);
612 } else {
613 it++;
614 }
615 }
616 }
617 // filter objects
618 myViewObjects.filterElements(GUIGlObjects);
619}
620
621
622const GUIGlObject*
624 if (myViewObjects.GUIGlObjects.size() > 0) {
625 return myViewObjects.GUIGlObjects.front();
626 } else {
627 return nullptr;
628 }
629}
630
631
634 if (myViewObjects.attributeCarriers.size() > 0) {
635 return myViewObjects.attributeCarriers.front();
636 } else {
637 return nullptr;
638 }
639}
640
641
644 if (myViewObjects.networkElements.size() > 0) {
645 return myViewObjects.networkElements.front();
646 } else {
647 return nullptr;
648 }
649}
650
651
654 if (myViewObjects.additionals.size() > 0) {
655 return myViewObjects.additionals.front();
656 } else {
657 return nullptr;
658 }
659}
660
661
664 if (myViewObjects.demandElements.size() > 0) {
665 return myViewObjects.demandElements.front();
666 } else {
667 return nullptr;
668 }
669}
670
671
674 if (myViewObjects.genericDatas.size() > 0) {
675 return myViewObjects.genericDatas.front();
676 } else {
677 return nullptr;
678 }
679}
680
681
684 if (myViewObjects.junctions.size() > 0) {
685 return myViewObjects.junctions.front();
686 } else {
687 return nullptr;
688 }
689}
690
691
692GNEEdge*
694 if (myViewObjects.edges.size() > 0) {
695 return myViewObjects.edges.front();
696 } else {
697 return nullptr;
698 }
699}
700
701
702GNELane*
704 if (myViewObjects.lanes.size() > 0) {
705 return myViewObjects.lanes.front();
706 } else {
707 return nullptr;
708 }
709}
710
711
712GNELane*
714 if (myViewObjects.lanes.size() > 0) {
715 for (auto& lane : myViewObjects.lanes) {
716 if (!(lane->isAttributeCarrierSelected() || lane->getParentEdge()->isAttributeCarrierSelected()) ||
717 !myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands().menuCheckLockSelectedElements->getCheck()) {
718 return lane;
719 }
720 }
721 // all locked, then return nullptr
722 return nullptr;
723 } else {
724 return nullptr;
725 }
726}
727
728
729const std::vector<GNELane*>&
731 return myViewObjects.lanes;
732}
733
734
737 if (myViewObjects.crossings.size() > 0) {
738 return myViewObjects.crossings.front();
739 } else {
740 return nullptr;
741 }
742}
743
744
747 if (myViewObjects.walkingAreas.size() > 0) {
748 return myViewObjects.walkingAreas.front();
749 } else {
750 return nullptr;
751 }
752}
753
754
757 if (myViewObjects.connections.size() > 0) {
758 return myViewObjects.connections.front();
759 } else {
760 return nullptr;
761 }
762}
763
764
767 if (myViewObjects.internalLanes.size() > 0) {
768 return myViewObjects.internalLanes.front();
769 } else {
770 return nullptr;
771 }
772}
773
774
775GNEPOI*
777 if (myViewObjects.POIs.size() > 0) {
778 return myViewObjects.POIs.front();
779 } else {
780 return nullptr;
781 }
782}
783
784
785GNEPoly*
787 if (myViewObjects.polys.size() > 0) {
788 return myViewObjects.polys.front();
789 } else {
790 return nullptr;
791 }
792}
793
794
795GNETAZ*
797 if (myViewObjects.TAZs.size() > 0) {
798 return myViewObjects.TAZs.front();
799 } else {
800 return nullptr;
801 }
802}
803
804
807 if (myViewObjects.edgeDatas.size() > 0) {
808 return myViewObjects.edgeDatas.front();
809 } else {
810 return nullptr;
811 }
812}
813
814
817 if (myViewObjects.edgeRelDatas.size() > 0) {
818 return myViewObjects.edgeRelDatas.front();
819 } else {
820 return nullptr;
821 }
822}
823
824
827 if (myViewObjects.TAZRelDatas.size() > 0) {
828 return myViewObjects.TAZRelDatas.front();
829 } else {
830 return nullptr;
831 }
832}
833
834
835const std::vector<GUIGlObject*>&
837 return myViewObjects.GUIGlObjects;
838}
839
840
841const std::vector<GNEAttributeCarrier*>&
843 return myViewObjects.attributeCarriers;
844}
845
846
847const std::vector<GNEJunction*>&
849 return myViewObjects.junctions;
850}
851
852
853const std::vector<GNEEdge*>&
855 return myViewObjects.edges;
856}
857
858
859const std::vector<GNETAZ*>&
861 return myViewObjects.TAZs;
862}
863
864
865const std::vector<GNEAdditional*>&
867 return myViewObjects.additionals;
868}
869
870
871const std::vector<GNEDemandElement*>&
873 return myViewObjects.demandElements;
874}
875
876
877const std::vector<const GNEJunction*>&
879 return myMergingJunctions;
880}
881
882
884
885
886void
888 GUIGlObjects.clear();
889 attributeCarriers.clear();
890 networkElements.clear();
891 additionals.clear();
892 demandElements.clear();
893 junctions.clear();
894 edges.clear();
895 lanes.clear();
896 crossings.clear();
897 walkingAreas.clear();
898 connections.clear();
899 internalLanes.clear();
900 TAZs.clear();
901 POIs.clear();
902 polys.clear();
903 genericDatas.clear();
904 edgeDatas.clear();
905 edgeRelDatas.clear();
906 TAZRelDatas.clear();
907}
908
909
910void
912 GUIGlObjects.reserve(size);
913 attributeCarriers.reserve(size);
914 networkElements.reserve(size);
915 additionals.reserve(size);
916 demandElements.reserve(size);
917 junctions.reserve(size);
918 edges.reserve(size);
919 lanes.reserve(size);
920 crossings.reserve(size);
921 walkingAreas.reserve(size);
922 connections.reserve(size);
923 internalLanes.reserve(size);
924 TAZs.reserve(size);
925 POIs.reserve(size);
926 polys.reserve(size);
927 genericDatas.reserve(size);
928 edgeDatas.reserve(size);
929 edgeRelDatas.reserve(size);
930 TAZRelDatas.reserve(size);
931}
932
933
934void
936 for (const auto& object : objects) {
937 // remove from GUIGlObjects
938 auto itGlObjects = GUIGlObjects.begin();
939 while (itGlObjects != GUIGlObjects.end()) {
940 if (*itGlObjects == object) {
941 itGlObjects = GUIGlObjects.erase(itGlObjects);
942 } else {
943 itGlObjects++;
944 }
945 }
946 // remove from attributeCarriers
947 auto itACs = attributeCarriers.begin();
948 while (itACs != attributeCarriers.end()) {
949 if ((*itACs)->getGUIGlObject() == object) {
950 itACs = attributeCarriers.erase(itACs);
951 } else {
952 itACs++;
953 }
954 }
955 // remove from networkElements
956 auto itNetworkElements = networkElements.begin();
957 while (itNetworkElements != networkElements.end()) {
958 if ((*itNetworkElements)->getGUIGlObject() == object) {
959 itNetworkElements = networkElements.erase(itNetworkElements);
960 } else {
961 itNetworkElements++;
962 }
963 }
964 // remove from additionals
965 auto itAdditionals = additionals.begin();
966 while (itAdditionals != additionals.end()) {
967 if ((*itAdditionals)->getGUIGlObject() == object) {
968 itAdditionals = additionals.erase(itAdditionals);
969 } else {
970 itAdditionals++;
971 }
972 }
973 // remove from demandElements
974 auto itDemandElements = demandElements.begin();
975 while (itDemandElements != demandElements.end()) {
976 if ((*itDemandElements)->getGUIGlObject() == object) {
977 itDemandElements = demandElements.erase(itDemandElements);
978 } else {
979 itDemandElements++;
980 }
981 }
982 // remove from genericDatas
983 auto itGenericDatas = genericDatas.begin();
984 while (itGenericDatas != genericDatas.end()) {
985 if ((*itGenericDatas)->getGUIGlObject() == object) {
986 itGenericDatas = genericDatas.erase(itGenericDatas);
987 } else {
988 itGenericDatas++;
989 }
990 }
991 // remove from junctions
992 auto itJunctions = junctions.begin();
993 while (itJunctions != junctions.end()) {
994 if ((*itJunctions)->getGUIGlObject() == object) {
995 itJunctions = junctions.erase(itJunctions);
996 } else {
997 itJunctions++;
998 }
999 }
1000 // remove from edges
1001 auto itEdges = edges.begin();
1002 while (itEdges != edges.end()) {
1003 if ((*itEdges)->getGUIGlObject() == object) {
1004 itEdges = edges.erase(itEdges);
1005 } else {
1006 itEdges++;
1007 }
1008 }
1009 // remove from lanes
1010 auto itLanes = lanes.begin();
1011 while (itLanes != lanes.end()) {
1012 if ((*itLanes)->getGUIGlObject() == object) {
1013 itLanes = lanes.erase(itLanes);
1014 } else {
1015 itLanes++;
1016 }
1017 }
1018 // remove from crossings
1019 auto itCrossings = crossings.begin();
1020 while (itCrossings != crossings.end()) {
1021 if ((*itCrossings)->getGUIGlObject() == object) {
1022 itCrossings = crossings.erase(itCrossings);
1023 } else {
1024 itCrossings++;
1025 }
1026 }
1027 // remove from walkingAreas
1028 auto itWalkingAreas = walkingAreas.begin();
1029 while (itWalkingAreas != walkingAreas.end()) {
1030 if ((*itWalkingAreas)->getGUIGlObject() == object) {
1031 itWalkingAreas = walkingAreas.erase(itWalkingAreas);
1032 } else {
1033 itWalkingAreas++;
1034 }
1035 }
1036 // remove from connections
1037 auto itConnections = connections.begin();
1038 while (itConnections != connections.end()) {
1039 if ((*itConnections)->getGUIGlObject() == object) {
1040 itConnections = connections.erase(itConnections);
1041 } else {
1042 itConnections++;
1043 }
1044 }
1045 // remove from internalLanes
1046 auto itInternalLanes = internalLanes.begin();
1047 while (itInternalLanes != internalLanes.end()) {
1048 if ((*itInternalLanes)->getGUIGlObject() == object) {
1049 itInternalLanes = internalLanes.erase(itInternalLanes);
1050 } else {
1051 itInternalLanes++;
1052 }
1053 }
1054 // remove from TAZs
1055 auto itTAZs = TAZs.begin();
1056 while (itTAZs != TAZs.end()) {
1057 if ((*itTAZs)->getGUIGlObject() == object) {
1058 itTAZs = TAZs.erase(itTAZs);
1059 } else {
1060 itTAZs++;
1061 }
1062 }
1063 // remove from POIs
1064 auto itPOIs = POIs.begin();
1065 while (itPOIs != POIs.end()) {
1066 if ((*itPOIs)->getGUIGlObject() == object) {
1067 itPOIs = POIs.erase(itPOIs);
1068 } else {
1069 itPOIs++;
1070 }
1071 }
1072 // remove from polys
1073 auto itPolys = polys.begin();
1074 while (itPolys != polys.end()) {
1075 if ((*itPolys)->getGUIGlObject() == object) {
1076 itPolys = polys.erase(itPolys);
1077 } else {
1078 itPolys++;
1079 }
1080 }
1081 // remove from edgeDatas
1082 auto itEdgeDatas = edgeDatas.begin();
1083 while (itEdgeDatas != edgeDatas.end()) {
1084 if ((*itEdgeDatas)->getGUIGlObject() == object) {
1085 itEdgeDatas = edgeDatas.erase(itEdgeDatas);
1086 } else {
1087 itEdgeDatas++;
1088 }
1089 }
1090 // remove from edgeRelDatas
1091 auto itEdgeRelDatas = edgeRelDatas.begin();
1092 while (itEdgeRelDatas != edgeRelDatas.end()) {
1093 if ((*itEdgeRelDatas)->getGUIGlObject() == object) {
1094 itEdgeRelDatas = edgeRelDatas.erase(itEdgeRelDatas);
1095 } else {
1096 itEdgeRelDatas++;
1097 }
1098 }
1099 // remove from TAZRelDatas
1100 auto itTAZRelDatas = TAZRelDatas.begin();
1101 while (itTAZRelDatas != TAZRelDatas.end()) {
1102 if ((*itTAZRelDatas)->getGUIGlObject() == object) {
1103 itTAZRelDatas = TAZRelDatas.erase(itTAZRelDatas);
1104 } else {
1105 itTAZRelDatas++;
1106 }
1107 }
1108 }
1109}
1110
1111
1112void
1114 // cast specific network element
1115 switch (glObject->getType()) {
1116 case GLO_JUNCTION: {
1117 // get junction
1118 auto junction = myViewNet->getNet()->getAttributeCarriers()->retrieveJunction(glObject->getMicrosimID());
1119 // check front element
1120 if (junction->isMarkedForDrawingFront()) {
1121 // insert at front
1122 container.junctions.insert(container.junctions.begin(), junction);
1123 container.networkElements.insert(container.networkElements.begin(), junction);
1124 container.attributeCarriers.insert(container.attributeCarriers.begin(), junction);
1125 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), junction);
1126 } else {
1127 // insert at back
1128 container.junctions.push_back(junction);
1129 container.networkElements.push_back(junction);
1130 container.attributeCarriers.push_back(junction);
1131 container.GUIGlObjects.push_back(junction);
1132 }
1133 break;
1134 }
1135 case GLO_EDGE: {
1136 // get edge
1137 auto edge = myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(glObject->getMicrosimID());
1138 // check front element
1139 if (edge->isMarkedForDrawingFront()) {
1140 // insert at front
1141 container.edges.insert(container.edges.begin(), edge);
1142 container.networkElements.insert(container.networkElements.begin(), edge);
1143 container.attributeCarriers.insert(container.attributeCarriers.begin(), edge);
1144 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edge);
1145 } else {
1146 // insert at back
1147 container.edges.push_back(edge);
1148 container.networkElements.push_back(edge);
1149 container.attributeCarriers.push_back(edge);
1150 container.GUIGlObjects.push_back(edge);
1151 }
1152 break;
1153 }
1154 case GLO_LANE: {
1155 // get lane
1156 auto lane = myViewNet->getNet()->getAttributeCarriers()->retrieveLane(glObject);
1157 // check front element
1158 if (lane->isMarkedForDrawingFront()) {
1159 // insert at front
1160 container.lanes.insert(container.lanes.begin(), lane);
1161 container.networkElements.insert(container.networkElements.begin(), lane);
1162 container.attributeCarriers.insert(container.attributeCarriers.begin(), lane);
1163 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), lane);
1164 } else {
1165 // insert at back
1166 container.lanes.push_back(lane);
1167 container.networkElements.push_back(lane);
1168 container.attributeCarriers.push_back(lane);
1169 container.GUIGlObjects.push_back(lane);
1170 }
1171 break;
1172 }
1173 case GLO_CROSSING: {
1174 // get crossing
1175 auto crossing = myViewNet->getNet()->getAttributeCarriers()->retrieveCrossing(glObject);
1176 // check front element
1177 if (crossing->isMarkedForDrawingFront()) {
1178 // insert at front
1179 container.crossings.insert(container.crossings.begin(), crossing);
1180 container.networkElements.insert(container.networkElements.begin(), crossing);
1181 container.attributeCarriers.insert(container.attributeCarriers.begin(), crossing);
1182 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), crossing);
1183 } else {
1184 // insert at back
1185 container.crossings.push_back(crossing);
1186 container.networkElements.push_back(crossing);
1187 container.attributeCarriers.push_back(crossing);
1188 container.GUIGlObjects.push_back(crossing);
1189 }
1190 break;
1191 }
1192 case GLO_WALKINGAREA: {
1193 // get walkingArea
1194 auto walkingArea = myViewNet->getNet()->getAttributeCarriers()->retrieveWalkingArea(glObject);
1195 // check front element
1196 if (walkingArea->isMarkedForDrawingFront()) {
1197 // insert at front
1198 container.walkingAreas.insert(container.walkingAreas.begin(), walkingArea);
1199 container.networkElements.insert(container.networkElements.begin(), walkingArea);
1200 container.attributeCarriers.insert(container.attributeCarriers.begin(), walkingArea);
1201 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), walkingArea);
1202 } else {
1203 // insert at back
1204 container.walkingAreas.push_back(walkingArea);
1205 container.networkElements.push_back(walkingArea);
1206 container.attributeCarriers.push_back(walkingArea);
1207 container.GUIGlObjects.push_back(walkingArea);
1208 }
1209 break;
1210 }
1211 case GLO_CONNECTION: {
1212 // get connection
1213 auto connection = myViewNet->getNet()->getAttributeCarriers()->retrieveConnection(glObject);
1214 // check front element
1215 if (connection->isMarkedForDrawingFront()) {
1216 // insert at front
1217 container.connections.insert(container.connections.begin(), connection);
1218 container.networkElements.insert(container.networkElements.begin(), connection);
1219 container.attributeCarriers.insert(container.attributeCarriers.begin(), connection);
1220 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), connection);
1221 } else {
1222 // insert at back
1223 container.connections.push_back(connection);
1224 container.networkElements.push_back(connection);
1225 container.attributeCarriers.push_back(connection);
1226 container.GUIGlObjects.push_back(connection);
1227 }
1228 break;
1229 }
1230 case GLO_TLLOGIC: {
1231 // get internal lane
1232 auto internalLane = myViewNet->getNet()->getAttributeCarriers()->retrieveInternalLane(glObject);
1233 // check front element
1234 if (internalLane->isMarkedForDrawingFront()) {
1235 // insert at front
1236 container.internalLanes.insert(container.internalLanes.begin(), internalLane);
1237 container.attributeCarriers.insert(container.attributeCarriers.begin(), internalLane);
1238 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), internalLane);
1239 } else {
1240 // insert at back
1241 container.internalLanes.push_back(internalLane);
1242 container.attributeCarriers.push_back(internalLane);
1243 container.GUIGlObjects.push_back(internalLane);
1244 }
1245 break;
1246 }
1247 default:
1248 break;
1249 }
1250}
1251
1252
1253void
1255 // get additional element
1256 auto additionalElement = myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject, false);
1257 if (additionalElement) {
1258 // insert depending if is the front attribute carrier
1259 if (additionalElement->isMarkedForDrawingFront()) {
1260 // insert at front
1261 container.additionals.insert(container.additionals.begin(), additionalElement);
1262 container.attributeCarriers.insert(container.attributeCarriers.begin(), additionalElement);
1263 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), additionalElement);
1264 } else {
1265 // insert at back
1266 container.additionals.push_back(additionalElement);
1267 container.attributeCarriers.push_back(additionalElement);
1268 container.GUIGlObjects.push_back(additionalElement);
1269 }
1270 }
1271}
1272
1273
1274void
1276 // cast specific shape
1277 if (glObject->getType() == GLO_POI) {
1278 // cast POI
1279 auto POI = dynamic_cast<GNEPOI*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
1280 // check front element
1281 if (POI->isMarkedForDrawingFront()) {
1282 // insert at front
1283 container.POIs.insert(container.POIs.begin(), POI);
1284 } else {
1285 // insert at back
1286 container.POIs.push_back(POI);
1287 }
1288 } else if ((glObject->getType() == GLO_POLYGON) || (glObject->getType() == GLO_JPS_WALKABLEAREA) || (glObject->getType() == GLO_JPS_OBSTACLE)) {
1289 // cast poly
1290 auto poly = dynamic_cast<GNEPoly*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
1291 // check front element
1292 if (poly->isMarkedForDrawingFront()) {
1293 // insert at front
1294 container.polys.insert(container.polys.begin(), poly);
1295 } else {
1296 // insert at back
1297 container.polys.push_back(poly);
1298 }
1299 }
1300}
1301
1302
1303void
1305 // cast specific TAZ
1306 if (glObject->getType() == GLO_TAZ) {
1307 // cast TAZ
1308 auto TAZ = dynamic_cast<GNETAZ*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
1309 // check front element
1310 if (TAZ->isMarkedForDrawingFront()) {
1311 // insert at front
1312 container.TAZs.insert(container.TAZs.begin(), TAZ);
1313 } else {
1314 // insert at back
1315 container.TAZs.push_back(TAZ);
1316 }
1317 }
1318}
1319
1320
1321void
1323 // get demandElement
1324 GNEDemandElement* demandElement = myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(glObject, false);
1325 if (demandElement) {
1326 // insert depending if is the front attribute carrier
1327 if (demandElement->isMarkedForDrawingFront()) {
1328 // insert at front
1329 container.demandElements.insert(container.demandElements.begin(), demandElement);
1330 container.attributeCarriers.insert(container.attributeCarriers.begin(), demandElement);
1331 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), demandElement);
1332 } else {
1333 // insert at back
1334 container.demandElements.push_back(demandElement);
1335 container.attributeCarriers.push_back(demandElement);
1336 container.GUIGlObjects.push_back(demandElement);
1337 }
1338 }
1339}
1340
1341
1342void
1344 // cast specific generic data
1345 switch (glObject->getType()) {
1346 case GLO_EDGEDATA: {
1347 // cast EdgeData
1348 auto edgeData = dynamic_cast<GNEEdgeData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
1349 // check front element
1350 if (edgeData->isMarkedForDrawingFront()) {
1351 // insert at front
1352 container.edgeDatas.insert(container.edgeDatas.begin(), edgeData);
1353 container.genericDatas.insert(container.genericDatas.begin(), edgeData);
1354 container.attributeCarriers.insert(container.attributeCarriers.begin(), edgeData);
1355 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edgeData);
1356 } else {
1357 // insert at back
1358 container.edgeDatas.push_back(edgeData);
1359 container.genericDatas.push_back(edgeData);
1360 container.attributeCarriers.push_back(edgeData);
1361 container.GUIGlObjects.push_back(edgeData);
1362 }
1363 break;
1364 }
1365 case GLO_EDGERELDATA: {
1366 // cast EdgeData
1367 auto edgeRelData = dynamic_cast<GNEEdgeRelData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
1368 // check front element
1369 if (edgeRelData->isMarkedForDrawingFront()) {
1370 // insert at front
1371 container.edgeRelDatas.insert(container.edgeRelDatas.begin(), edgeRelData);
1372 container.genericDatas.insert(container.genericDatas.begin(), edgeRelData);
1373 container.attributeCarriers.insert(container.attributeCarriers.begin(), edgeRelData);
1374 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edgeRelData);
1375 } else {
1376 // insert at back
1377 container.edgeRelDatas.push_back(edgeRelData);
1378 container.genericDatas.push_back(edgeRelData);
1379 container.attributeCarriers.push_back(edgeRelData);
1380 container.GUIGlObjects.push_back(edgeRelData);
1381 }
1382 break;
1383 }
1384 case GLO_TAZRELDATA: {
1385 // cast TAZRelData
1386 auto TAZRelData = dynamic_cast<GNETAZRelData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
1387 // check front element
1388 if (TAZRelData->isMarkedForDrawingFront()) {
1389 // insert at front
1390 container.TAZRelDatas.insert(container.TAZRelDatas.begin(), TAZRelData);
1391 container.genericDatas.insert(container.genericDatas.begin(), TAZRelData);
1392 container.attributeCarriers.insert(container.attributeCarriers.begin(), TAZRelData);
1393 container.GUIGlObjects.insert(container.GUIGlObjects.begin(), TAZRelData);
1394 } else {
1395 // insert at back
1396 container.TAZRelDatas.push_back(TAZRelData);
1397 container.genericDatas.push_back(TAZRelData);
1398 container.attributeCarriers.push_back(TAZRelData);
1399 container.GUIGlObjects.push_back(TAZRelData);
1400 }
1401 break;
1402 }
1403 default:
1404 break;
1405 }
1406}
1407
1408
1409void
1411 // iterate over filtered edge objects
1412 for (const auto& glObjectLayer : objectsContainer) {
1413 for (const auto& glObject : glObjectLayer.second) {
1414 // update all elements by categories
1415 updateNetworkElements(myViewObjects, glObject.object);
1416 updateAdditionalElements(myViewObjects, glObject.object);
1417 updateShapeElements(myViewObjects, glObject.object);
1418 updateTAZElements(myViewObjects, glObject.object);
1419 updateDemandElements(myViewObjects, glObject.object);
1420 updateGenericDataElements(myViewObjects, glObject.object);
1421 }
1422 }
1423}
1424
1425
1429
1430// ---------------------------------------------------------------------------
1431// GNEViewNetHelper::MouseButtonKeyPressed - methods
1432// ---------------------------------------------------------------------------
1433
1437
1438
1439void
1441 myEventInfo = (FXEvent*) eventData;
1442}
1443
1444
1445bool
1447 if (myEventInfo) {
1448 return (myEventInfo->state & SHIFTMASK) != 0;
1449 } else {
1450 return false;
1451 }
1452}
1453
1454
1455bool
1457 if (myEventInfo) {
1458 return (myEventInfo->state & CONTROLMASK) != 0;
1459 } else {
1460 return false;
1461 }
1462}
1463
1464
1465bool
1467 if (myEventInfo) {
1468 return (myEventInfo->state & ALTMASK) != 0;
1469 } else {
1470 return false;
1471 }
1472}
1473
1474
1475bool
1477 if (myEventInfo) {
1478 return (myEventInfo->state & LEFTBUTTONMASK) != 0;
1479 } else {
1480 return false;
1481 }
1482}
1483
1484
1485bool
1487 if (myEventInfo) {
1488 return (myEventInfo->state & RIGHTBUTTONMASK) != 0;
1489 } else {
1490 return false;
1491 }
1492}
1493
1494// ---------------------------------------------------------------------------
1495// GNEViewNetHelper::MoveSingleElementValues - methods
1496// ---------------------------------------------------------------------------
1497
1501
1502
1503bool
1505 // first obtain moving reference (common for all)
1506 myRelativeClickedPosition = myViewNet->getPositionInformation();
1507 // get edited element
1508 const GNENetworkElement* editedElement = myViewNet->myEditNetworkElementShapes.getEditedNetworkElement();
1509 // check what type of AC will be moved
1510 if (myViewNet->myViewObjectsSelector.getJunctionFront() && (myViewNet->myViewObjectsSelector.getJunctionFront() == editedElement)) {
1511 // get move operation
1512 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getJunctionFront()->getMoveElement()->getMoveOperation();
1513 // continue if move operation is valid
1514 if (moveOperation) {
1515 myMoveOperation = moveOperation;
1516 return true;
1517 } else {
1518 return false;
1519 }
1520 } else if (myViewNet->myViewObjectsSelector.getLaneFront() && (myViewNet->myViewObjectsSelector.getLaneFront() == editedElement)) {
1521 // get move operation
1522 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getLaneFront()->getMoveElement()->getMoveOperation();
1523 // continue if move operation is valid
1524 if (moveOperation) {
1525 myMoveOperation = moveOperation;
1526 return true;
1527 } else {
1528 return false;
1529 }
1530 } else if (myViewNet->myViewObjectsSelector.getCrossingFront() && (myViewNet->myViewObjectsSelector.getCrossingFront() == editedElement)) {
1531 // get move operation
1532 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getCrossingFront()->getMoveElement()->getMoveOperation();
1533 // continue if move operation is valid
1534 if (moveOperation) {
1535 myMoveOperation = moveOperation;
1536 return true;
1537 } else {
1538 return false;
1539 }
1540 } else if (myViewNet->myViewObjectsSelector.getConnectionFront() && (myViewNet->myViewObjectsSelector.getConnectionFront() == editedElement)) {
1541 // get move operation
1542 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getConnectionFront()->getMoveElement()->getMoveOperation();
1543 // continue if move operation is valid
1544 if (moveOperation) {
1545 myMoveOperation = moveOperation;
1546 return true;
1547 } else {
1548 return false;
1549 }
1550 } else if (myViewNet->myViewObjectsSelector.getWalkingAreaFront() && (myViewNet->myViewObjectsSelector.getWalkingAreaFront() == editedElement)) {
1551 // currently walking areas cannot be moved (will be implemented in the future)
1552 return false;
1553 } else {
1554 // there isn't moved items, then return false
1555 return false;
1556 }
1557}
1558
1559
1560bool
1562 // first obtain moving reference (common for all)
1563 myRelativeClickedPosition = myViewNet->getPositionInformation();
1564 // get front AC
1565 const GNEAttributeCarrier* markAC = myViewNet->myViewObjectsSelector.getAttributeCarrierFront();
1566 // check what type of AC will be moved
1567 if (myViewNet->myViewObjectsSelector.getPolyFront() && (markAC == myViewNet->myViewObjectsSelector.getPolyFront())) {
1568 // get move operation
1569 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getPolyFront()->getMoveElement()->getMoveOperation();
1570 // continue if move operation is valid
1571 if (moveOperation) {
1572 myMoveOperation = moveOperation;
1573 return true;
1574 } else {
1575 return false;
1576 }
1577 } else if (myViewNet->myViewObjectsSelector.getPOIFront() && (markAC == myViewNet->myViewObjectsSelector.getPOIFront())) {
1578 // get move operation
1579 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getPOIFront()->getMoveElement()->getMoveOperation();
1580 // continue if move operation is valid
1581 if (moveOperation) {
1582 myMoveOperation = moveOperation;
1583 return true;
1584 } else {
1585 return false;
1586 }
1587 } else if (myViewNet->myViewObjectsSelector.getAdditionalFront() && (markAC == myViewNet->myViewObjectsSelector.getAdditionalFront()) &&
1588 myViewNet->myViewObjectsSelector.getAdditionalFront()->getMoveElement()) {
1589 // get move operation
1590 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getAdditionalFront()->getMoveElement()->getMoveOperation();
1591 // continue if move operation is valid
1592 if (moveOperation) {
1593 myMoveOperation = moveOperation;
1594 return true;
1595 } else {
1596 return false;
1597 }
1598 } else if (myViewNet->myViewObjectsSelector.getJunctionFront() && (markAC == myViewNet->myViewObjectsSelector.getJunctionFront())) {
1599 // check if over junction there is a geometry point
1600 if (myViewNet->myViewObjectsSelector.getEdgeFront() && (myViewNet->myViewObjectsSelector.getEdgeFront()->clickedOverGeometryPoint(myRelativeClickedPosition))) {
1601 // get move operation
1602 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getEdgeFront()->getMoveElement()->getMoveOperation();
1603 // continue if move operation is valid
1604 if (moveOperation) {
1605 myMoveOperation = moveOperation;
1606 return true;
1607 } else {
1608 return false;
1609 }
1610 } else {
1611 // get move operation
1612 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getJunctionFront()->getMoveElement()->getMoveOperation();
1613 // continue if move operation is valid
1614 if (moveOperation) {
1615 myMoveOperation = moveOperation;
1616 return true;
1617 } else {
1618 return false;
1619 }
1620 }
1621 } else if (myViewNet->myViewObjectsSelector.getEdgeFront() && (markAC == myViewNet->myViewObjectsSelector.getEdgeFront())) {
1622 // calculate Edge movement values (can be entire shape, single geometry points, altitude, etc.)
1623 if (myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
1624 // edit end point
1625 myViewNet->myViewObjectsSelector.getEdgeFront()->editEndpoint(myViewNet->getPositionInformation(), myViewNet->myUndoList);
1626 // edge values wasn't calculated, then return false
1627 return false;
1628 } else {
1629 // get move operation
1630 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getEdgeFront()->getMoveElement()->getMoveOperation();
1631 // continue if move operation is valid
1632 if (moveOperation) {
1633 myMoveOperation = moveOperation;
1634 return true;
1635 } else {
1636 return false;
1637 }
1638 }
1639 } else if (myViewNet->myViewObjectsSelector.getLaneFront() && (markAC == myViewNet->myViewObjectsSelector.getLaneFront())) {
1640 // get move operation
1641 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getLaneFront()->getMoveElement()->getMoveOperation();
1642 // continue if move operation is valid
1643 if (moveOperation) {
1644 myMoveOperation = moveOperation;
1645 return true;
1646 } else {
1647 return false;
1648 }
1649 } else {
1650 // there isn't moved items, then return false
1651 return false;
1652 }
1653}
1654
1655
1656bool
1658 // first obtain moving reference (common for all)
1659 myRelativeClickedPosition = myViewNet->getPositionInformation();
1660 // get front AC
1661 const GNEAttributeCarrier* markAC = myViewNet->myViewObjectsSelector.getAttributeCarrierFront();
1662 // check if demand element can be moved
1663 if (myViewNet->myViewObjectsSelector.getDemandElementFront() && (markAC == myViewNet->myViewObjectsSelector.getDemandElementFront() &&
1664 myViewNet->myViewObjectsSelector.getDemandElementFront()->getMoveElement())) {
1665 // get move operation
1666 GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getDemandElementFront()->getMoveElement()->getMoveOperation();
1667 // continue if move operation is valid
1668 if (moveOperation) {
1669 myMoveOperation = moveOperation;
1670 return true;
1671 } else {
1672 return false;
1673 }
1674 } else {
1675 // there isn't moved items, then return false
1676 return false;
1677 }
1678}
1679
1680
1681void
1683 if (myMoveOperation) {
1684 // calculate moveOffset
1685 const GNEMoveOffset moveOffset = calculateMoveOffset();
1686 // check if mouse button is pressed
1687 if (mouseLeftButtonPressed) {
1688 // move elements
1689 GNEMoveElement::moveElement(myViewNet, myMoveOperation, moveOffset);
1690 } else {
1691 // commit move
1692 GNEMoveElement::commitMove(myViewNet, myMoveOperation, moveOffset, myViewNet->getUndoList());
1693 // don't forget delete move operation
1694 delete myMoveOperation;
1695 myMoveOperation = nullptr;
1696 }
1697 }
1698}
1699
1700
1701void
1703 if (myMoveOperation) {
1704 // calculate moveOffset
1705 const GNEMoveOffset moveOffset = calculateMoveOffset();
1706 GNEMoveElement::commitMove(myViewNet, myMoveOperation, moveOffset, myViewNet->getUndoList());
1707 // don't forget delete move operation
1708 delete myMoveOperation;
1709 myMoveOperation = nullptr;
1710 }
1711}
1712
1713
1714bool
1716 return myMoveOperation != nullptr;
1717}
1718
1719
1722 if (myMoveOperation) {
1723 return myMoveOperation->moveElement;
1724 } else {
1725 return nullptr;
1726 }
1727}
1728
1729
1730const GNEMoveOffset
1732 // calculate moveOffset depending of current mouse position and relative clicked position
1733 // @note #3521: Add checkBox to allow moving elements... has to be implemented and used here
1734 Position moveOffset = (myViewNet->getPositionInformation() - myViewNet->myMoveSingleElement.myRelativeClickedPosition);
1735 // calculate Z depending of moveElevation
1736 if (myViewNet->myNetworkViewOptions.menuCheckMoveElevation->shown() && myViewNet->myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
1737 // use Y as Z value and return Z move offset
1738 return GNEMoveOffset(moveOffset.y());
1739 } else {
1740 // return X-Y move offset
1741 return GNEMoveOffset(moveOffset.x(), moveOffset.y());
1742 }
1743}
1744
1745// ---------------------------------------------------------------------------
1746// GNEViewNetHelper::MoveMultipleElementValues - methods
1747// ---------------------------------------------------------------------------
1748
1750 myViewNet(viewNet),
1751 myMovingSelectedEdge(false),
1752 myEdgeOffset(0) {
1753}
1754
1755
1756void
1758 // save clicked position (to calculate offset)
1759 myClickedPosition = myViewNet->getPositionInformation();
1760 // continue depending of clicked element
1761 if (myViewNet->myViewObjectsSelector.getJunctionFront()) {
1762 calculateJunctionSelection();
1763 } else if (myViewNet->myViewObjectsSelector.getEdgeFront()) {
1764 calculateEdgeSelection(myViewNet->myViewObjectsSelector.getEdgeFront());
1765 }
1766 myViewNet->updateViewNet();
1767}
1768
1769
1770void
1772 // calculate moveOffset
1773 const GNEMoveOffset moveOffset = calculateMoveOffset();
1774 // check if mouse button is pressed
1775 if (mouseLeftButtonPressed) {
1776 // iterate over all operations
1777 for (const auto& moveOperation : myMoveOperations) {
1778 // move elements
1779 GNEMoveElement::moveElement(myViewNet, moveOperation, moveOffset);
1780 }
1781 } else if (myMoveOperations.size() > 0) {
1782 // begin undo list
1783 myViewNet->getUndoList()->begin(GUIIcon::MODEMOVE, TL("moving selection"));
1784 // iterate over all operations
1785 for (const auto& moveOperation : myMoveOperations) {
1786 // commit move
1787 GNEMoveElement::commitMove(myViewNet, moveOperation, moveOffset, myViewNet->getUndoList());
1788 // don't forget delete move operation
1789 delete moveOperation;
1790 }
1791 // end undo list
1792 myViewNet->getUndoList()->end();
1793 // clear move operations
1794 myMoveOperations.clear();
1795 }
1796}
1797
1798
1799void
1801 // calculate moveOffset
1802 const GNEMoveOffset moveOffset = calculateMoveOffset();
1803 // begin undo list
1804 myViewNet->getUndoList()->begin(GUIIcon::MODEMOVE, TL("moving selection"));
1805 // finish all move operations
1806 for (const auto& moveOperation : myMoveOperations) {
1807 GNEMoveElement::commitMove(myViewNet, moveOperation, moveOffset, myViewNet->getUndoList());
1808 // don't forget delete move operation
1809 delete moveOperation;
1810 }
1811 // end undo list
1812 myViewNet->getUndoList()->end();
1813 // clear move operations
1814 myMoveOperations.clear();
1815}
1816
1817
1818bool
1820 return (myMoveOperations.size() > 0);
1821}
1822
1823
1824bool
1826 return myMovingSelectedEdge;
1827}
1828
1829
1830void
1834
1835
1836double
1838 return myEdgeOffset;
1839}
1840
1841
1842bool
1844 return myMoveOperations.size() > 0;
1845}
1846
1847
1848const GNEMoveOffset
1850 // calculate moveOffset depending of current mouse position and relative clicked position
1851 // @note #3521: Add checkBox to allow moving elements... has to be implemented and used here
1852 Position moveOffset = (myViewNet->getPositionInformation() - myClickedPosition);
1853 // calculate Z depending of moveElevation
1854 if (myViewNet->myNetworkViewOptions.menuCheckMoveElevation->shown() && myViewNet->myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
1855 // use Y for Z and return X move offset
1856 return GNEMoveOffset(moveOffset.y());
1857 } else {
1858 // return X-Y move offset
1859 return GNEMoveOffset(moveOffset.x(), moveOffset.y());
1860 }
1861}
1862
1863
1864void
1866 // declare move operation
1867 GNEMoveOperation* moveOperation = nullptr;
1868 // first move all selected junctions
1869 const auto selectedJunctions = myViewNet->getNet()->getAttributeCarriers()->getSelectedJunctions();
1870 // iterate over selected junctions
1871 for (const auto& junction : selectedJunctions) {
1872 moveOperation = junction->getMoveElement()->getMoveOperation();
1873 if (moveOperation) {
1874 myMoveOperations.push_back(moveOperation);
1875 }
1876 }
1877 // now move all selected edges
1878 const auto selectedEdges = myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
1879 // iterate over selected edges
1880 for (const auto& edge : selectedEdges) {
1881 moveOperation = edge->getMoveElement()->getMoveOperation();
1882 if (moveOperation) {
1883 myMoveOperations.push_back(moveOperation);
1884 }
1885 }
1886}
1887
1888
1889void
1891 // first move all selected junctions
1892 const auto selectedJunctions = myViewNet->getNet()->getAttributeCarriers()->getSelectedJunctions();
1893 // iterate over selected junctions
1894 for (const auto& junction : selectedJunctions) {
1895 GNEMoveOperation* moveOperation = junction->getMoveElement()->getMoveOperation();
1896 if (moveOperation) {
1897 myMoveOperations.push_back(moveOperation);
1898 }
1899 }
1900 // enable moving selected edge flag
1901 myMovingSelectedEdge = true;
1902 // get edge shape
1903 const auto& shape = clickedEdge->getNBEdge()->getGeometry();
1904 // calculate offset based on the clicked edge shape and convex angle
1905 if (clickedEdge->isConvexAngle()) {
1906 myEdgeOffset = shape.nearest_offset_to_point2D(myViewNet->getPositionInformation());
1907 } else {
1908 myEdgeOffset = shape.length2D() - shape.nearest_offset_to_point2D(myViewNet->getPositionInformation());
1909 }
1910 // now move all selected edges
1911 const auto selectedEdges = myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
1912 // iterate over edges between 0 and 180 degrees
1913 for (const auto& edge : selectedEdges) {
1914 GNEMoveOperation* moveOperation = edge->getMoveElement()->getMoveOperation();
1915 // continue if move operation is valid
1916 if (moveOperation) {
1917 myMoveOperations.push_back(moveOperation);
1918 }
1919 }
1920}
1921
1922// ---------------------------------------------------------------------------
1923// GNEViewNetHelper::VehicleOptions - methods
1924// ---------------------------------------------------------------------------
1925
1927 myViewNet(viewNet) {
1928}
1929
1930
1931void
1936
1937
1938void
1942
1943// ---------------------------------------------------------------------------
1944// GNEViewNetHelper::VehicleTypeOptions - methods
1945// ---------------------------------------------------------------------------
1946
1950
1951
1952void
1957
1958
1959void
1963
1964// ---------------------------------------------------------------------------
1965// GNEViewNetHelper::SelectingArea - methods
1966// ---------------------------------------------------------------------------
1967
1969 selectingUsingRectangle(false),
1970 startDrawing(false),
1971 myViewNet(viewNet) {
1972}
1973
1974
1975void
1977 selectingUsingRectangle = true;
1978 selectionCorner1 = myViewNet->getPositionInformation();
1979 selectionCorner2 = selectionCorner1;
1980}
1981
1982
1983void
1985 // start drawing
1986 startDrawing = true;
1987 // only update selection corner 2
1988 selectionCorner2 = myViewNet->getPositionInformation();
1989 // update status bar
1990 myViewNet->setStatusBarText(TL("Selection width:") + toString(fabs(selectionCorner1.x() - selectionCorner2.x()))
1991 + TL(" height:") + toString(fabs(selectionCorner1.y() - selectionCorner2.y()))
1992 + TL(" diagonal:") + toString(selectionCorner1.distanceTo2D(selectionCorner2)));
1993}
1994
1995
1996void
1998 // finish rectangle selection
1999 selectingUsingRectangle = false;
2000 startDrawing = false;
2001 // clear status bar
2002 myViewNet->setStatusBarText("");
2003}
2004
2005
2006void
2008 // shift held down on mouse-down and mouse-up and check that rectangle exist
2009 if ((abs(selectionCorner1.x() - selectionCorner2.x()) > 0.01) &&
2010 (abs(selectionCorner1.y() - selectionCorner2.y()) > 0.01) &&
2011 myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
2012 // create boundary between two corners
2013 Boundary rectangleBoundary;
2014 rectangleBoundary.add(selectionCorner1);
2015 rectangleBoundary.add(selectionCorner2);
2016 // process selection within boundary
2017 processBoundarySelection(rectangleBoundary);
2018 }
2019}
2020
2021
2022std::vector<GNEEdge*>
2024 // shift held down on mouse-down and mouse-up and check that rectangle exist
2025 if ((abs(selectionCorner1.x() - selectionCorner2.x()) > 0.01) &&
2026 (abs(selectionCorner1.y() - selectionCorner2.y()) > 0.01) &&
2027 myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
2028 // create boundary between two corners
2029 Boundary rectangleBoundary;
2030 rectangleBoundary.add(selectionCorner1);
2031 rectangleBoundary.add(selectionCorner2);
2032 // get all elements in boundary
2033 myViewNet->updateObjectsInShape(rectangleBoundary.getShape(false));
2034 // return all edges
2035 return myViewNet->getViewObjectsSelector().getEdges();
2036 } else {
2037 return {};
2038 }
2039}
2040
2041
2042void
2044 if (selectingUsingRectangle) {
2046 glTranslated(0, 0, GLO_RECTANGLESELECTION);
2047 GLHelper::setColor(color);
2048 glLineWidth(2);
2049 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
2050 glBegin(GL_QUADS);
2051 glVertex2d(selectionCorner1.x(), selectionCorner1.y());
2052 glVertex2d(selectionCorner1.x(), selectionCorner2.y());
2053 glVertex2d(selectionCorner2.x(), selectionCorner2.y());
2054 glVertex2d(selectionCorner2.x(), selectionCorner1.y());
2055 glEnd();
2057 }
2058}
2059
2060
2061void
2063 const bool selEdges = myViewNet->myNetworkViewOptions.selectEdges();
2064 // obtain all elements in boundary
2065 myViewNet->updateObjectsInShape(boundary.getShape(false));
2066 // filter ACsInBoundary depending of current supermode
2067 std::vector<GNEAttributeCarrier*> ACsFiltered;
2068 ACsFiltered.reserve(myViewNet->getViewObjectsSelector().getAttributeCarriers().size());
2069 for (const auto& AC : myViewNet->getViewObjectsSelector().getAttributeCarriers()) {
2070 const auto tagProperty = AC->getTagProperty();
2071 if (tagProperty->isNetworkElement() || tagProperty->isAdditionalElement()) {
2072 // filter edges and lanes
2073 if (((tagProperty->getTag() == SUMO_TAG_EDGE) && !selEdges) ||
2074 ((tagProperty->getTag() == SUMO_TAG_LANE) && selEdges)) {
2075 continue;
2076 } else {
2077 ACsFiltered.push_back(AC);
2078 }
2079 } else if (tagProperty->isDemandElement()) {
2080 ACsFiltered.push_back(AC);
2081 } else if (tagProperty->isGenericData()) {
2082 ACsFiltered.push_back(AC);
2083 }
2084 }
2085 // filter ACsInBoundary depending if is locked
2086 std::vector<GNEAttributeCarrier*> ACsFilteredUnlocked;
2087 ACsFilteredUnlocked.reserve(ACsFiltered.size());
2088 for (const auto& AC : ACsFiltered) {
2089 // isGLObjectLockedcheck also if we're in their correspoindient supermode
2090 if (!AC->getGUIGlObject()->isGLObjectLocked()) {
2091 ACsFilteredUnlocked.push_back(AC);
2092 }
2093 }
2094 // declare two sets of attribute carriers, one for select and another for unselect
2095 std::vector<GNEAttributeCarrier*> ACToSelect;
2096 std::vector<GNEAttributeCarrier*> ACToUnselect;
2097 // reserve memory (we assume that in the worst case we're going to insert all elements of ACsInBoundaryFiltered
2098 ACToSelect.reserve(ACsFilteredUnlocked.size());
2099 ACToUnselect.reserve(ACsFilteredUnlocked.size());
2100 // in restrict AND replace mode all current selected attribute carriers will be unselected
2101 const auto modificationMode = myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode();
2103 // obtain selected ACs depending of current supermode
2104 const auto selectedAC = myViewNet->getNet()->getAttributeCarriers()->getSelectedAttributeCarriers(false);
2105 // add id into ACs to unselect
2106 for (const auto& AC : selectedAC) {
2107 ACToUnselect.push_back(AC);
2108 }
2109 }
2110 // iterate over AttributeCarriers obtained of boundary an place it in ACToSelect or ACToUnselect
2111 for (const auto& AC : ACsFilteredUnlocked) {
2112 switch (myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode()) {
2114 ACToUnselect.push_back(AC);
2115 break;
2117 if (std::find(ACToUnselect.begin(), ACToUnselect.end(), AC) != ACToUnselect.end()) {
2118 ACToSelect.push_back(AC);
2119 }
2120 break;
2121 default:
2122 ACToSelect.push_back(AC);
2123 break;
2124 }
2125 }
2126 // select junctions and their connections and crossings if Auto select junctions is enabled (note: only for "add mode")
2127 if (myViewNet->autoSelectNodes() && (myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode() == GNESelectorFrame::ModificationMode::Operation::ADD)) {
2128 std::vector<GNEEdge*> edgesToSelect;
2129 // iterate over ACToSelect and extract edges
2130 for (const auto& AC : ACToSelect) {
2131 if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
2132 edgesToSelect.push_back(dynamic_cast<GNEEdge*>(AC));
2133 }
2134 }
2135 // iterate over extracted edges
2136 for (const auto& edge : edgesToSelect) {
2137 // select junction source and all their connections and crossings
2138 ACToSelect.push_back(edge->getFromJunction());
2139 for (const auto& connection : edge->getFromJunction()->getGNEConnections()) {
2140 ACToSelect.push_back(connection);
2141 }
2142 for (const auto& crossing : edge->getFromJunction()->getGNECrossings()) {
2143 ACToSelect.push_back(crossing);
2144 }
2145 // select junction destination and all their connections crossings
2146 ACToSelect.push_back(edge->getToJunction());
2147 for (const auto& connection : edge->getToJunction()->getGNEConnections()) {
2148 ACToSelect.push_back(connection);
2149 }
2150 for (const auto& crossing : edge->getToJunction()->getGNECrossings()) {
2151 ACToSelect.push_back(crossing);
2152 }
2153 }
2154 }
2155 // only continue if there is ACs to select or unselect
2156 if ((ACToSelect.size() + ACToUnselect.size()) > 0) {
2157 // first unselect AC of ACToUnselect and then selects AC of ACToSelect
2158 myViewNet->myUndoList->begin(GUIIcon::MODESELECT, TL("selection using rectangle"));
2159 for (const auto& AC : ACToUnselect) {
2160 AC->setAttribute(GNE_ATTR_SELECTED, "0", myViewNet->myUndoList);
2161 }
2162 for (const auto& AC : ACToSelect) {
2163 if (AC->getTagProperty()->isSelectable()) {
2164 AC->setAttribute(GNE_ATTR_SELECTED, "1", myViewNet->myUndoList);
2165 }
2166 }
2167 myViewNet->myUndoList->end();
2168 }
2169 myViewNet->makeNonCurrent();
2170}
2171
2172// ---------------------------------------------------------------------------
2173// GNEViewNetHelper::TestingMode - methods
2174// ---------------------------------------------------------------------------
2175
2177 myViewNet(viewNet) {
2178}
2179
2180
2181void
2183 // first check if testing mode is enabled and window size is correct
2184 if (OptionsCont::getOptions().getBool("gui-testing") && OptionsCont::getOptions().isSet("window-size")) {
2185 std::vector<std::string> windowSize = OptionsCont::getOptions().getStringVector("window-size");
2186 // make sure that given windows size has exactly two valid int values
2187 if ((windowSize.size() == 2) && GNEAttributeCarrier::canParse<int>(windowSize[0]) && GNEAttributeCarrier::canParse<int>(windowSize[1])) {
2188 myTestingWidth = GNEAttributeCarrier::parse<int>(windowSize[0]);
2189 myTestingHeight = GNEAttributeCarrier::parse<int>(windowSize[1]);
2190 } else {
2191 WRITE_ERRORF(TL("Invalid windows size-format: %for option 'window-size'"), toString(windowSize));
2192 }
2193 }
2194}
2195
2196
2197void
2199 // first check if testing mode is enabled
2200 if (OptionsCont::getOptions().getBool("gui-testing")) {
2201 // check if main windows has to be resized
2202 if (myTestingWidth > 0) {
2203 mainWindow->resize(myTestingWidth, myTestingHeight);
2204 }
2205 //std::cout << " fixed: view=" << getWidth() << ", " << getHeight() << " app=" << mainWindow->getWidth() << ", " << mainWindow->getHeight() << "\n";
2206 // draw pink square in the upper left corner on top of everything
2207 const double size = myViewNet->p2m(32);
2208 Position center = myViewNet->screenPos2NetPos(8, 8);
2209 // magenta
2212 glTranslated(center.x(), center.y(), GLO_TESTELEMENT);
2213 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2214 glBegin(GL_QUADS);
2215 glVertex2d(0, 0);
2216 glVertex2d(0, -size);
2217 glVertex2d(size, -size);
2218 glVertex2d(size, 0);
2219 glEnd();
2221 // blue
2224 glTranslated(center.x(), center.y(), GLO_TESTELEMENT + 1);
2225 glScaled(0.7, 0.7, 0);
2226 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2227 glBegin(GL_QUADS);
2228 glVertex2d(0, 0);
2229 glVertex2d(0, -size);
2230 glVertex2d(size, -size);
2231 glVertex2d(size, 0);
2232 glEnd();
2234 // yellow
2237 glTranslated(center.x(), center.y(), GLO_TESTELEMENT + 2);
2238 glScaled(0.4, 0.4, 0);
2239 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2240 glBegin(GL_QUADS);
2241 glVertex2d(0, 0);
2242 glVertex2d(0, -size);
2243 glVertex2d(size, -size);
2244 glVertex2d(size, 0);
2245 glEnd();
2247 }
2248}
2249
2250// ---------------------------------------------------------------------------
2251// GNEViewNetHelper::SaveElements - methods
2252// ---------------------------------------------------------------------------
2253
2255 myViewNet(viewNet) {
2256}
2257
2258
2260 delete mySaveIndividualFilesPopup;
2261}
2262
2263
2264void
2266 // get save element grip
2267 auto gripSaveElements = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().saveElements;
2268 // get tooltip menu
2269 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2270 // create save sumo config button
2271 mySaveNeteditConfig = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
2272 std::string("\t") + TL("Save Netedit Config") + std::string("\t") + TL("Save Netedit Config. (Ctrl+Shift+E)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_NETEDITCONFIG),
2273 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_E_SAVENETEDITCONFIG, GUIDesignButtonToolbar);
2274 mySaveNeteditConfig->create();
2275 // create save sumo config button
2276 mySaveSumoConfig = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
2277 std::string("\t") + TL("Save Sumo Config") + std::string("\t") + TL("Save Sumo Config. (Ctrl+Shift+S)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_SUMOCONFIG),
2278 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_S_SAVESUMOCONFIG, GUIDesignButtonToolbar);
2279 mySaveSumoConfig->create();
2280 // create save network button
2281 mySaveNetwork = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
2282 std::string("\t") + TL("Save network") + std::string("\t") + TL("Save network. (Ctrl+S)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_NETWORKELEMENTS),
2283 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK, GUIDesignButtonToolbar);
2284 mySaveNetwork->create();
2285 // create popup for save individual files
2286 mySaveIndividualFilesPopup = new FXPopup(gripSaveElements, POPUP_VERTICAL);
2287 mySaveIndividualFilesPopup->create();
2288 // create save individual files button
2289 mySaveIndividualFiles = new MFXMenuButtonTooltip(gripSaveElements, tooltipMenu,
2290 std::string("\t") + TL("Save individual files") + std::string("\t") + TL("Save individual files."),
2291 GUIIconSubSys::getIcon(GUIIcon::SAVE_MULTIPLE), mySaveIndividualFilesPopup, nullptr, GUIDesignButtonToolbarLocator);
2292 mySaveIndividualFiles->create();
2293 // create save additional elements button
2294 mySaveAdditionalElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2295 std::string("\t") + TL("Save additional elements") + std::string("\t") + TL("Save additional elements. (Ctrl+Shift+A)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_ADDITIONALELEMENTS),
2296 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_A_SAVEADDITIONALELEMENTS, GUIDesignButtonPopup);
2297 mySaveAdditionalElements->create();
2298 // create save demand elements button
2299 mySaveDemandElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2300 std::string("\t") + TL("Save demand elements") + std::string("\t") + TL("Save demand elements. (Ctrl+Shift+D)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_DEMANDELEMENTS),
2301 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_D_SAVEDEMANDELEMENTS, GUIDesignButtonPopup);
2302 mySaveDemandElements->create();
2303 // create save data elements button
2304 mySaveDataElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2305 std::string("\t") + TL("Save data elements") + std::string("\t") + TL("Save data elements. (Ctrl+Shift+B)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_DATAELEMENTS),
2306 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_B_SAVEDATAELEMENTS, GUIDesignButtonPopup);
2307 mySaveDataElements->create();
2308 // create save mean datas elements button
2309 mySaveMeanDataElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
2310 std::string("\t") + TL("Save mean data elements") + std::string("\t") + TL("Save mean data elements. (Ctrl+Shift+M)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_MEANDATAELEMENTS),
2311 myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_M_SAVEMEANDATAELEMENTS, GUIDesignButtonPopup);
2312 mySaveMeanDataElements->create();
2313 // recalc menu bar because there is new elements
2314 gripSaveElements->recalc();
2315 // show menu bar modes
2316 gripSaveElements->show();
2317}
2318
2319
2320void
2322 if (value) {
2323 mySaveIndividualFiles->enable();
2324 } else {
2325 mySaveIndividualFiles->disable();
2326 }
2327}
2328
2329// ---------------------------------------------------------------------------
2330// GNEViewNetHelper::TimeFormat - methods
2331// ---------------------------------------------------------------------------
2332
2334 myViewNet(viewNet) {
2335}
2336
2337
2338void
2340 // create save sumo config button
2341 mySwitchButton = new MFXButtonTooltip(myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().timeSwitch,
2342 myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
2343 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,
2344 myViewNet->getViewParent()->getGNEAppWindows(), MID_GNE_TOGGLE_TIMEFORMAT, GUIDesignButtonToolbar);
2345 mySwitchButton->create();
2346}
2347
2348
2349void
2359
2360
2361void
2363 if (gHumanReadableTime) {
2364 mySwitchButton->setText("H");
2365 } else {
2366 mySwitchButton->setText("S");
2367 }
2368}
2369
2370// ---------------------------------------------------------------------------
2371// GNEViewNetHelper::EditModes - methods
2372// ---------------------------------------------------------------------------
2373
2375 currentSupermode(Supermode::NETWORK),
2376 networkEditMode(NetworkEditMode::NETWORK_INSPECT),
2377 demandEditMode(DemandEditMode::DEMAND_INSPECT),
2378 dataEditMode(DataEditMode::DATA_INSPECT),
2379 myViewNet(viewNet) {
2380 auto& neteditOptions = OptionsCont::getOptions();
2381 // if new option is enabled, start in create edge mode
2382 if (neteditOptions.getBool("new")) {
2384 neteditOptions.resetWritable();
2385 neteditOptions.set("new", "false");
2386 }
2387}
2388
2389
2391 delete myNeteditViewsPopup;
2392}
2393
2394
2395void
2397 // grip supermodes
2398 auto gripSupermodes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().superModes;
2399 // static toolTip menu
2400 auto toolTipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2401 // create network button
2402 networkButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
2403 TL("Network") + std::string("\t") + TL("Edit network elements") + std::string("\t") + TL("Set mode for editing network elements. (F2)"),
2405 networkButton->create();
2406 // create demand button
2407 demandButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
2408 TL("Demand") + std::string("\t") + TL("Edit traffic demand elements") + std::string("\t") + TL("Set mode for editing traffic demand. (F3)"),
2410 demandButton->create();
2411 // create data button
2412 dataButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
2413 TL("Data") + std::string("\t") + TL("Edit data elements") + std::string("\t") + TL("Set mode for editing data demand. (F4)"),
2415 dataButton->create();
2416 // build the views popup
2417 myNeteditViewsPopup = new FXPopup(gripSupermodes, POPUP_VERTICAL);
2418 myNeteditViewsPopup->create();
2419 // build views button
2420 myNeteditViewsButton = new MFXMenuButtonTooltip(gripSupermodes, toolTipMenu,
2421 (std::string("\t") + TL("Change netedit view") + std::string("\t") + TL("Change netedit view.")).c_str(),
2423 myNeteditViewsButton->create();
2424 // build default view button
2425 myDefaultViewButton = new MFXButtonTooltip(myNeteditViewsPopup, toolTipMenu,
2426 (std::string("Default\t") + TL("Set default view") + std::string("\t") + TL("Set default view.")).c_str(),
2428 myDefaultViewButton->create();
2429 // build jupedsim view button
2430 myJuPedSimViewButton = new MFXButtonTooltip(myNeteditViewsPopup, toolTipMenu,
2431 (std::string("JuPedSim\t") + TL("Set JuPedSim view") + std::string("\t") + TL("Set JuPedSim view.")).c_str(),
2433 myJuPedSimViewButton->create();
2434 myNeteditViewsPopup->recalc();
2435 // set width (grip + 3 large buttons + icon button)
2436 gripSupermodes->setWidth(353);
2437 // show menu bar modes
2438 gripSupermodes->show();
2439}
2440
2441
2442void
2444 if (!force && (supermode == currentSupermode)) {
2445 myViewNet->setStatusBarText(TL("Mode already selected"));
2446 if (myViewNet->myCurrentFrame != nullptr) {
2447 myViewNet->myCurrentFrame->focusUpperElement();
2448 }
2449 } else {
2450 myViewNet->setStatusBarText("");
2451 // abort current operation
2452 myViewNet->abortOperation(false);
2453 // set super mode
2454 currentSupermode = supermode;
2455 // set supermodes
2456 if (supermode == Supermode::NETWORK) {
2457 // change buttons
2458 networkButton->setChecked(true);
2459 demandButton->setChecked(false);
2460 dataButton->setChecked(false);
2461 // show network buttons
2462 myViewNet->myNetworkCheckableButtons.showNetworkCheckableButtons();
2463 // hide demand buttons
2464 myViewNet->myDemandCheckableButtons.hideDemandCheckableButtons();
2465 // hide data buttons
2466 myViewNet->myDataCheckableButtons.hideDataCheckableButtons();
2467 // force update network mode
2468 setNetworkEditMode(networkEditMode, true);
2469 } else if (supermode == Supermode::DEMAND) {
2470 // change buttons
2471 networkButton->setChecked(false);
2472 demandButton->setChecked(true);
2473 dataButton->setChecked(false);
2474 // hide network buttons
2475 myViewNet->myNetworkCheckableButtons.hideNetworkCheckableButtons();
2476 // show demand buttons
2477 myViewNet->myDemandCheckableButtons.showDemandCheckableButtons();
2478 // hide data buttons
2479 myViewNet->myDataCheckableButtons.hideDataCheckableButtons();
2480 // force update demand mode
2481 setDemandEditMode(demandEditMode, true);
2482 // demand modes require ALWAYS a recomputing
2483 myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
2484 // check if update path calculator
2485 if (!myViewNet->myNet->getDemandPathManager()->getPathCalculator()->isPathCalculatorUpdated()) {
2486 // update path calculator of demand path manager
2487 myViewNet->myNet->getDemandPathManager()->getPathCalculator()->updatePathCalculator();
2488 // compute all demand elements
2489 myViewNet->myNet->computeDemandElements(myViewNet->myViewParent->getGNEAppWindows());
2490 }
2491 } else if (supermode == Supermode::DATA) {
2492 // change buttons
2493 networkButton->setChecked(false);
2494 demandButton->setChecked(false);
2495 dataButton->setChecked(true);
2496 // hide network buttons
2497 myViewNet->myNetworkCheckableButtons.hideNetworkCheckableButtons();
2498 // hide demand buttons
2499 myViewNet->myDemandCheckableButtons.hideDemandCheckableButtons();
2500 // show data buttons
2501 myViewNet->myDataCheckableButtons.showDataCheckableButtons();
2502 // force update data mode
2503 setDataEditMode(dataEditMode, true);
2504 // check if recompute
2505 if (myViewNet->getViewParent()->getGNEAppWindows()->getProcessingMenuCommands().menuCheckRecomputeDataMode->getCheck() == TRUE) {
2506 // demand modes require ALWAYS a recomputing
2507 myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
2508 }
2509 // reset TAZ contours (due filling)
2510 for (const auto& TAZ : myViewNet->getNet()->getAttributeCarriers()->getAdditionals().at(SUMO_TAG_TAZ)) {
2511 TAZ.second->resetAdditionalContour();
2512 }
2513 }
2514 // update buttons
2515 networkButton->update();
2516 demandButton->update();
2517 dataButton->update();
2518 // update Supermode CommandButtons in GNEAppWindows
2519 myViewNet->myViewParent->getGNEAppWindows()->updateSuperModeMenuCommands(currentSupermode);
2520 }
2521}
2522
2523
2524void
2526 if ((mode == networkEditMode) && !force) {
2527 myViewNet->setStatusBarText(TL("Network mode already selected"));
2528 if (myViewNet->myCurrentFrame != nullptr) {
2529 myViewNet->myCurrentFrame->focusUpperElement();
2530 }
2531 } else if (networkEditMode == NetworkEditMode::NETWORK_TLS && !myViewNet->myViewParent->getTLSEditorFrame()->isTLSSaved()) {
2532 myViewNet->setStatusBarText(TL("Save modifications in TLS before change mode"));
2533 myViewNet->myCurrentFrame->focusUpperElement();
2534 } else {
2535 myViewNet->setStatusBarText("");
2536 myViewNet->abortOperation(false);
2537 // stop editing of custom shapes
2538 myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
2539 // set new Network mode
2540 networkEditMode = mode;
2541 // for common modes (Inspect/Delete/Select/move) change also the other supermode
2542 if (networkEditMode == NetworkEditMode::NETWORK_INSPECT) {
2543 demandEditMode = DemandEditMode::DEMAND_INSPECT;
2544 dataEditMode = DataEditMode::DATA_INSPECT;
2545 } else if (networkEditMode == NetworkEditMode::NETWORK_DELETE) {
2546 demandEditMode = DemandEditMode::DEMAND_DELETE;
2547 dataEditMode = DataEditMode::DATA_DELETE;
2548 } else if (networkEditMode == NetworkEditMode::NETWORK_SELECT) {
2549 demandEditMode = DemandEditMode::DEMAND_SELECT;
2550 dataEditMode = DataEditMode::DATA_SELECT;
2551 } else if (networkEditMode == NetworkEditMode::NETWORK_MOVE) {
2552 demandEditMode = DemandEditMode::DEMAND_MOVE;
2553 }
2554 // certain modes require a recomputing
2555 switch (mode) {
2560 // modes which depend on computed data
2561 myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
2562 break;
2563 default:
2564 break;
2565 }
2566 // update cursors
2567 myViewNet->updateCursor();
2568 // update network mode specific controls
2569 myViewNet->updateNetworkModeSpecificControls();
2570 }
2571}
2572
2573
2574void
2576 if ((mode == demandEditMode) && !force) {
2577 myViewNet->setStatusBarText(TL("Demand mode already selected"));
2578 if (myViewNet->myCurrentFrame != nullptr) {
2579 myViewNet->myCurrentFrame->focusUpperElement();
2580 }
2581 } else {
2582 myViewNet->setStatusBarText("");
2583 myViewNet->abortOperation(false);
2584 // stop editing of custom shapes
2585 myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
2586 // set new Demand mode
2587 demandEditMode = mode;
2588 // for common modes (Inspect/Delete/Select/Move) change also the other supermode
2589 if (demandEditMode == DemandEditMode::DEMAND_INSPECT) {
2590 networkEditMode = NetworkEditMode::NETWORK_INSPECT;
2591 dataEditMode = DataEditMode::DATA_INSPECT;
2592 } else if (demandEditMode == DemandEditMode::DEMAND_DELETE) {
2593 networkEditMode = NetworkEditMode::NETWORK_DELETE;
2594 dataEditMode = DataEditMode::DATA_DELETE;
2595 } else if (demandEditMode == DemandEditMode::DEMAND_SELECT) {
2596 networkEditMode = NetworkEditMode::NETWORK_SELECT;
2597 dataEditMode = DataEditMode::DATA_SELECT;
2598 } else if (demandEditMode == DemandEditMode::DEMAND_MOVE) {
2599 networkEditMode = NetworkEditMode::NETWORK_MOVE;
2600 }
2601 // update cursors
2602 myViewNet->updateCursor();
2603 // update network mode specific controls
2604 myViewNet->updateDemandModeSpecificControls();
2605 }
2606}
2607
2608
2609void
2611 if ((mode == dataEditMode) && !force) {
2612 myViewNet->setStatusBarText(TL("Data mode already selected"));
2613 if (myViewNet->myCurrentFrame != nullptr) {
2614 myViewNet->myCurrentFrame->focusUpperElement();
2615 }
2616 } else {
2617 myViewNet->setStatusBarText("");
2618 myViewNet->abortOperation(false);
2619 // stop editing of custom shapes
2620 myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
2621 // set new Data mode
2622 dataEditMode = mode;
2623 // for common modes (Inspect/Delete/Select/Move) change also the other supermode
2624 if (dataEditMode == DataEditMode::DATA_INSPECT) {
2625 networkEditMode = NetworkEditMode::NETWORK_INSPECT;
2626 demandEditMode = DemandEditMode::DEMAND_INSPECT;
2627 } else if (dataEditMode == DataEditMode::DATA_DELETE) {
2628 networkEditMode = NetworkEditMode::NETWORK_DELETE;
2629 demandEditMode = DemandEditMode::DEMAND_DELETE;
2630 } else if (dataEditMode == DataEditMode::DATA_SELECT) {
2631 networkEditMode = NetworkEditMode::NETWORK_SELECT;
2632 demandEditMode = DemandEditMode::DEMAND_SELECT;
2633 }
2634 // update all datasets
2635 for (const auto& dataSet : myViewNet->getNet()->getAttributeCarriers()->getDataSets()) {
2636 dataSet.second->updateAttributeColors();
2637 }
2638 // update cursors
2639 myViewNet->updateCursor();
2640 // update network mode specific controls
2641 myViewNet->updateDataModeSpecificControls();
2642 }
2643}
2644
2645
2646bool
2648 return (currentSupermode == Supermode::NETWORK);
2649}
2650
2651
2652bool
2654 return (currentSupermode == Supermode::DEMAND);
2655}
2656
2657
2658bool
2660 return (currentSupermode == Supermode::DATA);
2661}
2662
2663
2664void
2666 // grip supermodes
2667 auto gripSupermodes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().superModes;
2668 // file menu commands
2669 auto& fileMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getFileMenuCommands();
2670 // continue depending of selector
2671 if (sel == MID_GNE_VIEW_DEFAULT) {
2672 myNeteditViewsButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT));
2673 gripSupermodes->setWidth(353);
2674 // show menu commands
2675 fileMenuCommands.setDefaultView();
2676 } else if (sel == MID_GNE_VIEW_JUPEDSIM) {
2677 myNeteditViewsButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM));
2678 gripSupermodes->setWidth(250);
2679 // hide menu commands
2680 fileMenuCommands.setJuPedSimView();
2681 }
2682 // update viewNet
2683 myViewNet->viewUpdated();
2684}
2685
2686
2687bool
2689 return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT);
2690}
2691
2692
2693bool
2695 return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM);
2696}
2697
2698// ---------------------------------------------------------------------------
2699// GNEViewNetHelper::NetworkViewOptions - methods
2700// ---------------------------------------------------------------------------
2701
2705
2706
2707void
2709 // get grip modes
2710 auto gripModes = myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().modes;
2711 // static toolTip menu
2712 auto toolTipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2713 // create menu checks
2714 menuCheckToggleGrid = new MFXCheckableButton(false, gripModes, toolTipMenu,
2715 (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)")),
2718 menuCheckToggleGrid->setChecked(false);
2719 menuCheckToggleGrid->create();
2720
2721 menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, toolTipMenu,
2722 (std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
2725 menuCheckToggleDrawJunctionShape->setChecked(false);
2726 menuCheckToggleDrawJunctionShape->create();
2727
2728 menuCheckDrawSpreadVehicles = new MFXCheckableButton(false, gripModes, toolTipMenu,
2729 (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.")),
2732 menuCheckDrawSpreadVehicles->setChecked(false);
2733 menuCheckDrawSpreadVehicles->create();
2734
2735 menuCheckShowDemandElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
2736 (std::string("\t") + TL("Show demand elements") + std::string("\t") + TL("Toggle show demand elements.")),
2739 menuCheckShowDemandElements->setChecked(false);
2740 menuCheckShowDemandElements->create();
2741
2742 menuCheckSelectEdges = new MFXCheckableButton(false, gripModes, toolTipMenu,
2743 (std::string("\t") + TL("Clicks target lanes") + std::string("\t") + TL("Toggle whether clicking should inspect/select/delete lanes instead of edges.")),
2746 menuCheckSelectEdges->create();
2747
2748 menuCheckShowConnections = new MFXCheckableButton(false, gripModes, toolTipMenu,
2749 (std::string("\t") + TL("Show connections over junctions") + std::string("\t") + TL("Toggle show connections over junctions.")),
2752 menuCheckShowConnections->setChecked(myViewNet->getVisualisationSettings().showLane2Lane);
2753 menuCheckShowConnections->create();
2754
2755 menuCheckHideConnections = new MFXCheckableButton(false, gripModes, toolTipMenu,
2756 (std::string("\t") + TL("Hide connections") + std::string("\t") + TL("Toggle hide connections.")),
2759 menuCheckHideConnections->setChecked(false);
2760 menuCheckHideConnections->create();
2761
2762 menuCheckShowAdditionalSubElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
2763 (std::string("\t") + TL("Show additional sub-elements") + std::string("\t") + TL("Toggle show additional sub-elements.")),
2766 menuCheckShowAdditionalSubElements->setChecked(false);
2767 menuCheckShowAdditionalSubElements->create();
2768
2769 menuCheckShowTAZElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
2770 (std::string("\t") + TL("Show TAZ elements") + std::string("\t") + TL("Toggle show TAZ elements.")),
2773 menuCheckShowTAZElements->setChecked(false);
2774 menuCheckShowTAZElements->create();
2775
2776 menuCheckExtendSelection = new MFXCheckableButton(false, gripModes, toolTipMenu,
2777 (std::string("\t") + TL("Automatic select junctions") + std::string("\t") + TL("Toggle whether selecting multiple edges should automatically select their junctions.")),
2780 menuCheckExtendSelection->setChecked(true);
2781 menuCheckExtendSelection->create();
2782
2783 menuCheckChangeAllPhases = new MFXCheckableButton(false, gripModes, toolTipMenu,
2784 (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.")),
2787 menuCheckChangeAllPhases->setChecked(false);
2788 menuCheckChangeAllPhases->create();
2789
2790 menuCheckMergeAutomatically = new MFXCheckableButton(false, gripModes, toolTipMenu,
2791 (std::string("\t") + TL("Automatic merging junction") + std::string("\t") + TL("Toggle ask for confirmation before merging junction.")),
2794 menuCheckMergeAutomatically->create();
2795
2796 menuCheckChainEdges = new MFXCheckableButton(false, gripModes, toolTipMenu,
2797 (std::string("\t") + TL("Edge chain mode") + std::string("\t") + TL("Create consecutive edges with a single click (hit ESC to cancel chain).")),
2800 menuCheckChainEdges->setChecked(false);
2801 menuCheckChainEdges->create();
2802
2803 menuCheckAutoOppositeEdge = new MFXCheckableButton(false, gripModes, toolTipMenu,
2804 (std::string("\t") + TL("Edge opposite direction") + std::string("\t") + TL("Automatically create an edge in the opposite direction.")),
2807 menuCheckAutoOppositeEdge->setChecked(false);
2808 menuCheckAutoOppositeEdge->create();
2809
2810 menuCheckMoveElevation = new MFXCheckableButton(false, gripModes, toolTipMenu,
2811 (std::string("\t") + TL("Move elevation") + std::string("\t") + TL("Apply mouse movement to elevation instead of x,y position.")),
2814 menuCheckMoveElevation->setChecked(false);
2815 menuCheckMoveElevation->create();
2816
2817 menuCheckShowJunctionBubble = new MFXCheckableButton(false, gripModes, toolTipMenu,
2818 (std::string("\t") + TL("Show bubbles") + std::string("\t") + TL("Toggle show bubbles over junctions shapes.")),
2821 menuCheckShowJunctionBubble->setChecked(false);
2822 menuCheckShowJunctionBubble->create();
2823
2824 // always recalc after creating new elements
2825 gripModes->recalc();
2826}
2827
2828
2829void
2831 menuCheckToggleGrid->hide();
2832 menuCheckToggleDrawJunctionShape->hide();
2833 menuCheckDrawSpreadVehicles->hide();
2834 menuCheckShowDemandElements->hide();
2835 menuCheckSelectEdges->hide();
2836 menuCheckShowConnections->hide();
2837 menuCheckHideConnections->hide();
2838 menuCheckShowAdditionalSubElements->hide();
2839 menuCheckShowTAZElements->hide();
2840 menuCheckExtendSelection->hide();
2841 menuCheckChangeAllPhases->hide();
2842 menuCheckMergeAutomatically->hide();
2843 menuCheckShowJunctionBubble->hide();
2844 menuCheckMoveElevation->hide();
2845 menuCheckChainEdges->hide();
2846 menuCheckAutoOppositeEdge->hide();
2847}
2848
2849
2850void
2851GNEViewNetHelper::NetworkViewOptions::getVisibleNetworkMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
2852 // save visible menu commands in commands vector
2853 if (menuCheckToggleGrid->shown()) {
2854 commands.push_back(menuCheckToggleGrid);
2855 }
2856 if (menuCheckToggleDrawJunctionShape->shown()) {
2857 commands.push_back(menuCheckToggleDrawJunctionShape);
2858 }
2859 if (menuCheckDrawSpreadVehicles->shown()) {
2860 commands.push_back(menuCheckDrawSpreadVehicles);
2861 }
2862 if (menuCheckShowDemandElements->shown()) {
2863 commands.push_back(menuCheckShowDemandElements);
2864 }
2865 if (menuCheckSelectEdges->shown()) {
2866 commands.push_back(menuCheckSelectEdges);
2867 }
2868 if (menuCheckShowConnections->shown()) {
2869 commands.push_back(menuCheckShowConnections);
2870 }
2871 if (menuCheckHideConnections->shown()) {
2872 commands.push_back(menuCheckHideConnections);
2873 }
2874 if (menuCheckShowAdditionalSubElements->shown()) {
2875 commands.push_back(menuCheckShowAdditionalSubElements);
2876 }
2877 if (menuCheckShowTAZElements->shown()) {
2878 commands.push_back(menuCheckShowTAZElements);
2879 }
2880 if (menuCheckExtendSelection->shown()) {
2881 commands.push_back(menuCheckExtendSelection);
2882 }
2883 if (menuCheckChangeAllPhases->shown()) {
2884 commands.push_back(menuCheckChangeAllPhases);
2885 }
2886 if (menuCheckMergeAutomatically->shown()) {
2887 commands.push_back(menuCheckMergeAutomatically);
2888 }
2889 if (menuCheckChainEdges->shown()) {
2890 commands.push_back(menuCheckChainEdges);
2891 }
2892 if (menuCheckAutoOppositeEdge->shown()) {
2893 commands.push_back(menuCheckAutoOppositeEdge);
2894 }
2895 if (menuCheckMoveElevation->shown()) {
2896 commands.push_back(menuCheckMoveElevation);
2897 }
2898 if (menuCheckShowJunctionBubble->shown()) {
2899 commands.push_back(menuCheckShowJunctionBubble);
2900 }
2901}
2902
2903
2904bool
2906 return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
2907}
2908
2909
2910bool
2912 if (menuCheckShowDemandElements->shown()) {
2913 return (menuCheckShowDemandElements->amChecked() == TRUE);
2914 } else {
2915 // by default, if menuCheckShowDemandElements isn't shown, always show demand elements
2916 return true;
2917 }
2918}
2919
2920
2921bool
2923 if (menuCheckSelectEdges->shown()) {
2924 return (menuCheckSelectEdges->amChecked() != TRUE);
2925 } else {
2926 // by default, if menuCheckSelectEdges isn't shown, always select edges
2927 return true;
2928 }
2929}
2930
2931
2932bool
2934 if (myViewNet->myEditModes.isCurrentSupermodeData()) {
2935 return false;
2936 } else if (myViewNet->myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
2937 // check if menu check hide connections ins shown
2938 return (menuCheckHideConnections->amChecked() == FALSE);
2939 } else if (myViewNet->myEditModes.networkEditMode == NetworkEditMode::NETWORK_PROHIBITION) {
2940 return true;
2941 } else if (myViewNet->myEditModes.isCurrentSupermodeNetwork() && menuCheckShowConnections->shown() == false) {
2942 return false;
2943 } else {
2944 return (myViewNet->getVisualisationSettings().showLane2Lane);
2945 }
2946}
2947
2948
2949bool
2951 if (!myViewNet->myEditModes.isCurrentSupermodeNetwork()) {
2952 return false;
2953 } else if (menuCheckShowAdditionalSubElements->shown() == false) {
2954 return false;
2955 } else {
2956 return menuCheckShowAdditionalSubElements->amChecked();
2957 }
2958}
2959
2960
2961bool
2963 if (!myViewNet->myEditModes.isCurrentSupermodeNetwork()) {
2964 return false;
2965 } else if (menuCheckShowTAZElements->shown() == false) {
2966 return false;
2967 } else {
2968 return menuCheckShowTAZElements->amChecked();
2969 }
2970}
2971
2972
2973bool
2975 if (menuCheckMoveElevation->shown()) {
2976 return (menuCheckMoveElevation->amChecked() == TRUE);
2977 } else {
2978 return false;
2979 }
2980}
2981
2982// ---------------------------------------------------------------------------
2983// GNEViewNetHelper::DemandViewOptions - methods
2984// ---------------------------------------------------------------------------
2985
2987 myViewNet(viewNet) {
2988}
2989
2990
2991void
2993 // get grip modes
2994 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
2995 // get tooltip menu
2996 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
2997 // create menu checks
2998 menuCheckToggleGrid = new MFXCheckableButton(false, gripModes, tooltipMenu,
2999 (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)")),
3002 menuCheckToggleGrid->setChecked(false);
3003 menuCheckToggleGrid->create();
3004
3005 menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, tooltipMenu,
3006 (std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
3009 menuCheckToggleDrawJunctionShape->setChecked(false);
3010 menuCheckToggleDrawJunctionShape->create();
3011
3012 menuCheckDrawSpreadVehicles = new MFXCheckableButton(false, gripModes, tooltipMenu,
3013 (std::string("\t") + TL("Draw vehicles spread/depart position") + std::string("\t") + TL("Draw vehicles spread in lane or in depart position.")),
3016 menuCheckDrawSpreadVehicles->setChecked(false);
3017 menuCheckDrawSpreadVehicles->create();
3018
3019 menuCheckHideShapes = new MFXCheckableButton(false, gripModes, tooltipMenu,
3020 (std::string("\t") + TL("Show shapes") + std::string("\t") + TL("Toggle show shapes (Polygons and POIs).")),
3023 menuCheckHideShapes->setChecked(false);
3024 menuCheckHideShapes->create();
3025
3026 menuCheckShowAllTrips = new MFXCheckableButton(false, gripModes, tooltipMenu,
3027 (std::string("\t") + TL("Show all trips") + std::string("\t") + TL("Toggle show all trips (requires updated demand - F5).")),
3030 menuCheckShowAllTrips->setChecked(false);
3031 menuCheckShowAllTrips->create();
3032
3033 menuCheckShowAllPersonPlans = new MFXCheckableButton(false, gripModes, tooltipMenu,
3034 (std::string("\t") + TL("Show all person plans") + std::string("\t") + TL("Toggle show all person plans.")),
3037 menuCheckShowAllPersonPlans->setChecked(false);
3038 menuCheckShowAllPersonPlans->create();
3039
3040 menuCheckLockPerson = new MFXCheckableButton(false, gripModes, tooltipMenu,
3041 (std::string("\t") + TL("Lock selected person") + std::string("\t") + TL("Toggle lock selected person.")),
3044 menuCheckLockPerson->setChecked(false);
3045 menuCheckLockPerson->create();
3046
3047 menuCheckShowAllContainerPlans = new MFXCheckableButton(false, gripModes, tooltipMenu,
3048 (std::string("\t") + TL("Show all containers plans") + std::string("\t") + TL("Toggle show all container plans.")),
3051 menuCheckShowAllContainerPlans->setChecked(false);
3052 menuCheckShowAllContainerPlans->create();
3053
3054 menuCheckLockContainer = new MFXCheckableButton(false, gripModes, tooltipMenu,
3055 (std::string("\t") + TL("Lock selected container") + std::string("\t") + TL("Toggle lock selected container.")),
3058 menuCheckLockContainer->setChecked(false);
3059 menuCheckLockContainer->create();
3060
3061 menuCheckHideNonInspectedDemandElements = new MFXCheckableButton(false, gripModes, tooltipMenu,
3062 (std::string("\t") + TL("Show non-inspected demand elements") + std::string("\t") + TL("Toggle show non-inspected demand elements.")),
3065 menuCheckHideNonInspectedDemandElements->setChecked(false);
3066 menuCheckHideNonInspectedDemandElements->create();
3067
3068 menuCheckShowOverlappedRoutes = new MFXCheckableButton(false, gripModes, tooltipMenu,
3069 (std::string("\t") + TL("Show number of overlapped routes") + std::string("\t") + TL("Toggle show number of overlapped routes.")),
3072 menuCheckShowOverlappedRoutes->setChecked(false);
3073 menuCheckShowOverlappedRoutes->create();
3074
3075 // always recalc after creating new elements
3076 gripModes->recalc();
3077}
3078
3079
3080void
3082 menuCheckToggleGrid->hide();
3083 menuCheckToggleDrawJunctionShape->hide();
3084 menuCheckDrawSpreadVehicles->hide();
3085 menuCheckHideShapes->hide();
3086 menuCheckShowAllTrips->hide();
3087 menuCheckShowAllPersonPlans->hide();
3088 menuCheckLockPerson->hide();
3089 menuCheckShowAllContainerPlans->hide();
3090 menuCheckLockContainer->hide();
3091 menuCheckHideNonInspectedDemandElements->hide();
3092 menuCheckShowOverlappedRoutes->hide();
3093}
3094
3095
3096void
3097GNEViewNetHelper::DemandViewOptions::getVisibleDemandMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
3098 // save visible menu commands in commands vector
3099 if (menuCheckToggleGrid->shown()) {
3100 commands.push_back(menuCheckToggleGrid);
3101 }
3102 if (menuCheckToggleDrawJunctionShape->shown()) {
3103 commands.push_back(menuCheckToggleDrawJunctionShape);
3104 }
3105 if (menuCheckDrawSpreadVehicles->shown()) {
3106 commands.push_back(menuCheckDrawSpreadVehicles);
3107 }
3108 if (menuCheckHideShapes->shown()) {
3109 commands.push_back(menuCheckHideShapes);
3110 }
3111 if (menuCheckShowAllTrips->shown()) {
3112 commands.push_back(menuCheckShowAllTrips);
3113 }
3114 if (menuCheckShowAllPersonPlans->shown() && menuCheckShowAllPersonPlans->isEnabled()) {
3115 commands.push_back(menuCheckShowAllPersonPlans);
3116 }
3117 if (menuCheckLockPerson->shown() && menuCheckLockPerson->isEnabled()) {
3118 commands.push_back(menuCheckLockPerson);
3119 }
3120 if (menuCheckShowAllContainerPlans->shown() && menuCheckShowAllContainerPlans->isEnabled()) {
3121 commands.push_back(menuCheckShowAllContainerPlans);
3122 }
3123 if (menuCheckLockContainer->shown() && menuCheckLockContainer->isEnabled()) {
3124 commands.push_back(menuCheckLockContainer);
3125 }
3126 if (menuCheckHideNonInspectedDemandElements->shown()) {
3127 commands.push_back(menuCheckHideNonInspectedDemandElements);
3128 }
3129 if (menuCheckShowOverlappedRoutes->shown()) {
3130 commands.push_back(menuCheckShowOverlappedRoutes);
3131 }
3132}
3133
3134
3135bool
3137 return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
3138}
3139
3140
3141bool
3143 if (menuCheckHideNonInspectedDemandElements->shown()) {
3144 const auto& inspectedElements = myViewNet->getInspectedElements();
3145 // check conditions
3146 if ((menuCheckHideNonInspectedDemandElements->amChecked() == FALSE) || (inspectedElements.getFirstAC() == nullptr)) {
3147 // if checkbox is disabled or there isn't an inspected element, then return true
3148 return true;
3149 } else if (inspectedElements.getFirstAC() && inspectedElements.getFirstAC()->getTagProperty()->isDemandElement()) {
3150 if (inspectedElements.isACInspected(demandElement)) {
3151 // if inspected element correspond to demandElement, return true
3152 return true;
3153 } else {
3154 // if demandElement is a route, check if dottedAC is one of their children (Vehicle or Stop)
3155 for (const auto& demandElementChild : demandElement->getChildDemandElements()) {
3156 if (inspectedElements.isACInspected(demandElementChild)) {
3157 return true;
3158 }
3159 }
3160 // if demandElement is a vehicle, check if dottedAC is one of his route Parent
3161 for (const auto& demandElementParent : demandElement->getParentDemandElements()) {
3162 if (inspectedElements.isACInspected(demandElementParent)) {
3163 return true;
3164 }
3165 }
3166 // dottedAC isn't one of their parent, then return false
3167 return false;
3168 }
3169 } else {
3170 // we're inspecting a demand element, then return true
3171 return true;
3172 }
3173 } else {
3174 // we're inspecting a demand element, then return true
3175 return true;
3176 }
3177}
3178
3179
3180bool
3182 if (menuCheckHideShapes->shown()) {
3183 return (menuCheckHideShapes->amChecked() == FALSE);
3184 } else {
3185 return true;
3186 }
3187}
3188
3189
3190bool
3192 return (menuCheckShowAllTrips->amChecked() == TRUE);
3193}
3194
3195
3196bool
3198 if (menuCheckShowAllPersonPlans->isEnabled()) {
3199 return (menuCheckShowAllPersonPlans->amChecked() == TRUE);
3200 } else {
3201 return false;
3202 }
3203}
3204
3205
3206void
3208 myLockedPerson = person;
3209}
3210
3211
3212void
3214 myLockedPerson = nullptr;
3215}
3216
3217
3218const GNEDemandElement*
3220 return myLockedPerson;
3221}
3222
3223
3224bool
3226 if (menuCheckShowAllContainerPlans->isEnabled()) {
3227 return (menuCheckShowAllContainerPlans->amChecked() == TRUE);
3228 } else {
3229 return false;
3230 }
3231}
3232
3233
3234void
3236 myLockedContainer = container;
3237}
3238
3239
3240void
3242 myLockedContainer = nullptr;
3243}
3244
3245
3246bool
3248 if (menuCheckShowOverlappedRoutes->isEnabled()) {
3249 return (menuCheckShowOverlappedRoutes->amChecked() == TRUE);
3250 } else {
3251 return false;
3252 }
3253}
3254
3255
3256const GNEDemandElement*
3258 return myLockedContainer;
3259}
3260
3261// ---------------------------------------------------------------------------
3262// GNEViewNetHelper::DataViewOptions - methods
3263// ---------------------------------------------------------------------------
3264
3266 myViewNet(viewNet) {
3267}
3268
3269
3270void
3272 // get grip modes
3273 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3274 // get tooltip menu
3275 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3276 // create menu checks
3277 menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, tooltipMenu,
3278 (std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
3281 menuCheckToggleDrawJunctionShape->setChecked(false);
3282 menuCheckToggleDrawJunctionShape->create();
3283
3284 menuCheckShowAdditionals = new MFXCheckableButton(false, gripModes, tooltipMenu,
3285 (std::string("\t") + TL("Show additionals") + std::string("\t") + TL("Toggle show additionals.")),
3288 menuCheckShowAdditionals->create();
3289
3290 menuCheckShowShapes = new MFXCheckableButton(false, gripModes, tooltipMenu,
3291 (std::string("\t") + TL("Show shapes") + std::string("\t") + TL("Toggle show shapes (Polygons and POIs).")),
3294 menuCheckShowShapes->create();
3295
3296 menuCheckShowDemandElements = new MFXCheckableButton(false, gripModes, tooltipMenu,
3297 (std::string("\t") + TL("Show demand elements") + std::string("\t") + TL("Toggle show demand elements.")),
3300 menuCheckShowDemandElements->create();
3301
3302 menuCheckToggleTAZRelDrawing = new MFXCheckableButton(false, gripModes, tooltipMenu,
3303 (std::string("\t") + TL("Draw TAZREL drawing mode") + std::string("\t") + TL("Toggle draw TAZREL drawing mode.")),
3306 menuCheckToggleTAZRelDrawing->create();
3307
3308 menuCheckToggleTAZDrawFill = new MFXCheckableButton(false, gripModes, tooltipMenu,
3309 (std::string("\t") + TL("Toggle draw TAZ fill") + std::string("\t") + TL("Toggle draw TAZ fill")),
3312 menuCheckToggleTAZDrawFill->create();
3313
3314 menuCheckToggleTAZRelOnlyFrom = new MFXCheckableButton(false, gripModes, tooltipMenu,
3315 (std::string("\t") + TL("Toggle draw TAZRel only from") + std::string("\t") + TL("Toggle draw TAZRel only from")),
3318 menuCheckToggleTAZRelOnlyFrom->create();
3319
3320 menuCheckToggleTAZRelOnlyTo = new MFXCheckableButton(false, gripModes, tooltipMenu,
3321 (std::string("\t") + TL("Toggle draw TAZRel only to") + std::string("\t") + TL("Toggle draw TAZRel only to")),
3324 menuCheckToggleTAZRelOnlyTo->create();
3325
3326 // always recalc after creating new elements
3327 gripModes->recalc();
3328}
3329
3330
3331void
3333 menuCheckToggleDrawJunctionShape->hide();
3334 menuCheckShowAdditionals->hide();
3335 menuCheckShowShapes->hide();
3336 menuCheckShowDemandElements->hide();
3337 menuCheckToggleTAZRelDrawing->hide();
3338 menuCheckToggleTAZDrawFill->hide();
3339 menuCheckToggleTAZRelOnlyFrom->hide();
3340 menuCheckToggleTAZRelOnlyTo->hide();
3341}
3342
3343
3344void
3345GNEViewNetHelper::DataViewOptions::getVisibleDataMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
3346 // save visible menu commands in commands vector
3347 if (menuCheckToggleDrawJunctionShape->shown()) {
3348 commands.push_back(menuCheckToggleDrawJunctionShape);
3349 }
3350 if (menuCheckShowAdditionals->shown()) {
3351 commands.push_back(menuCheckShowAdditionals);
3352 }
3353 if (menuCheckShowShapes->shown()) {
3354 commands.push_back(menuCheckShowShapes);
3355 }
3356 if (menuCheckShowDemandElements->shown()) {
3357 commands.push_back(menuCheckShowDemandElements);
3358 }
3359 if (menuCheckToggleTAZRelDrawing->shown()) {
3360 commands.push_back(menuCheckToggleTAZRelDrawing);
3361 }
3362 if (menuCheckToggleTAZDrawFill->shown()) {
3363 commands.push_back(menuCheckToggleTAZDrawFill);
3364 }
3365 if (menuCheckToggleTAZRelOnlyFrom->shown()) {
3366 commands.push_back(menuCheckToggleTAZRelOnlyFrom);
3367 }
3368 if (menuCheckToggleTAZRelOnlyTo->shown()) {
3369 commands.push_back(menuCheckToggleTAZRelOnlyTo);
3370 }
3371}
3372
3373
3374bool
3376 if (menuCheckShowAdditionals->shown()) {
3377 return (menuCheckShowAdditionals->amChecked() == TRUE);
3378 } else {
3379 return true;
3380 }
3381}
3382
3383
3384bool
3386 if (menuCheckShowShapes->shown()) {
3387 return (menuCheckShowShapes->amChecked() == TRUE);
3388 } else {
3389 return true;
3390 }
3391}
3392
3393
3394bool
3396 if (menuCheckShowDemandElements->shown()) {
3397 return (menuCheckShowDemandElements->amChecked() == TRUE);
3398 } else {
3399 return true;
3400 }
3401}
3402
3403
3404bool
3406 return (menuCheckToggleTAZRelDrawing->amChecked() != TRUE);
3407}
3408
3409
3410bool
3412 if (menuCheckToggleTAZDrawFill->shown()) {
3413 return (menuCheckToggleTAZDrawFill->amChecked() != TRUE);
3414 } else {
3415 return false;
3416 }
3417}
3418
3419
3420bool
3422 if (menuCheckToggleTAZRelOnlyFrom->shown()) {
3423 return (menuCheckToggleTAZRelOnlyFrom->amChecked() != TRUE);
3424 } else {
3425 return false;
3426 }
3427}
3428
3429
3430bool
3432 if (menuCheckToggleTAZRelOnlyTo->shown()) {
3433 return (menuCheckToggleTAZRelOnlyTo->amChecked() != TRUE);
3434 } else {
3435 return false;
3436 }
3437}
3438
3439// ---------------------------------------------------------------------------
3440// GNEViewNetHelper::IntervalBar - methods
3441// ---------------------------------------------------------------------------
3442
3444 myViewNet(viewNet) {
3445}
3446
3447
3448void
3450 const auto staticTooltip = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3451 // create interval label
3452 FXLabel* genericDataLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3453 TL("Data type"), 0, GUIDesignLabelThickedFixed(100));
3454 genericDataLabel->create();
3455 // create combo box for generic datas
3456 myGenericDataTypesComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3457 staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed, myViewNet,
3459 myGenericDataTypesComboBox->create();
3460 // fill combo box
3461 myGenericDataTypesComboBox->appendIconItem("<all>");
3462 myGenericDataTypesComboBox->appendIconItem(toString(GNE_TAG_EDGEREL_SINGLE).c_str());
3463 myGenericDataTypesComboBox->appendIconItem(toString(SUMO_TAG_EDGEREL).c_str());
3464 myGenericDataTypesComboBox->appendIconItem(toString(SUMO_TAG_TAZREL).c_str());
3465 // create dataSet label
3466 FXLabel* dataSetLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3467 TL("Data sets"), 0, GUIDesignLabelThickedFixed(100));
3468 dataSetLabel->create();
3469 // create combo box for sets
3470 myDataSetsComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3471 staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed,
3473 myDataSetsComboBox->create();
3474 // create checkbutton for myLimitByInterval
3475 myIntervalCheckBox = new FXCheckButton(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3477 myIntervalCheckBox->create();
3478 // create textfield for begin
3479 myBeginTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3481 myBeginTextField->create();
3482 // create text field for end
3483 myEndTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3485 myEndTextField->create();
3486 // create parameter label
3487 FXLabel* parameterLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3488 TL("Parameter"), 0, GUIDesignLabelThickedFixed(100));
3489 parameterLabel->create();
3490 // create combo box for attributes
3491 myParametersComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3492 staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed,
3494 myParametersComboBox->create();
3495 // always recalc after creating new elements
3496 myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->recalc();
3497}
3498
3499
3500void
3502 // first update interval bar
3503 updateIntervalBar();
3504 // show toolbar grip
3505 myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->show();
3506}
3507
3508
3509void
3511 // hide toolbar grip
3512 myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->hide();
3513}
3514
3515
3516void
3518 // check if intervalBar has to be updated
3519 if (myUpdateInterval && myViewNet->getNet()) {
3520 // clear data sets
3521 myDataSets.clear();
3522 // declare intervals
3523 double begin = INVALID_DOUBLE;
3524 double end = INVALID_DOUBLE;
3525 // clear parameters
3526 myParameters.clear();
3527 // iterate over all data elements
3528 for (const auto& dataSet : myViewNet->getNet()->getAttributeCarriers()->getDataSets()) {
3529 // add data set ID
3530 myDataSets.push_back(dataSet.second->getID());
3531 // iterate over all intervals
3532 for (const auto& interval : dataSet.second->getDataIntervalChildren()) {
3533 // set intervals
3534 if ((begin == INVALID_DOUBLE) || (interval.first < begin)) {
3535 begin = interval.first;
3536 }
3537 if ((end == INVALID_DOUBLE) || (interval.first > end)) {
3538 end = interval.first;
3539 }
3540 // iterate over all generic datas
3541 for (const auto& genericData : interval.second->getGenericDataChildren()) {
3542 // iterate over parameters
3543 for (const auto& parameter : genericData->getParametersMap()) {
3544 myParameters.insert(parameter.first);
3545 }
3546 }
3547 }
3548 }
3549 // get previous dataSet
3550 const std::string previousDataSet = myDataSetsComboBox->getText().text();
3551 // get previous interval
3552 const std::string previousBegin = (myIntervalCheckBox->getCheck() == TRUE) ? myBeginTextField->getText().text() : "";
3553 const std::string previousEnd = (myIntervalCheckBox->getCheck() == TRUE) ? myEndTextField->getText().text() : "";
3554 // get previous parameter
3555 const std::string previousParameter = myParametersComboBox->getText().text();
3556 // clear comboBoxes
3557 myDataSetsComboBox->clearItems();
3558 myParametersComboBox->clearItems();
3559 // add first item (all)
3560 myDataSetsComboBox->appendIconItem("<all>");
3561 myParametersComboBox->appendIconItem("<all>");
3562 // fill dataSet comboBox
3563 for (const auto& dataSet : myDataSets) {
3564 myDataSetsComboBox->appendIconItem(dataSet.c_str());
3565 }
3566 // set begin/end
3567 myBeginTextField->setText(toString(begin).c_str());
3568 myEndTextField->setText(toString(end).c_str());
3569 // fill parameter comboBox
3570 for (const auto& parameter : myParameters) {
3571 myParametersComboBox->appendIconItem(parameter.c_str());
3572 }
3573 // check previous dataSet
3574 myDataSetsComboBox->setCurrentItem(0, FALSE);
3575 for (int i = 0; i < myDataSetsComboBox->getNumItems(); i++) {
3576 if (myDataSetsComboBox->getItemText(i) == previousDataSet) {
3577 myDataSetsComboBox->setCurrentItem(i);
3578 }
3579 }
3580 // set previous interval
3581 if (myIntervalCheckBox->getCheck() == TRUE) {
3582 myBeginTextField->setText(previousBegin.c_str());
3583 myEndTextField->setText(previousEnd.c_str());
3584 }
3585 // check previous parameter
3586 myParametersComboBox->setCurrentItem(0, FALSE);
3587 for (int i = 0; i < myParametersComboBox->getNumItems(); i++) {
3588 if (myParametersComboBox->getItemText(i) == previousParameter) {
3589 myParametersComboBox->setCurrentItem(i);
3590 }
3591 }
3592 // check if enable or disable
3593 if ((myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_INSPECT) ||
3594 (myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_SELECT) ||
3595 (myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_DELETE)) {
3596 enableIntervalBar();
3597 } else {
3598 disableIntervalBar();
3599 }
3600 // intervalBar updated, then change flag
3601 myUpdateInterval = false;
3602 }
3603}
3604
3605
3606void
3608 myUpdateInterval = true;
3609}
3610
3611
3614 if (myGenericDataTypesComboBox->isEnabled() && (myGenericDataTypesComboBox->getTextColor() == GUIDesignTextColorBlack)) {
3615 if (myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) {
3617 } else if (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_EDGEREL).c_str()) {
3618 return SUMO_TAG_EDGEREL;
3619 } else if (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_TAZREL).c_str()) {
3620 return SUMO_TAG_TAZREL;
3621 }
3622 }
3623 return SUMO_TAG_NOTHING;
3624}
3625
3626
3629 if (!myDataSetsComboBox->isEnabled() ||
3630 (myDataSetsComboBox->getCurrentItem() == 0) ||
3631 (myDataSetsComboBox->getTextColor() == GUIDesignTextColorRed)) {
3632 return nullptr;
3633 } else {
3634 return myViewNet->getNet()->getAttributeCarriers()->retrieveDataSet(myDataSetsComboBox->getText().text());
3635 }
3636}
3637
3638
3639double
3641 if (!myIntervalCheckBox->isEnabled() || (myIntervalCheckBox->getCheck() == FALSE)) {
3642 return INVALID_DOUBLE;
3643 } else {
3644 return GNEAttributeCarrier::parse<double>(myBeginTextField->getText().text());
3645 }
3646}
3647
3648
3649double
3651 if (!myIntervalCheckBox->isEnabled() || (myIntervalCheckBox->getCheck() == FALSE)) {
3652 return INVALID_DOUBLE;
3653 } else {
3654 return GNEAttributeCarrier::parse<double>(myEndTextField->getText().text());
3655 }
3656}
3657
3658
3659std::string
3661 if (!myParametersComboBox->isEnabled() ||
3662 (myParametersComboBox->getCurrentItem() == 0) ||
3663 (myParametersComboBox->getTextColor() == GUIDesignTextColorRed)) {
3664 return "";
3665 } else {
3666 return myParametersComboBox->getText().text();
3667 }
3668}
3669
3670
3671void
3673 if ((myGenericDataTypesComboBox->getText() == "<all>") ||
3674 (myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) ||
3675 (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_EDGEREL).c_str()) ||
3676 (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_TAZREL).c_str())) {
3677 myGenericDataTypesComboBox->setTextColor(GUIDesignTextColorBlack);
3678 } else {
3679 myGenericDataTypesComboBox->setTextColor(GUIDesignTextColorRed);
3680 }
3681 // update view net
3682 myViewNet->updateViewNet();
3683}
3684
3685
3686void
3688 // check if exist
3689 if (std::find(myDataSets.begin(), myDataSets.end(), myDataSetsComboBox->getText().text()) != myDataSets.end()) {
3690 myDataSetsComboBox->setTextColor(GUIDesignTextColorBlack);
3691 } else {
3692 myDataSetsComboBox->setTextColor(GUIDesignTextColorRed);
3693 }
3694 // update view net
3695 myViewNet->updateViewNet();
3696}
3697
3698
3699void
3701 // enable or disable text fields
3702 if (myIntervalCheckBox->isEnabled() && (myIntervalCheckBox->getCheck() == TRUE)) {
3703 myBeginTextField->enable();
3704 myEndTextField->enable();
3705 } else {
3706 myBeginTextField->disable();
3707 myEndTextField->disable();
3708 }
3709 // update view net
3710 myViewNet->updateViewNet();
3711}
3712
3713
3714void
3716 if (myBeginTextField->getText().empty()) {
3717 myBeginTextField->setText(toString(myViewNet->getNet()->getDataSetIntervalMinimumBegin()).c_str());
3718 myBeginTextField->setTextColor(GUIDesignTextColorBlack);
3719 } else if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text())) {
3720 myBeginTextField->setTextColor(GUIDesignTextColorBlack);
3721 } else {
3722 myBeginTextField->setTextColor(GUIDesignTextColorRed);
3723 }
3724 // update view net
3725 myViewNet->updateViewNet();
3726}
3727
3728
3729void
3731 if (myEndTextField->getText().empty()) {
3732 myEndTextField->setText(toString(myViewNet->getNet()->getDataSetIntervalMaximumEnd()).c_str());
3733 myEndTextField->setTextColor(GUIDesignTextColorBlack);
3734 } else if (GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {
3735 myEndTextField->setTextColor(GUIDesignTextColorBlack);
3736 } else {
3737 myEndTextField->setTextColor(GUIDesignTextColorRed);
3738 }
3739 // update view net
3740 myViewNet->updateViewNet();
3741}
3742
3743
3744void
3746 // check if exist
3747 if (myParameters.count(myParametersComboBox->getText().text()) > 0) {
3748 myParametersComboBox->setTextColor(GUIDesignTextColorBlack);
3749 } else {
3750 myParametersComboBox->setTextColor(GUIDesignTextColorRed);
3751 }
3752 // update view net
3753 myViewNet->updateViewNet();
3754}
3755
3756
3757
3758void
3760 // enable elements
3761 myGenericDataTypesComboBox->enable();
3762 myDataSetsComboBox->enable();
3763 myIntervalCheckBox->enable();
3764 if (myIntervalCheckBox->getCheck() == TRUE) {
3765 myBeginTextField->enable();
3766 myEndTextField->enable();
3767 } else {
3768 myBeginTextField->disable();
3769 myEndTextField->disable();
3770 }
3771 myParametersComboBox->enable();
3772}
3773
3774
3775void
3777 // disable all elements
3778 myGenericDataTypesComboBox->disable();
3779 myDataSetsComboBox->disable();
3780 myIntervalCheckBox->disable();
3781 myBeginTextField->disable();
3782 myEndTextField->disable();
3783 myParametersComboBox->disable();
3784}
3785
3786// ---------------------------------------------------------------------------
3787// GNEViewNetHelper::CommonCheckableButtons - methods
3788// ---------------------------------------------------------------------------
3789
3793
3794
3795void
3797 // get grip modes
3798 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3799 // get tooltip menu
3800 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3801 // inspect button
3802 inspectButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3803 std::string("\t") + TL("Inspect mode") + std::string("\t") + TL("Mode to inspect elements and change their attributes. (I)"),
3805 inspectButton->create();
3806 // delete button
3807 deleteButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3808 std::string("\t") + TL("Delete mode") + std::string("\t") + TL("Mode for deleting elements. (D)"),
3810 deleteButton->create();
3811 // select button
3812 selectButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3813 std::string("\t") + TL("Select mode") + std::string("\t") + TL("Mode for selecting elements. (S)"),
3815 selectButton->create();
3816 // always recalc menu bar after creating new elements
3817 gripModes->recalc();
3818}
3819
3820
3821void
3823 inspectButton->show();
3824 deleteButton->show();
3825 selectButton->show();
3826}
3827
3828
3829void
3831 inspectButton->hide();
3832 deleteButton->hide();
3833 selectButton->hide();
3834}
3835
3836
3837void
3839 inspectButton->setChecked(false);
3840 deleteButton->setChecked(false);
3841 selectButton->setChecked(false);
3842}
3843
3844
3845void
3847 inspectButton->update();
3848 deleteButton->update();
3849 selectButton->update();
3850}
3851
3852// ---------------------------------------------------------------------------
3853// GNEViewNetHelper::NetworkCheckableButtons - methods
3854// ---------------------------------------------------------------------------
3855
3859
3860
3861void
3863 // get grip modes
3864 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
3865 // get tooltip menu
3866 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
3867 // move button
3868 moveNetworkElementsButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3869 std::string("\t") + TL("Move mode") + std::string("\t") + TL("Mode for moving elements. (M)"),
3871 moveNetworkElementsButton->create();
3872 // create edge
3873 createEdgeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3874 std::string("\t") + TL("Edge mode") + std::string("\t") + TL("Mode for creating junctions and edges. (E)"),
3876 createEdgeButton->create();
3877 // traffic light mode
3878 trafficLightButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3879 std::string("\t") + TL("Traffic light mode") + std::string("\t") + TL("Mode for editing traffic lights over junctions. (T)"),
3881 trafficLightButton->create();
3882 // connection mode
3883 connectionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3884 std::string("\t") + TL("Connection mode") + std::string("\t") + TL("Mode for edit connections between lanes. (C)"),
3886 connectionButton->create();
3887 // prohibition mode
3888 prohibitionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3889 std::string("\t") + TL("Prohibition mode") + std::string("\t") + TL("Mode for editing connection prohibitions. (H)"),
3891 prohibitionButton->create();
3892 // crossing mode
3893 crossingButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3894 std::string("\t") + TL("Crossing mode") + std::string("\t") + TL("Mode for creating crossings between edges. (R)"),
3896 crossingButton->create();
3897 // additional mode
3898 additionalButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3899 std::string("\t") + TL("Additional mode") + std::string("\t") + TL("Mode for creating additional elements. (A)"),
3901 additionalButton->create();
3902 // wire mode
3903 wireButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3904 std::string("\t") + TL("Wire mode") + std::string("\t") + TL("Mode for editing overhead wires. (W)"),
3906 wireButton->create();
3907 // TAZ Mode
3908 TAZButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3909 std::string("\t") + TL("TAZ mode") + std::string("\t") + TL("Mode for creating Traffic Assignment Zones. (Z)"),
3911 TAZButton->create();
3912 // shape mode
3913 shapeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3914 std::string("\t") + TL("Polygon mode") + std::string("\t") + TL("Mode for creating polygons and POIs. (P)"),
3916 shapeButton->create();
3917 // decal mode
3918 decalButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
3919 std::string("\t") + TL("Decal mode") + std::string("\t") + TL("Mode for editing decals. (U)"),
3921 decalButton->create();
3922 // always recalc after creating new elements
3923 gripModes->recalc();
3924}
3925
3926
3927void
3929 // continue depending of view
3930 if (myViewNet->getEditModes().isJuPedSimView()) {
3931 moveNetworkElementsButton->show();
3932 createEdgeButton->show();
3933 connectionButton->hide();
3934 trafficLightButton->hide();
3935 additionalButton->show();
3936 crossingButton->show();
3937 TAZButton->show();
3938 shapeButton->show();
3939 prohibitionButton->hide();
3940 wireButton->hide();
3941 decalButton->hide();
3942 } else {
3943 moveNetworkElementsButton->show();
3944 createEdgeButton->show();
3945 connectionButton->show();
3946 trafficLightButton->show();
3947 additionalButton->show();
3948 crossingButton->show();
3949 TAZButton->show();
3950 shapeButton->show();
3951 prohibitionButton->show();
3952 wireButton->show();
3953 decalButton->show();
3954 }
3955}
3956
3957
3958void
3960 moveNetworkElementsButton->hide();
3961 createEdgeButton->hide();
3962 connectionButton->hide();
3963 trafficLightButton->hide();
3964 additionalButton->hide();
3965 crossingButton->hide();
3966 TAZButton->hide();
3967 shapeButton->hide();
3968 prohibitionButton->hide();
3969 wireButton->hide();
3970 decalButton->hide();
3971}
3972
3973
3974void
3976 moveNetworkElementsButton->setChecked(false);
3977 createEdgeButton->setChecked(false);
3978 connectionButton->setChecked(false);
3979 trafficLightButton->setChecked(false);
3980 additionalButton->setChecked(false);
3981 crossingButton->setChecked(false);
3982 TAZButton->setChecked(false);
3983 shapeButton->setChecked(false);
3984 prohibitionButton->setChecked(false);
3985 wireButton->setChecked(false);
3986 decalButton->setChecked(false);
3987}
3988
3989
3990void
3992 moveNetworkElementsButton->update();
3993 createEdgeButton->update();
3994 connectionButton->update();
3995 trafficLightButton->update();
3996 additionalButton->update();
3997 crossingButton->update();
3998 TAZButton->update();
3999 shapeButton->update();
4000 prohibitionButton->update();
4001 wireButton->update();
4002 decalButton->update();
4003}
4004
4005// ---------------------------------------------------------------------------
4006// GNEViewNetHelper::DemandCheckableButtons - methods
4007// ---------------------------------------------------------------------------
4008
4012
4013
4014void
4016 // get grip modes
4017 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
4018 // get tooltip menu
4019 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
4020 // move button
4021 moveDemandElementsButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4022 std::string("\t") + TL("Move mode") + std::string("\t") + TL("Mode for moving elements. (M)"),
4024 moveDemandElementsButton->create();
4025 // route mode
4026 routeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4027 std::string("\t") + TL("Route mode") + std::string("\t") + TL("Mode for creating routes. (R)"),
4029 routeButton->create();
4030 // rout distribution mode
4031 routeDistributionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4032 std::string("\t") + TL("Route distribution mode") + std::string("\t") + TL("Mode for creating and editing rout distributions. (W)"),
4034 routeDistributionButton->create();
4035 // vehicle mode
4036 vehicleButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4037 std::string("\t") + TL("Vehicle mode") + std::string("\t") + TL("Mode for creating vehicles. (V)"),
4039 vehicleButton->create();
4040 // type mode
4041 typeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4042 std::string("\t") + TL("Type mode") + std::string("\t") + TL("Mode for creating types (of vehicles, persons and containers). (T)"),
4044 typeButton->create();
4045 // type distribution mode
4046 typeDistributionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4047 std::string("\t") + TL("Type distribution mode") + std::string("\t") + TL("Mode for creating and editing type distribution. (U)"),
4049 typeDistributionButton->create();
4050 // stop mode
4051 stopButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4052 std::string("\t") + TL("Stop mode") + std::string("\t") + TL("Mode for creating stops. (A)"),
4054 stopButton->create();
4055 // person mode
4056 personButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4057 std::string("\t") + TL("Person mode") + std::string("\t") + TL("Mode for creating persons. (P)"),
4059 personButton->create();
4060 // person plan mode
4061 personPlanButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4062 std::string("\t") + TL("Person plan mode") + std::string("\t") + TL("Mode for creating person plans. (L)"),
4064 personPlanButton->create();
4065 // container mode
4066 containerButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4067 std::string("\t") + TL("Container mode") + std::string("\t") + TL("Mode for creating containers. (C)"),
4069 containerButton->create();
4070 // container plan mode
4071 containerPlanButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4072 std::string("\t") + TL("Container plan mode") + std::string("\t") + TL("Mode for creating container plans. (H)"),
4074 containerPlanButton->create();
4075 // always recalc after creating new elements
4076 gripModes->recalc();
4077}
4078
4079
4080void
4082 if (myViewNet->getEditModes().isJuPedSimView()) {
4083 moveDemandElementsButton->hide();
4084 routeButton->show();
4085 routeDistributionButton->show();
4086 vehicleButton->hide();
4087 typeButton->show();
4088 typeDistributionButton->show();
4089 stopButton->hide();
4090 personButton->show();
4091 personPlanButton->show();
4092 containerButton->hide();
4093 containerPlanButton->hide();
4094 } else {
4095 moveDemandElementsButton->show();
4096 routeButton->show();
4097 routeDistributionButton->show();
4098 vehicleButton->show();
4099 typeButton->show();
4100 typeDistributionButton->show();
4101 stopButton->show();
4102 personButton->show();
4103 personPlanButton->show();
4104 containerButton->show();
4105 containerPlanButton->show();
4106 }
4107}
4108
4109
4110void
4112 moveDemandElementsButton->hide();
4113 routeButton->hide();
4114 routeDistributionButton->hide();
4115 vehicleButton->hide();
4116 typeButton->hide();
4117 typeDistributionButton->hide();
4118 stopButton->hide();
4119 personButton->hide();
4120 personPlanButton->hide();
4121 containerButton->hide();
4122 containerPlanButton->hide();
4123}
4124
4125
4126void
4128 moveDemandElementsButton->setChecked(false);
4129 routeButton->setChecked(false);
4130 routeDistributionButton->setChecked(false);
4131 vehicleButton->setChecked(false);
4132 typeButton->setChecked(false);
4133 typeDistributionButton->setChecked(false);
4134 stopButton->setChecked(false);
4135 personButton->setChecked(false);
4136 personPlanButton->setChecked(false);
4137 containerButton->setChecked(false);
4138 containerPlanButton->setChecked(false);
4139}
4140
4141
4142void
4144 moveDemandElementsButton->update();
4145 routeButton->update();
4146 routeDistributionButton->update();
4147 vehicleButton->update();
4148 typeButton->update();
4149 typeDistributionButton->update();
4150 stopButton->update();
4151 personButton->update();
4152 personPlanButton->update();
4153 containerButton->update();
4154 containerPlanButton->update();
4155}
4156
4157// ---------------------------------------------------------------------------
4158// GNEViewNetHelper::DataCheckableButtons - methods
4159// ---------------------------------------------------------------------------
4160
4164
4165
4166void
4168 // get grip modes
4169 auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
4170 // get tooltip menu
4171 auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
4172 // edgeData mode
4173 edgeDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4174 std::string("\t") + TL("Edge data mode") + std::string("\t") + TL("Mode for creating edge datas. (E)"),
4176 edgeDataButton->create();
4177 // edgeRelData mode
4178 edgeRelDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4179 std::string("\t") + TL("Edge relation data mode") + std::string("\t") + TL("Mode for creating edge relation datas. (R)"),
4181 edgeRelDataButton->create();
4182 // TAZRelData mode
4183 TAZRelDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4184 std::string("\t") + TL("TAZ relation data mode") + std::string("\t") + TL("Mode for creating TAZ relation datas. (Z)"),
4186 TAZRelDataButton->create();
4187 // meanData button
4188 meanDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
4189 std::string("\t") + TL("MeanData mode") + std::string("\t") + TL("Mode for MeanData elements. (M)"),
4191 meanDataButton->create();
4192 // always recalc after creating new elements
4193 gripModes->recalc();
4194}
4195
4196
4197void
4199 edgeDataButton->show();
4200 edgeRelDataButton->show();
4201 TAZRelDataButton->show();
4202 meanDataButton->show();
4203}
4204
4205
4206void
4208 edgeDataButton->hide();
4209 edgeRelDataButton->hide();
4210 TAZRelDataButton->hide();
4211 meanDataButton->hide();
4212}
4213
4214
4215void
4217 edgeDataButton->setChecked(false);
4218 edgeRelDataButton->setChecked(false);
4219 TAZRelDataButton->setChecked(false);
4220 meanDataButton->setChecked(false);
4221}
4222
4223
4224void
4226 edgeDataButton->update();
4227 edgeRelDataButton->update();
4228 TAZRelDataButton->update();
4229 meanDataButton->update();
4230}
4231
4232// ---------------------------------------------------------------------------
4233// GNEViewNetHelper::EditNetworkElementShapes - methods
4234// ---------------------------------------------------------------------------
4235
4237 myViewNet(viewNet),
4238 myPreviousNetworkEditMode(NetworkEditMode::NETWORK_NONE) {
4239}
4240
4241
4242void
4244 if (element && (myEditedNetworkElement == nullptr)) {
4245 // save current edit mode before starting
4246 myPreviousNetworkEditMode = myViewNet->myEditModes.networkEditMode;
4247 // set move mode
4248 myViewNet->myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_MOVE);
4249 //set editedNetworkElement
4250 myEditedNetworkElement = element;
4251 // enable shape edited flag
4252 myEditedNetworkElement->setShapeEdited(true);
4253 // update view net to show the new editedShapePoly
4254 myViewNet->updateViewNet();
4255 }
4256}
4257
4258
4259void
4261 // stop edit shape junction deleting editedShapePoly
4262 if (myEditedNetworkElement != nullptr) {
4263 // disable shape edited flag
4264 myEditedNetworkElement->setShapeEdited(false);
4265 // reset editedNetworkElement
4266 myEditedNetworkElement = nullptr;
4267 // restore previous edit mode
4268 if (myViewNet->myEditModes.networkEditMode != myPreviousNetworkEditMode) {
4269 myViewNet->myEditModes.setNetworkEditMode(myPreviousNetworkEditMode);
4270 }
4271 }
4272}
4273
4274
4275void
4277 // save edited junction's shape
4278 if (myEditedNetworkElement != nullptr) {
4279 // stop edit custom shape
4280 stopEditCustomShape();
4281 }
4282}
4283
4284
4287 return myEditedNetworkElement;
4288}
4289
4290// ---------------------------------------------------------------------------
4291// GNEViewNetHelper::BlockIcon - methods
4292// ---------------------------------------------------------------------------
4293
4294void
4296 const GNEAttributeCarrier* AC, GUIGlObjectType type, const Position position, const double exaggeration,
4297 const double size, const double offsetx, const double offsety) {
4298 // first check if icon can be drawn
4299 if (checkDrawing(d, AC, type, exaggeration)) {
4300 // Start pushing matrix
4302 // Traslate to position
4303 glTranslated(position.x(), position.y(), GLO_LOCKICON);
4304 // Traslate depending of the offset
4305 glTranslated(offsetx, offsety, 0);
4306 // rotate to avoid draw invert
4307 glRotated(180, 0, 0, 1);
4308 // Set draw color
4309 glColor3d(1, 1, 1);
4310 // Draw lock icon
4312 // Pop matrix
4314 }
4315}
4316
4317
4319
4320
4321bool
4323 GUIGlObjectType type, const double exaggeration) {
4324 // check detail
4326 return false;
4327 }
4328 // get view net
4329 const auto viewNet = AC->getNet()->getViewNet();
4330 // check exaggeration
4331 if (exaggeration == 0) {
4332 return false;
4333 }
4334 // check supermodes
4335 if (viewNet->getEditModes().isCurrentSupermodeNetwork() &&
4337 return false;
4338 }
4339 if (viewNet->getEditModes().isCurrentSupermodeDemand() && (!AC->getTagProperty()->isDemandElement())) {
4340 return false;
4341 }
4342 if (viewNet->getEditModes().isCurrentSupermodeData() && (!AC->getTagProperty()->isDataElement())) {
4343 return false;
4344 }
4345 // check if is locked
4346 if (!viewNet->getLockManager().isObjectLocked(type, AC->isAttributeCarrierSelected())) {
4347 return false;
4348 }
4349 // all ok, then draw
4350 return true;
4351}
4352
4353// ---------------------------------------------------------------------------
4354// GNEViewNetHelper - methods
4355// ---------------------------------------------------------------------------
4356
4357const std::vector<RGBColor>&
4359 // if is empty, fill it
4360 if (myRainbowScaledColors.empty()) {
4361 // fill scale colors (10)
4362 myRainbowScaledColors.push_back(RGBColor(232, 35, 0, 255));
4363 myRainbowScaledColors.push_back(RGBColor(255, 165, 0, 255));
4364 myRainbowScaledColors.push_back(RGBColor(255, 255, 0, 255));
4365 myRainbowScaledColors.push_back(RGBColor(28, 215, 0, 255));
4366 myRainbowScaledColors.push_back(RGBColor(0, 181, 100, 255));
4367 myRainbowScaledColors.push_back(RGBColor(0, 255, 191, 255));
4368 myRainbowScaledColors.push_back(RGBColor(178, 255, 255, 255));
4369 myRainbowScaledColors.push_back(RGBColor(0, 112, 184, 255));
4370 myRainbowScaledColors.push_back(RGBColor(56, 41, 131, 255));
4371 myRainbowScaledColors.push_back(RGBColor(127, 0, 255, 255));
4372 }
4373 return myRainbowScaledColors;
4374}
4375
4376
4377const RGBColor&
4378GNEViewNetHelper::getRainbowScaledColor(const double min, const double max, const double value) {
4379 // check extremes
4380 if (value <= min) {
4381 return getRainbowScaledColors().front();
4382 } else if (value >= max) {
4383 return getRainbowScaledColors().back();
4384 } else {
4385 // calculate value procent between [min, max]
4386 const double procent = ((value - min) * 100) / (max - min);
4387 // check if is valid
4388 if (procent <= 0) {
4389 return getRainbowScaledColors().front();
4390 } else if (procent >= 100) {
4391 return getRainbowScaledColors().back();
4392 } else {
4393 // return scaled color
4394 return getRainbowScaledColors().at((int)(procent / 10.0));
4395 }
4396 }
4397}
4398
4399
4400std::vector<GUIGlObject*>
4401GNEViewNetHelper::filterElementsByLayer(const std::vector<GUIGlObject*>& GLObjects) {
4402 std::vector<GUIGlObject*> filteredGLObjects;
4403 if (GLObjects.size() > 0) {
4404 const auto firstLayer = GLObjects.front()->getType();
4405 for (const auto& GLObject : GLObjects) {
4406 if ((GLO_RIDE <= firstLayer) && (firstLayer <= GLO_TRANSHIP) &&
4407 (GLO_RIDE <= GLObject->getType()) && (GLObject->getType() <= GLO_TRANSHIP)) {
4408 filteredGLObjects.push_back(GLObject);
4409 } else if ((GLO_STOP <= firstLayer) && (firstLayer <= GLO_STOP_PLAN) &&
4410 (GLO_STOP <= GLObject->getType()) && (GLObject->getType() <= GLO_STOP_PLAN)) {
4411 filteredGLObjects.push_back(GLObject);
4412 } else if ((GLO_VEHICLE <= firstLayer) && (firstLayer <= GLO_ROUTEFLOW) &&
4413 (GLO_VEHICLE <= GLObject->getType()) && (GLObject->getType() <= GLO_ROUTEFLOW)) {
4414 filteredGLObjects.push_back(GLObject);
4415 } else if ((GLO_PERSON <= firstLayer) && (firstLayer <= GLO_PERSONFLOW) &&
4416 (GLO_PERSON <= GLObject->getType()) && (GLObject->getType() <= GLO_PERSONFLOW)) {
4417 filteredGLObjects.push_back(GLObject);
4418 } else if ((GLO_CONTAINER <= firstLayer) && (firstLayer <= GLO_CONTAINERFLOW) &&
4419 (GLO_CONTAINER <= GLObject->getType()) && (GLObject->getType() <= GLO_CONTAINERFLOW)) {
4420 filteredGLObjects.push_back(GLObject);
4421 } else if (GLObject->getType() == firstLayer) {
4422 filteredGLObjects.push_back(GLObject);
4423 }
4424 }
4425 }
4426 return filteredGLObjects;
4427}
4428
4429/****************************************************************************/
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:857
@ 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:941
@ MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING
toggle TAZRel drawing
Definition GUIAppEnum.h:965
@ 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:831
@ MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION
move elevation instead of x,y
Definition GUIAppEnum.h:853
@ MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS
hide connections
Definition GUIAppEnum.h:839
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS
show connections
Definition GUIAppEnum.h:837
@ MID_GNE_INTERVALBAR_BEGIN
begin changed in InterbalBar
Definition GUIAppEnum.h:985
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO
toggle draw TAZRel only to
Definition GUIAppEnum.h:971
@ MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:957
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS
show TAZ elements
Definition GUIAppEnum.h:843
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON
lock person
Definition GUIAppEnum.h:943
@ 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:931
@ 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:811
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID
show grid
Definition GUIAppEnum.h:929
@ 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:855
@ MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition GUIAppEnum.h:963
@ 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:937
@ MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS
show additionals
Definition GUIAppEnum.h:959
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES
show junctions as bubbles
Definition GUIAppEnum.h:851
@ MID_GNE_INTERVALBAR_END
end changed in InterbalBar
Definition GUIAppEnum.h:987
@ MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION
extend selection
Definition GUIAppEnum.h:845
@ 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:841
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS
show all container plans
Definition GUIAppEnum.h:945
@ MID_GNE_VIEW_DEFAULT
set default view
Definition GUIAppEnum.h:793
@ MID_HOTKEY_F4_SUPERMODE_DATA
select data supermode in netedit
Definition GUIAppEnum.h:238
@ MID_GNE_VIEW_JUPEDSIM
set juPedSim view
Definition GUIAppEnum.h:795
@ MID_GNE_INTERVALBAR_PARAMETER
parameter changed in InterbalBar
Definition GUIAppEnum.h:989
@ 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:967
@ 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_SHOWDEMANDELEMENTS
show demand elements
Definition GUIAppEnum.h:833
@ 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:935
@ MID_GNE_INTERVALBAR_GENERICDATATYPE
generic data selected
Definition GUIAppEnum.h:979
@ MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY
don't ask before merging junctions
Definition GUIAppEnum.h:849
@ MID_HOTKEY_CTRL_SHIFT_M_SAVEMEANDATAELEMENTS
save Mean Datas
Definition GUIAppEnum.h:216
@ MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES
change all phases
Definition GUIAppEnum.h:847
@ MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES
show shapes
Definition GUIAppEnum.h:961
@ 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:969
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:829
@ MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition GUIAppEnum.h:933
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES
show overlapped routes
Definition GUIAppEnum.h:949
@ 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:981
@ 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:947
@ MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES
select edges
Definition GUIAppEnum.h:835
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS
show all trips
Definition GUIAppEnum.h:939
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID
show grid
Definition GUIAppEnum.h:827
@ MID_GNE_INTERVALBAR_LIMITED
enable/disable show data elements by interval
Definition GUIAppEnum.h:983
@ 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
@ 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_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:46
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:1727
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:755
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:190
static const RGBColor YELLOW
Definition RGBColor.h:191
static const RGBColor MAGENTA
Definition RGBColor.h:193
#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 showConnections() const
check if select show connections checkbox is enabled
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 selectEdges() const
check if select edges 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