Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNECreateEdgeFrame.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 create edges (and junctions)
19/****************************************************************************/
20
21#include <netedit/GNENet.h>
22#include <netedit/GNEUndoList.h>
35
36#include "GNECreateEdgeFrame.h"
37
38// ===========================================================================
39// FOX callback mapping
40// ===========================================================================
41
50
56
57// Object implementation
58FXIMPLEMENT(GNECreateEdgeFrame::EdgeTypeSelector, MFXGroupBoxModule, EdgeTypeSelectorMap, ARRAYNUMBER(EdgeTypeSelectorMap))
59FXIMPLEMENT(GNECreateEdgeFrame::LaneTypeSelector, MFXGroupBoxModule, LaneTypeSelectorMap, ARRAYNUMBER(LaneTypeSelectorMap))
60
61
62// ===========================================================================
63// method definitions
64// ===========================================================================
65
66// ---------------------------------------------------------------------------
67// GNECreateEdgeFrame::EdgeTypeSelector - methods
68// ---------------------------------------------------------------------------
69
71 MFXGroupBoxModule(createEdgeFrameParent, TL("Template selector")),
72 myCreateEdgeFrameParent(createEdgeFrameParent),
73 myDefaultEdgeType(new GNEEdgeType(createEdgeFrameParent)),
74 myCurrentIndex(0) {
75 // default edge radio button
76 myCreateDefaultEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Create default edge"),
78 // default short radio button
79 myCreateDefaultShortEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Create default edge short"),
81 // checkboxes
82 myNoPedestriansCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Disallow for pedestrians"),
84 myAddSidewalkCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Add sidewalk"),
86 myAddBikelaneCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Add bikelane"),
88 // use custom edge radio button
89 myCreateCustomEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Use edgeType/template"),
91 // edge types combo box
92 myEdgeTypesComboBox = new MFXComboBoxIcon(getCollapsableFrame(), createEdgeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
94 // create horizontal frame
95 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
96 // create new edge type button
97 myAddEdgeTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Add"), "", TL("Add edge type"), GUIIconSubSys::getIcon(GUIIcon::ADD),
99 // create delete edge type button
100 myDeleteEdgeTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Delete"), "", TL("Delete edge type"), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
102 // create delete edge type button
103 myCreateFromTemplate = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create from template"), "", TL("Create edgeType from template"), GUIIconSubSys::getIcon(GUIIcon::EDGE),
105 // by default, create custom edge
106 myCreateDefaultEdgeType->setCheck(TRUE);
107 // check if enable disable pedestrians
108 for (const auto& junction : createEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
109 if (junction.second->getNBNode()->getCrossings().size() > 0) {
110 enableCheckBoxDisablePedestrians();
111 }
112 }
113}
114
115
119
120
121void
123 // get template editor
124 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
125 // get current item
126 const int index = myEdgeTypesComboBox->getCurrentItem();
127 // fill combo box
128 fillComboBox();
129 // continue depending of radio buttons
130 if (myCreateDefaultEdgeType->getCheck() || myCreateDefaultShortEdgeType->getCheck()) {
131 // enable check boxes
132 myAddSidewalkCheckButton->enable();
133 myAddBikelaneCheckButton->enable();
134 myNoPedestriansCheckButton->enable();
135 // disable create from template
136 myCreateFromTemplate->disable();
137 // disable comboBox
138 myEdgeTypesComboBox->disable();
139 // disable buttons
140 myAddEdgeTypeButton->disable();
141 myDeleteEdgeTypeButton->disable();
142 // show default edgeType attributes
143 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myDefaultEdgeType, true);
144 // show lane attributes
145 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
146 } else if (myCreateCustomEdgeType->getCheck()) {
147 // disable check boxes
148 myAddSidewalkCheckButton->disable();
149 myAddBikelaneCheckButton->disable();
150 myNoPedestriansCheckButton->disable();
151 // enable buttons
152 myAddEdgeTypeButton->enable();
153 myDeleteEdgeTypeButton->enable();
154 // check conditions
155 if (myEdgeTypesComboBox->getNumItems() == 0) {
156 // disable comboBox and edgeType
157 myEdgeTypesComboBox->disable();
158 myDeleteEdgeTypeButton->disable();
159 // hide attributes creators
160 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->hideAttributesEditor();
161 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
162 } else if (templateEditor->getEdgeTemplate() && (index == 0)) {
163 // enable create from template
164 myCreateFromTemplate->enable();
165 // enable comboBox
166 myEdgeTypesComboBox->enable();
167 // disable delete edge type button (because templates cannot be deleted)
168 myDeleteEdgeTypeButton->disable();
169 // show edgeType attributes and disable
170 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(templateEditor->getEdgeTemplate(), true);
171 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->disableAttributesEditor();
172 // show lane attributes (will be automatic disabled)
173 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
174 } else {
175 // disable create from template
176 myCreateFromTemplate->disable();
177 // enable comboBox
178 myEdgeTypesComboBox->enable();
179 // get edgeType
180 myEdgeTypeSelected = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text(), false);
181 // check if exist
182 if (myEdgeTypeSelected) {
183 // show edgeType attributes
184 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myEdgeTypeSelected, true);
185 // show lane attributes
186 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
187 } else {
188 // hide edgeType attributes
189 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->hideAttributesEditor();
190 // hide lane attributes
191 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
192 // set comboBox text
193 myEdgeTypesComboBox->setTextColor(GUIDesignTextColorRed);
194 }
195 }
196 }
197 // recalc
198 recalc();
199}
200
201
202void
203GNECreateEdgeFrame::EdgeTypeSelector::updateIDinComboBox(const std::string& oldID, const std::string& newID) {
204 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
205 if (myEdgeTypesComboBox->getItemText(i) == oldID) {
206 myEdgeTypesComboBox->updateIconItem(i, newID.c_str());
207 }
208 }
209}
210
211
212bool
214 return (myCreateDefaultEdgeType->getCheck() == TRUE);
215}
216
217
218bool
220 return (myCreateDefaultShortEdgeType->getCheck() == TRUE);
221}
222
223
224bool
226 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
227 if ((myCreateCustomEdgeType->getCheck() == TRUE) && (myEdgeTypesComboBox->getCurrentItem() == 0)) {
228 return true;
229 } else {
230 return false;
231 }
232 } else {
233 return false;
234 }
235}
236
237
238void
240 myNoPedestriansCheckButton->setCheck(TRUE);
241}
242
243
246 return myDefaultEdgeType;
247}
248
249
252 if ((myCreateDefaultEdgeType->getCheck() == TRUE) || (myCreateDefaultShortEdgeType->getCheck() == TRUE)) {
253 return myDefaultEdgeType;
254 } else {
255 return myEdgeTypeSelected;
256 }
257}
258
259
260bool
262 return (myNoPedestriansCheckButton->getCheck() == TRUE);
263}
264
265
266bool
268 return (myAddSidewalkCheckButton->getCheck() == TRUE);
269}
270
271
272bool
274 return (myAddBikelaneCheckButton->getCheck() == TRUE);
275}
276
277
278void
280 myEdgeTypeSelected = nullptr;
281 myCurrentIndex--;
282 if (myCurrentIndex < 0) {
283 myCurrentIndex = 0;
284 }
285}
286
287
288void
290 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
291 if (myEdgeTypesComboBox->getItemText(i) == edgeType->getID()) {
292 // set current item and index
293 myEdgeTypesComboBox->setCurrentItem(i);
294 myCurrentIndex = i;
295 // set buttons
296 myCreateDefaultEdgeType->setCheck(FALSE);
297 myCreateDefaultShortEdgeType->setCheck(FALSE);
298 myCreateCustomEdgeType->setCheck(TRUE);
299 // refresh
300 refreshEdgeTypeSelector();
301 }
302 }
303}
304
305
306void
308 myCreateDefaultEdgeType->setCheck(FALSE);
309 myCreateDefaultShortEdgeType->setCheck(FALSE);
310 myCreateCustomEdgeType->setCheck(TRUE);
311 refreshEdgeTypeSelector();
312}
313
314
315long
317 // update radio buttons
318 if (obj == myCreateDefaultEdgeType) {
319 myCreateDefaultEdgeType->setCheck(TRUE);
320 myCreateDefaultShortEdgeType->setCheck(FALSE);
321 myCreateCustomEdgeType->setCheck(FALSE);
322 } else if (obj == myCreateDefaultShortEdgeType) {
323 myCreateDefaultEdgeType->setCheck(FALSE);
324 myCreateDefaultShortEdgeType->setCheck(TRUE);
325 myCreateCustomEdgeType->setCheck(FALSE);
326 } else {
327 myCreateDefaultEdgeType->setCheck(FALSE);
328 myCreateDefaultShortEdgeType->setCheck(FALSE);
329 myCreateCustomEdgeType->setCheck(TRUE);
330 }
331 // refresh template selector
332 refreshEdgeTypeSelector();
333 return 0;
334}
335
336
337long
339 // create new edge type
340 GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
341 // add it using undoList
342 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
343 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
344 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
345 // update myEdgeTypeSelected
346 myEdgeTypeSelected = edgeType;
347 // select last item
348 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
349 // refresh EdgeTypeSelector
350 refreshEdgeTypeSelector();
351 return 0;
352}
353
354
355long
357 // first check if we have to reset myEdgeTypeSelected
358 if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
359 myEdgeTypeSelected = nullptr;
360 }
361 // get edgeType to remove
362 GNEEdgeType* edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text());
363 // remove it using undoList
364 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("delete edge type"));
365 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
366 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
367 // refresh EdgeTypeSelector
368 refreshEdgeTypeSelector();
369 return 0;
370}
371
372
373long
375 // update current index
376 myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
377 // refresh edgeType selector
378 refreshEdgeTypeSelector();
379 return 0;
380}
381
382
383long
385 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
386 // create new edge type
387 GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
388 // copy all template values
389 edgeType->copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
390 // add it using undoList
391 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
392 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
393 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
394 // update myEdgeTypeSelected
395 myEdgeTypeSelected = edgeType;
396 // select last item
397 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
398 // refresh EdgeTypeSelector
399 refreshEdgeTypeSelector();
400 }
401 return 0;
402}
403
404
405long
407 if (myAddSidewalkCheckButton->getCheck() == TRUE) {
408 myNoPedestriansCheckButton->setCheck(TRUE);
409 myNoPedestriansCheckButton->disable();
410 } else {
411 myNoPedestriansCheckButton->enable();
412 }
413 // show default edgeType attributes again (for refresh sidewalk and bike widths)
414 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myDefaultEdgeType, true);
415 return 1;
416}
417
418
419void
421 // get template editor
422 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
423 // get edge types
424 const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
425 // clear edge types
426 myEdgeTypesComboBox->clearItems();
427 // set comboBox text color
428 myEdgeTypesComboBox->setTextColor(GUIDesignTextColorBlack);
429 // add template
430 if (templateEditor->getEdgeTemplate()) {
431 myEdgeTypesComboBox->appendIconItem((TL("template: ") + templateEditor->getEdgeTemplate()->getID()).c_str(), nullptr);
432 }
433 if (edgeTypes.size() > 0) {
434 // add edge types
435 for (const auto& edgeType : edgeTypes) {
436 myEdgeTypesComboBox->appendIconItem(edgeType.second->getID().c_str(), edgeType.second->getACIcon());
437 }
438 // set current item
439 if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
440 myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
441 }
442 myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
443 myEdgeTypesComboBox->enable();
444 } else {
445 myEdgeTypesComboBox->disable();
446 }
447}
448
449// ---------------------------------------------------------------------------
450// GNECreateEdgeFrame::LaneTypeSelector - methods
451// ---------------------------------------------------------------------------
452
454 MFXGroupBoxModule(createEdgeFrameParent, TL("LaneType selector")),
455 myCreateEdgeFrameParent(createEdgeFrameParent),
456 myLaneIndex(0) {
457 // lane types combo box
460 // create horizontal frame
461 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
462 // create new lane type button
463 myAddLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Add"), "", TL("Add lane type"), GUIIconSubSys::getIcon(GUIIcon::ADD),
465 // create delete lane type button
466 myDeleteLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Delete"), "", TL("Delete lane type"), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
468}
469
470
473
474
475void
477 // start at first lane
478 myLaneIndex = 0;
479 // refresh laneTypeSelector
480 refreshLaneTypeSelector();
481 // show
482 show();
483}
484
485
486void
488 // hide attributes creator module
489 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
490 // hide
491 hide();
492}
493
494
495void
497 // clear lane types
498 myLaneTypesComboBox->clearItems();
499 // first check if use template
500 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
501 const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
502 // fill comboBox
503 for (const auto& laneTemplate : edgeTemplate->getLaneTemplates()) {
504 myLaneTypesComboBox->appendIconItem(laneTemplate->getAttribute(SUMO_ATTR_ID).c_str(), laneTemplate->getACIcon());
505 }
506 // update comboBox
507 updateComboBox();
508 // show laneTypeAttributes
509 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeTemplate->getLaneTemplates().at(myLaneIndex), false);
510 // disable laneAttributes (because is a template)
511 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->disableAttributesEditor();
512 // disable add and remove buttons
513 myAddLaneTypeButton->disable();
514 myDeleteLaneTypeButton->disable();
515 } else {
516 // get edgeType
517 const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
518 // fill comboBox
519 for (const auto& laneType : edgeType->getLaneTypes()) {
520 myLaneTypesComboBox->appendIconItem(laneType->getAttribute(SUMO_ATTR_ID).c_str(), laneType->getACIcon());
521 }
522 // update comboBox
523 updateComboBox();
524 // show laneTypeAttributes
525 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeType->getLaneTypes().at(myLaneIndex), false);
526 // enable add and remove buttons
527 myAddLaneTypeButton->enable();
528 // check if enable or disable remove lane button
529 if (edgeType->getLaneTypes().size() > 1) {
530 myDeleteLaneTypeButton->enable();
531 } else {
532 myDeleteLaneTypeButton->disable();
533 }
534 }
535 // recalc
536 recalc();
537}
538
539
540long
542 // check what edgeType is being edited
543 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
544 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
545 // add new lane in default edge type
546 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->addLaneType(new GNELaneType(myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()));
547 // refresh laneTypeSelector
548 refreshLaneTypeSelector();
549 // set combo box
550 myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
551 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
552 // get selected
553 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
554 if (edgeType) {
555 // create new edgeType
556 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
557 // create laneTypes
558 for (const auto& laneType : edgeType->getLaneTypes()) {
559 newEdgeType->addLaneType(new GNELaneType(newEdgeType, laneType));
560 }
561 // add new lane
562 newEdgeType->addLaneType(new GNELaneType(newEdgeType));
563 // remove old edgeTyp und and newEdgeType
564 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("add laneType"));
565 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
566 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
567 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
568 // update index
569 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
570 // set current edgeType in selector
571 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
572 }
573 }
574 return 0;
575}
576
577
578long
580 // check what edgeType is being edited
581 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
582 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
583 // add new lane in default edge type
584 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->removeLaneType(myLaneIndex);
585 // refresh laneTypeSelector
586 refreshLaneTypeSelector();
587 // set combo box
588 myLaneTypesComboBox->setCurrentItem(0);
589 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
590 // get selected
591 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
592 if (edgeType) {
593 // create new edgeType
594 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
595 // create laneTypes (except current)
596 for (int i = 0; i < (int)edgeType->getLaneTypes().size(); i++) {
597 if (i != myLaneIndex) {
598 newEdgeType->addLaneType(new GNELaneType(newEdgeType, edgeType->getLaneTypes().at(i)));
599 }
600 }
601 // remove old edgeTyp und and newEdgeType
602 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("remove laneType"));
603 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
604 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
605 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
606 // update index
607 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
608 // set current edgeType in selector
609 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
610 }
611 }
612 return 0;
613}
614
615
616long
618 // update index
619 myLaneIndex = myLaneTypesComboBox->getCurrentItem();
620 // refresh laneType selector
621 refreshLaneTypeSelector();
622 return 0;
623}
624
625
626void
628 // check lane index
629 if (myLaneIndex > myLaneTypesComboBox->getNumItems()) {
630 myLaneIndex = 0;
631 }
632 // set current item
633 myLaneTypesComboBox->setCurrentItem(myLaneIndex);
634}
635
636// ---------------------------------------------------------------------------
637// GNECreateEdgeFrame::Legend - methods
638// ---------------------------------------------------------------------------
639
641 MFXGroupBoxModule(createEdgeFrameParent, TL("Information")) {
642 std::ostringstream information;
643 // add label for shift+click
644 information
645 << "- " << TL("ESC:") << "\n"
646 << " " << TL("Deselect origin") << "\n"
647 << "- " << TL("Control+Click:") << "\n"
648 << " " << TL("Move view") << "\n"
649 << "- " << TL("Shift+Click:") << "\n"
650 << " " << TL("Splits edge in both directions") << "\n"
651 << "- " << TL("Alt+Shift+Click:") << "\n"
652 << " " << TL("Splits edge in one direction");
653 // create label
654 new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
655}
656
657
659
660// ---------------------------------------------------------------------------
661// GNECreateEdgeFrame - methods
662// ---------------------------------------------------------------------------
663
665 GNEFrame(viewParent, viewNet, TL("Create Edge")),
666 myJunctionSource(nullptr) {
667 // create custom edge selector
669 // Create edgeType parameters
671 // lane type selector
673 // Create laneType parameters
675 // create edge selector legend
676 myLegend = new Legend(this);
677}
678
679
681
682
683void
685 const bool oppositeEdge, const bool chainEdge) {
686 // first check if there is an edge template, an edge type (default or custom)
689 WRITE_WARNING(TL("Select either default edgeType or short edge or a custom edgeType or template"));
691 // if grid is enabled and currently there isn't a junction under mouse, make a new search snapping position to grid
692 if ((viewObjects.getJunctionFront() == nullptr) && myViewNet->getVisualisationSettings().showGrid) {
694 }
695 // obtain junction depending of gridEnabled
696 GNEJunction* junction = viewObjects.getJunctionFront();
697 // begin undo list
699 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
700 }
701 // if we didn't clicked over another junction, then create a new
702 if (junction == nullptr) {
703 junction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition), myViewNet->getUndoList());
704 }
705 // now check if we have to create a new edge
706 if (myJunctionSource == nullptr) {
707 // check if create edge type short
709 // create new junction
710 auto newJunction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition) + Position(5, 0), myViewNet->getUndoList());
711 // create new small edge
712 GNEEdge* newEdge = myViewNet->getNet()->createEdge(junction, newJunction, nullptr, myViewNet->getUndoList());
713 // set parameters
715 // check pedestrians and sidewalks
717 disablePedestrians(newEdge);
718 }
719 // check if add bikelane
722 }
723 // check if add sidewalk
726 }
727 // end undo list
730 } else {
731 std::cout << "edge created without an open CommandGroup" << std::endl;
732 }
733 } else {
734 myJunctionSource = junction;
736 }
737 update();
738 } else {
739 // make sure that junctions source and destination are different
740 if (myJunctionSource != junction) {
741 // may fail to prevent double edges
742 GNEEdge* newEdge = myViewNet->getNet()->createEdge(myJunctionSource, junction, nullptr, myViewNet->getUndoList());
743 // check if edge was successfully created
744 if (newEdge) {
745 // set parameters
750 // check pedestrians and sidewalks
752 disablePedestrians(newEdge);
753 }
754 // check if add bikelane
757 }
758 // check if add sidewalk
761 }
762 } else {
764 }
765 // create another edge, if create opposite edge is enabled
766 if (oppositeEdge && (myViewNet->getNet()->getAttributeCarriers()->retrieveEdges(junction, myJunctionSource).size() == 0)) {
767 GNEEdge* newOppositeEdge = myViewNet->getNet()->createEdge(junction, myJunctionSource, nullptr,
768 myViewNet->getUndoList(), "-" + newEdge->getNBEdge()->getID());
769 // set parameters
774 // check pedestrians and sidewalks
776 disablePedestrians(newOppositeEdge);
777 }
778 // check if add bikelane
781 }
782 // check if add sidewalk
785 }
786 } else {
788 }
789 }
790 // edge created, then unmark as create edge source
792 // end undo list
795 } else {
796 std::cout << "edge created without an open CommandGroup" << std::endl;
797 }
798 // if we're creating edges in chain mode, mark junction as junction edge source
799 if (chainEdge) {
800 myJunctionSource = junction;
802 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
803 } else {
804 myJunctionSource = nullptr;
805 }
806 } else {
807 myViewNet->setStatusBarText(TL("An edge with the same geometry already exists!"));
808 }
809 } else {
810 myViewNet->setStatusBarText(TL("Start- and endpoint for an edge must be distinct!"));
811 }
812 update();
813 }
814 }
815}
816
817
818void
820 // if myCreateEdgeSource exist, unmark ist as create edge source
821 if (myJunctionSource != nullptr) {
822 // remove current created edge source
824 myJunctionSource = nullptr;
825 }
826}
827
828
829const GNEJunction*
833
834
835void
837 // refresh template selector
839 // show frame
841}
842
843
844void
846 // hide frame
848}
849
850
855
856
861
862
867
868
873
874
875void
880
881
882void
884 // iterate over lanes
885 for (const auto& lane : edge->getChildLanes()) {
886 // avoid sidewalks
887 if (lane->getAttribute(SUMO_ATTR_ALLOW) != "pedestrian") {
888 // extract disallow list
889 std::vector<std::string> disallowList = GNEAttributeCarrier::parse<std::vector<std::string> >(lane->getAttribute(SUMO_ATTR_DISALLOW));
890 // check if append pedestrian to disallow
891 if (std::find(disallowList.begin(), disallowList.end(), "pedestrian") == disallowList.end()) {
892 disallowList.push_back("pedestrian");
893 }
894 // update attribute
895 lane->setAttribute(SUMO_ATTR_DISALLOW, toString(disallowList), myViewNet->getUndoList());
896 }
897 }
898}
899
900
901void
902GNECreateEdgeFrame::addBikelane(GNEEdge* edge, const std::string& bikelaneWidth) const {
903 bool bikelaneFound = false;
904 // iterate over lanes
905 for (const auto& lane : edge->getChildLanes()) {
906 // check if there is already a SideWalk
907 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "bicycle") {
908 bikelaneFound = true;
909 }
910 }
911 // only add if previously there is no bikelanes
912 if (!bikelaneFound) {
913 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_BICYCLE, false);
914 // set width
915 if (bikelaneWidth != "default") {
916 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, bikelaneWidth, myViewNet->getUndoList());
917 }
918 }
919}
920
921
922void
923GNECreateEdgeFrame::addSidewalk(GNEEdge* edge, const std::string& sidewalkWidth) const {
924 bool sidewalkFound = false;
925 // iterate over lanes
926 for (const auto& lane : edge->getChildLanes()) {
927 // check if there is already a SideWalk
928 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "pedestrian") {
929 sidewalkFound = true;
930 }
931 }
932 // only add if previously there is no Sidewalk
933 if (!sidewalkFound) {
934 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_PEDESTRIAN, false);
935 // set width
936 if (sidewalkWidth != "default") {
937 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, sidewalkWidth, myViewNet->getUndoList());
938 }
939 }
940}
941
942/****************************************************************************/
FXDEFMAP(GNECreateEdgeFrame::EdgeTypeSelector) EdgeTypeSelectorMap[]
@ MID_GNE_CREATEEDGEFRAME_CREATEFROMTEMPLATE
create edge type from template
@ MID_GNE_CREATEEDGEFRAME_CHECKBUTTON
check button
@ MID_GNE_CREATEEDGEFRAME_SELECTTEMPLATE
select edge template
@ MID_GNE_CREATEEDGEFRAME_DELETE
delete edge type
@ MID_GNE_CREATEEDGEFRAME_ADD
add new edge type
@ MID_GNE_CREATEEDGEFRAME_SELECTLANE
select lane (used for default and template edges)
@ MID_GNE_CREATEEDGEFRAME_SELECTRADIOBUTTON
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButton
Definition GUIDesigns.h:100
#define GUIDesignComboBoxAttribute
Combo box static (cannot be edited) extended over the matrix column.
Definition GUIDesigns.h:304
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:430
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:64
#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 GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition GUIDesigns.h:281
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_BIKELANEWIDTH
@ SUMO_ATTR_SIDEWALKWIDTH
@ SUMO_ATTR_ID
@ SUMO_ATTR_WIDTH
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
const std::string getID() const
get ID (all Attribute Carriers have one)
GNENet * getNet() const
get pointer to net
bool checkAttributes(const bool showWarning)
check if current edited attributes are valid
GNEEdgeType * getEdgeTypeSelected() const
get edgeType selected
GNEEdgeType * getDefaultEdgeType() const
get default edgeType
bool useEdgeTemplate() const
check if we have to use edge template
bool useDefaultEdgeTypeShort() const
check if we're using default edge type short
long onUpdCheckButtons(FXObject *, FXSelector, void *)
Called when check buttons are updated.
bool isAddBikelaneEnabled() const
check if add bikelane check button is enabled
void updateIDinComboBox(const std::string &oldID, const std::string &newID)
update id in comboBox
long onCmdAddEdgeType(FXObject *, FXSelector, void *)
Called when the user press button for add a new edge type.
void enableCheckBoxDisablePedestrians()
void enable checkbox for disable pedestrians
bool useDefaultEdgeType() const
check if we're using default edge type
long onCmdDeleteEdgeType(FXObject *, FXSelector, void *)
Called when the user press button for delete edge type.
GNEEdgeType * myDefaultEdgeType
default edge type
long onCmdCreateFromTemplate(FXObject *, FXSelector, void *)
Called when the user press create edgeType from Template.
bool isAddSidewalkEnabled() const
check if add sidewalk check button is enabled
void refreshEdgeTypeSelector()
refresh edge type selector
bool isNoPedestriansEnabled() const
check if no pedestrian check button is enabled
long onCmdRadioButton(FXObject *, FXSelector, void *)
void setCurrentEdgeType(const GNEEdgeType *edgeType)
set current edgeType
void clearEdgeTypeSelected()
clear edgeType selected
long onCmdSelectEdgeTypeOrTemplate(FXObject *, FXSelector, void *)
Called when the user press select an edgeType or template in comboBox.
long onCmdSelectLaneType(FXObject *, FXSelector, void *)
Called when the user press select an laneType in comboBox.
FXButton * myDeleteLaneTypeButton
button for delete lane type
MFXComboBoxIcon * myLaneTypesComboBox
ComboBox for lane types.
void showLaneTypeSelector()
show lane type selector
LaneTypeSelector(GNECreateEdgeFrame *createEdgeFrameParent)
FOX-declaration.
void hideLaneTypeSelector()
hide lane type selector
long onCmdAddLaneType(FXObject *, FXSelector, void *)
FXButton * myAddLaneTypeButton
button for create new lane type
long onCmdDeleteLaneType(FXObject *, FXSelector, void *)
Called when the user press button for delete lane type.
void refreshLaneTypeSelector()
refresh LaneTypeSelector
Legend(GNECreateEdgeFrame *createEdgeFrameParent)
constructor
EdgeTypeSelector * getEdgeTypeSelector() const
get edgeType selector
GNEJunction * myJunctionSource
source junction for new edge
void processClick(const Position &clickedPosition, const GNEViewNetHelper::ViewObjectsSelector &viewObjects, const bool oppositeEdge, const bool chainEdge)
handle processClick and set the relative coloring
void abortEdgeCreation()
abort current edge creation
void show()
show create edge frame
GNECreateEdgeFrame::LaneTypeSelector * myLaneTypeSelector
lane type selector
void addSidewalk(GNEEdge *edge, const std::string &sidewalkWidth) const
add sidewalk in the given edge
GNEAttributesEditor * getLaneTypeAttributes() const
get laneType attributes
const GNEJunction * getJunctionSource() const
get junction source for new edge
GNEAttributesEditor * getEdgeTypeAttributes() const
get edgeType attributes
GNEAttributesEditor * myLaneTypeAttributesEditor
internal laneType attributes
GNEAttributesEditor * myEdgeTypeAttributesEditor
internal edgeType attributes
void disablePedestrians(GNEEdge *edge) const
disable pedestrians in the given edge (within undoRedo)
GNECreateEdgeFrame::Legend * myLegend
Legend.
GNECreateEdgeFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
void addBikelane(GNEEdge *edge, const std::string &bikelaneWidth) const
add bikelane in the given edge
void hide()
hide create edge frame
EdgeTypeSelector * myEdgeTypeSelector
edge type selector
void setUseEdgeTemplate()
set default to using edge template
LaneTypeSelector * getLaneTypeSelector()
get lane type selector
void copyEdgeType(const GNEEdgeType *edgeType, GNEUndoList *undoList)
copy edge attributes from edgeType
Definition GNEEdge.cpp:1045
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:753
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition GNEEdge.cpp:1022
const std::vector< GNELaneTemplate * > & getLaneTemplates() const
get vector with the lane templates of this edge
std::string getAttribute(SumoXMLAttr key) const override
void copyTemplate(const GNEEdgeTemplate *edgeTemplate)
copy edge template
const std::vector< GNELaneType * > & getLaneTypes() const
get laneTypes
void addLaneType(GNELaneType *laneType)
add laneType
GNEViewNet * getViewNet() const
get view net
Definition GNEFrame.cpp:152
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
const GNEHierarchicalContainerChildren< GNELane * > & getChildLanes() const
get child lanes
GNEEdgeTemplate * getEdgeTemplate() const
get edge template (to copy attributes from)
TemplateEditor * getTemplateEditor() const
get template editor
void markAsCreateEdgeSource()
marks as first junction in createEdge-mode
void unMarkAsCreateEdgeSource()
removes mark as first junction in createEdge-mode
std::vector< GNEEdge * > retrieveEdges(GNEJunction *from, GNEJunction *to) const
get all edges by from and to GNEJunction
GNEEdgeType * retrieveEdgeType(const std::string &id, bool hardFail=true) const
get edge type by id
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:144
GNEEdge * createEdge(GNEJunction *src, GNEJunction *dest, GNEEdge *edgeTemplate, GNEUndoList *undoList, const std::string &suggestedName="", bool wasSplit=false, bool allowDuplicateGeom=false, bool recomputeConnections=true)
creates a new edge (unless an edge with the same geometry already exists)
Definition GNENet.cpp:277
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
Definition GNENet.cpp:261
GNEViewNet * getViewNet() const
get view net
Definition GNENet.cpp:2193
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
bool hasCommandGroup() const
Check if undoList has command group.
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
class used to group all variables related with objects under cursor after a click over view
GNEJunction * getJunctionFront() const
get front junction or a pointer to nullptr
GNENet * getNet() const
get the net object
void updateObjectsInPosition(const Position &pos)
update objects and boundaries in position
GNEViewParent * getViewParent() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
bool addRestrictedLane(GNELane *lane, SUMOVehicleClass vclass, const bool insertAtFront)
add restricted lane
void setStatusBarText(const std::string &text)
set statusBar text
A single child window which contains a view of the simulation area.
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
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
MFXStaticToolTip * getStaticTooltipMenu() const
get static toolTip for menus
Position snapToActiveGrid(const Position &pos, bool snapXY=true) const
Returns a position that is mapped to the closest grid point if the grid is active.
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
bool showGrid
Information whether a grid shall be shown.
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)
const std::string & getID() const
Definition NBEdge.h:1551
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37