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),
84 myCurrentTAZParent(CurrentTAZParent) {
85}
86
87
89
90
91void
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) {
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) {
109 } else if (percentage < 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) {
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) {
127 } else if (percentage < 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),
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
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
209 }
210}
211
212
213GNETAZ*
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*>&
236
237
238const std::vector<GNETAZFrame::CurrentTAZ::TAZEdgeColor>&
242
243
244void
246 // clear all curren TAZEdges
247 myTAZEdgeColors.clear();
248 // clear weight values
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
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
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),
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
524 // show items edges button
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
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
608
609
610double
614
615
616bool
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
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
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
667 } else if (obj == myTextFieldDefaultValueTAZSources) {
668 // check if given value is valid
671 // check if myDefaultTAZSourceWeight is greater than 0
672 if (myDefaultTAZSourceWeight >= 0) {
673 // set valid color
675 } else {
676 // set invalid color
679 }
680 } else {
681 // set invalid color
684 }
685 } else if (obj == myTextFieldDefaultValueTAZSinks) {
686 // check if given value is valid
689 // check if myDefaultTAZSinkWeight is greater than 0
690 if (myDefaultTAZSinkWeight >= 0) {
691 // set valid color
693 } else {
694 // set invalid color
697 }
698 } else {
699 // set invalid color
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
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
893 show();
894}
895
896
897void
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
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) {
932 // always update statistics after insertion
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)
966 // always update statistics after clear edges
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>&
979
980
981long
983 if (obj == myTextFieldTAZSourceWeight) {
984 // check if given value is valid
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
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
1002 }
1003 } else {
1004 // set invalid color
1006 }
1007 } else if (obj == myTextFieldTAZSinkWeight) {
1008 // check if given value is valid
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
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
1026 }
1027 } else {
1028 // set invalid color
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());
1140 myTextFieldTAZSinkWeight->setText(joinToString(weightSinkSet, " ").c_str());
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),
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
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
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"
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
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
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
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
1427
1428
1433
1434
1439
1440
1445
1446
1447bool
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
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
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
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
1547void
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/****************************************************************************/
FXDEFMAP(GNETAZFrame::TAZSaveChanges) TAZSaveChangesMap[]
@ MID_GNE_SET_ATTRIBUTE
attribute edited
Definition GUIAppEnum.h:993
@ MID_CANCEL
Cancel-button pressed.
Definition GUIAppEnum.h:310
@ MID_CHOOSEN_OPERATION
set type of selection
Definition GUIAppEnum.h:599
@ MID_OK
Ok-button pressed.
Definition GUIAppEnum.h:308
@ 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
Definition GUIIcons.h:90
#define WRITE_MESSAGE(msg)
Definition MsgHandler.h:288
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
@ 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:289
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)
static T parse(const std::string &string)
parses a value of type T from string (used for basic types: int, double, bool, etc....
static bool canParse(const std::string &string)
true if a value of type T can be parsed from string
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
static FXLabel * buildRainbow(FXComposite *parent)
build rainbow in frame modul
Definition GNEFrame.cpp:245
GNEViewNet * myViewNet
FOX need this.
Definition GNEFrame.h:122
virtual void show()
show Frame
Definition GNEFrame.cpp:110
virtual void hide()
hide Frame
Definition GNEFrame.cpp:119
GNEFrame(GNEViewParent *viewParent, GNEViewNet *viewNet, const std::string &frameLabel)
Constructor.
Definition GNEFrame.cpp:42
struct for edges and the source/sink colors
Definition GNETAZFrame.h:49
int sourcePlusSinkColor
color by source + sink [0-9]
Definition GNETAZFrame.h:77
GNETAZSourceSink * sink
sink TAZ
Definition GNETAZFrame.h:68
TAZEdgeColor(CurrentTAZ *CurrentTAZParent, GNEEdge *_edge, GNETAZSourceSink *_source, GNETAZSourceSink *_sink)
constructor
GNETAZSourceSink * source
source TAZ
Definition GNETAZFrame.h:65
~TAZEdgeColor()
destructor (needed because RGBColors has to be deleted)
int sourceMinusSinkColor
color by source - sink [0-9]
Definition GNETAZFrame.h:80
CurrentTAZ * myCurrentTAZParent
pointer to CurrentTAZParent
Definition GNETAZFrame.h:84
int sourceColor
color by source [0-9]
Definition GNETAZFrame.h:71
int sinkColor
color by sink [0-9]
Definition GNETAZFrame.h:74
void refreshTAZEdges()
refresh TAZEdges
double myMinSourceMinusSinkWeight
minimum source minus sink value of current TAZ Edges
std::vector< GNEEdge * > mySelectedEdges
vector with pointers to selected 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
std::vector< TAZEdgeColor > myTAZEdgeColors
vector with TAZ's 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.
GNETAZFrame * myTAZFrameParent
FOX need this.
long onCmdSetZeroFringeProbabilities(FXObject *obj, FXSelector, void *)
Called when the user press "zero fringe probabilities" button.
double myDefaultTAZSourceWeight
default source weight
FXTextField * myTextFieldDefaultValueTAZSinks
textField to set a default value for TAZ Sinks
long onCmdSetDefaultValues(FXObject *obj, FXSelector, void *)
double getDefaultTAZSinkWeight() const
default sink weight
double myDefaultTAZSinkWeight
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
GNETAZFrame * myTAZFrameParent
pointer to TAZFrame parent
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
GNETAZFrame * myTAZFrameParent
pointer to TAZFrame parent
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
GNETAZFrame * myTAZFrameParent
pointer to TAZFrame parent
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.
std::vector< CurrentTAZ::TAZEdgeColor > myEdgeAndTAZChildrenSelected
vector with the current selected edges and their associated children
void hideTAZSelectionStatisticsModule()
hide TAZ Selection Statistics Module
GNETAZFrame * myTAZFrameParent
pointer to TAZFrame parent
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.
std::string getAttribute(SumoXMLAttr key) const override
inherited from GNEAttributeCarrier
double getWeight() const
get weight
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
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
A single child window which contains a view of the simulation area.
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)
MFXGroupBoxModule(GNEFrame *frame, const std::string &text, const int options=Options::COLLAPSIBLE)
constructor for frames
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