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