Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/GNEViewNetHelper.cpp
193692 views
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
/****************************************************************************/
14
/// @file GNEViewNetHelper.cpp
15
/// @author Jakob Erdmann
16
/// @author Pablo Alvarez Lopez
17
/// @date Feb 2019
18
///
19
// A file used to reduce the size of GNEViewNet.h grouping structs and classes
20
/****************************************************************************/
21
22
#include <netedit/elements/additional/GNEPOI.h>
23
#include <netedit/elements/additional/GNEPoly.h>
24
#include <netedit/elements/additional/GNETAZ.h>
25
#include <netedit/elements/data/GNEDataInterval.h>
26
#include <netedit/elements/data/GNEEdgeData.h>
27
#include <netedit/elements/data/GNEEdgeRelData.h>
28
#include <netedit/elements/data/GNETAZRelData.h>
29
#include <netedit/elements/network/GNEConnection.h>
30
#include <netedit/elements/network/GNECrossing.h>
31
#include <netedit/elements/network/GNEInternalLane.h>
32
#include <netedit/elements/network/GNEWalkingArea.h>
33
#include <netedit/frames/common/GNESelectorFrame.h>
34
#include <netedit/frames/network/GNETLSEditorFrame.h>
35
#include <netedit/GNETagProperties.h>
36
#include <utils/foxtools/MFXMenuCheckIcon.h>
37
#include <utils/gui/div/GLHelper.h>
38
#include <utils/gui/div/GUIDesigns.h>
39
#include <utils/gui/div/GUIGlobalViewObjectsHandler.h>
40
#include <utils/gui/images/GUITextureSubSys.h>
41
#include <utils/options/OptionsCont.h>
42
43
#include "GNEApplicationWindow.h"
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
54
std::vector<RGBColor> GNEViewNetHelper::myRainbowScaledColors;
55
56
// ---------------------------------------------------------------------------
57
// GNEViewNetHelper::LockManager - methods
58
// ---------------------------------------------------------------------------
59
60
GNEViewNetHelper::LockManager::LockManager(GNEViewNet* viewNet) :
61
myViewNet(viewNet) {
62
// fill myLockedElements objects
63
myLockedElements[GLO_JUNCTION] = OperationLocked(Supermode::NETWORK);
64
myLockedElements[GLO_EDGE] = OperationLocked(Supermode::NETWORK);
65
myLockedElements[GLO_LANE] = OperationLocked(Supermode::NETWORK);
66
myLockedElements[GLO_CONNECTION] = OperationLocked(Supermode::NETWORK);
67
myLockedElements[GLO_CROSSING] = OperationLocked(Supermode::NETWORK);
68
myLockedElements[GLO_WALKINGAREA] = OperationLocked(Supermode::NETWORK);
69
myLockedElements[GLO_ADDITIONALELEMENT] = OperationLocked(Supermode::NETWORK);
70
myLockedElements[GLO_WIRE] = OperationLocked(Supermode::NETWORK);
71
myLockedElements[GLO_TAZ] = OperationLocked(Supermode::NETWORK);
72
myLockedElements[GLO_WIRE] = OperationLocked(Supermode::NETWORK);
73
myLockedElements[GLO_POLYGON] = OperationLocked(Supermode::NETWORK);
74
myLockedElements[GLO_POI] = OperationLocked(Supermode::NETWORK);
75
myLockedElements[GLO_JPS_WALKABLEAREA] = OperationLocked(Supermode::NETWORK);
76
myLockedElements[GLO_JPS_OBSTACLE] = OperationLocked(Supermode::NETWORK);
77
// fill myLockedElements objects
78
myLockedElements[GLO_ROUTE] = OperationLocked(Supermode::DEMAND);
79
myLockedElements[GLO_VEHICLE] = OperationLocked(Supermode::DEMAND);
80
myLockedElements[GLO_PERSON] = OperationLocked(Supermode::DEMAND);
81
myLockedElements[GLO_PERSONTRIP] = OperationLocked(Supermode::DEMAND);
82
myLockedElements[GLO_RIDE] = OperationLocked(Supermode::DEMAND);
83
myLockedElements[GLO_WALK] = OperationLocked(Supermode::DEMAND);
84
myLockedElements[GLO_CONTAINER] = OperationLocked(Supermode::DEMAND);
85
myLockedElements[GLO_TRANSPORT] = OperationLocked(Supermode::DEMAND);
86
myLockedElements[GLO_TRANSHIP] = OperationLocked(Supermode::DEMAND);
87
myLockedElements[GLO_STOP] = OperationLocked(Supermode::DEMAND);
88
// fill myLockedElements objects
89
myLockedElements[GLO_EDGEDATA] = OperationLocked(Supermode::DATA);
90
myLockedElements[GLO_EDGERELDATA] = OperationLocked(Supermode::DATA);
91
myLockedElements[GLO_TAZRELDATA] = OperationLocked(Supermode::DATA);
92
}
93
94
95
GNEViewNetHelper::LockManager::~LockManager() {}
96
97
98
bool
99
GNEViewNetHelper::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
129
void
130
GNEViewNetHelper::LockManager::updateFlags() {
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
165
void
166
GNEViewNetHelper::LockManager::updateLockMenuBar() {
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
201
GNEViewNetHelper::LockManager::OperationLocked::OperationLocked():
202
mySupermode(Supermode::NETWORK) {
203
}
204
205
206
GNEViewNetHelper::LockManager::OperationLocked::OperationLocked(Supermode supermode) :
207
mySupermode(supermode) {
208
}
209
210
211
GNEViewNetHelper::LockManager::OperationLocked::~OperationLocked() {}
212
213
214
Supermode
215
GNEViewNetHelper::LockManager::OperationLocked::getSupermode() const {
216
return mySupermode;
217
}
218
219
// ---------------------------------------------------------------------------
220
// GNEViewNetHelper::InspectedElements - methods
221
// ---------------------------------------------------------------------------
222
223
GNEViewNetHelper::InspectedElements::InspectedElements() {}
224
225
226
void
227
GNEViewNetHelper::InspectedElements::inspectAC(GNEAttributeCarrier* AC) {
228
myInspectedACs.clear();
229
if (AC) {
230
myFirstInspectedAC = AC;
231
myInspectedACs.insert(AC);
232
} else {
233
myFirstInspectedAC = nullptr;
234
}
235
}
236
237
238
void
239
GNEViewNetHelper::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
252
void
253
GNEViewNetHelper::InspectedElements::uninspectAC(GNEAttributeCarrier* AC) {
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
267
void
268
GNEViewNetHelper::InspectedElements::clearInspectedElements() {
269
myFirstInspectedAC = nullptr;
270
myInspectedACs.clear();
271
}
272
273
274
GNEAttributeCarrier*
275
GNEViewNetHelper::InspectedElements::getFirstAC() const {
276
return myFirstInspectedAC;
277
}
278
279
280
const std::unordered_set<GNEAttributeCarrier*>&
281
GNEViewNetHelper::InspectedElements::getACs() const {
282
return myInspectedACs;
283
}
284
285
286
bool
287
GNEViewNetHelper::InspectedElements::isACInspected(GNEAttributeCarrier* AC) const {
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
298
bool
299
GNEViewNetHelper::InspectedElements::isACInspected(const GNEAttributeCarrier* AC) const {
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
311
bool
312
GNEViewNetHelper::InspectedElements::isInspectingElements() const {
313
return myInspectedACs.size() > 0;
314
}
315
316
317
bool
318
GNEViewNetHelper::InspectedElements::isInspectingSingleElement() const {
319
return myInspectedACs.size() == 1;
320
}
321
322
323
bool
324
GNEViewNetHelper::InspectedElements::isInspectingMultipleElements() const {
325
return myInspectedACs.size() > 1;
326
}
327
328
// ---------------------------------------------------------------------------
329
// GNEViewNetHelper::MarkFrontElements - methods
330
// ---------------------------------------------------------------------------
331
332
GNEViewNetHelper::MarkFrontElements::MarkFrontElements() {}
333
334
335
const std::unordered_set<GNEAttributeCarrier*>&
336
GNEViewNetHelper::MarkFrontElements::getACs() const {
337
return myMarkedACs;
338
}
339
340
341
void
342
GNEViewNetHelper::MarkFrontElements::unmarkAll() {
343
// make a copy because container is modified in every iteration
344
const auto copy = myMarkedACs;
345
for (auto& AC : copy) {
346
AC->unmarkForDrawingFront();
347
}
348
}
349
350
351
void
352
GNEViewNetHelper::MarkFrontElements::markAC(GNEAttributeCarrier* AC) {
353
myMarkedACs.insert(AC);
354
}
355
356
357
void
358
GNEViewNetHelper::MarkFrontElements::unmarkAC(GNEAttributeCarrier* AC) {
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
371
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsSelector(GNEViewNet* viewNet) :
372
myViewNet(viewNet) {
373
}
374
375
376
void
377
GNEViewNetHelper::ViewObjectsSelector::updateObjects() {
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
386
void
387
GNEViewNetHelper::ViewObjectsSelector::updateMergingJunctions() {
388
myMergingJunctions = gViewObjectsHandler.getMergingJunctions();
389
}
390
391
392
void
393
GNEViewNetHelper::ViewObjectsSelector::fillSumoBaseObject(CommonXMLStructure::SumoBaseObject* baseObjet) const {
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
427
void
428
GNEViewNetHelper::ViewObjectsSelector::filterAllExcept(GUIGlObjectType exception) {
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
440
void
441
GNEViewNetHelper::ViewObjectsSelector::filterBySuperMode() {
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
456
void
457
GNEViewNetHelper::ViewObjectsSelector::filterJunctions() {
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
467
void
468
GNEViewNetHelper::ViewObjectsSelector::filterEdges() {
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
478
void
479
GNEViewNetHelper::ViewObjectsSelector::filterLanes() {
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
489
void
490
GNEViewNetHelper::ViewObjectsSelector::filterConnections() {
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
500
void
501
GNEViewNetHelper::ViewObjectsSelector::filterCrossings() {
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
511
void
512
GNEViewNetHelper::ViewObjectsSelector::filterWalkingAreas() {
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
522
void
523
GNEViewNetHelper::ViewObjectsSelector::filterShapes() {
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
536
void
537
GNEViewNetHelper::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
553
void
554
GNEViewNetHelper::ViewObjectsSelector::filterNetworkElements() {
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
564
void
565
GNEViewNetHelper::ViewObjectsSelector::filterDemandElements(const bool includeRoutes) {
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
579
void
580
GNEViewNetHelper::ViewObjectsSelector::filterDataElements() {
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
597
void
598
GNEViewNetHelper::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) {
602
if (GUIGlObject->isGLObjectLocked()) {
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
622
const GUIGlObject*
623
GNEViewNetHelper::ViewObjectsSelector::getGUIGlObjectFront() const {
624
if (myViewObjects.GUIGlObjects.size() > 0) {
625
return myViewObjects.GUIGlObjects.front();
626
} else {
627
return nullptr;
628
}
629
}
630
631
632
GNEAttributeCarrier*
633
GNEViewNetHelper::ViewObjectsSelector::getAttributeCarrierFront() const {
634
if (myViewObjects.attributeCarriers.size() > 0) {
635
return myViewObjects.attributeCarriers.front();
636
} else {
637
return nullptr;
638
}
639
}
640
641
642
GNENetworkElement*
643
GNEViewNetHelper::ViewObjectsSelector::getNetworkElementFront() const {
644
if (myViewObjects.networkElements.size() > 0) {
645
return myViewObjects.networkElements.front();
646
} else {
647
return nullptr;
648
}
649
}
650
651
652
GNEAdditional*
653
GNEViewNetHelper::ViewObjectsSelector::getAdditionalFront() const {
654
if (myViewObjects.additionals.size() > 0) {
655
return myViewObjects.additionals.front();
656
} else {
657
return nullptr;
658
}
659
}
660
661
662
GNEDemandElement*
663
GNEViewNetHelper::ViewObjectsSelector::getDemandElementFront() const {
664
if (myViewObjects.demandElements.size() > 0) {
665
return myViewObjects.demandElements.front();
666
} else {
667
return nullptr;
668
}
669
}
670
671
672
GNEGenericData*
673
GNEViewNetHelper::ViewObjectsSelector::getGenericDataElementFront() const {
674
if (myViewObjects.genericDatas.size() > 0) {
675
return myViewObjects.genericDatas.front();
676
} else {
677
return nullptr;
678
}
679
}
680
681
682
GNEJunction*
683
GNEViewNetHelper::ViewObjectsSelector::getJunctionFront() const {
684
if (myViewObjects.junctions.size() > 0) {
685
return myViewObjects.junctions.front();
686
} else {
687
return nullptr;
688
}
689
}
690
691
692
GNEEdge*
693
GNEViewNetHelper::ViewObjectsSelector::getEdgeFront() const {
694
if (myViewObjects.edges.size() > 0) {
695
return myViewObjects.edges.front();
696
} else {
697
return nullptr;
698
}
699
}
700
701
702
GNELane*
703
GNEViewNetHelper::ViewObjectsSelector::getLaneFront() const {
704
if (myViewObjects.lanes.size() > 0) {
705
return myViewObjects.lanes.front();
706
} else {
707
return nullptr;
708
}
709
}
710
711
712
GNELane*
713
GNEViewNetHelper::ViewObjectsSelector::getLaneFrontNonLocked() const {
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
729
const std::vector<GNELane*>&
730
GNEViewNetHelper::ViewObjectsSelector::getLanes() const {
731
return myViewObjects.lanes;
732
}
733
734
735
GNECrossing*
736
GNEViewNetHelper::ViewObjectsSelector::getCrossingFront() const {
737
if (myViewObjects.crossings.size() > 0) {
738
return myViewObjects.crossings.front();
739
} else {
740
return nullptr;
741
}
742
}
743
744
745
GNEWalkingArea*
746
GNEViewNetHelper::ViewObjectsSelector::getWalkingAreaFront() const {
747
if (myViewObjects.walkingAreas.size() > 0) {
748
return myViewObjects.walkingAreas.front();
749
} else {
750
return nullptr;
751
}
752
}
753
754
755
GNEConnection*
756
GNEViewNetHelper::ViewObjectsSelector::getConnectionFront() const {
757
if (myViewObjects.connections.size() > 0) {
758
return myViewObjects.connections.front();
759
} else {
760
return nullptr;
761
}
762
}
763
764
765
GNEInternalLane*
766
GNEViewNetHelper::ViewObjectsSelector::getInternalLaneFront() const {
767
if (myViewObjects.internalLanes.size() > 0) {
768
return myViewObjects.internalLanes.front();
769
} else {
770
return nullptr;
771
}
772
}
773
774
775
GNEPOI*
776
GNEViewNetHelper::ViewObjectsSelector::getPOIFront() const {
777
if (myViewObjects.POIs.size() > 0) {
778
return myViewObjects.POIs.front();
779
} else {
780
return nullptr;
781
}
782
}
783
784
785
GNEPoly*
786
GNEViewNetHelper::ViewObjectsSelector::getPolyFront() const {
787
if (myViewObjects.polys.size() > 0) {
788
return myViewObjects.polys.front();
789
} else {
790
return nullptr;
791
}
792
}
793
794
795
GNETAZ*
796
GNEViewNetHelper::ViewObjectsSelector::getTAZFront() const {
797
if (myViewObjects.TAZs.size() > 0) {
798
return myViewObjects.TAZs.front();
799
} else {
800
return nullptr;
801
}
802
}
803
804
805
GNEEdgeData*
806
GNEViewNetHelper::ViewObjectsSelector::getEdgeDataElementFront() const {
807
if (myViewObjects.edgeDatas.size() > 0) {
808
return myViewObjects.edgeDatas.front();
809
} else {
810
return nullptr;
811
}
812
}
813
814
815
GNEEdgeRelData*
816
GNEViewNetHelper::ViewObjectsSelector::getEdgeRelDataElementFront() const {
817
if (myViewObjects.edgeRelDatas.size() > 0) {
818
return myViewObjects.edgeRelDatas.front();
819
} else {
820
return nullptr;
821
}
822
}
823
824
825
GNETAZRelData*
826
GNEViewNetHelper::ViewObjectsSelector::getTAZRelDataElementFront() const {
827
if (myViewObjects.TAZRelDatas.size() > 0) {
828
return myViewObjects.TAZRelDatas.front();
829
} else {
830
return nullptr;
831
}
832
}
833
834
835
const std::vector<GUIGlObject*>&
836
GNEViewNetHelper::ViewObjectsSelector::getGLObjects() const {
837
return myViewObjects.GUIGlObjects;
838
}
839
840
841
const std::vector<GNEAttributeCarrier*>&
842
GNEViewNetHelper::ViewObjectsSelector::getAttributeCarriers() const {
843
return myViewObjects.attributeCarriers;
844
}
845
846
847
const std::vector<GNEJunction*>&
848
GNEViewNetHelper::ViewObjectsSelector::getJunctions() const {
849
return myViewObjects.junctions;
850
}
851
852
853
const std::vector<GNEEdge*>&
854
GNEViewNetHelper::ViewObjectsSelector::getEdges() const {
855
return myViewObjects.edges;
856
}
857
858
859
const std::vector<GNETAZ*>&
860
GNEViewNetHelper::ViewObjectsSelector::getTAZs() const {
861
return myViewObjects.TAZs;
862
}
863
864
865
const std::vector<GNEAdditional*>&
866
GNEViewNetHelper::ViewObjectsSelector::getAdditionals() const {
867
return myViewObjects.additionals;
868
}
869
870
871
const std::vector<GNEDemandElement*>&
872
GNEViewNetHelper::ViewObjectsSelector::getDemandElements() const {
873
return myViewObjects.demandElements;
874
}
875
876
877
const std::vector<const GNEJunction*>&
878
GNEViewNetHelper::ViewObjectsSelector::getMergingJunctions() const {
879
return myMergingJunctions;
880
}
881
882
883
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::ViewObjectsContainer() {}
884
885
886
void
887
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::clearElements() {
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
910
void
911
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::reserve(int size) {
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
934
void
935
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::filterElements(const std::vector<const GUIGlObject*>& objects) {
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
1112
void
1113
GNEViewNetHelper::ViewObjectsSelector::updateNetworkElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
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
1253
void
1254
GNEViewNetHelper::ViewObjectsSelector::updateAdditionalElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
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
1274
void
1275
GNEViewNetHelper::ViewObjectsSelector::updateShapeElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
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
1303
void
1304
GNEViewNetHelper::ViewObjectsSelector::updateTAZElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
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
1321
void
1322
GNEViewNetHelper::ViewObjectsSelector::updateDemandElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
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
1342
void
1343
GNEViewNetHelper::ViewObjectsSelector::updateGenericDataElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
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
1409
void
1410
GNEViewNetHelper::ViewObjectsSelector::processGUIGlObjects(const GUIViewObjectsHandler::GLObjectsSortedContainer& objectsContainer) {
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
1426
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsSelector() :
1427
myViewNet(nullptr) {
1428
}
1429
1430
// ---------------------------------------------------------------------------
1431
// GNEViewNetHelper::MouseButtonKeyPressed - methods
1432
// ---------------------------------------------------------------------------
1433
1434
GNEViewNetHelper::MouseButtonKeyPressed::MouseButtonKeyPressed() :
1435
myEventInfo(nullptr) {
1436
}
1437
1438
1439
void
1440
GNEViewNetHelper::MouseButtonKeyPressed::update(void* eventData) {
1441
myEventInfo = (FXEvent*) eventData;
1442
}
1443
1444
1445
bool
1446
GNEViewNetHelper::MouseButtonKeyPressed::shiftKeyPressed() const {
1447
if (myEventInfo) {
1448
return (myEventInfo->state & SHIFTMASK) != 0;
1449
} else {
1450
return false;
1451
}
1452
}
1453
1454
1455
bool
1456
GNEViewNetHelper::MouseButtonKeyPressed::controlKeyPressed() const {
1457
if (myEventInfo) {
1458
return (myEventInfo->state & CONTROLMASK) != 0;
1459
} else {
1460
return false;
1461
}
1462
}
1463
1464
1465
bool
1466
GNEViewNetHelper::MouseButtonKeyPressed::altKeyPressed() const {
1467
if (myEventInfo) {
1468
return (myEventInfo->state & ALTMASK) != 0;
1469
} else {
1470
return false;
1471
}
1472
}
1473
1474
1475
bool
1476
GNEViewNetHelper::MouseButtonKeyPressed::mouseLeftButtonPressed() const {
1477
if (myEventInfo) {
1478
return (myEventInfo->state & LEFTBUTTONMASK) != 0;
1479
} else {
1480
return false;
1481
}
1482
}
1483
1484
1485
bool
1486
GNEViewNetHelper::MouseButtonKeyPressed::mouseRightButtonPressed() const {
1487
if (myEventInfo) {
1488
return (myEventInfo->state & RIGHTBUTTONMASK) != 0;
1489
} else {
1490
return false;
1491
}
1492
}
1493
1494
// ---------------------------------------------------------------------------
1495
// GNEViewNetHelper::MoveSingleElementValues - methods
1496
// ---------------------------------------------------------------------------
1497
1498
GNEViewNetHelper::MoveSingleElementModul::MoveSingleElementModul(GNEViewNet* viewNet) :
1499
myViewNet(viewNet) {
1500
}
1501
1502
1503
bool
1504
GNEViewNetHelper::MoveSingleElementModul::beginMoveNetworkElementShape() {
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
1560
bool
1561
GNEViewNetHelper::MoveSingleElementModul::beginMoveSingleElementNetworkMode() {
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
1656
bool
1657
GNEViewNetHelper::MoveSingleElementModul::beginMoveSingleElementDemandMode() {
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
1681
void
1682
GNEViewNetHelper::MoveSingleElementModul::moveSingleElement(const bool mouseLeftButtonPressed) {
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
1701
void
1702
GNEViewNetHelper::MoveSingleElementModul::finishMoveSingleElement() {
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
1714
bool
1715
GNEViewNetHelper::MoveSingleElementModul::isCurrentlyMovingSingleElement() const {
1716
return myMoveOperation != nullptr;
1717
}
1718
1719
1720
GNEMoveElement*
1721
GNEViewNetHelper::MoveSingleElementModul::getMovedElement() const {
1722
if (myMoveOperation) {
1723
return myMoveOperation->moveElement;
1724
} else {
1725
return nullptr;
1726
}
1727
}
1728
1729
1730
const GNEMoveOffset
1731
GNEViewNetHelper::MoveSingleElementModul::calculateMoveOffset() const {
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
1749
GNEViewNetHelper::MoveMultipleElementModul::MoveMultipleElementModul(GNEViewNet* viewNet) :
1750
myViewNet(viewNet),
1751
myMovingSelectedEdge(false),
1752
myEdgeOffset(0) {
1753
}
1754
1755
1756
void
1757
GNEViewNetHelper::MoveMultipleElementModul::beginMoveSelection() {
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
1770
void
1771
GNEViewNetHelper::MoveMultipleElementModul::moveSelection(const bool mouseLeftButtonPressed) {
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
1799
void
1800
GNEViewNetHelper::MoveMultipleElementModul::finishMoveSelection() {
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
1818
bool
1819
GNEViewNetHelper::MoveMultipleElementModul::isMovingSelection() const {
1820
return (myMoveOperations.size() > 0);
1821
}
1822
1823
1824
bool
1825
GNEViewNetHelper::MoveMultipleElementModul::isMovingSelectedEdge() const {
1826
return myMovingSelectedEdge;
1827
}
1828
1829
1830
void
1831
GNEViewNetHelper::MoveMultipleElementModul::resetMovingSelectedEdge() {
1832
myMovingSelectedEdge = false;
1833
}
1834
1835
1836
double
1837
GNEViewNetHelper::MoveMultipleElementModul::getEdgeOffset() const {
1838
return myEdgeOffset;
1839
}
1840
1841
1842
bool
1843
GNEViewNetHelper::MoveMultipleElementModul::isCurrentlyMovingMultipleElements() const {
1844
return myMoveOperations.size() > 0;
1845
}
1846
1847
1848
const GNEMoveOffset
1849
GNEViewNetHelper::MoveMultipleElementModul::calculateMoveOffset() const {
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
1864
void
1865
GNEViewNetHelper::MoveMultipleElementModul::calculateJunctionSelection() {
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
1889
void
1890
GNEViewNetHelper::MoveMultipleElementModul::calculateEdgeSelection(const GNEEdge* clickedEdge) {
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
1926
GNEViewNetHelper::VehicleOptions::VehicleOptions(GNEViewNet* viewNet) :
1927
myViewNet(viewNet) {
1928
}
1929
1930
1931
void
1932
GNEViewNetHelper::VehicleOptions::buildVehicleOptionsMenuChecks() {
1933
UNUSED_PARAMETER(myViewNet);
1934
// currently unused
1935
}
1936
1937
1938
void
1939
GNEViewNetHelper::VehicleOptions::hideVehicleOptionsMenuChecks() {
1940
// currently unused
1941
}
1942
1943
// ---------------------------------------------------------------------------
1944
// GNEViewNetHelper::VehicleTypeOptions - methods
1945
// ---------------------------------------------------------------------------
1946
1947
GNEViewNetHelper::VehicleTypeOptions::VehicleTypeOptions(GNEViewNet* viewNet) :
1948
myViewNet(viewNet) {
1949
}
1950
1951
1952
void
1953
GNEViewNetHelper::VehicleTypeOptions::buildVehicleTypeOptionsMenuChecks() {
1954
UNUSED_PARAMETER(myViewNet);
1955
// currently unused
1956
}
1957
1958
1959
void
1960
GNEViewNetHelper::VehicleTypeOptions::hideVehicleTypeOptionsMenuChecks() {
1961
// currently unused
1962
}
1963
1964
// ---------------------------------------------------------------------------
1965
// GNEViewNetHelper::SelectingArea - methods
1966
// ---------------------------------------------------------------------------
1967
1968
GNEViewNetHelper::SelectingArea::SelectingArea(GNEViewNet* viewNet) :
1969
selectingUsingRectangle(false),
1970
startDrawing(false),
1971
myViewNet(viewNet) {
1972
}
1973
1974
1975
void
1976
GNEViewNetHelper::SelectingArea::beginRectangleSelection() {
1977
selectingUsingRectangle = true;
1978
selectionCorner1 = myViewNet->getPositionInformation();
1979
selectionCorner2 = selectionCorner1;
1980
}
1981
1982
1983
void
1984
GNEViewNetHelper::SelectingArea::moveRectangleSelection() {
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
1996
void
1997
GNEViewNetHelper::SelectingArea::finishRectangleSelection() {
1998
// finish rectangle selection
1999
selectingUsingRectangle = false;
2000
startDrawing = false;
2001
// clear status bar
2002
myViewNet->setStatusBarText("");
2003
}
2004
2005
2006
void
2007
GNEViewNetHelper::SelectingArea::processRectangleSelection() {
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
2022
std::vector<GNEEdge*>
2023
GNEViewNetHelper::SelectingArea::processEdgeRectangleSelection() {
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
2042
void
2043
GNEViewNetHelper::SelectingArea::drawRectangleSelection(const RGBColor& color) const {
2044
if (selectingUsingRectangle) {
2045
GLHelper::pushMatrix();
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();
2056
GLHelper::popMatrix();
2057
}
2058
}
2059
2060
2061
void
2062
GNEViewNetHelper::SelectingArea::processBoundarySelection(const Boundary& boundary) {
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();
2102
if ((modificationMode == GNESelectorFrame::ModificationMode::Operation::RESTRICT) || (modificationMode == GNESelectorFrame::ModificationMode::Operation::REPLACE)) {
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()) {
2113
case GNESelectorFrame::ModificationMode::Operation::SUB:
2114
ACToUnselect.push_back(AC);
2115
break;
2116
case GNESelectorFrame::ModificationMode::Operation::RESTRICT:
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
2176
GNEViewNetHelper::TestingMode::TestingMode(GNEViewNet* viewNet) :
2177
myViewNet(viewNet) {
2178
}
2179
2180
2181
void
2182
GNEViewNetHelper::TestingMode::initTestingMode() {
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
2197
void
2198
GNEViewNetHelper::TestingMode::drawTestingElements(GUIMainWindow* mainWindow) {
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
2210
GLHelper::pushMatrix();
2211
GLHelper::setColor(RGBColor::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();
2220
GLHelper::popMatrix();
2221
// blue
2222
GLHelper::pushMatrix();
2223
GLHelper::setColor(RGBColor::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();
2233
GLHelper::popMatrix();
2234
// yellow
2235
GLHelper::pushMatrix();
2236
GLHelper::setColor(RGBColor::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();
2246
GLHelper::popMatrix();
2247
}
2248
}
2249
2250
// ---------------------------------------------------------------------------
2251
// GNEViewNetHelper::SaveElements - methods
2252
// ---------------------------------------------------------------------------
2253
2254
GNEViewNetHelper::SaveElements::SaveElements(GNEViewNet* viewNet) :
2255
myViewNet(viewNet) {
2256
}
2257
2258
2259
GNEViewNetHelper::SaveElements::~SaveElements() {
2260
delete mySaveIndividualFilesPopup;
2261
}
2262
2263
2264
void
2265
GNEViewNetHelper::SaveElements::buildSaveElementsButtons() {
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
2320
void
2321
GNEViewNetHelper::SaveElements::setSaveIndividualFiles(bool value) {
2322
if (value) {
2323
mySaveIndividualFiles->enable();
2324
} else {
2325
mySaveIndividualFiles->disable();
2326
}
2327
}
2328
2329
// ---------------------------------------------------------------------------
2330
// GNEViewNetHelper::TimeFormat - methods
2331
// ---------------------------------------------------------------------------
2332
2333
GNEViewNetHelper::TimeFormat::TimeFormat(GNEViewNet* viewNet) :
2334
myViewNet(viewNet) {
2335
}
2336
2337
2338
void
2339
GNEViewNetHelper::TimeFormat::buildTimeFormatButtons() {
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
2349
void
2350
GNEViewNetHelper::TimeFormat::switchTimeFormat() {
2351
if (gHumanReadableTime) {
2352
gHumanReadableTime = false;
2353
} else {
2354
gHumanReadableTime = true;
2355
}
2356
OptionsCont::getOptions().resetWritable();
2357
OptionsCont::getOptions().set("human-readable-time", toString(gHumanReadableTime));
2358
}
2359
2360
2361
void
2362
GNEViewNetHelper::TimeFormat::updateButtonLabel() {
2363
if (gHumanReadableTime) {
2364
mySwitchButton->setText("H");
2365
} else {
2366
mySwitchButton->setText("S");
2367
}
2368
}
2369
2370
// ---------------------------------------------------------------------------
2371
// GNEViewNetHelper::EditModes - methods
2372
// ---------------------------------------------------------------------------
2373
2374
GNEViewNetHelper::EditModes::EditModes(GNEViewNet* viewNet) :
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")) {
2383
networkEditMode = NetworkEditMode::NETWORK_CREATE_EDGE;
2384
neteditOptions.resetWritable();
2385
neteditOptions.set("new", "false");
2386
}
2387
}
2388
2389
2390
GNEViewNetHelper::EditModes::~EditModes() {
2391
delete myNeteditViewsPopup;
2392
}
2393
2394
2395
void
2396
GNEViewNetHelper::EditModes::buildSuperModeButtons() {
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)"),
2404
GUIIconSubSys::getIcon(GUIIcon::SUPERMODENETWORK), myViewNet, MID_HOTKEY_F2_SUPERMODE_NETWORK, GUIDesignMFXCheckableButtonSupermode);
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)"),
2409
GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDEMAND), myViewNet, MID_HOTKEY_F3_SUPERMODE_DEMAND, GUIDesignMFXCheckableButtonSupermode);
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)"),
2414
GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDATA), myViewNet, MID_HOTKEY_F4_SUPERMODE_DATA, GUIDesignMFXCheckableButtonSupermode);
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(),
2422
GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT), myNeteditViewsPopup, nullptr, GUIDesignTLSTableCheckableButtonIcon);
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(),
2427
GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT), myViewNet, MID_GNE_VIEW_DEFAULT, GUIDesignButtonLeft);
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(),
2432
GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM), myViewNet, MID_GNE_VIEW_JUPEDSIM, GUIDesignButtonLeft);
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
2442
void
2443
GNEViewNetHelper::EditModes::setSupermode(Supermode supermode, const bool force) {
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
2524
void
2525
GNEViewNetHelper::EditModes::setNetworkEditMode(NetworkEditMode mode, const bool force) {
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) {
2556
case NetworkEditMode::NETWORK_PROHIBITION:
2557
case NetworkEditMode::NETWORK_CONNECT:
2558
case NetworkEditMode::NETWORK_TLS:
2559
case NetworkEditMode::NETWORK_WIRE:
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
2574
void
2575
GNEViewNetHelper::EditModes::setDemandEditMode(DemandEditMode mode, const bool force) {
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
2609
void
2610
GNEViewNetHelper::EditModes::setDataEditMode(DataEditMode mode, const bool force) {
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
2646
bool
2647
GNEViewNetHelper::EditModes::isCurrentSupermodeNetwork() const {
2648
return (currentSupermode == Supermode::NETWORK);
2649
}
2650
2651
2652
bool
2653
GNEViewNetHelper::EditModes::isCurrentSupermodeDemand() const {
2654
return (currentSupermode == Supermode::DEMAND);
2655
}
2656
2657
2658
bool
2659
GNEViewNetHelper::EditModes::isCurrentSupermodeData() const {
2660
return (currentSupermode == Supermode::DATA);
2661
}
2662
2663
2664
void
2665
GNEViewNetHelper::EditModes::setView(FXSelector sel) {
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
2687
bool
2688
GNEViewNetHelper::EditModes::isDefaultView() const {
2689
return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT);
2690
}
2691
2692
2693
bool
2694
GNEViewNetHelper::EditModes::isJuPedSimView() const {
2695
return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM);
2696
}
2697
2698
// ---------------------------------------------------------------------------
2699
// GNEViewNetHelper::NetworkViewOptions - methods
2700
// ---------------------------------------------------------------------------
2701
2702
GNEViewNetHelper::NetworkViewOptions::NetworkViewOptions(GNEViewNet* viewNet) :
2703
myViewNet(viewNet) {
2704
}
2705
2706
2707
void
2708
GNEViewNetHelper::NetworkViewOptions::buildNetworkViewOptionsMenuChecks() {
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)")),
2716
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEGRID),
2717
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID, GUIDesignMFXCheckableButtonSquare);
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)")),
2723
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE),
2724
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GUIDesignMFXCheckableButtonSquare);
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.")),
2730
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SPREADVEHICLE),
2731
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES, GUIDesignMFXCheckableButtonSquare);
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.")),
2737
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SHOWDEMANDELEMENTS),
2738
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS, GUIDesignMFXCheckableButtonSquare);
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.")),
2744
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SELECTEDGES),
2745
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES, GUIDesignMFXCheckableButtonSquare);
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.")),
2750
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SHOWCONNECTIONS),
2751
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS, GUIDesignMFXCheckableButtonSquare);
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.")),
2757
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_HIDECONNECTIONS),
2758
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS, GUIDesignMFXCheckableButtonSquare);
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.")),
2764
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SHOWSUBADDITIONALS),
2765
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS, GUIDesignMFXCheckableButtonSquare);
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.")),
2771
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SHOWTAZELEMENTS),
2772
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS, GUIDesignMFXCheckableButtonSquare);
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.")),
2778
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_AUTOSELECTJUNCTIONS),
2779
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION, GUIDesignMFXCheckableButtonSquare);
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.")),
2785
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_APPLYTOALLPHASES),
2786
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES, GUIDesignMFXCheckableButtonSquare);
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.")),
2792
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_MERGEAUTOMATICALLY),
2793
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY, GUIDesignMFXCheckableButtonSquare);
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).")),
2798
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_CHAIN),
2799
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES, GUIDesignMFXCheckableButtonSquare);
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.")),
2805
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_TWOWAY),
2806
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES, GUIDesignMFXCheckableButtonSquare);
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.")),
2812
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_ELEVATION),
2813
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION, GUIDesignMFXCheckableButtonSquare);
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.")),
2819
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_BUBBLES),
2820
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES, GUIDesignMFXCheckableButtonSquare);
2821
menuCheckShowJunctionBubble->setChecked(false);
2822
menuCheckShowJunctionBubble->create();
2823
2824
// always recalc after creating new elements
2825
gripModes->recalc();
2826
}
2827
2828
2829
void
2830
GNEViewNetHelper::NetworkViewOptions::hideNetworkViewOptionsMenuChecks() {
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
2850
void
2851
GNEViewNetHelper::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
2904
bool
2905
GNEViewNetHelper::NetworkViewOptions::drawSpreadVehicles() const {
2906
return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
2907
}
2908
2909
2910
bool
2911
GNEViewNetHelper::NetworkViewOptions::showDemandElements() const {
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
2921
bool
2922
GNEViewNetHelper::NetworkViewOptions::selectEdges() const {
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
2932
bool
2933
GNEViewNetHelper::NetworkViewOptions::showConnections() const {
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
2949
bool
2950
GNEViewNetHelper::NetworkViewOptions::showSubAdditionals() const {
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
2961
bool
2962
GNEViewNetHelper::NetworkViewOptions::showTAZElements() const {
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
2973
bool
2974
GNEViewNetHelper::NetworkViewOptions::editingElevation() const {
2975
if (menuCheckMoveElevation->shown()) {
2976
return (menuCheckMoveElevation->amChecked() == TRUE);
2977
} else {
2978
return false;
2979
}
2980
}
2981
2982
// ---------------------------------------------------------------------------
2983
// GNEViewNetHelper::DemandViewOptions - methods
2984
// ---------------------------------------------------------------------------
2985
2986
GNEViewNetHelper::DemandViewOptions::DemandViewOptions(GNEViewNet* viewNet) :
2987
myViewNet(viewNet) {
2988
}
2989
2990
2991
void
2992
GNEViewNetHelper::DemandViewOptions::buildDemandViewOptionsMenuChecks() {
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)")),
3000
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEGRID),
3001
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID, GUIDesignMFXCheckableButtonSquare);
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)")),
3007
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE),
3008
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GUIDesignMFXCheckableButtonSquare);
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.")),
3014
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SPREADVEHICLE),
3015
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES, GUIDesignMFXCheckableButtonSquare);
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).")),
3021
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_HIDESHAPES),
3022
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES, GUIDesignMFXCheckableButtonSquare);
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).")),
3028
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWTRIPS),
3029
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS, GUIDesignMFXCheckableButtonSquare);
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.")),
3035
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWPERSONPLANS),
3036
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS, GUIDesignMFXCheckableButtonSquare);
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.")),
3042
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_LOCKPERSON),
3043
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON, GUIDesignMFXCheckableButtonSquare);
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.")),
3049
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWCONTAINERPLANS),
3050
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS, GUIDesignMFXCheckableButtonSquare);
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.")),
3056
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_LOCKCONTAINER),
3057
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER, GUIDesignMFXCheckableButtonSquare);
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.")),
3063
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_HIDENONINSPECTEDDEMANDELEMENTS),
3064
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED, GUIDesignMFXCheckableButtonSquare);
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.")),
3070
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWOVERLAPPEDROUTES),
3071
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES, GUIDesignMFXCheckableButtonSquare);
3072
menuCheckShowOverlappedRoutes->setChecked(false);
3073
menuCheckShowOverlappedRoutes->create();
3074
3075
// always recalc after creating new elements
3076
gripModes->recalc();
3077
}
3078
3079
3080
void
3081
GNEViewNetHelper::DemandViewOptions::hideDemandViewOptionsMenuChecks() {
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
3096
void
3097
GNEViewNetHelper::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
3135
bool
3136
GNEViewNetHelper::DemandViewOptions::drawSpreadVehicles() const {
3137
return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
3138
}
3139
3140
3141
bool
3142
GNEViewNetHelper::DemandViewOptions::showNonInspectedDemandElements(const GNEDemandElement* demandElement) const {
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
3180
bool
3181
GNEViewNetHelper::DemandViewOptions::showShapes() const {
3182
if (menuCheckHideShapes->shown()) {
3183
return (menuCheckHideShapes->amChecked() == FALSE);
3184
} else {
3185
return true;
3186
}
3187
}
3188
3189
3190
bool
3191
GNEViewNetHelper::DemandViewOptions::showAllTrips() const {
3192
return (menuCheckShowAllTrips->amChecked() == TRUE);
3193
}
3194
3195
3196
bool
3197
GNEViewNetHelper::DemandViewOptions::showAllPersonPlans() const {
3198
if (menuCheckShowAllPersonPlans->isEnabled()) {
3199
return (menuCheckShowAllPersonPlans->amChecked() == TRUE);
3200
} else {
3201
return false;
3202
}
3203
}
3204
3205
3206
void
3207
GNEViewNetHelper::DemandViewOptions::lockPerson(const GNEDemandElement* person) {
3208
myLockedPerson = person;
3209
}
3210
3211
3212
void
3213
GNEViewNetHelper::DemandViewOptions::unlockPerson() {
3214
myLockedPerson = nullptr;
3215
}
3216
3217
3218
const GNEDemandElement*
3219
GNEViewNetHelper::DemandViewOptions::getLockedPerson() const {
3220
return myLockedPerson;
3221
}
3222
3223
3224
bool
3225
GNEViewNetHelper::DemandViewOptions::showAllContainerPlans() const {
3226
if (menuCheckShowAllContainerPlans->isEnabled()) {
3227
return (menuCheckShowAllContainerPlans->amChecked() == TRUE);
3228
} else {
3229
return false;
3230
}
3231
}
3232
3233
3234
void
3235
GNEViewNetHelper::DemandViewOptions::lockContainer(const GNEDemandElement* container) {
3236
myLockedContainer = container;
3237
}
3238
3239
3240
void
3241
GNEViewNetHelper::DemandViewOptions::unlockContainer() {
3242
myLockedContainer = nullptr;
3243
}
3244
3245
3246
bool
3247
GNEViewNetHelper::DemandViewOptions::showOverlappedRoutes() const {
3248
if (menuCheckShowOverlappedRoutes->isEnabled()) {
3249
return (menuCheckShowOverlappedRoutes->amChecked() == TRUE);
3250
} else {
3251
return false;
3252
}
3253
}
3254
3255
3256
const GNEDemandElement*
3257
GNEViewNetHelper::DemandViewOptions::getLockedContainer() const {
3258
return myLockedContainer;
3259
}
3260
3261
// ---------------------------------------------------------------------------
3262
// GNEViewNetHelper::DataViewOptions - methods
3263
// ---------------------------------------------------------------------------
3264
3265
GNEViewNetHelper::DataViewOptions::DataViewOptions(GNEViewNet* viewNet) :
3266
myViewNet(viewNet) {
3267
}
3268
3269
3270
void
3271
GNEViewNetHelper::DataViewOptions::buildDataViewOptionsMenuChecks() {
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)")),
3279
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE),
3280
myViewNet, MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GUIDesignMFXCheckableButtonSquare);
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.")),
3286
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_SHOWADDITIONALS),
3287
myViewNet, MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS, GUIDesignMFXCheckableButtonSquare);
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).")),
3292
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_SHOWSHAPES),
3293
myViewNet, MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES, GUIDesignMFXCheckableButtonSquare);
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.")),
3298
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SHOWDEMANDELEMENTS),
3299
myViewNet, MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS, GUIDesignMFXCheckableButtonSquare);
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.")),
3304
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZRELDRAWING),
3305
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING, GUIDesignMFXCheckableButtonSquare);
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")),
3310
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZDRAWFILL),
3311
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL, GUIDesignMFXCheckableButtonSquare);
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")),
3316
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZRELONLYFROM),
3317
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM, GUIDesignMFXCheckableButtonSquare);
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")),
3322
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZRELONLYTO),
3323
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO, GUIDesignMFXCheckableButtonSquare);
3324
menuCheckToggleTAZRelOnlyTo->create();
3325
3326
// always recalc after creating new elements
3327
gripModes->recalc();
3328
}
3329
3330
3331
void
3332
GNEViewNetHelper::DataViewOptions::hideDataViewOptionsMenuChecks() {
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
3344
void
3345
GNEViewNetHelper::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
3374
bool
3375
GNEViewNetHelper::DataViewOptions::showAdditionals() const {
3376
if (menuCheckShowAdditionals->shown()) {
3377
return (menuCheckShowAdditionals->amChecked() == TRUE);
3378
} else {
3379
return true;
3380
}
3381
}
3382
3383
3384
bool
3385
GNEViewNetHelper::DataViewOptions::showShapes() const {
3386
if (menuCheckShowShapes->shown()) {
3387
return (menuCheckShowShapes->amChecked() == TRUE);
3388
} else {
3389
return true;
3390
}
3391
}
3392
3393
3394
bool
3395
GNEViewNetHelper::DataViewOptions::showDemandElements() const {
3396
if (menuCheckShowDemandElements->shown()) {
3397
return (menuCheckShowDemandElements->amChecked() == TRUE);
3398
} else {
3399
return true;
3400
}
3401
}
3402
3403
3404
bool
3405
GNEViewNetHelper::DataViewOptions::TAZRelDrawing() const {
3406
return (menuCheckToggleTAZRelDrawing->amChecked() != TRUE);
3407
}
3408
3409
3410
bool
3411
GNEViewNetHelper::DataViewOptions::TAZDrawFill() const {
3412
if (menuCheckToggleTAZDrawFill->shown()) {
3413
return (menuCheckToggleTAZDrawFill->amChecked() != TRUE);
3414
} else {
3415
return false;
3416
}
3417
}
3418
3419
3420
bool
3421
GNEViewNetHelper::DataViewOptions::TAZRelOnlyFrom() const {
3422
if (menuCheckToggleTAZRelOnlyFrom->shown()) {
3423
return (menuCheckToggleTAZRelOnlyFrom->amChecked() != TRUE);
3424
} else {
3425
return false;
3426
}
3427
}
3428
3429
3430
bool
3431
GNEViewNetHelper::DataViewOptions::TAZRelOnlyTo() const {
3432
if (menuCheckToggleTAZRelOnlyTo->shown()) {
3433
return (menuCheckToggleTAZRelOnlyTo->amChecked() != TRUE);
3434
} else {
3435
return false;
3436
}
3437
}
3438
3439
// ---------------------------------------------------------------------------
3440
// GNEViewNetHelper::IntervalBar - methods
3441
// ---------------------------------------------------------------------------
3442
3443
GNEViewNetHelper::IntervalBar::IntervalBar(GNEViewNet* viewNet) :
3444
myViewNet(viewNet) {
3445
}
3446
3447
3448
void
3449
GNEViewNetHelper::IntervalBar::buildIntervalBarElements() {
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,
3458
MID_GNE_INTERVALBAR_GENERICDATATYPE, GUIDesignComboBoxFixed(180));
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,
3472
myViewNet, MID_GNE_INTERVALBAR_DATASET, GUIDesignComboBoxFixed(180));
3473
myDataSetsComboBox->create();
3474
// create checkbutton for myLimitByInterval
3475
myIntervalCheckBox = new FXCheckButton(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3476
TL("Interval"), myViewNet, MID_GNE_INTERVALBAR_LIMITED, GUIDesignCheckButtonAttribute);
3477
myIntervalCheckBox->create();
3478
// create textfield for begin
3479
myBeginTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3480
GUIDesignTextFieldNCol, myViewNet, MID_GNE_INTERVALBAR_BEGIN, GUIDesignTextFieldFixedRestricted(50, TEXTFIELD_REAL));
3481
myBeginTextField->create();
3482
// create text field for end
3483
myEndTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
3484
GUIDesignTextFieldNCol, myViewNet, MID_GNE_INTERVALBAR_END, GUIDesignTextFieldFixedRestricted(50, TEXTFIELD_REAL));
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,
3493
myViewNet, MID_GNE_INTERVALBAR_PARAMETER, GUIDesignComboBoxFixed(180));
3494
myParametersComboBox->create();
3495
// always recalc after creating new elements
3496
myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->recalc();
3497
}
3498
3499
3500
void
3501
GNEViewNetHelper::IntervalBar::showIntervalBar() {
3502
// first update interval bar
3503
updateIntervalBar();
3504
// show toolbar grip
3505
myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->show();
3506
}
3507
3508
3509
void
3510
GNEViewNetHelper::IntervalBar::hideIntervalBar() {
3511
// hide toolbar grip
3512
myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->hide();
3513
}
3514
3515
3516
void
3517
GNEViewNetHelper::IntervalBar::updateIntervalBar() {
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
3606
void
3607
GNEViewNetHelper::IntervalBar::markForUpdate() {
3608
myUpdateInterval = true;
3609
}
3610
3611
3612
SumoXMLTag
3613
GNEViewNetHelper::IntervalBar::getGenericDataType() const {
3614
if (myGenericDataTypesComboBox->isEnabled() && (myGenericDataTypesComboBox->getTextColor() == GUIDesignTextColorBlack)) {
3615
if (myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) {
3616
return GNE_TAG_EDGEREL_SINGLE;
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
3627
GNEDataSet*
3628
GNEViewNetHelper::IntervalBar::getDataSet() const {
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
3639
double
3640
GNEViewNetHelper::IntervalBar::getBegin() const {
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
3649
double
3650
GNEViewNetHelper::IntervalBar::getEnd() const {
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
3659
std::string
3660
GNEViewNetHelper::IntervalBar::getParameter() const {
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
3671
void
3672
GNEViewNetHelper::IntervalBar::setGenericDataType() {
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
3686
void
3687
GNEViewNetHelper::IntervalBar::setDataSet() {
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
3699
void
3700
GNEViewNetHelper::IntervalBar::setInterval() {
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
3714
void
3715
GNEViewNetHelper::IntervalBar::setBegin() {
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
3729
void
3730
GNEViewNetHelper::IntervalBar::setEnd() {
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
3744
void
3745
GNEViewNetHelper::IntervalBar::setParameter() {
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
3758
void
3759
GNEViewNetHelper::IntervalBar::enableIntervalBar() {
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
3775
void
3776
GNEViewNetHelper::IntervalBar::disableIntervalBar() {
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
3790
GNEViewNetHelper::CommonCheckableButtons::CommonCheckableButtons(GNEViewNet* viewNet) :
3791
myViewNet(viewNet) {
3792
}
3793
3794
3795
void
3796
GNEViewNetHelper::CommonCheckableButtons::buildCommonCheckableButtons() {
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)"),
3804
GUIIconSubSys::getIcon(GUIIcon::MODEINSPECT), myViewNet, MID_HOTKEY_I_MODE_INSPECT, GUIDesignMFXCheckableButtonSquare);
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)"),
3809
GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), myViewNet, MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE, GUIDesignMFXCheckableButtonSquare);
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)"),
3814
GUIIconSubSys::getIcon(GUIIcon::MODESELECT), myViewNet, MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT, GUIDesignMFXCheckableButtonSquare);
3815
selectButton->create();
3816
// always recalc menu bar after creating new elements
3817
gripModes->recalc();
3818
}
3819
3820
3821
void
3822
GNEViewNetHelper::CommonCheckableButtons::showCommonCheckableButtons() {
3823
inspectButton->show();
3824
deleteButton->show();
3825
selectButton->show();
3826
}
3827
3828
3829
void
3830
GNEViewNetHelper::CommonCheckableButtons::hideCommonCheckableButtons() {
3831
inspectButton->hide();
3832
deleteButton->hide();
3833
selectButton->hide();
3834
}
3835
3836
3837
void
3838
GNEViewNetHelper::CommonCheckableButtons::disableCommonCheckableButtons() {
3839
inspectButton->setChecked(false);
3840
deleteButton->setChecked(false);
3841
selectButton->setChecked(false);
3842
}
3843
3844
3845
void
3846
GNEViewNetHelper::CommonCheckableButtons::updateCommonCheckableButtons() {
3847
inspectButton->update();
3848
deleteButton->update();
3849
selectButton->update();
3850
}
3851
3852
// ---------------------------------------------------------------------------
3853
// GNEViewNetHelper::NetworkCheckableButtons - methods
3854
// ---------------------------------------------------------------------------
3855
3856
GNEViewNetHelper::NetworkCheckableButtons::NetworkCheckableButtons(GNEViewNet* viewNet) :
3857
myViewNet(viewNet) {
3858
}
3859
3860
3861
void
3862
GNEViewNetHelper::NetworkCheckableButtons::buildNetworkCheckableButtons() {
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)"),
3870
GUIIconSubSys::getIcon(GUIIcon::MODEMOVE), myViewNet, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
3875
GUIIconSubSys::getIcon(GUIIcon::MODECREATEEDGE), myViewNet, MID_HOTKEY_E_MODE_EDGE_EDGEDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
3880
GUIIconSubSys::getIcon(GUIIcon::MODETLS), myViewNet, MID_HOTKEY_T_MODE_TLS_TYPE, GUIDesignMFXCheckableButtonSquare);
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 editing connections between lanes. (C)"),
3885
GUIIconSubSys::getIcon(GUIIcon::MODECONNECTION), myViewNet, MID_HOTKEY_C_MODE_CONNECT_CONTAINER, GUIDesignMFXCheckableButtonSquare);
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)"),
3890
GUIIconSubSys::getIcon(GUIIcon::MODEPROHIBITION), myViewNet, MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN, GUIDesignMFXCheckableButtonSquare);
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)"),
3895
GUIIconSubSys::getIcon(GUIIcon::MODECROSSING), myViewNet, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
3900
GUIIconSubSys::getIcon(GUIIcon::MODEADDITIONAL), myViewNet, MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS, GUIDesignMFXCheckableButtonSquare);
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)"),
3905
GUIIconSubSys::getIcon(GUIIcon::MODEWIRE), myViewNet, MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
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)"),
3910
GUIIconSubSys::getIcon(GUIIcon::MODETAZ), myViewNet, MID_HOTKEY_Z_MODE_TAZ_TAZREL, GUIDesignMFXCheckableButtonSquare);
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)"),
3915
GUIIconSubSys::getIcon(GUIIcon::MODESHAPE), myViewNet, MID_HOTKEY_P_MODE_POLYGON_PERSON, GUIDesignMFXCheckableButtonSquare);
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)"),
3920
GUIIconSubSys::getIcon(GUIIcon::MODEDECAL), myViewNet, MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
3921
decalButton->create();
3922
// always recalc after creating new elements
3923
gripModes->recalc();
3924
}
3925
3926
3927
void
3928
GNEViewNetHelper::NetworkCheckableButtons::showNetworkCheckableButtons() {
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
3958
void
3959
GNEViewNetHelper::NetworkCheckableButtons::hideNetworkCheckableButtons() {
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
3974
void
3975
GNEViewNetHelper::NetworkCheckableButtons::disableNetworkCheckableButtons() {
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
3990
void
3991
GNEViewNetHelper::NetworkCheckableButtons::updateNetworkCheckableButtons() {
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
4009
GNEViewNetHelper::DemandCheckableButtons::DemandCheckableButtons(GNEViewNet* viewNet) :
4010
myViewNet(viewNet) {
4011
}
4012
4013
4014
void
4015
GNEViewNetHelper::DemandCheckableButtons::buildDemandCheckableButtons() {
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)"),
4023
GUIIconSubSys::getIcon(GUIIcon::MODEMOVE), myViewNet, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
4028
GUIIconSubSys::getIcon(GUIIcon::MODEROUTE), myViewNet, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
4033
GUIIconSubSys::getIcon(GUIIcon::MODEROUTEDISTRIBUTION), myViewNet, MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
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)"),
4038
GUIIconSubSys::getIcon(GUIIcon::MODEVEHICLE), myViewNet, MID_HOTKEY_V_MODE_VEHICLE, GUIDesignMFXCheckableButtonSquare);
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)"),
4043
GUIIconSubSys::getIcon(GUIIcon::MODETYPE), myViewNet, MID_HOTKEY_T_MODE_TLS_TYPE, GUIDesignMFXCheckableButtonSquare);
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)"),
4048
GUIIconSubSys::getIcon(GUIIcon::MODETYPEDISTRIBUTION), myViewNet, MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
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)"),
4053
GUIIconSubSys::getIcon(GUIIcon::MODESTOP), myViewNet, MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS, GUIDesignMFXCheckableButtonSquare);
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)"),
4058
GUIIconSubSys::getIcon(GUIIcon::MODEPERSON), myViewNet, MID_HOTKEY_P_MODE_POLYGON_PERSON, GUIDesignMFXCheckableButtonSquare);
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)"),
4063
GUIIconSubSys::getIcon(GUIIcon::MODEPERSONPLAN), myViewNet, MID_HOTKEY_L_MODE_PERSONPLAN, GUIDesignMFXCheckableButtonSquare);
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)"),
4068
GUIIconSubSys::getIcon(GUIIcon::MODECONTAINER), myViewNet, MID_HOTKEY_C_MODE_CONNECT_CONTAINER, GUIDesignMFXCheckableButtonSquare);
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)"),
4073
GUIIconSubSys::getIcon(GUIIcon::MODECONTAINERPLAN), myViewNet, MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN, GUIDesignMFXCheckableButtonSquare);
4074
containerPlanButton->create();
4075
// always recalc after creating new elements
4076
gripModes->recalc();
4077
}
4078
4079
4080
void
4081
GNEViewNetHelper::DemandCheckableButtons::showDemandCheckableButtons() {
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
4110
void
4111
GNEViewNetHelper::DemandCheckableButtons::hideDemandCheckableButtons() {
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
4126
void
4127
GNEViewNetHelper::DemandCheckableButtons::disableDemandCheckableButtons() {
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
4142
void
4143
GNEViewNetHelper::DemandCheckableButtons::updateDemandCheckableButtons() {
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
4161
GNEViewNetHelper::DataCheckableButtons::DataCheckableButtons(GNEViewNet* viewNet) :
4162
myViewNet(viewNet) {
4163
}
4164
4165
4166
void
4167
GNEViewNetHelper::DataCheckableButtons::buildDataCheckableButtons() {
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)"),
4175
GUIIconSubSys::getIcon(GUIIcon::MODEEDGEDATA), myViewNet, MID_HOTKEY_E_MODE_EDGE_EDGEDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
4180
GUIIconSubSys::getIcon(GUIIcon::MODEEDGERELDATA), myViewNet, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GUIDesignMFXCheckableButtonSquare);
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)"),
4185
GUIIconSubSys::getIcon(GUIIcon::MODETAZRELDATA), myViewNet, MID_HOTKEY_Z_MODE_TAZ_TAZREL, GUIDesignMFXCheckableButtonSquare);
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)"),
4190
GUIIconSubSys::getIcon(GUIIcon::MODEMEANDATA), myViewNet, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GUIDesignMFXCheckableButtonSquare);
4191
meanDataButton->create();
4192
// always recalc after creating new elements
4193
gripModes->recalc();
4194
}
4195
4196
4197
void
4198
GNEViewNetHelper::DataCheckableButtons::showDataCheckableButtons() {
4199
edgeDataButton->show();
4200
edgeRelDataButton->show();
4201
TAZRelDataButton->show();
4202
meanDataButton->show();
4203
}
4204
4205
4206
void
4207
GNEViewNetHelper::DataCheckableButtons::hideDataCheckableButtons() {
4208
edgeDataButton->hide();
4209
edgeRelDataButton->hide();
4210
TAZRelDataButton->hide();
4211
meanDataButton->hide();
4212
}
4213
4214
4215
void
4216
GNEViewNetHelper::DataCheckableButtons::disableDataCheckableButtons() {
4217
edgeDataButton->setChecked(false);
4218
edgeRelDataButton->setChecked(false);
4219
TAZRelDataButton->setChecked(false);
4220
meanDataButton->setChecked(false);
4221
}
4222
4223
4224
void
4225
GNEViewNetHelper::DataCheckableButtons::updateDataCheckableButtons() {
4226
edgeDataButton->update();
4227
edgeRelDataButton->update();
4228
TAZRelDataButton->update();
4229
meanDataButton->update();
4230
}
4231
4232
// ---------------------------------------------------------------------------
4233
// GNEViewNetHelper::EditNetworkElementShapes - methods
4234
// ---------------------------------------------------------------------------
4235
4236
GNEViewNetHelper::EditNetworkElementShapes::EditNetworkElementShapes(GNEViewNet* viewNet) :
4237
myViewNet(viewNet),
4238
myPreviousNetworkEditMode(NetworkEditMode::NETWORK_NONE) {
4239
}
4240
4241
4242
void
4243
GNEViewNetHelper::EditNetworkElementShapes::startEditCustomShape(GNENetworkElement* element) {
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
4259
void
4260
GNEViewNetHelper::EditNetworkElementShapes::stopEditCustomShape() {
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
4275
void
4276
GNEViewNetHelper::EditNetworkElementShapes::commitShapeEdited() {
4277
// save edited junction's shape
4278
if (myEditedNetworkElement != nullptr) {
4279
// stop edit custom shape
4280
stopEditCustomShape();
4281
}
4282
}
4283
4284
4285
GNENetworkElement*
4286
GNEViewNetHelper::EditNetworkElementShapes::getEditedNetworkElement() const {
4287
return myEditedNetworkElement;
4288
}
4289
4290
// ---------------------------------------------------------------------------
4291
// GNEViewNetHelper::BlockIcon - methods
4292
// ---------------------------------------------------------------------------
4293
4294
void
4295
GNEViewNetHelper::LockIcon::drawLockIcon(const GUIVisualizationSettings::Detail d,
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
4301
GLHelper::pushMatrix();
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
4311
GUITexturesHelper::drawTexturedBox(GUITextureSubSys::getTexture(GUITexture::LOCK), size);
4312
// Pop matrix
4313
GLHelper::popMatrix();
4314
}
4315
}
4316
4317
4318
GNEViewNetHelper::LockIcon::LockIcon() {}
4319
4320
4321
bool
4322
GNEViewNetHelper::LockIcon::checkDrawing(const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier* AC,
4323
GUIGlObjectType type, const double exaggeration) {
4324
// check detail
4325
if (d > GUIVisualizationSettings::Detail::LockedIcons) {
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() &&
4336
!(AC->getTagProperty()->isNetworkElement() || AC->getTagProperty()->isAdditionalElement())) {
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
4357
const std::vector<RGBColor>&
4358
GNEViewNetHelper::getRainbowScaledColors() {
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
4377
const RGBColor&
4378
GNEViewNetHelper::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
4400
std::vector<GUIGlObject*>
4401
GNEViewNetHelper::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
/****************************************************************************/
4430
4431