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-2026 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, GNEGroupBoxModule, EdgeTypeSelectorMap, ARRAYNUMBER(EdgeTypeSelectorMap))
59FXIMPLEMENT(GNECreateEdgeFrame::LaneTypeSelector, GNEGroupBoxModule, LaneTypeSelectorMap, ARRAYNUMBER(LaneTypeSelectorMap))
60
61
62// ===========================================================================
63// method definitions
64// ===========================================================================
65
66// ---------------------------------------------------------------------------
67// GNECreateEdgeFrame::EdgeTypeSelector - methods
68// ---------------------------------------------------------------------------
69
71 GNEGroupBoxModule(createEdgeFrameParent, TL("Template selector")),
72 myCreateEdgeFrameParent(createEdgeFrameParent),
74 // default edge radio button
75 myCreateDefaultEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Create default edge"),
77 // default short radio button
78 myCreateDefaultShortEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Create default edge short"),
80 // checkboxes
81 myNoPedestriansCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Disallow for pedestrians"),
83 myAddSidewalkCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Add sidewalk"),
85 myAddBikelaneCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Add bikelane"),
87 // use custom edge radio button
88 myCreateCustomEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Use edgeType/template"),
90 // edge types combo box
91 myEdgeTypesComboBox = new MFXComboBoxIcon(getCollapsableFrame(), createEdgeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
93 // create horizontal frame
94 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
95 // create new edge type button
96 myAddEdgeTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Add"), "", TL("Add edge type"), GUIIconSubSys::getIcon(GUIIcon::ADD),
98 // create delete edge type button
99 myDeleteEdgeTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Delete"), "", TL("Delete edge type"), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
101 // create delete edge type button
102 myCreateFromTemplate = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create from template"), "", TL("Create edgeType from template"), GUIIconSubSys::getIcon(GUIIcon::EDGE),
104 // by default, create custom edge
105 myCreateDefaultEdgeType->setCheck(TRUE);
106 // check if enable disable pedestrians
107 for (const auto& junction : createEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
108 if (junction.second->getNBNode()->getCrossings().size() > 0) {
110 }
111 }
112}
113
114
117
118
119void
121 // get template editor
122 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
123 // get current item
124 const int index = myEdgeTypesComboBox->getCurrentItem();
125 // fill combo box
126 fillComboBox();
127 // continue depending of radio buttons
128 if (myCreateDefaultEdgeType->getCheck() || myCreateDefaultShortEdgeType->getCheck()) {
129 // enable check boxes
130 myAddSidewalkCheckButton->enable();
131 myAddBikelaneCheckButton->enable();
133 // disable create from template
134 myCreateFromTemplate->disable();
135 // disable comboBox
136 myEdgeTypesComboBox->disable();
137 // disable buttons
138 myAddEdgeTypeButton->disable();
139 myDeleteEdgeTypeButton->disable();
140 // show default edgeType attributes
141 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType(), true);
142 // show lane attributes
143 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
144 } else if (myCreateCustomEdgeType->getCheck()) {
145 // disable check boxes
146 myAddSidewalkCheckButton->disable();
147 myAddBikelaneCheckButton->disable();
149 // enable buttons
150 myAddEdgeTypeButton->enable();
151 myDeleteEdgeTypeButton->enable();
152 // check conditions
153 if (myEdgeTypesComboBox->getNumItems() == 0) {
154 // disable comboBox and edgeType
155 myEdgeTypesComboBox->disable();
156 myDeleteEdgeTypeButton->disable();
157 // hide attributes creators
158 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->hideAttributesEditor();
159 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
160 } else if (templateEditor->getEdgeTemplate() && (index == 0)) {
161 // enable create from template
162 myCreateFromTemplate->enable();
163 // enable comboBox
164 myEdgeTypesComboBox->enable();
165 // disable delete edge type button (because templates cannot be deleted)
166 myDeleteEdgeTypeButton->disable();
167 // show edgeType attributes and disable
168 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(templateEditor->getEdgeTemplate(), true);
169 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->disableAttributesEditor();
170 // show lane attributes (will be automatic disabled)
171 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
172 } else {
173 // disable create from template
174 myCreateFromTemplate->disable();
175 // enable comboBox
176 myEdgeTypesComboBox->enable();
177 // get edgeType
178 myEdgeTypeSelected = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text(), false);
179 // check if exist
180 if (myEdgeTypeSelected) {
181 // show edgeType attributes
182 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myEdgeTypeSelected, true);
183 // show lane attributes
184 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
185 } else {
186 // hide edgeType attributes
187 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->hideAttributesEditor();
188 // hide lane attributes
189 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
190 // set comboBox text
192 }
193 }
194 }
195 // recalc
196 recalc();
197}
198
199
200void
201GNECreateEdgeFrame::EdgeTypeSelector::updateIDinComboBox(const std::string& oldID, const std::string& newID) {
202 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
203 if (myEdgeTypesComboBox->getItemText(i) == oldID) {
204 myEdgeTypesComboBox->updateIconItem(i, newID.c_str());
205 }
206 }
207}
208
209
210bool
214
215
216bool
220
221
222bool
224 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
225 if ((myCreateCustomEdgeType->getCheck() == TRUE) && (myEdgeTypesComboBox->getCurrentItem() == 0)) {
226 return true;
227 } else {
228 return false;
229 }
230 } else {
231 return false;
232 }
233}
234
235
236void
240
241
244 if ((myCreateDefaultEdgeType->getCheck() == TRUE) || (myCreateDefaultShortEdgeType->getCheck() == TRUE)) {
245 return myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType();
246 } else {
247 return myEdgeTypeSelected;
248 }
249}
250
251
252bool
256
257
258bool
262
263
264bool
268
269
270void
278
279
280void
282 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
283 if (myEdgeTypesComboBox->getItemText(i) == edgeType->getID()) {
284 // set current item and index
285 myEdgeTypesComboBox->setCurrentItem(i);
286 myCurrentIndex = i;
287 // set buttons
288 myCreateDefaultEdgeType->setCheck(FALSE);
289 myCreateDefaultShortEdgeType->setCheck(FALSE);
290 myCreateCustomEdgeType->setCheck(TRUE);
291 // refresh
293 }
294 }
295}
296
297
298void
305
306
307long
309 // update radio buttons
310 if (obj == myCreateDefaultEdgeType) {
311 myCreateDefaultEdgeType->setCheck(TRUE);
312 myCreateDefaultShortEdgeType->setCheck(FALSE);
313 myCreateCustomEdgeType->setCheck(FALSE);
314 } else if (obj == myCreateDefaultShortEdgeType) {
315 myCreateDefaultEdgeType->setCheck(FALSE);
316 myCreateDefaultShortEdgeType->setCheck(TRUE);
317 myCreateCustomEdgeType->setCheck(FALSE);
318 } else {
319 myCreateDefaultEdgeType->setCheck(FALSE);
320 myCreateDefaultShortEdgeType->setCheck(FALSE);
321 myCreateCustomEdgeType->setCheck(TRUE);
322 }
323 // refresh template selector
325 return 0;
326}
327
328
329long
331 // create new edge type
332 auto net = myCreateEdgeFrameParent->getViewNet()->getNet();
333 GNEEdgeType* edgeType = new GNEEdgeType(net, net->getAttributeCarriers()->generateEdgeTypeID());
334 // add it using undoList
335 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
336 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
337 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
338 // update myEdgeTypeSelected
339 myEdgeTypeSelected = edgeType;
340 // select last item
341 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
342 // refresh EdgeTypeSelector
344 return 0;
345}
346
347
348long
350 // first check if we have to reset myEdgeTypeSelected
351 if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
352 myEdgeTypeSelected = nullptr;
353 }
354 // get edgeType to remove
355 GNEEdgeType* edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text());
356 // remove it using undoList
357 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("delete edge type"));
358 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
359 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
360 // refresh EdgeTypeSelector
362 return 0;
363}
364
365
366long
368 // update current index
369 myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
370 // refresh edgeType selector
372 return 0;
373}
374
375
376long
378 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
379 // create new edge type
380 auto net = myCreateEdgeFrameParent->getViewNet()->getNet();
381 GNEEdgeType* edgeType = new GNEEdgeType(net, net->getAttributeCarriers()->generateEdgeTypeID());
382 // copy all template values
383 edgeType->copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
384 // add it using undoList
385 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
386 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
387 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
388 // update myEdgeTypeSelected
389 myEdgeTypeSelected = edgeType;
390 // select last item
391 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
392 // refresh EdgeTypeSelector
394 }
395 return 0;
396}
397
398
399long
401 if (myAddSidewalkCheckButton->getCheck() == TRUE) {
402 myNoPedestriansCheckButton->setCheck(TRUE);
404 } else {
406 }
407 // show default edgeType attributes again (for refresh sidewalk and bike widths)
408 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType(), true);
409 return 1;
410}
411
412
413void
415 // get template editor
416 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
417 // get edge types
418 const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
419 // clear edge types
420 myEdgeTypesComboBox->clearItems();
421 // set comboBox text color
423 // add template
424 if (templateEditor->getEdgeTemplate()) {
425 myEdgeTypesComboBox->appendIconItem((TL("template: ") + templateEditor->getEdgeTemplate()->getID()).c_str(), nullptr);
426 }
427 if (edgeTypes.size() > 0) {
428 // add edge types
429 for (const auto& edgeType : edgeTypes) {
430 myEdgeTypesComboBox->appendIconItem(edgeType.second->getID().c_str(), edgeType.second->getACIcon());
431 }
432 // set current item
433 if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
434 myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
435 }
436 myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
437 myEdgeTypesComboBox->enable();
438 } else {
439 myEdgeTypesComboBox->disable();
440 }
441}
442
443// ---------------------------------------------------------------------------
444// GNECreateEdgeFrame::LaneTypeSelector - methods
445// ---------------------------------------------------------------------------
446
448 GNEGroupBoxModule(createEdgeFrameParent, TL("LaneType selector")),
449 myCreateEdgeFrameParent(createEdgeFrameParent),
450 myLaneIndex(0) {
451 // lane types combo box
454 // create horizontal frame
455 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
456 // create new lane type button
457 myAddLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Add"), "", TL("Add lane type"), GUIIconSubSys::getIcon(GUIIcon::ADD),
459 // create delete lane type button
460 myDeleteLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Delete"), "", TL("Delete lane type"), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
462}
463
464
467
468
469void
471 // start at first lane
472 myLaneIndex = 0;
473 // refresh laneTypeSelector
475 // show
476 show();
477}
478
479
480void
482 // hide attributes creator module
483 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
484 // hide
485 hide();
486}
487
488
489void
491 // clear lane types
492 myLaneTypesComboBox->clearItems();
493 // first check if use template
494 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
495 const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
496 // fill comboBox
497 for (const auto& laneTemplate : edgeTemplate->getLaneTemplates()) {
498 myLaneTypesComboBox->appendIconItem(laneTemplate->getAttribute(SUMO_ATTR_ID).c_str(), laneTemplate->getACIcon());
499 }
500 // update comboBox
502 // show laneTypeAttributes
503 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeTemplate->getLaneTemplates().at(myLaneIndex), false);
504 // disable laneAttributes (because is a template)
505 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->disableAttributesEditor();
506 // disable add and remove buttons
507 myAddLaneTypeButton->disable();
508 myDeleteLaneTypeButton->disable();
509 } else {
510 // get edgeType
511 const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
512 // fill comboBox
513 for (const auto& laneType : edgeType->getLaneTypes()) {
514 myLaneTypesComboBox->appendIconItem(laneType->getAttribute(SUMO_ATTR_ID).c_str(), laneType->getACIcon());
515 }
516 // update comboBox
518 // show laneTypeAttributes
519 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeType->getLaneTypes().at(myLaneIndex), false);
520 // enable add and remove buttons
521 myAddLaneTypeButton->enable();
522 // check if enable or disable remove lane button
523 if (edgeType->getLaneTypes().size() > 1) {
524 myDeleteLaneTypeButton->enable();
525 } else {
526 myDeleteLaneTypeButton->disable();
527 }
528 }
529 // recalc
530 recalc();
531}
532
533
534long
536 // check what edgeType is being edited
537 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
538 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
539 // add new lane in default edge type
540 auto edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType();
541 edgeType->addLaneType(new GNELaneType(edgeType));
542 // refresh laneTypeSelector
544 // set combo box
545 myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
546 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
547 // get selected
548 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
549 if (edgeType) {
550 // create new edgeType
551 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
552 // create laneTypes
553 for (const auto& laneType : edgeType->getLaneTypes()) {
554 newEdgeType->addLaneType(new GNELaneType(newEdgeType, laneType));
555 }
556 // add new lane
557 newEdgeType->addLaneType(new GNELaneType(newEdgeType));
558 // remove old edgeTyp und and newEdgeType
559 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("add laneType"));
560 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
561 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
562 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
563 // update index
564 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
565 // set current edgeType in selector
566 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
567 }
568 }
569 return 0;
570}
571
572
573long
575 // check what edgeType is being edited
576 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
577 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
578 // add new lane in default edge type
579 myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType()->removeLaneType(myLaneIndex);
580 // refresh laneTypeSelector
582 // set combo box
583 myLaneTypesComboBox->setCurrentItem(0);
584 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
585 // get selected
586 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
587 if (edgeType) {
588 // create new edgeType
589 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
590 // create laneTypes (except current)
591 for (int i = 0; i < (int)edgeType->getLaneTypes().size(); i++) {
592 if (i != myLaneIndex) {
593 newEdgeType->addLaneType(new GNELaneType(newEdgeType, edgeType->getLaneTypes().at(i)));
594 }
595 }
596 // remove old edgeTyp und and newEdgeType
597 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("remove laneType"));
598 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
599 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
600 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
601 // update index
602 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
603 // set current edgeType in selector
604 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
605 }
606 }
607 return 0;
608}
609
610
611long
613 // update index
614 myLaneIndex = myLaneTypesComboBox->getCurrentItem();
615 // refresh laneType selector
617 return 0;
618}
619
620
621void
623 // check lane index
624 if (myLaneIndex >= myLaneTypesComboBox->getNumItems()) {
625 myLaneIndex = 0;
626 }
627 // set current item
628 myLaneTypesComboBox->setCurrentItem(myLaneIndex);
629}
630
631// ---------------------------------------------------------------------------
632// GNECreateEdgeFrame::Legend - methods
633// ---------------------------------------------------------------------------
634
636 GNEGroupBoxModule(createEdgeFrameParent, TL("Information")) {
637 std::ostringstream information;
638 // add label for shift+click
639 information
640 << "- " << TL("ESC:") << "\n"
641 << " " << TL("Deselect origin") << "\n"
642 << "- " << TL("Control+Click:") << "\n"
643 << " " << TL("Move view") << "\n"
644 << "- " << TL("Shift+Click:") << "\n"
645 << " " << TL("Splits edge in both directions") << "\n"
646 << "- " << TL("Alt+Shift+Click:") << "\n"
647 << " " << TL("Splits edge in one direction");
648 // create label
649 new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
650}
651
652
654
655// ---------------------------------------------------------------------------
656// GNECreateEdgeFrame - methods
657// ---------------------------------------------------------------------------
658
660 GNEFrame(viewParent, viewNet, TL("Create Edge")),
661 myJunctionSource(nullptr) {
662 // create custom edge selector
664 // Create edgeType parameters
666 // lane type selector
668 // Create laneType parameters
670 // create edge selector legend
671 myLegend = new Legend(this);
672}
673
674
676
677
678void
680 const bool oppositeEdge, const bool chainEdge) {
681 // first check if there is an edge template, an edge type (default or custom)
682 if (!myEdgeTypeSelector->useDefaultEdgeType() && !myEdgeTypeSelector->useDefaultEdgeTypeShort() &&
683 !myEdgeTypeSelector->useEdgeTemplate() && (myEdgeTypeSelector->getEdgeTypeSelected() == nullptr)) {
684 WRITE_WARNING(TL("Select either default edgeType or short edge or a custom edgeType or template"));
685 } else if (myEdgeTypeAttributesEditor->checkAttributes(true) && myLaneTypeAttributesEditor->checkAttributes(true)) {
686 // get edge type
687 auto edgeType = myViewNet->getNet()->getACTemplates()->getDefaultEdgeType();
688 // if grid is enabled and currently there isn't a junction under mouse, make a new search snapping position to grid
689 if ((viewObjects.getJunctionFront() == nullptr) && myViewNet->getVisualisationSettings().showGrid) {
690 myViewNet->updateObjectsInPosition(myViewNet->snapToActiveGrid(clickedPosition));
691 }
692 // obtain junction depending of gridEnabled
693 GNEJunction* junction = viewObjects.getJunctionFront();
694 // begin undo list
695 if (!myViewNet->getUndoList()->hasCommandGroup()) {
696 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
697 }
698 // if we didn't clicked over another junction, then create a new
699 if (junction == nullptr) {
700 junction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition), myViewNet->getUndoList());
701 }
702 // now check if we have to create a new edge
703 if (myJunctionSource == nullptr) {
704 // check if create edge type short
705 if (myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
706 // create new junction
707 auto newJunction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition) + Position(5, 0), myViewNet->getUndoList());
708 // create new small edge
709 GNEEdge* newEdge = myViewNet->getNet()->createEdge(junction, newJunction, nullptr, myViewNet->getUndoList());
710 // set parameters
711 newEdge->copyEdgeType(edgeType, myViewNet->getUndoList());
712 // check pedestrians and sidewalks
713 if (myEdgeTypeSelector->isNoPedestriansEnabled()) {
714 disablePedestrians(newEdge);
715 }
716 // check if add bikelane
717 if (myEdgeTypeSelector->isAddBikelaneEnabled()) {
719 }
720 // check if add sidewalk
721 if (myEdgeTypeSelector->isAddSidewalkEnabled()) {
723 }
724 // end undo list
725 if (myViewNet->getUndoList()->hasCommandGroup()) {
726 myViewNet->getUndoList()->end();
727 } else {
728 std::cout << "edge created without an open CommandGroup" << std::endl;
729 }
730 } else {
731 myJunctionSource = junction;
732 myJunctionSource->markAsCreateEdgeSource();
733 }
734 update();
735 } else {
736 // make sure that junctions source and destination are different
737 if (myJunctionSource != junction) {
738 // may fail to prevent double edges
739 GNEEdge* newEdge = myViewNet->getNet()->createEdge(myJunctionSource, junction, nullptr, myViewNet->getUndoList());
740 // check if edge was successfully created
741 if (newEdge) {
742 // set parameters
743 if (myEdgeTypeSelector->useEdgeTemplate()) {
744 newEdge->copyTemplate(myViewNet->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate(), myViewNet->getUndoList());
745 } else if (myEdgeTypeSelector->useDefaultEdgeType()) {
746 newEdge->copyEdgeType(edgeType, myViewNet->getUndoList());
747 // check pedestrians and sidewalks
748 if (myEdgeTypeSelector->isNoPedestriansEnabled()) {
749 disablePedestrians(newEdge);
750 }
751 // check if add bikelane
752 if (myEdgeTypeSelector->isAddBikelaneEnabled()) {
754 }
755 // check if add sidewalk
756 if (myEdgeTypeSelector->isAddSidewalkEnabled()) {
758 }
759 } else {
760 newEdge->copyEdgeType(myEdgeTypeSelector->getEdgeTypeSelected(), myViewNet->getUndoList());
761 }
762 // create another edge, if create opposite edge is enabled
763 if (oppositeEdge && (myViewNet->getNet()->getAttributeCarriers()->retrieveEdges(junction, myJunctionSource).size() == 0)) {
764 GNEEdge* newOppositeEdge = myViewNet->getNet()->createEdge(junction, myJunctionSource, nullptr,
765 myViewNet->getUndoList(), "-" + newEdge->getNBEdge()->getID());
766 // set parameters
767 if (myEdgeTypeSelector->useEdgeTemplate()) {
768 newOppositeEdge->copyTemplate(myViewNet->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate(), myViewNet->getUndoList());
769 } else if (myEdgeTypeSelector->useDefaultEdgeType()) {
770 newOppositeEdge->copyEdgeType(edgeType, myViewNet->getUndoList());
771 // check pedestrians and sidewalks
772 if (myEdgeTypeSelector->isNoPedestriansEnabled()) {
773 disablePedestrians(newOppositeEdge);
774 }
775 // check if add bikelane
776 if (myEdgeTypeSelector->isAddBikelaneEnabled()) {
777 addBikelane(newOppositeEdge, edgeType->getAttribute(SUMO_ATTR_BIKELANEWIDTH));
778 }
779 // check if add sidewalk
780 if (myEdgeTypeSelector->isAddSidewalkEnabled()) {
781 addSidewalk(newOppositeEdge, edgeType->getAttribute(SUMO_ATTR_SIDEWALKWIDTH));
782 }
783 } else {
784 newOppositeEdge->copyEdgeType(myEdgeTypeSelector->getEdgeTypeSelected(), myViewNet->getUndoList());
785 }
786 }
787 // edge created, then unmark as create edge source
788 myJunctionSource->unMarkAsCreateEdgeSource();
789 // end undo list
790 if (myViewNet->getUndoList()->hasCommandGroup()) {
791 myViewNet->getUndoList()->end();
792 } else {
793 std::cout << "edge created without an open CommandGroup" << std::endl;
794 }
795 // if we're creating edges in chain mode, mark junction as junction edge source
796 if (chainEdge) {
797 myJunctionSource = junction;
798 myJunctionSource->markAsCreateEdgeSource();
799 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
800 } else {
801 myJunctionSource = nullptr;
802 }
803 } else {
804 myViewNet->setStatusBarText(TL("An edge with the same geometry already exists!"));
805 }
806 } else {
807 myViewNet->setStatusBarText(TL("Start- and endpoint for an edge must be distinct!"));
808 }
809 update();
810 }
811 }
812}
813
814
815void
817 // if myCreateEdgeSource exist, unmark ist as create edge source
818 if (myJunctionSource != nullptr) {
819 // remove current created edge source
820 myJunctionSource->unMarkAsCreateEdgeSource();
821 myJunctionSource = nullptr;
822 }
823}
824
825
826const GNEJunction*
830
831
832void
834 // refresh template selector
835 myEdgeTypeSelector->refreshEdgeTypeSelector();
836 // show frame
838}
839
840
841void
843 // hide frame
845}
846
847
852
853
858
859
864
865
870
871
872void
874 myEdgeTypeSelector->useTemplate();
875 myEdgeTypeSelector->refreshEdgeTypeSelector();
876}
877
878
879void
881 // iterate over lanes
882 for (const auto& lane : edge->getChildLanes()) {
883 // avoid sidewalks
884 if (lane->getAttribute(SUMO_ATTR_ALLOW) != "pedestrian") {
885 // extract disallow list
886 std::vector<std::string> disallowList = GNEAttributeCarrier::parse<std::vector<std::string> >(lane->getAttribute(SUMO_ATTR_DISALLOW));
887 // check if append pedestrian to disallow
888 if (std::find(disallowList.begin(), disallowList.end(), "pedestrian") == disallowList.end()) {
889 disallowList.push_back("pedestrian");
890 }
891 // update attribute
892 lane->setAttribute(SUMO_ATTR_DISALLOW, toString(disallowList), myViewNet->getUndoList());
893 }
894 }
895}
896
897
898void
899GNECreateEdgeFrame::addBikelane(GNEEdge* edge, const std::string& bikelaneWidth) const {
900 bool bikelaneFound = false;
901 // iterate over lanes
902 for (const auto& lane : edge->getChildLanes()) {
903 // check if there is already a SideWalk
904 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "bicycle") {
905 bikelaneFound = true;
906 }
907 }
908 // only add if previously there is no bikelanes
909 if (!bikelaneFound) {
910 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_BICYCLE, false);
911 // set width
912 if (bikelaneWidth != "default") {
913 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, bikelaneWidth, myViewNet->getUndoList());
914 }
915 }
916}
917
918
919void
920GNECreateEdgeFrame::addSidewalk(GNEEdge* edge, const std::string& sidewalkWidth) const {
921 bool sidewalkFound = false;
922 // iterate over lanes
923 for (const auto& lane : edge->getChildLanes()) {
924 // check if there is already a SideWalk
925 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "pedestrian") {
926 sidewalkFound = true;
927 }
928 }
929 // only add if previously there is no Sidewalk
930 if (!sidewalkFound) {
931 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_PEDESTRIAN, false);
932 // set width
933 if (sidewalkWidth != "default") {
934 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, sidewalkWidth, myViewNet->getUndoList());
935 }
936 }
937}
938
939/****************************************************************************/
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
@ LANETYPE
Definition GUIIcons.h:416
#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:49
const std::string getID() const override
get ID (all Attribute Carriers have one)
static T parse(const std::string &string)
parses a value of type T from string (used for basic types: int, double, bool, etc....
GNENet * getNet() const
get pointer to net
GNEEdgeType * getEdgeTypeSelected() const
get edgeType selected
FXRadioButton * myCreateDefaultShortEdgeType
create default edge short
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.
FXCheckButton * myAddBikelaneCheckButton
add bike check button
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
FXButton * myDeleteEdgeTypeButton
button for delete edge type
long onCmdDeleteEdgeType(FXObject *, FXSelector, void *)
Called when the user press button for delete edge type.
FXCheckButton * myAddSidewalkCheckButton
add sidewalk check button
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
FXButton * myCreateFromTemplate
button for create edgeType from template
FXRadioButton * myCreateCustomEdgeType
create custom edge
MFXComboBoxIcon * myEdgeTypesComboBox
ComboBox for edge types.
FXRadioButton * myCreateDefaultEdgeType
create default edge
void refreshEdgeTypeSelector()
refresh edge type selector
FXCheckButton * myNoPedestriansCheckButton
no pedestrian check button
bool isNoPedestriansEnabled() const
check if no pedestrian check button is enabled
long onCmdRadioButton(FXObject *, FXSelector, void *)
GNEEdgeType * myEdgeTypeSelected
selected edgeType
EdgeTypeSelector(GNECreateEdgeFrame *createEdgeFrameParent)
FOX-declaration.
GNECreateEdgeFrame * myCreateEdgeFrameParent
pointer to createEdgeFrameParent
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.
FXButton * myAddEdgeTypeButton
button for create new edge type
GNECreateEdgeFrame * myCreateEdgeFrameParent
pointer to createEdgeFrameParent
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:1058
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:766
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition GNEEdge.cpp:1035
std::string getAttribute(SumoXMLAttr key) const override
Definition GNEEdge.cpp:1112
const std::vector< GNELaneTemplate * > & getLaneTemplates() const
get vector with the lane templates of this edge
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:145
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
GNEGroupBoxModule (based on FXGroupBox).
GNEGroupBoxModule(GNEFrame *frame, const std::string &text, const int options=Options::COLLAPSIBLE)
constructor for frames
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
const GNEHierarchicalContainerChildren< GNELane * > & getChildLanes() const
get child lanes
GNEEdgeTemplate * getEdgeTemplate() const
get edge template (to copy attributes from)
GNEViewNet * getViewNet() const
get view net (used for simplify code)
Definition GNENet.cpp:144
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
GNEViewParent * getViewParent() const
get the net object
bool addRestrictedLane(GNELane *lane, SUMOVehicleClass vclass, const bool insertAtFront)
add restricted lane
A single child window which contains a view of the simulation area.
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
MFXStaticToolTip * getStaticTooltipMenu() const
get static toolTip for menus
A list item which allows for custom coloring.
const std::string & getID() const
Definition NBEdge.h:1551
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37