Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/network/GNETAZFrame.cpp
169685 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 GNETAZFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Oct 2018
17
///
18
// The Widget for add TAZ elements
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNETagProperties.h>
24
#include <netedit/GNEUndoList.h>
25
#include <netedit/GNEViewParent.h>
26
#include <netedit/dialogs/basic/GNEQuestionBasicDialog.h>
27
#include <netedit/dialogs/basic/GNEInformationBasicDialog.h>
28
#include <netedit/changes/GNEChange_TAZSourceSink.h>
29
#include <netedit/elements/additional/GNEAdditionalHandler.h>
30
#include <netedit/elements/additional/GNETAZ.h>
31
#include <netedit/frames/GNEAttributesEditor.h>
32
#include <netedit/frames/GNEDrawingShape.h>
33
#include <utils/foxtools/MFXDynamicLabel.h>
34
#include <utils/gui/div/GUIDesigns.h>
35
36
#include "GNETAZFrame.h"
37
38
// ===========================================================================
39
// FOX callback mapping
40
// ===========================================================================
41
42
FXDEFMAP(GNETAZFrame::TAZSaveChanges) TAZSaveChangesMap[] = {
43
FXMAPFUNC(SEL_COMMAND, MID_OK, GNETAZFrame::TAZSaveChanges::onCmdSaveChanges),
44
FXMAPFUNC(SEL_COMMAND, MID_CANCEL, GNETAZFrame::TAZSaveChanges::onCmdCancelChanges),
45
};
46
47
FXDEFMAP(GNETAZFrame::TAZChildDefaultParameters) TAZChildDefaultParametersMap[] = {
48
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNETAZFrame::TAZChildDefaultParameters::onCmdSetDefaultValues),
49
FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNETAZFrame::TAZChildDefaultParameters::onCmdUseSelectedEdges),
50
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ZEROFRINGEPROB, GNETAZFrame::TAZChildDefaultParameters::onCmdSetZeroFringeProbabilities),
51
};
52
53
FXDEFMAP(GNETAZFrame::TAZSelectionStatistics) TAZSelectionStatisticsMap[] = {
54
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNETAZFrame::TAZSelectionStatistics::onCmdSetNewValues),
55
};
56
57
FXDEFMAP(GNETAZFrame::TAZEdgesGraphic) TAZEdgesGraphicMap[] = {
58
FXMAPFUNC(SEL_COMMAND, MID_CHOOSEN_OPERATION, GNETAZFrame::TAZEdgesGraphic::onCmdChoosenBy),
59
};
60
61
// Object implementation
62
FXIMPLEMENT(GNETAZFrame::TAZSaveChanges, MFXGroupBoxModule, TAZSaveChangesMap, ARRAYNUMBER(TAZSaveChangesMap))
63
FXIMPLEMENT(GNETAZFrame::TAZChildDefaultParameters, MFXGroupBoxModule, TAZChildDefaultParametersMap, ARRAYNUMBER(TAZChildDefaultParametersMap))
64
FXIMPLEMENT(GNETAZFrame::TAZSelectionStatistics, MFXGroupBoxModule, TAZSelectionStatisticsMap, ARRAYNUMBER(TAZSelectionStatisticsMap))
65
FXIMPLEMENT(GNETAZFrame::TAZEdgesGraphic, MFXGroupBoxModule, TAZEdgesGraphicMap, ARRAYNUMBER(TAZEdgesGraphicMap))
66
67
68
// ===========================================================================
69
// method definitions
70
// ===========================================================================
71
72
// ---------------------------------------------------------------------------
73
// GNETAZFrame::CurrentTAZ - methods
74
// ---------------------------------------------------------------------------
75
76
GNETAZFrame::CurrentTAZ::TAZEdgeColor::TAZEdgeColor(CurrentTAZ* CurrentTAZParent, GNEEdge* _edge, GNETAZSourceSink* _source, GNETAZSourceSink* _sink) :
77
edge(_edge),
78
source(_source),
79
sink(_sink),
80
sourceColor(0),
81
sinkColor(0),
82
sourcePlusSinkColor(0),
83
sourceMinusSinkColor(0),
84
myCurrentTAZParent(CurrentTAZParent) {
85
}
86
87
88
GNETAZFrame::CurrentTAZ::TAZEdgeColor::~TAZEdgeColor() {}
89
90
91
void
92
GNETAZFrame::CurrentTAZ::TAZEdgeColor::updateColors() {
93
sourceColor = source ? GNEAttributeCarrier::parse<int>(source->getAttribute(GNE_ATTR_TAZCOLOR)) : 0;
94
sinkColor = sink ? GNEAttributeCarrier::parse<int>(sink->getAttribute(GNE_ATTR_TAZCOLOR)) : 0;
95
double sourceWeight = source ? source->getWeight() : 0;
96
double sinkWeight = sink ? sink->getWeight() : 0;
97
// Obtain Source+Sink needs more steps. First obtain Source+Sink Weight
98
double sourcePlusSinkWeight = sourceWeight + sinkWeight;
99
// avoid division between zero
100
if ((myCurrentTAZParent->myMaxSourcePlusSinkWeight - myCurrentTAZParent->myMinSourcePlusSinkWeight) == 0) {
101
sourcePlusSinkColor = 0;
102
} else {
103
// calculate percentage relative to the max and min Source+Sink weight
104
double percentage = (sourcePlusSinkWeight - myCurrentTAZParent->myMinSourcePlusSinkWeight) /
105
(myCurrentTAZParent->myMaxSourcePlusSinkWeight - myCurrentTAZParent->myMinSourcePlusSinkWeight);
106
// convert percentage to a value between [0-9] (because we have only 10 colors)
107
if (percentage >= 1) {
108
sourcePlusSinkColor = 9;
109
} else if (percentage < 0) {
110
sourcePlusSinkColor = 0;
111
} else {
112
sourcePlusSinkColor = (int)(percentage * 10);
113
}
114
}
115
// Obtain Source+Sink needs more steps. First obtain Source-Sink Weight
116
double sourceMinusSinkWeight = sourceWeight - sinkWeight;
117
// avoid division between zero
118
if ((myCurrentTAZParent->myMaxSourceMinusSinkWeight - myCurrentTAZParent->myMinSourceMinusSinkWeight) == 0) {
119
sourceMinusSinkColor = 0;
120
} else {
121
// calculate percentage relative to the max and min Source-Sink weight
122
double percentage = (sourceMinusSinkWeight - myCurrentTAZParent->myMinSourceMinusSinkWeight) /
123
(myCurrentTAZParent->myMaxSourceMinusSinkWeight - myCurrentTAZParent->myMinSourceMinusSinkWeight);
124
// convert percentage to a value between [0-9] (because we have only 10 colors)
125
if (percentage >= 1) {
126
sourceMinusSinkColor = 9;
127
} else if (percentage < 0) {
128
sourceMinusSinkColor = 0;
129
} else {
130
sourceMinusSinkColor = (int)(percentage * 10);
131
}
132
}
133
}
134
135
136
GNETAZFrame::CurrentTAZ::TAZEdgeColor::TAZEdgeColor() :
137
edge(nullptr),
138
source(nullptr),
139
sink(nullptr),
140
sourceColor(0),
141
sinkColor(0),
142
sourcePlusSinkColor(0),
143
sourceMinusSinkColor(0),
144
myCurrentTAZParent(nullptr) {
145
}
146
147
148
GNETAZFrame::CurrentTAZ::CurrentTAZ(GNETAZFrame* TAZFrameParent) :
149
MFXGroupBoxModule(TAZFrameParent, TL("TAZ")),
150
myTAZFrameParent(TAZFrameParent),
151
myEditedTAZ(nullptr),
152
myMaxSourcePlusSinkWeight(0),
153
myMinSourcePlusSinkWeight(-1),
154
myMaxSourceMinusSinkWeight(0),
155
myMinSourceMinusSinkWeight(-1) {
156
// create TAZ label
157
myCurrentTAZLabel = new FXLabel(getCollapsableFrame(), TL("No TAZ selected"), 0, GUIDesignLabel(JUSTIFY_LEFT));
158
}
159
160
161
GNETAZFrame::CurrentTAZ::~CurrentTAZ() {}
162
163
164
void
165
GNETAZFrame::CurrentTAZ::setTAZ(GNETAZ* editedTAZ) {
166
// set new current TAZ
167
myEditedTAZ = editedTAZ;
168
// update label and moduls
169
if (myEditedTAZ != nullptr) {
170
myCurrentTAZLabel->setText((TL("Current TAZ: ") + myEditedTAZ->getID()).c_str());
171
// obtain a copy of all SELECTED edges of the net (to avoid slowdown during manipulations)
172
mySelectedEdges = myTAZFrameParent->myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
173
// refresh TAZ Edges
174
refreshTAZEdges();
175
// hide TAZ parameters
176
myTAZFrameParent->myTAZAttributesEditor->hideAttributesEditor();
177
// hide drawing shape
178
myTAZFrameParent->myDrawingShape->hideDrawingShape();
179
// show edge common parameters
180
myTAZFrameParent->myTAZCommonStatistics->showTAZCommonStatisticsModule();
181
// show save TAZ Edges
182
myTAZFrameParent->myTAZSaveChanges->showTAZSaveChangesModule();
183
// show edge common parameters
184
myTAZFrameParent->myTAZChildDefaultParameters->extendTAZChildDefaultParameters();
185
// show Edges graphics
186
myTAZFrameParent->myTAZEdgesGraphic->showTAZEdgesGraphicModule();
187
} else {
188
// show TAZ parameters
189
myTAZFrameParent->myTAZAttributesEditor->showAttributesEditor(myTAZFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(SUMO_TAG_TAZ), true);
190
// show drawing shape
191
myTAZFrameParent->myDrawingShape->showDrawingShape();
192
// hide edge common parameters
193
myTAZFrameParent->myTAZCommonStatistics->hideTAZCommonStatisticsModule();
194
// hide edge common parameters
195
myTAZFrameParent->myTAZChildDefaultParameters->collapseTAZChildDefaultParameters();
196
// hide Edges graphics
197
myTAZFrameParent->myTAZEdgesGraphic->hideTAZEdgesGraphicModule();
198
// hide save TAZ Edges
199
myTAZFrameParent->myTAZSaveChanges->hideTAZSaveChangesModule();
200
// restore label
201
myCurrentTAZLabel->setText(TL("No TAZ selected"));
202
// clear selected edges
203
mySelectedEdges.clear();
204
// reset all weight values
205
myMaxSourcePlusSinkWeight = 0;
206
myMinSourcePlusSinkWeight = -1;
207
myMaxSourceMinusSinkWeight = 0;
208
myMinSourceMinusSinkWeight = -1;
209
}
210
}
211
212
213
GNETAZ*
214
GNETAZFrame::CurrentTAZ::getTAZ() const {
215
return myEditedTAZ;
216
}
217
218
219
bool
220
GNETAZFrame::CurrentTAZ::isTAZEdge(GNEEdge* edge) const {
221
// simply iterate over edges and check edge parameter
222
for (const auto& TAZEdgeColor : myTAZEdgeColors) {
223
if (TAZEdgeColor.edge == edge) {
224
return true;
225
}
226
}
227
// not found, then return false
228
return false;
229
}
230
231
232
const std::vector<GNEEdge*>&
233
GNETAZFrame::CurrentTAZ::getSelectedEdges() const {
234
return mySelectedEdges;
235
}
236
237
238
const std::vector<GNETAZFrame::CurrentTAZ::TAZEdgeColor>&
239
GNETAZFrame::CurrentTAZ::getTAZEdges() const {
240
return myTAZEdgeColors;
241
}
242
243
244
void
245
GNETAZFrame::CurrentTAZ::refreshTAZEdges() {
246
// clear all curren TAZEdges
247
myTAZEdgeColors.clear();
248
// clear weight values
249
myMaxSourcePlusSinkWeight = 0;
250
myMinSourcePlusSinkWeight = -1;
251
myMaxSourceMinusSinkWeight = 0;
252
myMinSourceMinusSinkWeight = -1;
253
// only refresh if we're editing an TAZ
254
if (myEditedTAZ) {
255
// first update TAZ Statistics
256
myEditedTAZ->updateTAZStatistic();
257
myTAZFrameParent->myTAZCommonStatistics->updateStatistics();
258
// iterate over child TAZElements and create TAZEdges
259
for (const auto& TAZSourceSink : myEditedTAZ->getChildTAZSourceSinks()) {
260
addSourceSink(TAZSourceSink);
261
}
262
// update colors after add all edges
263
for (auto& TAZEdgeColor : myTAZEdgeColors) {
264
TAZEdgeColor.updateColors();
265
}
266
// update edge colors
267
myTAZFrameParent->myTAZEdgesGraphic->updateEdgeColors();
268
}
269
}
270
271
272
void
273
GNETAZFrame::CurrentTAZ::addSourceSink(GNETAZSourceSink* sourceSink) {
274
GNEEdge* edge = myTAZFrameParent->myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(sourceSink->getAttribute(SUMO_ATTR_EDGE));
275
// first check if TAZEdgeColor has to be created
276
bool createTAZEdge = true;
277
for (auto& TAZEdgeColor : myTAZEdgeColors) {
278
if (TAZEdgeColor.edge == edge) {
279
createTAZEdge = false;
280
// update TAZ Source or Sink
281
if (sourceSink->getTagProperty()->getTag() == SUMO_TAG_TAZSOURCE) {
282
TAZEdgeColor.source = sourceSink;
283
} else {
284
TAZEdgeColor.sink = sourceSink;
285
}
286
}
287
}
288
// check if TAZElements has to be created
289
if (createTAZEdge) {
290
if (sourceSink->getTagProperty()->getTag() == SUMO_TAG_TAZSOURCE) {
291
myTAZEdgeColors.push_back(TAZEdgeColor(this, edge, sourceSink, nullptr));
292
} else {
293
myTAZEdgeColors.push_back(TAZEdgeColor(this, edge, nullptr, sourceSink));
294
}
295
}
296
// recalculate weights
297
myMaxSourcePlusSinkWeight = 0;
298
myMinSourcePlusSinkWeight = -1;
299
myMaxSourceMinusSinkWeight = 0;
300
myMinSourceMinusSinkWeight = -1;
301
for (const auto& TAZEdgeColor : myTAZEdgeColors) {
302
// make sure that both TAZ Source and Sink exist
303
if (TAZEdgeColor.source && TAZEdgeColor.sink) {
304
// obtain source plus sink
305
double sourcePlusSink = TAZEdgeColor.source->getWeight() + TAZEdgeColor.sink->getWeight();
306
// check myMaxSourcePlusSinkWeight
307
if (sourcePlusSink > myMaxSourcePlusSinkWeight) {
308
myMaxSourcePlusSinkWeight = sourcePlusSink;
309
}
310
// check myMinSourcePlusSinkWeight
311
if ((myMinSourcePlusSinkWeight == -1) || (sourcePlusSink < myMinSourcePlusSinkWeight)) {
312
myMinSourcePlusSinkWeight = sourcePlusSink;
313
}
314
// obtain source minus sink
315
double sourceMinusSink = TAZEdgeColor.source->getWeight() - TAZEdgeColor.sink->getWeight();
316
// use valor absolute
317
if (sourceMinusSink < 0) {
318
sourceMinusSink *= -1;
319
}
320
// check myMaxSourcePlusSinkWeight
321
if (sourceMinusSink > myMaxSourceMinusSinkWeight) {
322
myMaxSourceMinusSinkWeight = sourceMinusSink;
323
}
324
// check myMinSourcePlusSinkWeight
325
if ((myMinSourceMinusSinkWeight == -1) || (sourceMinusSink < myMinSourceMinusSinkWeight)) {
326
myMinSourceMinusSinkWeight = sourceMinusSink;
327
}
328
}
329
}
330
}
331
332
// ---------------------------------------------------------------------------
333
// GNETAZFrame::TAZCommonStatistics - methods
334
// ---------------------------------------------------------------------------
335
336
GNETAZFrame::TAZCommonStatistics::TAZCommonStatistics(GNETAZFrame* TAZFrameParent) :
337
MFXGroupBoxModule(TAZFrameParent, TL("TAZ Statistics")),
338
myTAZFrameParent(TAZFrameParent) {
339
// create label for statistics
340
myStatisticsLabel = new FXLabel(getCollapsableFrame(), TL("Statistics"), 0, GUIDesignLabelFrameInformation);
341
}
342
343
344
GNETAZFrame::TAZCommonStatistics::~TAZCommonStatistics() {}
345
346
347
void
348
GNETAZFrame::TAZCommonStatistics::showTAZCommonStatisticsModule() {
349
// always update statistics after show
350
updateStatistics();
351
show();
352
}
353
354
355
void
356
GNETAZFrame::TAZCommonStatistics::hideTAZCommonStatisticsModule() {
357
hide();
358
}
359
360
361
void
362
GNETAZFrame::TAZCommonStatistics::updateStatistics() {
363
if (myTAZFrameParent->myCurrentTAZ->getTAZ()) {
364
// declare ostringstream for statistics
365
std::ostringstream information;
366
information
367
<< TL("- Number of edges: ") << toString(myTAZFrameParent->myCurrentTAZ->getTAZ()->getChildTAZSourceSinks().size() / 2) << "\n"
368
<< TL("- Min source: ") << myTAZFrameParent->myCurrentTAZ->getTAZ()->getAttribute(GNE_ATTR_MIN_SOURCE) << "\n"
369
<< TL("- Max source: ") << myTAZFrameParent->myCurrentTAZ->getTAZ()->getAttribute(GNE_ATTR_MAX_SOURCE) << "\n"
370
<< TL("- Average source: ") << myTAZFrameParent->myCurrentTAZ->getTAZ()->getAttribute(GNE_ATTR_AVERAGE_SOURCE) << "\n"
371
<< "\n"
372
<< TL("- Min sink: ") << myTAZFrameParent->myCurrentTAZ->getTAZ()->getAttribute(GNE_ATTR_MIN_SINK) << "\n"
373
<< TL("- Max sink: ") << myTAZFrameParent->myCurrentTAZ->getTAZ()->getAttribute(GNE_ATTR_MAX_SINK) << "\n"
374
<< TL("- Average sink: ") << myTAZFrameParent->myCurrentTAZ->getTAZ()->getAttribute(GNE_ATTR_AVERAGE_SINK);
375
// set new label
376
myStatisticsLabel->setText(information.str().c_str());
377
} else {
378
myStatisticsLabel->setText(TL("No TAZ Selected"));
379
}
380
}
381
382
// ---------------------------------------------------------------------------
383
// GNETAZFrame::TAZSaveChanges - methods
384
// ---------------------------------------------------------------------------
385
386
GNETAZFrame::TAZSaveChanges::TAZSaveChanges(GNETAZFrame* TAZFrameParent) :
387
MFXGroupBoxModule(TAZFrameParent, TL("Modifications")),
388
myTAZFrameParent(TAZFrameParent) {
389
// Create groupbox for save changes
390
mySaveChangesButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Confirm changes"), "", "", GUIIconSubSys::getIcon(GUIIcon::SAVE), this, MID_OK, GUIDesignButton);
391
mySaveChangesButton->disable();
392
// Create groupbox cancel changes
393
myCancelChangesButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Cancel changes"), "", "", GUIIconSubSys::getIcon(GUIIcon::CANCEL), this, MID_CANCEL, GUIDesignButton);
394
myCancelChangesButton->disable();
395
}
396
397
398
GNETAZFrame::TAZSaveChanges::~TAZSaveChanges() {}
399
400
401
void
402
GNETAZFrame::TAZSaveChanges::showTAZSaveChangesModule() {
403
show();
404
}
405
406
407
void
408
GNETAZFrame::TAZSaveChanges::hideTAZSaveChangesModule() {
409
// cancel changes before hiding module
410
onCmdCancelChanges(0, 0, 0);
411
hide();
412
}
413
414
415
void
416
GNETAZFrame::TAZSaveChanges::enableButtonsAndBeginUndoList() {
417
// check that save changes is disabled
418
if (!mySaveChangesButton->isEnabled()) {
419
// enable mySaveChangesButton and myCancelChangesButton
420
mySaveChangesButton->enable();
421
myCancelChangesButton->enable();
422
// start undo list set
423
myTAZFrameParent->myViewNet->getUndoList()->begin(GUIIcon::TAZ, TL("TAZ changes"));
424
}
425
}
426
427
428
bool
429
GNETAZFrame::TAZSaveChanges::isChangesPending() const {
430
// simply check if save Changes Button is enabled
431
return myTAZFrameParent->shown() && mySaveChangesButton->isEnabled();
432
}
433
434
435
long
436
GNETAZFrame::TAZSaveChanges::onCmdSaveChanges(FXObject*, FXSelector, void*) {
437
// check that save changes is enabled
438
if (mySaveChangesButton->isEnabled()) {
439
// disable mySaveChangesButton and myCancelChangesButton
440
mySaveChangesButton->disable();
441
myCancelChangesButton->disable();
442
// finish undo list set
443
myTAZFrameParent->myViewNet->getUndoList()->end();
444
// always refresh TAZ Edges after removing TAZSources/Sinks
445
myTAZFrameParent->myCurrentTAZ->refreshTAZEdges();
446
// update use edges button
447
myTAZFrameParent->myTAZChildDefaultParameters->updateSelectEdgesButton();
448
449
}
450
return 1;
451
}
452
453
454
long
455
GNETAZFrame::TAZSaveChanges::onCmdCancelChanges(FXObject*, FXSelector, void*) {
456
// check that save changes is enabled
457
if (mySaveChangesButton->isEnabled()) {
458
// disable buttons
459
mySaveChangesButton->disable();
460
myCancelChangesButton->disable();
461
// abort undo list
462
myTAZFrameParent->myViewNet->getUndoList()->abortAllChangeGroups();
463
// always refresh TAZ Edges after removing TAZSources/Sinks
464
myTAZFrameParent->myCurrentTAZ->refreshTAZEdges();
465
// update use edges button
466
myTAZFrameParent->myTAZChildDefaultParameters->updateSelectEdgesButton();
467
}
468
return 1;
469
}
470
471
// ---------------------------------------------------------------------------
472
// GNETAZFrame::TAZChildDefaultParameters - methods
473
// ---------------------------------------------------------------------------
474
475
GNETAZFrame::TAZChildDefaultParameters::TAZChildDefaultParameters(GNETAZFrame* TAZFrameParent) :
476
MFXGroupBoxModule(TAZFrameParent, TL("TAZ Sources/Sinks")),
477
myTAZFrameParent(TAZFrameParent),
478
myDefaultTAZSourceWeight(1),
479
myDefaultTAZSinkWeight(1) {
480
// create checkbox for toggle membership
481
myToggleMembershipFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
482
new FXLabel(myToggleMembershipFrame, TL("Membership"), 0, GUIDesignLabelThickedFixed(100));
483
myToggleMembership = new FXCheckButton(myToggleMembershipFrame, TL("Toggle"), this, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
484
// by default enabled
485
myToggleMembership->setCheck(TRUE);
486
// create default TAZ Source weight
487
myDefaultTAZSourceFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
488
new FXLabel(myDefaultTAZSourceFrame, TL("New source"), 0, GUIDesignLabelThickedFixed(100));
489
myTextFieldDefaultValueTAZSources = new FXTextField(myDefaultTAZSourceFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
490
myTextFieldDefaultValueTAZSources->setText("1");
491
// create default TAZ Sink weight
492
myDefaultTAZSinkFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
493
new FXLabel(myDefaultTAZSinkFrame, TL("New sink"), 0, GUIDesignLabelThickedFixed(100));
494
myTextFieldDefaultValueTAZSinks = new FXTextField(myDefaultTAZSinkFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
495
myTextFieldDefaultValueTAZSinks->setText("1");
496
// Create button for use selected edges
497
myUseSelectedEdges = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Use selected edges"), "", "", nullptr, this, MID_GNE_SELECT, GUIDesignButton);
498
// Create button for zero fringe probabilities
499
myZeroFringeProbabilities = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Set zero fringe prob."), "", "", nullptr, this, MID_GNE_SET_ZEROFRINGEPROB, GUIDesignButton);
500
// Create information label
501
std::ostringstream information;
502
information
503
<< std::string("- ") << TL("Toggle Membership:") << "\n"
504
<< std::string(" ") << TL("Create new Sources/Sinks with given weights.");
505
myInformationLabel = new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
506
// always show
507
show();
508
}
509
510
511
GNETAZFrame::TAZChildDefaultParameters::~TAZChildDefaultParameters() {}
512
513
514
void
515
GNETAZFrame::TAZChildDefaultParameters::extendTAZChildDefaultParameters() {
516
// check if TAZ selection Statistics Module has to be shown
517
if (myToggleMembership->getCheck() == FALSE) {
518
myTAZFrameParent->myTAZSelectionStatistics->showTAZSelectionStatisticsModule();
519
} else {
520
myTAZFrameParent->myTAZSelectionStatistics->hideTAZSelectionStatisticsModule();
521
}
522
// update selected button
523
updateSelectEdgesButton();
524
// show items edges button
525
myToggleMembershipFrame->show();
526
myDefaultTAZSourceFrame->show();
527
myDefaultTAZSinkFrame->show();
528
myUseSelectedEdges->show();
529
myInformationLabel->show();
530
}
531
532
533
void
534
GNETAZFrame::TAZChildDefaultParameters::collapseTAZChildDefaultParameters() {
535
// hide TAZ Selection Statistics Module
536
myTAZFrameParent->myTAZSelectionStatistics->hideTAZSelectionStatisticsModule();
537
// hide items
538
myToggleMembershipFrame->hide();
539
myDefaultTAZSourceFrame->hide();
540
myDefaultTAZSinkFrame->hide();
541
myUseSelectedEdges->hide();
542
myInformationLabel->hide();
543
}
544
545
546
void
547
GNETAZFrame::TAZChildDefaultParameters::updateSelectEdgesButton() {
548
if (myToggleMembership->getCheck() == TRUE) {
549
// check if use selected edges has to be enabled
550
if (myTAZFrameParent->myCurrentTAZ->getSelectedEdges().size() > 0) {
551
myUseSelectedEdges->setText(TL("Use selected edges"));
552
myUseSelectedEdges->enable();
553
} else if (myTAZFrameParent->myCurrentTAZ->getTAZEdges().size() > 0) {
554
myUseSelectedEdges->setText(TL("Remove all edges"));
555
myUseSelectedEdges->enable();
556
} else {
557
myUseSelectedEdges->setText(TL("Use selected edges"));
558
myUseSelectedEdges->disable();
559
}
560
} else if (myTAZFrameParent->getCurrentTAZModule()->getTAZEdges().size() > 0) {
561
// enable myUseSelectedEdges button
562
myUseSelectedEdges->enable();
563
// update mySelectEdgesOfSelection label
564
if (myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected().size() == 0) {
565
// check if all edges of TAZChildren are selected
566
bool allSelected = true;
567
for (const auto& TAZEdgeColor : myTAZFrameParent->getCurrentTAZModule()->getTAZEdges()) {
568
if (!TAZEdgeColor.edge->isAttributeCarrierSelected()) {
569
allSelected = false;
570
}
571
}
572
if (allSelected) {
573
myUseSelectedEdges->setText(TL("Remove all edges from selection"));
574
} else {
575
myUseSelectedEdges->setText(TL("Add all edges to selection"));
576
}
577
} else if (myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected().size() == 1) {
578
if (myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected().front().edge->isAttributeCarrierSelected()) {
579
myUseSelectedEdges->setText(TL("Remove edge from selection"));
580
} else {
581
myUseSelectedEdges->setText(TL("Add edge to selection"));
582
}
583
} else {
584
// check if all edges of TAZChildren selected are selected
585
bool allSelected = true;
586
for (const auto& selectedEdge : myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected()) {
587
if (!selectedEdge.edge->isAttributeCarrierSelected()) {
588
allSelected = false;
589
}
590
}
591
if (allSelected) {
592
myUseSelectedEdges->setText((TL("Remove ") + toString(myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected().size()) + TL(" edges from to selection")).c_str());
593
} else {
594
myUseSelectedEdges->setText((TL("Add ") + toString(myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected().size()) + TL(" edges to selection")).c_str());
595
}
596
}
597
} else {
598
// TAZ doesn't have children, then disable button
599
myUseSelectedEdges->disable();
600
}
601
}
602
603
604
double
605
GNETAZFrame::TAZChildDefaultParameters::getDefaultTAZSourceWeight() const {
606
return myDefaultTAZSourceWeight;
607
}
608
609
610
double
611
GNETAZFrame::TAZChildDefaultParameters::getDefaultTAZSinkWeight() const {
612
return myDefaultTAZSinkWeight;
613
}
614
615
616
bool
617
GNETAZFrame::TAZChildDefaultParameters::getToggleMembership() const {
618
return (myToggleMembership->getCheck() == TRUE);
619
}
620
621
622
long
623
GNETAZFrame::TAZChildDefaultParameters::onCmdSetDefaultValues(FXObject* obj, FXSelector, void*) {
624
// find edited object
625
if (obj == myToggleMembership) {
626
// first clear selected edges
627
myTAZFrameParent->myTAZSelectionStatistics->clearSelectedEdges();
628
// set text of myToggleMembership
629
if (myToggleMembership->getCheck() == TRUE) {
630
myToggleMembership->setText(TL("toggle"));
631
// show source/Sink Frames
632
myDefaultTAZSourceFrame->show();
633
myDefaultTAZSinkFrame->show();
634
// update information label
635
std::ostringstream information;
636
information
637
<< std::string("- ") << TL("Toggle Membership:") << "\n"
638
<< std::string(" ") << TL("Create new Sources/Sinks with given weights.");
639
myInformationLabel->setText(information.str().c_str());
640
// hide TAZSelectionStatistics
641
myTAZFrameParent->myTAZSelectionStatistics->hideTAZSelectionStatisticsModule();
642
// check if use selected edges has to be enabled
643
if (myTAZFrameParent->myCurrentTAZ->getSelectedEdges().size() > 0) {
644
myUseSelectedEdges->setText(TL("Use selected edges"));
645
} else if (myTAZFrameParent->myCurrentTAZ->getTAZEdges().size() > 0) {
646
myUseSelectedEdges->setText(TL("Remove all edges"));
647
} else {
648
myUseSelectedEdges->setText(TL("Use selected edges"));
649
myUseSelectedEdges->disable();
650
}
651
} else {
652
myToggleMembership->setText(TL("keep"));
653
// hide source/Sink Frames
654
myDefaultTAZSourceFrame->hide();
655
myDefaultTAZSinkFrame->hide();
656
// update information label
657
std::ostringstream information;
658
information
659
<< std::string("- ") << TL("Keep Membership:") << TL(" Select Sources/Sinks.") << "\n"
660
<< std::string("- ") << TL("Press ESC to clear the current selection.");
661
myInformationLabel->setText(information.str().c_str());
662
// show TAZSelectionStatistics
663
myTAZFrameParent->myTAZSelectionStatistics->showTAZSelectionStatisticsModule();
664
}
665
// update button
666
updateSelectEdgesButton();
667
} else if (obj == myTextFieldDefaultValueTAZSources) {
668
// check if given value is valid
669
if (GNEAttributeCarrier::canParse<double>(myTextFieldDefaultValueTAZSources->getText().text())) {
670
myDefaultTAZSourceWeight = GNEAttributeCarrier::parse<double>(myTextFieldDefaultValueTAZSources->getText().text());
671
// check if myDefaultTAZSourceWeight is greater than 0
672
if (myDefaultTAZSourceWeight >= 0) {
673
// set valid color
674
myTextFieldDefaultValueTAZSources->setTextColor(GUIDesignTextColorBlack);
675
} else {
676
// set invalid color
677
myTextFieldDefaultValueTAZSources->setTextColor(GUIDesignTextColorRed);
678
myDefaultTAZSourceWeight = 1;
679
}
680
} else {
681
// set invalid color
682
myTextFieldDefaultValueTAZSources->setTextColor(GUIDesignTextColorRed);
683
myDefaultTAZSourceWeight = 1;
684
}
685
} else if (obj == myTextFieldDefaultValueTAZSinks) {
686
// check if given value is valid
687
if (GNEAttributeCarrier::canParse<double>(myTextFieldDefaultValueTAZSinks->getText().text())) {
688
myDefaultTAZSinkWeight = GNEAttributeCarrier::parse<double>(myTextFieldDefaultValueTAZSinks->getText().text());
689
// check if myDefaultTAZSinkWeight is greater than 0
690
if (myDefaultTAZSinkWeight >= 0) {
691
// set valid color
692
myTextFieldDefaultValueTAZSinks->setTextColor(GUIDesignTextColorBlack);
693
} else {
694
// set invalid color
695
myTextFieldDefaultValueTAZSinks->setTextColor(GUIDesignTextColorRed);
696
myDefaultTAZSinkWeight = 1;
697
}
698
} else {
699
// set invalid color
700
myTextFieldDefaultValueTAZSinks->setTextColor(GUIDesignTextColorRed);
701
myDefaultTAZSinkWeight = 1;
702
}
703
}
704
return 1;
705
}
706
707
708
long
709
GNETAZFrame::TAZChildDefaultParameters::onCmdUseSelectedEdges(FXObject*, FXSelector, void*) {
710
// select edge or create new TAZ Source/Child, depending of myToggleMembership
711
if (myToggleMembership->getCheck() == TRUE) {
712
// first drop all edges
713
myTAZFrameParent->dropTAZMembers();
714
// iterate over selected edges and add it as TAZMember
715
for (const auto& selectedEdge : myTAZFrameParent->myCurrentTAZ->getSelectedEdges()) {
716
myTAZFrameParent->addOrRemoveTAZMember(selectedEdge);
717
}
718
// update selected button
719
updateSelectEdgesButton();
720
} else {
721
if (myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected().size() == 0) {
722
// first check if all TAZEdges are selected
723
bool allSelected = true;
724
for (const auto& TAZEdgeColor : myTAZFrameParent->getCurrentTAZModule()->getTAZEdges()) {
725
if (!TAZEdgeColor.edge->isAttributeCarrierSelected()) {
726
allSelected = false;
727
}
728
}
729
// select or unselect all depending of allSelected
730
if (allSelected) {
731
// remove form selection all TAZEdges
732
for (const auto& TAZEdgeColor : myTAZFrameParent->getCurrentTAZModule()->getTAZEdges()) {
733
// change attribute selected (without undo-redo)
734
TAZEdgeColor.edge->unselectAttributeCarrier();
735
}
736
} else {
737
// add to selection all TAZEdges
738
for (const auto& TAZEdgeColor : myTAZFrameParent->getCurrentTAZModule()->getTAZEdges()) {
739
// change attribute selected (without undo-redo)
740
TAZEdgeColor.edge->selectAttributeCarrier();
741
}
742
}
743
} else {
744
// first check if all TAZEdges are selected
745
bool allSelected = true;
746
for (const auto& selectedEdge : myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected()) {
747
if (!selectedEdge.edge->isAttributeCarrierSelected()) {
748
allSelected = false;
749
}
750
}
751
// select or unselect all depending of allSelected
752
if (allSelected) {
753
// only remove from selection selected TAZEdges
754
for (const auto& selectedEdge : myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected()) {
755
if (selectedEdge.edge->isAttributeCarrierSelected()) {
756
// change attribute selected (without undo-redo)
757
selectedEdge.edge->unselectAttributeCarrier();
758
}
759
}
760
} else {
761
// only add to selection selected TAZEdges
762
for (const auto& selectedEdge : myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected()) {
763
if (!selectedEdge.edge->isAttributeCarrierSelected()) {
764
// change attribute selected (without undo-redo)
765
selectedEdge.edge->selectAttributeCarrier();
766
}
767
}
768
}
769
}
770
}
771
// update selection button
772
myTAZFrameParent->myTAZChildDefaultParameters->updateSelectEdgesButton();
773
// update view net
774
myTAZFrameParent->myViewNet->updateViewNet();
775
return 1;
776
}
777
778
779
long
780
GNETAZFrame::TAZChildDefaultParameters::onCmdSetZeroFringeProbabilities(FXObject*, FXSelector, void*) {
781
// compute and update
782
auto& neteditOptions = OptionsCont::getOptions();
783
myTAZFrameParent->getViewNet()->getNet()->computeAndUpdate(neteditOptions, false);
784
myTAZFrameParent->getViewNet()->update();
785
// find all edges with TAZSource/sinks and without successors/predecessors
786
std::vector<GNETAZSourceSink*> sources;
787
std::vector<GNETAZSourceSink*> sinks;
788
std::set<GNEAdditional*> TAZs;
789
// check if we're editing a single TAZ or all TAZs
790
if (myTAZFrameParent->myCurrentTAZ->getTAZ() != nullptr) {
791
// iterate over source/sinks
792
for (const auto& TAZSourceSink : myTAZFrameParent->myCurrentTAZ->getTAZ()->getChildTAZSourceSinks()) {
793
if (TAZSourceSink->getTagProperty()->getTag() == SUMO_TAG_TAZSOURCE) {
794
// set sink probability to 0 for all edges that have no predecessor
795
if (!TAZSourceSink->getParentEdges().front()->hasSuccessors() &&
796
(TAZSourceSink->getAttributeDouble(SUMO_ATTR_WEIGHT) != 0)) {
797
sources.push_back(TAZSourceSink);
798
TAZs.insert(myTAZFrameParent->myCurrentTAZ->getTAZ());
799
}
800
} else {
801
// set source probability to 0 for all edges that have no successor
802
if (!TAZSourceSink->getParentEdges().front()->hasPredecessors() &&
803
(TAZSourceSink->getAttributeDouble(SUMO_ATTR_WEIGHT) != 0)) {
804
sinks.push_back(TAZSourceSink);
805
TAZs.insert(myTAZFrameParent->myCurrentTAZ->getTAZ());
806
}
807
}
808
}
809
} else {
810
// iterate over all TAZs
811
for (const auto& TAZ : myTAZFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getAdditionals().at(SUMO_TAG_TAZ)) {
812
// iterate over source/sinks
813
for (const auto& TAZSourceSink : TAZ.second->getChildTAZSourceSinks()) {
814
if (TAZSourceSink->getTagProperty()->getTag() == SUMO_TAG_TAZSOURCE) {
815
// set sink probability to 0 for all edges that have no predecessor
816
if (!TAZSourceSink->getParentEdges().front()->hasSuccessors() &&
817
(TAZSourceSink->getAttributeDouble(SUMO_ATTR_WEIGHT) != 0)) {
818
sources.push_back(TAZSourceSink);
819
TAZs.insert(TAZ.second);
820
}
821
} else {
822
// set source probability to 0 for all edges that have no successor
823
if (!TAZSourceSink->getParentEdges().front()->hasPredecessors() &&
824
(TAZSourceSink->getAttributeDouble(SUMO_ATTR_WEIGHT) != 0)) {
825
sinks.push_back(TAZSourceSink);
826
TAZs.insert(TAZ.second);
827
}
828
}
829
}
830
}
831
}
832
// check if there is sources/sinks
833
if ((sources.size() + sinks.size()) > 0) {
834
// build the text
835
const std::string text = (TAZs.size() == 1) ?
836
// single TAZ
837
TL("Set weight 0 in ") + toString(sources.size()) + TL(" sources and ") +
838
toString(sinks.size()) + TL(" sinks from TAZ '") + (*TAZs.begin())->getID() + "'?" :
839
// multiple TAZs
840
TL("Set weight 0 in ") + toString(sources.size()) + TL(" sources and ") +
841
toString(sinks.size()) + TL(" sinks from ") + toString(TAZs.size()) + TL(" TAZs?");
842
// open question dialog
843
const auto questionDialog = GNEQuestionBasicDialog(myTAZFrameParent->getViewNet()->getViewParent()->getGNEAppWindows(),
844
GNEDialog::Buttons::YES_NO, TL("Set zero fringe probabilities"), text);
845
// continue depending of answer
846
if (questionDialog.getResult() == GNEDialog::Result::ACCEPT) {
847
myTAZFrameParent->myViewNet->getUndoList()->begin(GUIIcon::TAZ, TL("set zero fringe probabilities"));
848
for (const auto& source : sources) {
849
source->setAttribute(SUMO_ATTR_WEIGHT, "0", myTAZFrameParent->myViewNet->getUndoList());
850
}
851
for (const auto& sink : sinks) {
852
sink->setAttribute(SUMO_ATTR_WEIGHT, "0", myTAZFrameParent->myViewNet->getUndoList());
853
}
854
myTAZFrameParent->myViewNet->getUndoList()->end();
855
}
856
} else {
857
// show information box
858
GNEInformationBasicDialog(myTAZFrameParent->getViewNet()->getViewParent()->getGNEAppWindows(),
859
TL("Set zero fringe probabilities"), TL("No source/sinks to update."));
860
}
861
return 1;
862
}
863
864
// ---------------------------------------------------------------------------
865
// GNETAZFrame::TAZSelectionStatistics - methods
866
// ---------------------------------------------------------------------------
867
868
GNETAZFrame::TAZSelectionStatistics::TAZSelectionStatistics(GNETAZFrame* TAZFrameParent) :
869
MFXGroupBoxModule(TAZFrameParent, TL("Selection Statistics")),
870
myTAZFrameParent(TAZFrameParent) {
871
// create default TAZ Source weight
872
myTAZSourceFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
873
new FXLabel(myTAZSourceFrame, TL("Source"), 0, GUIDesignLabelThickedFixed(100));
874
myTextFieldTAZSourceWeight = new FXTextField(myTAZSourceFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
875
myTAZSourceFrame->hide();
876
// create default TAZ Sink weight
877
myTAZSinkFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
878
new FXLabel(myTAZSinkFrame, TL("Sink"), 0, GUIDesignLabelThickedFixed(100));
879
myTextFieldTAZSinkWeight = new FXTextField(myTAZSinkFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
880
myTAZSinkFrame->hide();
881
// create label for statistics
882
myStatisticsLabel = new FXLabel(getCollapsableFrame(), TL("Statistics"), 0, GUIDesignLabelFrameInformation);
883
}
884
885
886
GNETAZFrame::TAZSelectionStatistics::~TAZSelectionStatistics() {}
887
888
889
void
890
GNETAZFrame::TAZSelectionStatistics::showTAZSelectionStatisticsModule() {
891
// update Statistics before show
892
updateStatistics();
893
show();
894
}
895
896
897
void
898
GNETAZFrame::TAZSelectionStatistics::hideTAZSelectionStatisticsModule() {
899
// clear children before hide
900
clearSelectedEdges();
901
hide();
902
}
903
904
905
bool
906
GNETAZFrame::TAZSelectionStatistics::selectEdge(const CurrentTAZ::TAZEdgeColor& TAZEdgeColor) {
907
// find TAZEdgeColor using edge as criterium wasn't previously selected
908
for (const auto& selectedEdge : myEdgeAndTAZChildrenSelected) {
909
if (selectedEdge.edge == TAZEdgeColor.edge) {
910
throw ProcessError(TL("TAZEdgeColor already selected"));
911
}
912
}
913
// add edge and their TAZ Children into myTAZChildSelected
914
myEdgeAndTAZChildrenSelected.push_back(TAZEdgeColor);
915
// always update statistics after insertion
916
updateStatistics();
917
// update edge colors
918
myTAZFrameParent->myTAZEdgesGraphic->updateEdgeColors();
919
// update selection button
920
myTAZFrameParent->myTAZChildDefaultParameters->updateSelectEdgesButton();
921
return true;
922
}
923
924
925
bool
926
GNETAZFrame::TAZSelectionStatistics::unselectEdge(GNEEdge* edge) {
927
if (edge) {
928
// find TAZEdgeColor using edge as criterium
929
for (auto it = myEdgeAndTAZChildrenSelected.begin(); it != myEdgeAndTAZChildrenSelected.end(); it++) {
930
if (it->edge == edge) {
931
myEdgeAndTAZChildrenSelected.erase(it);
932
// always update statistics after insertion
933
updateStatistics();
934
// update edge colors
935
myTAZFrameParent->myTAZEdgesGraphic->updateEdgeColors();
936
// update selection button
937
myTAZFrameParent->myTAZChildDefaultParameters->updateSelectEdgesButton();
938
return true;
939
}
940
}
941
// throw exception if edge wasn't found
942
throw ProcessError(TL("edge wasn't found"));
943
} else {
944
throw ProcessError(TL("Invalid edge"));
945
}
946
}
947
948
949
bool
950
GNETAZFrame::TAZSelectionStatistics::isEdgeSelected(GNEEdge* edge) {
951
// find TAZEdgeColor using edge as criterium
952
for (const auto& selectedEdge : myEdgeAndTAZChildrenSelected) {
953
if (selectedEdge.edge == edge) {
954
return true;
955
}
956
}
957
// edge wasn't found, then return false
958
return false;
959
}
960
961
962
void
963
GNETAZFrame::TAZSelectionStatistics::clearSelectedEdges() {
964
// clear all selected edges (and the TAZ Children)
965
myEdgeAndTAZChildrenSelected.clear();
966
// always update statistics after clear edges
967
updateStatistics();
968
// update edge colors
969
myTAZFrameParent->myTAZEdgesGraphic->updateEdgeColors();
970
// update selection button
971
myTAZFrameParent->myTAZChildDefaultParameters->updateSelectEdgesButton();
972
}
973
974
975
const std::vector<GNETAZFrame::CurrentTAZ::TAZEdgeColor>&
976
GNETAZFrame::TAZSelectionStatistics::getEdgeAndTAZChildrenSelected() const {
977
return myEdgeAndTAZChildrenSelected;
978
}
979
980
981
long
982
GNETAZFrame::TAZSelectionStatistics::onCmdSetNewValues(FXObject* obj, FXSelector, void*) {
983
if (obj == myTextFieldTAZSourceWeight) {
984
// check if given value is valid
985
if (GNEAttributeCarrier::canParse<double>(myTextFieldTAZSourceWeight->getText().text())) {
986
double newTAZSourceWeight = GNEAttributeCarrier::parse<double>(myTextFieldTAZSourceWeight->getText().text());
987
// check if myDefaultTAZSourceWeight is greater than 0
988
if (newTAZSourceWeight >= 0) {
989
// set valid color in TextField
990
myTextFieldTAZSourceWeight->setTextColor(GUIDesignTextColorBlack);
991
// enable save button
992
myTAZFrameParent->myTAZSaveChanges->enableButtonsAndBeginUndoList();
993
// update weight of all TAZSources
994
for (const auto& selectedEdge : myEdgeAndTAZChildrenSelected) {
995
selectedEdge.source->setAttribute(SUMO_ATTR_WEIGHT, myTextFieldTAZSourceWeight->getText().text(), myTAZFrameParent->myViewNet->getUndoList());
996
}
997
// refresh TAZ Edges
998
myTAZFrameParent->getCurrentTAZModule()->refreshTAZEdges();
999
} else {
1000
// set invalid color
1001
myTextFieldTAZSourceWeight->setTextColor(GUIDesignTextColorRed);
1002
}
1003
} else {
1004
// set invalid color
1005
myTextFieldTAZSourceWeight->setTextColor(GUIDesignTextColorRed);
1006
}
1007
} else if (obj == myTextFieldTAZSinkWeight) {
1008
// check if given value is valid
1009
if (GNEAttributeCarrier::canParse<double>(myTextFieldTAZSinkWeight->getText().text())) {
1010
double newTAZSinkWeight = GNEAttributeCarrier::parse<double>(myTextFieldTAZSinkWeight->getText().text());
1011
// check if myDefaultTAZSinkWeight is greater than 0
1012
if (newTAZSinkWeight >= 0) {
1013
// set valid color in TextField
1014
myTextFieldTAZSinkWeight->setTextColor(GUIDesignTextColorBlack);
1015
// enable save button
1016
myTAZFrameParent->myTAZSaveChanges->enableButtonsAndBeginUndoList();
1017
// update weight of all TAZSources
1018
for (const auto& selectedEdge : myEdgeAndTAZChildrenSelected) {
1019
selectedEdge.sink->setAttribute(SUMO_ATTR_WEIGHT, myTextFieldTAZSinkWeight->getText().text(), myTAZFrameParent->myViewNet->getUndoList());
1020
}
1021
// refresh TAZ Edges
1022
myTAZFrameParent->getCurrentTAZModule()->refreshTAZEdges();
1023
} else {
1024
// set invalid color
1025
myTextFieldTAZSinkWeight->setTextColor(GUIDesignTextColorRed);
1026
}
1027
} else {
1028
// set invalid color
1029
myTextFieldTAZSinkWeight->setTextColor(GUIDesignTextColorRed);
1030
}
1031
}
1032
return 1;
1033
}
1034
1035
1036
long
1037
GNETAZFrame::TAZSelectionStatistics::onCmdSelectEdges(FXObject*, FXSelector, void*) {
1038
if (myEdgeAndTAZChildrenSelected.size() == 0) {
1039
// add to selection all TAZEdges
1040
for (const auto& TAZEdgeColor : myTAZFrameParent->getCurrentTAZModule()->getTAZEdges()) {
1041
// avoid empty undolists
1042
if (!TAZEdgeColor.edge->isAttributeCarrierSelected()) {
1043
// enable save button
1044
myTAZFrameParent->myTAZSaveChanges->enableButtonsAndBeginUndoList();
1045
// change attribute selected
1046
TAZEdgeColor.edge->setAttribute(GNE_ATTR_SELECTED, "true", myTAZFrameParent->myViewNet->getUndoList());
1047
}
1048
}
1049
} else {
1050
// only add to selection selected TAZEdges
1051
for (const auto& selectedEdge : myEdgeAndTAZChildrenSelected) {
1052
// avoid empty undolists
1053
if (!selectedEdge.edge->isAttributeCarrierSelected()) {
1054
// enable save button
1055
myTAZFrameParent->myTAZSaveChanges->enableButtonsAndBeginUndoList();
1056
// change attribute selected
1057
selectedEdge.edge->setAttribute(GNE_ATTR_SELECTED, "true", myTAZFrameParent->myViewNet->getUndoList());
1058
}
1059
}
1060
}
1061
return 1;
1062
}
1063
1064
1065
void
1066
GNETAZFrame::TAZSelectionStatistics::updateStatistics() {
1067
if (myEdgeAndTAZChildrenSelected.size() > 0) {
1068
// show TAZSources/Sinks frames
1069
myTAZSourceFrame->show();
1070
myTAZSinkFrame->show();
1071
// declare string sets for TextFields (to avoid duplicated values)
1072
std::set<std::string> weightSourceSet;
1073
std::set<std::string> weightSinkSet;
1074
// declare statistic variables
1075
double weight = 0;
1076
double maxWeightSource = 0;
1077
double minWeightSource = -1;
1078
double averageWeightSource = 0;
1079
double maxWeightSink = 0;
1080
double minWeightSink = -1;
1081
double averageWeightSink = 0;
1082
// iterate over child TAZElements
1083
for (const auto& selectedEdge : myEdgeAndTAZChildrenSelected) {
1084
//start with sources
1085
weight = selectedEdge.source->getWeight();
1086
// insert source weight in weightSinkTextField
1087
weightSourceSet.insert(toString(weight));
1088
// check max Weight
1089
if (maxWeightSource < weight) {
1090
maxWeightSource = weight;
1091
}
1092
// check min Weight
1093
if (minWeightSource == -1 || (maxWeightSource < weight)) {
1094
minWeightSource = weight;
1095
}
1096
// update Average
1097
averageWeightSource += weight;
1098
// continue with sinks
1099
weight = selectedEdge.sink->getWeight();
1100
// save sink weight in weightSinkTextField
1101
weightSinkSet.insert(toString(weight));
1102
// check max Weight
1103
if (maxWeightSink < weight) {
1104
maxWeightSink = weight;
1105
}
1106
// check min Weight
1107
if (minWeightSink == -1 || (maxWeightSink < weight)) {
1108
minWeightSink = weight;
1109
}
1110
// update Average
1111
averageWeightSink += weight;
1112
}
1113
// calculate average
1114
averageWeightSource /= (double)myEdgeAndTAZChildrenSelected.size();
1115
averageWeightSink /= (double)myEdgeAndTAZChildrenSelected.size();
1116
// declare ostringstream for statistics
1117
std::ostringstream information;
1118
std::string edgeInformation;
1119
// first fill edgeInformation
1120
if (myEdgeAndTAZChildrenSelected.size() == 1) {
1121
edgeInformation = TL("- Edge ID: ") + myEdgeAndTAZChildrenSelected.begin()->edge->getID();
1122
} else {
1123
edgeInformation = TL("- Number of edges: ") + toString(myEdgeAndTAZChildrenSelected.size());
1124
}
1125
// fill rest of information
1126
information
1127
<< edgeInformation << "\n"
1128
<< TL("- Min source: ") << toString(minWeightSource) << "\n"
1129
<< TL("- Max source: ") << toString(maxWeightSource) << "\n"
1130
<< TL("- Average source: ") << toString(averageWeightSource) << "\n"
1131
<< "\n"
1132
<< TL("- Min sink: ") << toString(minWeightSink) << "\n"
1133
<< TL("- Max sink: ") << toString(maxWeightSink) << "\n"
1134
<< TL("- Average sink: ") << toString(averageWeightSink);
1135
// set new label
1136
myStatisticsLabel->setText(information.str().c_str());
1137
// set TextFields (Text and color)
1138
myTextFieldTAZSourceWeight->setText(joinToString(weightSourceSet, " ").c_str());
1139
myTextFieldTAZSourceWeight->setTextColor(GUIDesignTextColorBlack);
1140
myTextFieldTAZSinkWeight->setText(joinToString(weightSinkSet, " ").c_str());
1141
myTextFieldTAZSinkWeight->setTextColor(GUIDesignTextColorBlack);
1142
} else {
1143
// hide TAZSources/Sinks frames
1144
myTAZSourceFrame->hide();
1145
myTAZSinkFrame->hide();
1146
// hide myStatisticsLabel
1147
myStatisticsLabel->setText(TL("No edges selected"));
1148
}
1149
}
1150
1151
// ---------------------------------------------------------------------------
1152
// GNETAZFrame::TAZEdgesGraphic - methods
1153
// ---------------------------------------------------------------------------
1154
1155
GNETAZFrame::TAZEdgesGraphic::TAZEdgesGraphic(GNETAZFrame* TAZFrameParent) :
1156
MFXGroupBoxModule(TAZFrameParent, TL("Edges")),
1157
myTAZFrameParent(TAZFrameParent),
1158
myEdgeDefaultColor(RGBColor::GREY),
1159
myEdgeSelectedColor(RGBColor::MAGENTA) {
1160
// create label for non taz edge color information
1161
FXLabel* NonTAZEdgeLabel = new FXLabel(getCollapsableFrame(), TL("Non TAZ Edge"), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));
1162
NonTAZEdgeLabel->setBackColor(MFXUtils::getFXColor(myEdgeDefaultColor));
1163
NonTAZEdgeLabel->setTextColor(MFXUtils::getFXColor(RGBColor::WHITE));
1164
// create label for selected TAZEdgeColor color information
1165
FXLabel* selectedTAZEdgeLabel = new FXLabel(getCollapsableFrame(), TL("Selected TAZ Edge"), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));
1166
selectedTAZEdgeLabel->setBackColor(MFXUtils::getFXColor(myEdgeSelectedColor));
1167
// build rainbow
1168
GNEFrame::buildRainbow(this);
1169
// create Radio button for show edges by source weight
1170
myColorBySourceWeight = new FXRadioButton(getCollapsableFrame(), TL("Color by Source"), this, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
1171
// create Radio button for show edges by sink weight
1172
myColorBySinkWeight = new FXRadioButton(getCollapsableFrame(), TL("Color by Sink"), this, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
1173
// create Radio button for show edges by source + sink weight
1174
myColorBySourcePlusSinkWeight = new FXRadioButton(getCollapsableFrame(), TL("Color by Source + Sink"), this, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
1175
// create Radio button for show edges by source - sink weight
1176
myColorBySourceMinusSinkWeight = new FXRadioButton(getCollapsableFrame(), TL("Color by Source - Sink"), this, MID_CHOOSEN_OPERATION, GUIDesignRadioButton);
1177
// show by source as default
1178
myColorBySourceWeight->setCheck(true);
1179
}
1180
1181
1182
GNETAZFrame::TAZEdgesGraphic::~TAZEdgesGraphic() {}
1183
1184
1185
void
1186
GNETAZFrame::TAZEdgesGraphic::showTAZEdgesGraphicModule() {
1187
// update edge colors
1188
updateEdgeColors();
1189
show();
1190
}
1191
1192
1193
void
1194
GNETAZFrame::TAZEdgesGraphic::hideTAZEdgesGraphicModule() {
1195
// iterate over all edges and restore color
1196
for (const auto& edge : myTAZFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
1197
for (const auto& lane : edge.second->getChildLanes()) {
1198
lane->setSpecialColor(nullptr);
1199
}
1200
}
1201
hide();
1202
}
1203
1204
1205
void
1206
GNETAZFrame::TAZEdgesGraphic::updateEdgeColors() {
1207
const std::vector<RGBColor>& scaledColors = GNEViewNetHelper::getRainbowScaledColors();
1208
// start painting all edges in gray
1209
for (const auto& edge : myTAZFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
1210
if (!edge.second->isAttributeCarrierSelected()) {
1211
// set candidate color (in this case, gray)
1212
for (const auto lane : edge.second->getChildLanes()) {
1213
lane->setSpecialColor(&myEdgeDefaultColor);
1214
}
1215
}
1216
}
1217
// now paint Source/sinks colors
1218
for (const auto& TAZEdgeColor : myTAZFrameParent->myCurrentTAZ->getTAZEdges()) {
1219
if (!TAZEdgeColor.edge->isAttributeCarrierSelected()) {
1220
// set candidate color (in this case,
1221
for (const auto& lane : TAZEdgeColor.edge->getChildLanes()) {
1222
// check what will be painted (source, sink or both)
1223
if (myColorBySourceWeight->getCheck() == TRUE) {
1224
lane->setSpecialColor(&scaledColors.at(TAZEdgeColor.sourceColor), TAZEdgeColor.source->getWeight());
1225
} else if (myColorBySinkWeight->getCheck() == TRUE) {
1226
lane->setSpecialColor(&scaledColors.at(TAZEdgeColor.sinkColor), TAZEdgeColor.sink->getWeight());
1227
} else if (myColorBySourcePlusSinkWeight->getCheck() == TRUE) {
1228
lane->setSpecialColor(&scaledColors.at(TAZEdgeColor.sourcePlusSinkColor), TAZEdgeColor.source->getWeight() + TAZEdgeColor.sink->getWeight());
1229
} else {
1230
lane->setSpecialColor(&scaledColors.at(TAZEdgeColor.sourceMinusSinkColor), TAZEdgeColor.source->getWeight() - TAZEdgeColor.sink->getWeight());
1231
}
1232
}
1233
}
1234
}
1235
// as last step paint candidate colors
1236
for (const auto& selectedEdge : myTAZFrameParent->myTAZSelectionStatistics->getEdgeAndTAZChildrenSelected()) {
1237
if (!selectedEdge.edge->isAttributeCarrierSelected()) {
1238
// set candidate selected color
1239
for (const auto& lane : selectedEdge.edge->getChildLanes()) {
1240
lane->setSpecialColor(&myEdgeSelectedColor);
1241
}
1242
}
1243
}
1244
// always update view after setting new colors
1245
myTAZFrameParent->myViewNet->updateViewNet();
1246
}
1247
1248
1249
long
1250
GNETAZFrame::TAZEdgesGraphic::onCmdChoosenBy(FXObject* obj, FXSelector, void*) {
1251
// check what radio was pressed and disable the others
1252
if (obj == myColorBySourceWeight) {
1253
myColorBySinkWeight->setCheck(FALSE);
1254
myColorBySourcePlusSinkWeight->setCheck(FALSE);
1255
myColorBySourceMinusSinkWeight->setCheck(FALSE);
1256
} else if (obj == myColorBySinkWeight) {
1257
myColorBySourceWeight->setCheck(FALSE);
1258
myColorBySourcePlusSinkWeight->setCheck(FALSE);
1259
myColorBySourceMinusSinkWeight->setCheck(FALSE);
1260
} else if (obj == myColorBySourcePlusSinkWeight) {
1261
myColorBySourceWeight->setCheck(FALSE);
1262
myColorBySinkWeight->setCheck(FALSE);
1263
myColorBySourceMinusSinkWeight->setCheck(FALSE);
1264
} else if (obj == myColorBySourceMinusSinkWeight) {
1265
myColorBySourceWeight->setCheck(FALSE);
1266
myColorBySinkWeight->setCheck(FALSE);
1267
myColorBySourcePlusSinkWeight->setCheck(FALSE);
1268
}
1269
// update edge colors
1270
updateEdgeColors();
1271
return 1;
1272
}
1273
1274
// ---------------------------------------------------------------------------
1275
// GNETAZFrame - methods
1276
// ---------------------------------------------------------------------------
1277
1278
GNETAZFrame::GNETAZFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
1279
GNEFrame(viewParent, viewNet, TL("TAZs")) {
1280
1281
// create current TAZ module
1282
myCurrentTAZ = new CurrentTAZ(this);
1283
1284
// Create TAZ Parameters module
1285
myTAZAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
1286
1287
// Create drawing controls module
1288
myDrawingShape = new GNEDrawingShape(this);
1289
1290
// Create TAZ Edges Common Statistics module
1291
myTAZCommonStatistics = new TAZCommonStatistics(this);
1292
1293
// Create save TAZ Edges module
1294
myTAZSaveChanges = new TAZSaveChanges(this);
1295
1296
// Create TAZ Edges Common Parameters module
1297
myTAZChildDefaultParameters = new TAZChildDefaultParameters(this);
1298
1299
// Create TAZ Edges Selection Statistics module
1300
myTAZSelectionStatistics = new TAZSelectionStatistics(this);
1301
1302
// Create TAZ Edges Common Parameters module
1303
myTAZEdgesGraphic = new TAZEdgesGraphic(this);
1304
1305
// by default there isn't a TAZ
1306
myCurrentTAZ->setTAZ(nullptr);
1307
}
1308
1309
1310
GNETAZFrame::~GNETAZFrame() {
1311
// check if we have to delete base TAZ object
1312
if (myBaseTAZ) {
1313
delete myBaseTAZ;
1314
}
1315
}
1316
1317
1318
void
1319
GNETAZFrame::show() {
1320
// edit template
1321
myCurrentTAZ->setTAZ(nullptr);
1322
// show frame
1323
GNEFrame::show();
1324
}
1325
1326
1327
void
1328
GNETAZFrame::hide() {
1329
// hide frame
1330
GNEFrame::hide();
1331
}
1332
1333
1334
bool
1335
GNETAZFrame::processClick(const Position& clickedPosition, const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {
1336
// Declare map to keep values
1337
std::map<SumoXMLAttr, std::string> valuesOfElement;
1338
if (myDrawingShape->isDrawing()) {
1339
// add or delete a new point depending of flag "delete last created point"
1340
if (myDrawingShape->getDeleteLastCreatedPoint()) {
1341
myDrawingShape->removeLastPoint();
1342
} else {
1343
myDrawingShape->addNewPoint(clickedPosition);
1344
}
1345
return true;
1346
} else if ((myCurrentTAZ->getTAZ() == nullptr) || (viewObjects.getTAZFront() && myCurrentTAZ->getTAZ() && !myTAZSaveChanges->isChangesPending())) {
1347
// if user click over an TAZ and there isn't changes pending, then select a new TAZ
1348
if (viewObjects.getTAZFront()) {
1349
// avoid reset of Frame if user doesn't click over an TAZ
1350
myCurrentTAZ->setTAZ(viewObjects.getTAZFront());
1351
// update TAZStatistics
1352
myCurrentTAZ->getTAZ()->updateTAZStatistic();
1353
myTAZCommonStatistics->updateStatistics();
1354
return true;
1355
} else {
1356
return false;
1357
}
1358
} else if (viewObjects.getEdgeFront()) {
1359
// if toggle Edge is enabled, select edge. In other case create two new source/Sinks
1360
if (myTAZChildDefaultParameters->getToggleMembership()) {
1361
// create new source/Sinks or delete it
1362
return addOrRemoveTAZMember(viewObjects.getEdgeFront());
1363
} else {
1364
// first check if clicked edge was previously selected
1365
if (myTAZSelectionStatistics->isEdgeSelected(viewObjects.getEdgeFront())) {
1366
// clear selected edges
1367
myTAZSelectionStatistics->clearSelectedEdges();
1368
} else {
1369
// iterate over TAZEdges saved in CurrentTAZ (it contains the Edge and Source/sinks)
1370
for (const auto& TAZEdgeColor : myCurrentTAZ->getTAZEdges()) {
1371
if (TAZEdgeColor.edge == viewObjects.getEdgeFront()) {
1372
// clear current selection (to avoid having two or more edges selected at the same time using mouse clicks)
1373
myTAZSelectionStatistics->clearSelectedEdges();
1374
// now select edge
1375
myTAZSelectionStatistics->selectEdge(TAZEdgeColor);
1376
// edge selected, then return true
1377
return true;
1378
}
1379
}
1380
}
1381
// edge wasn't selected, then return false
1382
return false;
1383
}
1384
} else {
1385
// nothing to do
1386
return false;
1387
}
1388
}
1389
1390
1391
void
1392
GNETAZFrame::processEdgeSelection(const std::vector<GNEEdge*>& edges) {
1393
// first check that a TAZ is selected
1394
if (myCurrentTAZ->getTAZ()) {
1395
// if "toggle Membership" is enabled, create new TAZSources/sinks. In other case simply select edges
1396
if (myTAZChildDefaultParameters->getToggleMembership()) {
1397
// iterate over edges
1398
for (const auto& edge : edges) {
1399
// first check if edge owns a TAZEge
1400
if (!myCurrentTAZ->isTAZEdge(edge)) {
1401
// create new TAZ Sources/Sinks
1402
addOrRemoveTAZMember(edge);
1403
}
1404
}
1405
} else {
1406
// iterate over edges
1407
for (const auto& edge : edges) {
1408
// first check that selected edge isn't already selected
1409
if (!myTAZSelectionStatistics->isEdgeSelected(edge)) {
1410
// iterate over TAZEdges saved in CurrentTAZ (it contains the Edge and Source/sinks)
1411
for (const auto& TAZEdgeColor : myCurrentTAZ->getTAZEdges()) {
1412
if (TAZEdgeColor.edge == edge) {
1413
myTAZSelectionStatistics->selectEdge(TAZEdgeColor);
1414
}
1415
}
1416
}
1417
}
1418
}
1419
}
1420
}
1421
1422
1423
GNEDrawingShape*
1424
GNETAZFrame::getDrawingShapeModule() const {
1425
return myDrawingShape;
1426
}
1427
1428
1429
GNETAZFrame::CurrentTAZ*
1430
GNETAZFrame::getCurrentTAZModule() const {
1431
return myCurrentTAZ;
1432
}
1433
1434
1435
GNETAZFrame::TAZSelectionStatistics*
1436
GNETAZFrame::getTAZSelectionStatisticsModule() const {
1437
return myTAZSelectionStatistics;
1438
}
1439
1440
1441
GNETAZFrame::TAZSaveChanges*
1442
GNETAZFrame::getTAZSaveChangesModule() const {
1443
return myTAZSaveChanges;
1444
}
1445
1446
1447
bool
1448
GNETAZFrame::shapeDrawed() {
1449
// show warning dialogbox and stop check if input parameters are valid
1450
if (!myTAZAttributesEditor->checkAttributes(true)) {
1451
return false;
1452
} else if (myDrawingShape->getTemporalShape().size() < 3) {
1453
WRITE_WARNING(TL("TAZ shape needs at least three points"));
1454
return false;
1455
} else {
1456
// reset base TAZ element
1457
if (myBaseTAZ) {
1458
delete myBaseTAZ;
1459
}
1460
// create an new base additional
1461
myBaseTAZ = new CommonXMLStructure::SumoBaseObject(nullptr);
1462
myBaseTAZ->setTag(SUMO_TAG_TAZ);
1463
// get attributes and values
1464
myTAZAttributesEditor->fillSumoBaseObject(myBaseTAZ);
1465
// generate new ID
1466
myBaseTAZ->addStringAttribute(SUMO_ATTR_ID, myViewNet->getNet()->getAttributeCarriers()->generateAdditionalID(SUMO_TAG_TAZ));
1467
// obtain shape and close it
1468
PositionVector shape = myDrawingShape->getTemporalShape();
1469
shape.closePolygon();
1470
myBaseTAZ->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shape);
1471
// set center if is invalid
1472
if (myBaseTAZ->getPositionAttribute(SUMO_ATTR_CENTER) == Position::INVALID) {
1473
myBaseTAZ->addPositionAttribute(SUMO_ATTR_CENTER, shape.getCentroid());
1474
}
1475
// check if TAZ has to be created with edges
1476
if (myBaseTAZ->getBoolAttribute(GNE_ATTR_EDGES_WITHIN)) {
1477
// get all elements within shape
1478
myViewNet->updateObjectsInShape(shape);
1479
// declare edge IDs
1480
std::vector<std::string> edgeIDs;
1481
edgeIDs.reserve(myViewNet->getViewObjectsSelector().getEdges().size());
1482
// get only edges with geometry around triangle
1483
for (const auto& edge : myViewNet->getViewObjectsSelector().getEdges()) {
1484
edgeIDs.push_back(edge->getID());
1485
}
1486
myBaseTAZ->addStringListAttribute(SUMO_ATTR_EDGES, edgeIDs);
1487
} else {
1488
// TAZ is created without edges
1489
myBaseTAZ->addStringListAttribute(SUMO_ATTR_EDGES, std::vector<std::string>());
1490
}
1491
// declare additional handler
1492
GNEAdditionalHandler additionalHandler(myViewNet->getNet(), myBaseTAZ->hasStringAttribute(GNE_ATTR_ADDITIONAL_FILE) ?
1493
myBaseTAZ->getStringAttribute(GNE_ATTR_ADDITIONAL_FILE) : "",
1494
myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
1495
// build TAZ
1496
additionalHandler.parseSumoBaseObject(myBaseTAZ);
1497
// Write info
1498
WRITE_MESSAGE(TLF("Created % sources and sinks", (2 * myBaseTAZ->getStringListAttribute(SUMO_ATTR_EDGES).size())));
1499
// TAZ created, then return true
1500
return true;
1501
}
1502
}
1503
1504
1505
bool
1506
GNETAZFrame::addOrRemoveTAZMember(GNEEdge* edge) {
1507
// first check if edge exist;
1508
if (edge) {
1509
// first check if already exist (in this case, remove it)
1510
for (const auto& TAZEdgeColor : myCurrentTAZ->getTAZEdges()) {
1511
if (TAZEdgeColor.edge == edge) {
1512
// enable save changes button
1513
myTAZSaveChanges->enableButtonsAndBeginUndoList();
1514
// remove Source and Sinks using GNEChange_TAZElement
1515
if (myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(TAZEdgeColor.source->getGUIGlObject(), false)) {
1516
myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(TAZEdgeColor.source, false), true);
1517
}
1518
if (myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(TAZEdgeColor.sink->getGUIGlObject(), false)) {
1519
myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(TAZEdgeColor.sink, false), true);
1520
}
1521
// always refresh TAZ Edges after removing TAZSources/Sinks
1522
myCurrentTAZ->refreshTAZEdges();
1523
// update select edges button
1524
myTAZChildDefaultParameters->updateSelectEdgesButton();
1525
return true;
1526
}
1527
}
1528
// if wasn't found, then add it
1529
myTAZSaveChanges->enableButtonsAndBeginUndoList();
1530
// create TAZ Sink using GNEChange_TAZElement and value of TAZChild default parameters
1531
GNETAZSourceSink* source = new GNETAZSourceSink(SUMO_TAG_TAZSOURCE, myCurrentTAZ->getTAZ(), edge, myTAZChildDefaultParameters->getDefaultTAZSourceWeight());
1532
myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(source, true), true);
1533
// create TAZ Sink using GNEChange_TAZElement and value of TAZChild default parameters
1534
GNETAZSourceSink* sink = new GNETAZSourceSink(SUMO_TAG_TAZSINK, myCurrentTAZ->getTAZ(), edge, myTAZChildDefaultParameters->getDefaultTAZSinkWeight());
1535
myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(sink, true), true);
1536
// always refresh TAZ Edges after adding TAZSources/Sinks
1537
myCurrentTAZ->refreshTAZEdges();
1538
// update selected button
1539
myTAZChildDefaultParameters->updateSelectEdgesButton();
1540
return true;
1541
} else {
1542
throw ProcessError("Edge cannot be null");
1543
}
1544
}
1545
1546
1547
void
1548
GNETAZFrame::dropTAZMembers() {
1549
// iterate over all TAZEdges
1550
for (const auto& TAZEdgeColor : myCurrentTAZ->getTAZEdges()) {
1551
// enable save changes button
1552
myTAZSaveChanges->enableButtonsAndBeginUndoList();
1553
// remove Source and Sinks using GNEChange_TAZElement
1554
if (TAZEdgeColor.source) {
1555
myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(TAZEdgeColor.source, false), true);
1556
}
1557
if (TAZEdgeColor.sink) {
1558
myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(TAZEdgeColor.sink, false), true);
1559
}
1560
}
1561
// always refresh TAZ Edges after removing TAZSources/Sinks
1562
myCurrentTAZ->refreshTAZEdges();
1563
}
1564
1565
/****************************************************************************/
1566
1567