Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNETAZFrame.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-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/****************************************************************************/
18// The Widget for add TAZ elements
19/****************************************************************************/
20
22#include <netedit/GNENet.h>
24#include <netedit/GNEUndoList.h>
35
36#include "GNETAZFrame.h"
37
38// ===========================================================================
39// FOX callback mapping
40// ===========================================================================
41
46
52
56
60
61// Object implementation
62FXIMPLEMENT(GNETAZFrame::TAZSaveChanges, MFXGroupBoxModule, TAZSaveChangesMap, ARRAYNUMBER(TAZSaveChangesMap))
63FXIMPLEMENT(GNETAZFrame::TAZChildDefaultParameters, MFXGroupBoxModule, TAZChildDefaultParametersMap, ARRAYNUMBER(TAZChildDefaultParametersMap))
64FXIMPLEMENT(GNETAZFrame::TAZSelectionStatistics, MFXGroupBoxModule, TAZSelectionStatisticsMap, ARRAYNUMBER(TAZSelectionStatisticsMap))
65FXIMPLEMENT(GNETAZFrame::TAZEdgesGraphic, MFXGroupBoxModule, TAZEdgesGraphicMap, ARRAYNUMBER(TAZEdgesGraphicMap))
66
67
68// ===========================================================================
69// method definitions
70// ===========================================================================
71
72// ---------------------------------------------------------------------------
73// GNETAZFrame::CurrentTAZ - methods
74// ---------------------------------------------------------------------------
75
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
89
90
91void
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
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
149 MFXGroupBoxModule(TAZFrameParent, TL("TAZ")),
150 myTAZFrameParent(TAZFrameParent),
151 myEditedTAZ(nullptr),
156 // create TAZ label
157 myCurrentTAZLabel = new FXLabel(getCollapsableFrame(), TL("No TAZ selected"), 0, GUIDesignLabel(JUSTIFY_LEFT));
158}
159
160
162
163
164void
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
213GNETAZ*
215 return myEditedTAZ;
216}
217
218
219bool
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
232const std::vector<GNEEdge*>&
234 return mySelectedEdges;
235}
236
237
238const std::vector<GNETAZFrame::CurrentTAZ::TAZEdgeColor>&
240 return myTAZEdgeColors;
241}
242
243
244void
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) {
265 }
266 // update edge colors
267 myTAZFrameParent->myTAZEdgesGraphic->updateEdgeColors();
268 }
269}
270
271
272void
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
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
337 MFXGroupBoxModule(TAZFrameParent, TL("TAZ Statistics")),
338 myTAZFrameParent(TAZFrameParent) {
339 // create label for statistics
341}
342
343
345
346
347void
349 // always update statistics after show
350 updateStatistics();
351 show();
352}
353
354
355void
359
360
361void
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
387 MFXGroupBoxModule(TAZFrameParent, TL("Modifications")),
388 myTAZFrameParent(TAZFrameParent) {
389 // Create groupbox for save changes
391 mySaveChangesButton->disable();
392 // Create groupbox cancel changes
394 myCancelChangesButton->disable();
395}
396
397
399
400
401void
405
406
407void
409 // cancel changes before hiding module
410 onCmdCancelChanges(0, 0, 0);
411 hide();
412}
413
414
415void
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
428bool
430 // simply check if save Changes Button is enabled
431 return myTAZFrameParent->shown() && mySaveChangesButton->isEnabled();
432}
433
434
435long
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
454long
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
476 MFXGroupBoxModule(TAZFrameParent, TL("TAZ Sources/Sinks")),
477 myTAZFrameParent(TAZFrameParent),
478 myDefaultTAZSourceWeight(1),
479 myDefaultTAZSinkWeight(1) {
480 // create checkbox for toggle membership
482 new FXLabel(myToggleMembershipFrame, TL("Membership"), 0, GUIDesignLabelThickedFixed(100));
484 // by default enabled
485 myToggleMembership->setCheck(TRUE);
486 // create default TAZ Source weight
488 new FXLabel(myDefaultTAZSourceFrame, TL("New source"), 0, GUIDesignLabelThickedFixed(100));
491 // create default TAZ Sink weight
493 new FXLabel(myDefaultTAZSinkFrame, TL("New sink"), 0, GUIDesignLabelThickedFixed(100));
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
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.");
506 // always show
507 show();
508}
509
510
512
513
514void
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
533void
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
546void
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
604double
606 return myDefaultTAZSourceWeight;
607}
608
609
610double
612 return myDefaultTAZSinkWeight;
613}
614
615
616bool
618 return (myToggleMembership->getCheck() == TRUE);
619}
620
621
622long
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
708long
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
779long
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
869 MFXGroupBoxModule(TAZFrameParent, TL("Selection Statistics")),
870 myTAZFrameParent(TAZFrameParent) {
871 // create default TAZ Source weight
873 new FXLabel(myTAZSourceFrame, TL("Source"), 0, GUIDesignLabelThickedFixed(100));
875 myTAZSourceFrame->hide();
876 // create default TAZ Sink weight
878 new FXLabel(myTAZSinkFrame, TL("Sink"), 0, GUIDesignLabelThickedFixed(100));
880 myTAZSinkFrame->hide();
881 // create label for statistics
883}
884
885
887
888
889void
891 // update Statistics before show
892 updateStatistics();
893 show();
894}
895
896
897void
899 // clear children before hide
900 clearSelectedEdges();
901 hide();
902}
903
904
905bool
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
925bool
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
949bool
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
962void
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
975const std::vector<GNETAZFrame::CurrentTAZ::TAZEdgeColor>&
977 return myEdgeAndTAZChildrenSelected;
978}
979
980
981long
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
1036long
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
1065void
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
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
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
1183
1184
1185void
1187 // update edge colors
1188 updateEdgeColors();
1189 show();
1190}
1191
1192
1193void
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
1205void
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
1249long
1250GNETAZFrame::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
1279 GNEFrame(viewParent, viewNet, TL("TAZs")) {
1280
1281 // create current TAZ module
1282 myCurrentTAZ = new CurrentTAZ(this);
1283
1284 // Create TAZ Parameters module
1286
1287 // Create drawing controls module
1288 myDrawingShape = new GNEDrawingShape(this);
1289
1290 // Create TAZ Edges Common Statistics module
1292
1293 // Create save TAZ Edges module
1294 myTAZSaveChanges = new TAZSaveChanges(this);
1295
1296 // Create TAZ Edges Common Parameters module
1298
1299 // Create TAZ Edges Selection Statistics module
1301
1302 // Create TAZ Edges Common Parameters module
1304
1305 // by default there isn't a TAZ
1306 myCurrentTAZ->setTAZ(nullptr);
1307}
1308
1309
1311 // check if we have to delete base TAZ object
1312 if (myBaseTAZ) {
1313 delete myBaseTAZ;
1314 }
1315}
1316
1317
1318void
1320 // edit template
1321 myCurrentTAZ->setTAZ(nullptr);
1322 // show frame
1324}
1325
1326
1327void
1329 // hide frame
1331}
1332
1333
1334bool
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"
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
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
1361 // create new source/Sinks or delete it
1362 return addOrRemoveTAZMember(viewObjects.getEdgeFront());
1363 } else {
1364 // first check if clicked edge was previously selected
1366 // clear selected edges
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)
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
1391void
1392GNETAZFrame::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
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
1403 }
1404 }
1405 } else {
1406 // iterate over edges
1407 for (const auto& edge : edges) {
1408 // first check that selected edge isn't already selected
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
1427
1428
1433
1434
1439
1440
1445
1446
1447bool
1449 // show warning dialogbox and stop check if input parameters are valid
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
1463 // get attributes and values
1465 // generate new ID
1467 // obtain shape and close it
1469 shape.closePolygon();
1471 // set center if is invalid
1474 }
1475 // check if TAZ has to be created with edges
1477 // get all elements within 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 }
1487 } else {
1488 // TAZ is created without edges
1489 myBaseTAZ->addStringListAttribute(SUMO_ATTR_EDGES, std::vector<std::string>());
1490 }
1491 // declare additional handler
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
1505bool
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
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
1523 // update select edges button
1525 return true;
1526 }
1527 }
1528 // if wasn't found, then add it
1530 // create TAZ Sink using GNEChange_TAZElement and value of TAZChild default parameters
1532 myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(source, true), true);
1533 // create TAZ Sink using GNEChange_TAZElement and value of TAZChild default parameters
1535 myViewNet->getUndoList()->add(new GNEChange_TAZSourceSink(sink, true), true);
1536 // always refresh TAZ Edges after adding TAZSources/Sinks
1538 // update selected button
1540 return true;
1541 } else {
1542 throw ProcessError("Edge cannot be null");
1543 }
1544}
1545
1546
1547void
1549 // iterate over all TAZEdges
1550 for (const auto& TAZEdgeColor : myCurrentTAZ->getTAZEdges()) {
1551 // enable save changes button
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
1563}
1564
1565/****************************************************************************/
FXDEFMAP(GNETAZFrame::TAZSaveChanges) TAZSaveChangesMap[]
@ MID_GNE_SET_ATTRIBUTE
attribute edited
Definition GUIAppEnum.h:991
@ MID_CANCEL
Cancel-button pressed.
Definition GUIAppEnum.h:308
@ MID_CHOOSEN_OPERATION
set type of selection
Definition GUIAppEnum.h:597
@ MID_OK
Ok-button pressed.
Definition GUIAppEnum.h:306
@ MID_GNE_SELECT
select element
@ MID_GNE_SET_ZEROFRINGEPROB
set zero fringe probabilities (used in TAZ Frame)
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButton
Definition GUIDesigns.h:100
#define GUIDesignTextField
Definition GUIDesigns.h:74
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:430
#define GUIDesignLabel(justify)
Definition GUIDesigns.h:245
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition GUIDesigns.h:92
#define GUIDesignTextColorBlack
black color (for correct text)
Definition GUIDesigns.h:38
#define GUIDesignCheckButton
checkButton placed in left position
Definition GUIDesigns.h:194
#define GUIDesignRadioButton
Definition GUIDesigns.h:231
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition GUIDesigns.h:254
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition GUIDesigns.h:281
@ SAVE
save icons
#define WRITE_MESSAGE(msg)
Definition MsgHandler.h:289
#define WRITE_WARNING(msg)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:305
#define TLF(string,...)
Definition MsgHandler.h:307
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ GNE_ATTR_MAX_SOURCE
max source (used only by TAZs)
@ SUMO_ATTR_EDGE
@ GNE_ATTR_TAZCOLOR
Color of TAZSources/TAZSinks.
@ GNE_ATTR_MAX_SINK
max sink (used only by TAZs)
@ GNE_ATTR_AVERAGE_SINK
average sink (used only by TAZs)
@ GNE_ATTR_SELECTED
element is selected
@ GNE_ATTR_MIN_SINK
min sink (used only by TAZs)
@ SUMO_ATTR_EDGES
the edges of a route
@ GNE_ATTR_ADDITIONAL_FILE
additional save file
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_WEIGHT
@ SUMO_ATTR_CENTER
@ GNE_ATTR_AVERAGE_SOURCE
average source (used only by TAZs)
@ SUMO_ATTR_ID
@ GNE_ATTR_EDGES_WITHIN
virtual attribute used for use edges within during TAZ creation
@ GNE_ATTR_MIN_SOURCE
min source (used only by TAZs)
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:283
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
void parseSumoBaseObject(CommonXMLStructure::SumoBaseObject *obj)
parse SumoBaseObject (it's called recursivelly)
bool hasStringAttribute(const SumoXMLAttr attr) const
has function
void setTag(const SumoXMLTag tag)
set SumoBaseObject tag
const Position & getPositionAttribute(const SumoXMLAttr attr) const
get Position attribute
void addPositionVectorAttribute(const SumoXMLAttr attr, const PositionVector &value)
add PositionVector attribute into current SumoBaseObject node
void addStringListAttribute(const SumoXMLAttr attr, const std::vector< std::string > &value)
add string list attribute into current SumoBaseObject node
void addPositionAttribute(const SumoXMLAttr attr, const Position &value)
add Position attribute into current SumoBaseObject node
bool getBoolAttribute(const SumoXMLAttr attr) const
get bool attribute
void addStringAttribute(const SumoXMLAttr attr, const std::string &value)
add string attribute into current SumoBaseObject node
const std::vector< std::string > & getStringListAttribute(const SumoXMLAttr attr) const
get string list attribute
const std::string & getStringAttribute(const SumoXMLAttr attr) const
get string attribute
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
GNENet * getNet() const
get pointer to net
SumoXMLAttr fillSumoBaseObject(CommonXMLStructure::SumoBaseObject *baseObject) const
fill sumo Base object
bool checkAttributes(const bool showWarning)
check if current edited attributes are valid
bool isDrawing() const
return true if currently a shape is drawed
void addNewPoint(const Position &P)
add new point to temporal shape
bool getDeleteLastCreatedPoint()
get flag delete last created point
void removeLastPoint()
remove last added point
const PositionVector & getTemporalShape() const
get Temporal shape
A road/street connecting two junctions (netedit-version)
Definition GNEEdge.h:53
static FXLabel * buildRainbow(FXComposite *parent)
build rainbow in frame modul
Definition GNEFrame.cpp:252
GNEViewNet * myViewNet
FOX need this.
Definition GNEFrame.h:121
virtual void show()
show Frame
Definition GNEFrame.cpp:117
virtual void hide()
hide Frame
Definition GNEFrame.cpp:126
GNEAdditional * retrieveAdditional(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named additional.
std::string generateAdditionalID(SumoXMLTag type) const
generate additional id
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
std::vector< GNEEdge * > getSelectedEdges() const
return all edges
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:144
struct for edges and the source/sink colors
Definition GNETAZFrame.h:49
GNETAZSourceSink * sink
sink TAZ
Definition GNETAZFrame.h:68
GNETAZSourceSink * source
source TAZ
Definition GNETAZFrame.h:65
~TAZEdgeColor()
destructor (needed because RGBColors has to be deleted)
void refreshTAZEdges()
refresh TAZEdges
double myMinSourceMinusSinkWeight
minimum source minus sink value of current TAZ Edges
bool isTAZEdge(GNEEdge *edge) const
check if given edge belongs to current TAZ
void addSourceSink(GNETAZSourceSink *additional)
add source sink
GNETAZFrame * myTAZFrameParent
pointer to TAZ Frame
GNETAZ * myEditedTAZ
current edited TAZ
const std::vector< CurrentTAZ::TAZEdgeColor > & getTAZEdges() const
get TAZEdges
void setTAZ(GNETAZ *editedTAZ)
set current TAZ
const std::vector< GNEEdge * > & getSelectedEdges() const
get current selected edges
double myMaxSourceMinusSinkWeight
maximum source minus sink value of current TAZ Edges
FXLabel * myCurrentTAZLabel
Label for current TAZ.
CurrentTAZ(GNETAZFrame *TAZFrameParent)
constructor
double myMaxSourcePlusSinkWeight
maximum source plus sink value of current TAZ Edges
double myMinSourcePlusSinkWeight
minimum source plus sink value of current TAZ Edges
GNETAZ * getTAZ() const
get current TAZ
bool getToggleMembership() const
check if toggle membership is enabled
FXButton * myUseSelectedEdges
button for use selected edges
TAZChildDefaultParameters(GNETAZFrame *TAZFrameParent)
FOX-declaration.
FXCheckButton * myToggleMembership
CheckButton to enable or disable Toggle edge Membership.
void collapseTAZChildDefaultParameters()
collapse TAZ child default parameters Module (if we have selected a TAZ)
FXTextField * myTextFieldDefaultValueTAZSources
textField to set a default value for TAZ Sources
long onCmdUseSelectedEdges(FXObject *obj, FXSelector, void *)
Called when the user press "use selected edges" button.
void updateSelectEdgesButton()
update "select edges button"
double getDefaultTAZSourceWeight() const
get default source weight
void extendTAZChildDefaultParameters()
extend TAZ child default parameters Module (if we have selected a TAZ)
FXLabel * myInformationLabel
information label
FXHorizontalFrame * myDefaultTAZSinkFrame
Horizontal Frame for default TAZ Sink Weight.
FXHorizontalFrame * myDefaultTAZSourceFrame
Horizontal Frame for default TAZ Source Weight.
FXHorizontalFrame * myToggleMembershipFrame
Horizontal Frame toggle membership.
long onCmdSetZeroFringeProbabilities(FXObject *obj, FXSelector, void *)
Called when the user press "zero fringe probabilities" button.
FXTextField * myTextFieldDefaultValueTAZSinks
textField to set a default value for TAZ Sinks
long onCmdSetDefaultValues(FXObject *obj, FXSelector, void *)
double getDefaultTAZSinkWeight() const
default sink weight
FXButton * myZeroFringeProbabilities
button for setting zero fringe probabilities
void showTAZCommonStatisticsModule()
show TAZ Common Statistics Module
TAZCommonStatistics(GNETAZFrame *TAZFrameParent)
constructor
FXLabel * myStatisticsLabel
Statistics labels.
void hideTAZCommonStatisticsModule()
hide TAZ Common Statistics Module
void updateStatistics()
update Statistics label
FXRadioButton * myColorBySourcePlusSinkWeight
add radio button "color source + sink"
RGBColor myEdgeSelectedColor
RGBColor color for selected egdes.
FXRadioButton * myColorBySinkWeight
add radio button "color by sink"
void showTAZEdgesGraphicModule()
show TAZ Edges Graphic Module
void updateEdgeColors()
update edge colors;
FXRadioButton * myColorBySourceWeight
add radio button "color by source"
FXRadioButton * myColorBySourceMinusSinkWeight
add radio button "color source - Sink"
RGBColor myEdgeDefaultColor
default RGBColor for all edges
long onCmdChoosenBy(FXObject *obj, FXSelector, void *)
void hideTAZEdgesGraphicModule()
hide TAZ Edges Graphic Module
TAZEdgesGraphic(GNETAZFrame *TAZFrameParent)
FOX-declaration.
bool isChangesPending() const
return true if there is changes to save
FXButton * mySaveChangesButton
@field FXButton for save changes in TAZEdges
void showTAZSaveChangesModule()
show TAZ Save Changes Module
FXButton * myCancelChangesButton
@field FXButton for cancel changes in TAZEdges
long onCmdCancelChanges(FXObject *, FXSelector, void *)
Called when the user press the button cancel changes.
TAZSaveChanges(GNETAZFrame *TAZFrameParent)
FOX-declaration.
void hideTAZSaveChangesModule()
hide TAZ Save Changes Module
long onCmdSaveChanges(FXObject *, FXSelector, void *)
void enableButtonsAndBeginUndoList()
enable buttons save and cancel changes (And begin Undo List)
long onCmdSelectEdges(FXObject *obj, FXSelector, void *)
Called when the user press select edges.
TAZSelectionStatistics(GNETAZFrame *TAZFrameParent)
FOX-declaration.
FXHorizontalFrame * myTAZSourceFrame
Horizontal Frame for default TAZ Source Weight.
void hideTAZSelectionStatisticsModule()
hide TAZ Selection Statistics Module
bool isEdgeSelected(GNEEdge *edge)
check if an edge is selected
FXHorizontalFrame * myTAZSinkFrame
Horizontal Frame for default TAZ Sink Weight.
const std::vector< CurrentTAZ::TAZEdgeColor > & getEdgeAndTAZChildrenSelected() const
get map with edge and TAZChildren
void showTAZSelectionStatisticsModule()
show TAZ Selection Statistics Module
long onCmdSetNewValues(FXObject *obj, FXSelector, void *)
void clearSelectedEdges()
clear current TAZ children
FXTextField * myTextFieldTAZSourceWeight
textField for TAZ Source weight
void updateStatistics()
update TAZSelectionStatistics
FXTextField * myTextFieldTAZSinkWeight
textField for TAZ Sink weight
bool selectEdge(const CurrentTAZ::TAZEdgeColor &edge)
add an edge and their TAZ Children in the list of selected items
bool unselectEdge(GNEEdge *edge)
un select an edge (and their TAZ Children)
FXLabel * myStatisticsLabel
Statistics labels.
TAZSelectionStatistics * myTAZSelectionStatistics
TAZ Edges selection parameters.
TAZSelectionStatistics * getTAZSelectionStatisticsModule() const
get TAZ Selection Statistics module
TAZSaveChanges * getTAZSaveChangesModule() const
get TAZ Save Changes module
GNEAttributesEditor * myTAZAttributesEditor
TAZ parameters.
CurrentTAZ * myCurrentTAZ
current TAZ
TAZEdgesGraphic * myTAZEdgesGraphic
TAZ Edges Graphic.
bool addOrRemoveTAZMember(GNEEdge *edge)
add or remove a source and a sink, or remove it if edge is in the list of TAZ Children
void dropTAZMembers()
drop all TAZSources and TAZ Sinks of current TAZ
GNEDrawingShape * getDrawingShapeModule() const
get drawing mode module
CurrentTAZ * getCurrentTAZModule() const
get Current TAZ module
TAZCommonStatistics * myTAZCommonStatistics
TAZ Edges common parameters.
GNEDrawingShape * myDrawingShape
Drawing shape.
bool shapeDrawed()
build a shaped element using the drawed shape return true if was successfully created
void show()
show TAZ Frame
~GNETAZFrame()
Destructor.
TAZSaveChanges * myTAZSaveChanges
save TAZ Edges
CommonXMLStructure::SumoBaseObject * myBaseTAZ
SumoBaseObject used for creating TAZ.
void hide()
hide TAZ frame
void processEdgeSelection(const std::vector< GNEEdge * > &edges)
process selection of edges in view net
bool processClick(const Position &clickedPosition, const GNEViewNetHelper::ViewObjectsSelector &viewObjects)
process click over Viewnet
TAZChildDefaultParameters * myTAZChildDefaultParameters
TAZ child defaults parameters.
GNETAZFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
void updateTAZStatistic()
update TAZ Statistic
Definition GNETAZ.cpp:592
double getWeight() const
get weight
std::string getAttribute(SumoXMLAttr key) const
inherited from GNEAttributeCarrier
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
class used to group all variables related with objects under cursor after a click over view
GNEEdge * getEdgeFront() const
get front edge or a pointer to nullptr
GNETAZ * getTAZFront() const
get front TAZ or a pointer to nullptr
const std::vector< GNEEdge * > & getEdges() const
get vector with edges
GNENet * getNet() const
get the net object
GNEViewParent * getViewParent() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
const GNEViewNetHelper::ViewObjectsSelector & getViewObjectsSelector() const
get objects under cursor
void updateObjectsInShape(const PositionVector &shape)
get objects in the given shape (using triangulation)
A single child window which contains a view of the simulation area.
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
A list item which allows for custom coloring.
MFXGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition MFXUtils.cpp:145
static OptionsCont & getOptions()
Retrieves the options.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
static const Position INVALID
used to indicate that a position is valid
Definition Position.h:323
A list of positions.
void closePolygon()
ensures that the last position equals the first
Position getCentroid() const
Returns the centroid (closes the polygon if unclosed)
static const RGBColor WHITE
Definition RGBColor.h:195
static const std::vector< RGBColor > & getRainbowScaledColors()
get scaled rainbow colors