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>
34
35#include "GNECreateEdgeFrame.h"
36
37// ===========================================================================
38// FOX callback mapping
39// ===========================================================================
40
49
55
56// Object implementation
57FXIMPLEMENT(GNECreateEdgeFrame::EdgeTypeSelector, MFXGroupBoxModule, EdgeTypeSelectorMap, ARRAYNUMBER(EdgeTypeSelectorMap))
58FXIMPLEMENT(GNECreateEdgeFrame::LaneTypeSelector, MFXGroupBoxModule, LaneTypeSelectorMap, ARRAYNUMBER(LaneTypeSelectorMap))
59
60
61// ===========================================================================
62// method definitions
63// ===========================================================================
64
65// ---------------------------------------------------------------------------
66// GNECreateEdgeFrame::EdgeTypeSelector - methods
67// ---------------------------------------------------------------------------
68
70 MFXGroupBoxModule(createEdgeFrameParent, TL("Template selector")),
71 myCreateEdgeFrameParent(createEdgeFrameParent),
72 myDefaultEdgeType(new GNEEdgeType(createEdgeFrameParent)),
73 myCurrentIndex(0) {
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(), GUIDesignComboBoxNCol, true, GUIDesignComboBoxVisibleItems,
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) {
109 enableCheckBoxDisablePedestrians();
110 }
111 }
112}
113
114
118
119
120void
122 // get template editor
123 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
124 // get current item
125 const int index = myEdgeTypesComboBox->getCurrentItem();
126 // fill combo box
127 fillComboBox();
128 // continue depending of radio buttons
129 if (myCreateDefaultEdgeType->getCheck() || myCreateDefaultShortEdgeType->getCheck()) {
130 // enable check boxes
131 myAddSidewalkCheckButton->enable();
132 myAddBikelaneCheckButton->enable();
133 myNoPedestriansCheckButton->enable();
134 // disable create from template
135 myCreateFromTemplate->disable();
136 // disable comboBox
137 myEdgeTypesComboBox->disable();
138 // disable buttons
139 myAddEdgeTypeButton->disable();
140 myDeleteEdgeTypeButton->disable();
141 // show default edgeType attributes
142 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myDefaultEdgeType, true);
143 // show lane attributes
144 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
145 } else if (myCreateCustomEdgeType->getCheck()) {
146 // disable check boxes
147 myAddSidewalkCheckButton->disable();
148 myAddBikelaneCheckButton->disable();
149 myNoPedestriansCheckButton->disable();
150 // enable buttons
151 myAddEdgeTypeButton->enable();
152 myDeleteEdgeTypeButton->enable();
153 // check conditions
154 if (myEdgeTypesComboBox->getNumItems() == 0) {
155 // disable comboBox and edgeType
156 myEdgeTypesComboBox->disable();
157 myDeleteEdgeTypeButton->disable();
158 // hide attributes creators
159 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->hideAttributesEditor();
160 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
161 } else if (templateEditor->getEdgeTemplate() && (index == 0)) {
162 // enable create from template
163 myCreateFromTemplate->enable();
164 // enable comboBox
165 myEdgeTypesComboBox->enable();
166 // disable delete edge type button (because templates cannot be deleted)
167 myDeleteEdgeTypeButton->disable();
168 // show edgeType attributes and disable
169 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(templateEditor->getEdgeTemplate(), true);
170 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->disableAttributesEditor();
171 // show lane attributes (will be automatic disabled)
172 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
173 } else {
174 // disable create from template
175 myCreateFromTemplate->disable();
176 // enable comboBox
177 myEdgeTypesComboBox->enable();
178 // get edgeType
179 myEdgeTypeSelected = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text(), false);
180 // check if exist
181 if (myEdgeTypeSelected) {
182 // show edgeType attributes
183 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myEdgeTypeSelected, true);
184 // show lane attributes
185 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
186 } else {
187 // hide edgeType attributes
188 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->hideAttributesEditor();
189 // hide lane attributes
190 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
191 // set comboBox text
192 myEdgeTypesComboBox->setTextColor(FXRGB(255, 0, 0));
193 }
194 }
195 }
196 // recalc
197 recalc();
198}
199
200
201void
202GNECreateEdgeFrame::EdgeTypeSelector::updateIDinComboBox(const std::string& oldID, const std::string& newID) {
203 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
204 if (myEdgeTypesComboBox->getItemText(i) == oldID) {
205 myEdgeTypesComboBox->updateIconItem(i, newID.c_str());
206 }
207 }
208}
209
210
211bool
213 return (myCreateDefaultEdgeType->getCheck() == TRUE);
214}
215
216
217bool
219 return (myCreateDefaultShortEdgeType->getCheck() == TRUE);
220}
221
222
223bool
225 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
226 if ((myCreateCustomEdgeType->getCheck() == TRUE) && (myEdgeTypesComboBox->getCurrentItem() == 0)) {
227 return true;
228 } else {
229 return false;
230 }
231 } else {
232 return false;
233 }
234}
235
236
237void
239 myNoPedestriansCheckButton->setCheck(TRUE);
240}
241
242
245 return myDefaultEdgeType;
246}
247
248
251 if ((myCreateDefaultEdgeType->getCheck() == TRUE) || (myCreateDefaultShortEdgeType->getCheck() == TRUE)) {
252 return myDefaultEdgeType;
253 } else {
254 return myEdgeTypeSelected;
255 }
256}
257
258
259bool
261 return (myNoPedestriansCheckButton->getCheck() == TRUE);
262}
263
264
265bool
267 return (myAddSidewalkCheckButton->getCheck() == TRUE);
268}
269
270
271bool
273 return (myAddBikelaneCheckButton->getCheck() == TRUE);
274}
275
276
277void
279 myEdgeTypeSelected = nullptr;
280 myCurrentIndex--;
281 if (myCurrentIndex < 0) {
282 myCurrentIndex = 0;
283 }
284}
285
286
287void
289 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
290 if (myEdgeTypesComboBox->getItemText(i) == edgeType->getID()) {
291 // set current item and index
292 myEdgeTypesComboBox->setCurrentItem(i);
293 myCurrentIndex = i;
294 // set buttons
295 myCreateDefaultEdgeType->setCheck(FALSE);
296 myCreateDefaultShortEdgeType->setCheck(FALSE);
297 myCreateCustomEdgeType->setCheck(TRUE);
298 // refresh
299 refreshEdgeTypeSelector();
300 }
301 }
302}
303
304
305void
307 myCreateDefaultEdgeType->setCheck(FALSE);
308 myCreateDefaultShortEdgeType->setCheck(FALSE);
309 myCreateCustomEdgeType->setCheck(TRUE);
310 refreshEdgeTypeSelector();
311}
312
313
314long
316 // update radio buttons
317 if (obj == myCreateDefaultEdgeType) {
318 myCreateDefaultEdgeType->setCheck(TRUE);
319 myCreateDefaultShortEdgeType->setCheck(FALSE);
320 myCreateCustomEdgeType->setCheck(FALSE);
321 } else if (obj == myCreateDefaultShortEdgeType) {
322 myCreateDefaultEdgeType->setCheck(FALSE);
323 myCreateDefaultShortEdgeType->setCheck(TRUE);
324 myCreateCustomEdgeType->setCheck(FALSE);
325 } else {
326 myCreateDefaultEdgeType->setCheck(FALSE);
327 myCreateDefaultShortEdgeType->setCheck(FALSE);
328 myCreateCustomEdgeType->setCheck(TRUE);
329 }
330 // refresh template selector
331 refreshEdgeTypeSelector();
332 return 0;
333}
334
335
336long
338 // create new edge type
339 GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
340 // add it using undoList
341 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
342 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
343 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
344 // update myEdgeTypeSelected
345 myEdgeTypeSelected = edgeType;
346 // select last item
347 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
348 // refresh EdgeTypeSelector
349 refreshEdgeTypeSelector();
350 return 0;
351}
352
353
354long
356 // first check if we have to reset myEdgeTypeSelected
357 if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
358 myEdgeTypeSelected = nullptr;
359 }
360 // get edgeType to remove
361 GNEEdgeType* edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text());
362 // remove it using undoList
363 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("delete edge type"));
364 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
365 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
366 // refresh EdgeTypeSelector
367 refreshEdgeTypeSelector();
368 return 0;
369}
370
371
372long
374 // update current index
375 myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
376 // refresh edgeType selector
377 refreshEdgeTypeSelector();
378 return 0;
379}
380
381
382long
384 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
385 // create new edge type
386 GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
387 // copy all template values
388 edgeType->copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
389 // add it using undoList
390 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
391 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
392 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
393 // update myEdgeTypeSelected
394 myEdgeTypeSelected = edgeType;
395 // select last item
396 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
397 // refresh EdgeTypeSelector
398 refreshEdgeTypeSelector();
399 }
400 return 0;
401}
402
403
404long
406 if (myAddSidewalkCheckButton->getCheck() == TRUE) {
407 myNoPedestriansCheckButton->setCheck(TRUE);
408 myNoPedestriansCheckButton->disable();
409 } else {
410 myNoPedestriansCheckButton->enable();
411 }
412 // show default edgeType attributes again (for refresh sidewalk and bike widths)
413 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myDefaultEdgeType, true);
414 return 1;
415}
416
417
418void
420 // get template editor
421 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
422 // get edge types
423 const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
424 // clear edge types
425 myEdgeTypesComboBox->clearItems();
426 // set comboBox text color
427 myEdgeTypesComboBox->setTextColor(FXRGB(0, 0, 0));
428 // add template
429 if (templateEditor->getEdgeTemplate()) {
430 myEdgeTypesComboBox->appendIconItem((TL("template: ") + templateEditor->getEdgeTemplate()->getID()).c_str(), nullptr);
431 }
432 if (edgeTypes.size() > 0) {
433 // add edge types
434 for (const auto& edgeType : edgeTypes) {
435 myEdgeTypesComboBox->appendIconItem(edgeType.second->getID().c_str(), edgeType.second->getACIcon());
436 }
437 // set current item
438 if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
439 myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
440 }
441 myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
442 myEdgeTypesComboBox->enable();
443 } else {
444 myEdgeTypesComboBox->disable();
445 }
446}
447
448// ---------------------------------------------------------------------------
449// GNECreateEdgeFrame::LaneTypeSelector - methods
450// ---------------------------------------------------------------------------
451
453 MFXGroupBoxModule(createEdgeFrameParent, TL("LaneType selector")),
454 myCreateEdgeFrameParent(createEdgeFrameParent),
455 myLaneIndex(0) {
456 // lane types combo box
459 // create horizontal frame
460 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
461 // create new lane type button
462 myAddLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Add"), "", TL("Add lane type"), GUIIconSubSys::getIcon(GUIIcon::ADD),
464 // create delete lane type button
465 myDeleteLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Delete"), "", TL("Delete lane type"), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
467}
468
469
472
473
474void
476 // start at first lane
477 myLaneIndex = 0;
478 // refresh laneTypeSelector
479 refreshLaneTypeSelector();
480 // show
481 show();
482}
483
484
485void
487 // hide attributes creator module
488 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
489 // hide
490 hide();
491}
492
493
494void
496 // clear lane types
497 myLaneTypesComboBox->clearItems();
498 // first check if use template
499 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
500 const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
501 // fill comboBox
502 for (const auto& laneTemplate : edgeTemplate->getLaneTemplates()) {
503 myLaneTypesComboBox->appendIconItem(laneTemplate->getAttribute(SUMO_ATTR_ID).c_str(), laneTemplate->getACIcon());
504 }
505 // update comboBox
506 updateComboBox();
507 // show laneTypeAttributes
508 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeTemplate->getLaneTemplates().at(myLaneIndex), false);
509 // disable laneAttributes (because is a template)
510 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->disableAttributesEditor();
511 // disable add and remove buttons
512 myAddLaneTypeButton->disable();
513 myDeleteLaneTypeButton->disable();
514 } else {
515 // get edgeType
516 const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
517 // fill comboBox
518 for (const auto& laneType : edgeType->getLaneTypes()) {
519 myLaneTypesComboBox->appendIconItem(laneType->getAttribute(SUMO_ATTR_ID).c_str(), laneType->getACIcon());
520 }
521 // update comboBox
522 updateComboBox();
523 // show laneTypeAttributes
524 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeType->getLaneTypes().at(myLaneIndex), false);
525 // enable add and remove buttons
526 myAddLaneTypeButton->enable();
527 // check if enable or disable remove lane button
528 if (edgeType->getLaneTypes().size() > 1) {
529 myDeleteLaneTypeButton->enable();
530 } else {
531 myDeleteLaneTypeButton->disable();
532 }
533 }
534 // recalc
535 recalc();
536}
537
538
539long
541 // check what edgeType is being edited
542 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
543 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
544 // add new lane in default edge type
545 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->addLaneType(new GNELaneType(myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()));
546 // refresh laneTypeSelector
547 refreshLaneTypeSelector();
548 // set combo box
549 myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
550 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
551 // get selected
552 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
553 if (edgeType) {
554 // create new edgeType
555 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
556 // create laneTypes
557 for (const auto& laneType : edgeType->getLaneTypes()) {
558 newEdgeType->addLaneType(new GNELaneType(newEdgeType, laneType));
559 }
560 // add new lane
561 newEdgeType->addLaneType(new GNELaneType(newEdgeType));
562 // remove old edgeTyp und and newEdgeType
563 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("add laneType"));
564 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
565 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
566 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
567 // update index
568 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
569 // set current edgeType in selector
570 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
571 }
572 }
573 return 0;
574}
575
576
577long
579 // check what edgeType is being edited
580 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
581 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
582 // add new lane in default edge type
583 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->removeLaneType(myLaneIndex);
584 // refresh laneTypeSelector
585 refreshLaneTypeSelector();
586 // set combo box
587 myLaneTypesComboBox->setCurrentItem(0);
588 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
589 // get selected
590 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
591 if (edgeType) {
592 // create new edgeType
593 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
594 // create laneTypes (except current)
595 for (int i = 0; i < (int)edgeType->getLaneTypes().size(); i++) {
596 if (i != myLaneIndex) {
597 newEdgeType->addLaneType(new GNELaneType(newEdgeType, edgeType->getLaneTypes().at(i)));
598 }
599 }
600 // remove old edgeTyp und and newEdgeType
601 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("remove laneType"));
602 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
603 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
604 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
605 // update index
606 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
607 // set current edgeType in selector
608 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
609 }
610 }
611 return 0;
612}
613
614
615long
617 // update index
618 myLaneIndex = myLaneTypesComboBox->getCurrentItem();
619 // refresh laneType selector
620 refreshLaneTypeSelector();
621 return 0;
622}
623
624
625void
627 // check lane index
628 if (myLaneIndex > myLaneTypesComboBox->getNumItems()) {
629 myLaneIndex = 0;
630 }
631 // set current item
632 myLaneTypesComboBox->setCurrentItem(myLaneIndex);
633}
634
635// ---------------------------------------------------------------------------
636// GNECreateEdgeFrame::Legend - methods
637// ---------------------------------------------------------------------------
638
640 MFXGroupBoxModule(createEdgeFrameParent, TL("Information")) {
641 std::ostringstream information;
642 // add label for shift+click
643 information
644 << "- " << TL("ESC:") << "\n"
645 << " " << TL("Deselect origin") << "\n"
646 << "- " << TL("Control+Click:") << "\n"
647 << " " << TL("Move view") << "\n"
648 << "- " << TL("Shift+Click:") << "\n"
649 << " " << TL("Splits edge in both directions") << "\n"
650 << "- " << TL("Alt+Shift+Click:") << "\n"
651 << " " << TL("Splits edge in one direction");
652 // create label
653 new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
654}
655
656
658
659// ---------------------------------------------------------------------------
660// GNECreateEdgeFrame - methods
661// ---------------------------------------------------------------------------
662
664 GNEFrame(viewParent, viewNet, TL("Create Edge")),
665 myJunctionSource(nullptr) {
666 // create custom edge selector
668 // Create edgeType parameters
670 // lane type selector
672 // Create laneType parameters
674 // create edge selector legend
675 myLegend = new Legend(this);
676}
677
678
680
681
682void
684 const bool oppositeEdge, const bool chainEdge) {
685 // first check if there is an edge template, an edge type (default or custom)
688 WRITE_WARNING(TL("Select either default edgeType or short edge or a custom edgeType or template"));
690 // if grid is enabled and currently there isn't a junction under mouse, make a new search snapping position to grid
691 if ((viewObjects.getJunctionFront() == nullptr) && myViewNet->getVisualisationSettings().showGrid) {
693 }
694 // obtain junction depending of gridEnabled
695 GNEJunction* junction = viewObjects.getJunctionFront();
696 // begin undo list
698 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
699 }
700 // if we didn't clicked over another junction, then create a new
701 if (junction == nullptr) {
702 junction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition), myViewNet->getUndoList());
703 }
704 // now check if we have to create a new edge
705 if (myJunctionSource == nullptr) {
706 // check if create edge type short
708 // create new junction
709 auto newJunction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition) + Position(5, 0), myViewNet->getUndoList());
710 // create new small edge
711 GNEEdge* newEdge = myViewNet->getNet()->createEdge(junction, newJunction, nullptr, myViewNet->getUndoList());
712 // set parameters
714 // check pedestrians and sidewalks
716 disablePedestrians(newEdge);
717 }
718 // check if add bikelane
721 }
722 // check if add sidewalk
725 }
726 // end undo list
729 } else {
730 std::cout << "edge created without an open CommandGroup" << std::endl;
731 }
732 } else {
733 myJunctionSource = junction;
735 }
736 update();
737 } else {
738 // make sure that junctions source and destination are different
739 if (myJunctionSource != junction) {
740 // may fail to prevent double edges
741 GNEEdge* newEdge = myViewNet->getNet()->createEdge(myJunctionSource, junction, nullptr, myViewNet->getUndoList());
742 // check if edge was successfully created
743 if (newEdge) {
744 // set parameters
749 // check pedestrians and sidewalks
751 disablePedestrians(newEdge);
752 }
753 // check if add bikelane
756 }
757 // check if add sidewalk
760 }
761 } else {
763 }
764 // create another edge, if create opposite edge is enabled
765 if (oppositeEdge && (myViewNet->getNet()->getAttributeCarriers()->retrieveEdges(junction, myJunctionSource).size() == 0)) {
766 GNEEdge* newOppositeEdge = myViewNet->getNet()->createEdge(junction, myJunctionSource, nullptr,
767 myViewNet->getUndoList(), "-" + newEdge->getNBEdge()->getID());
768 // set parameters
773 // check pedestrians and sidewalks
775 disablePedestrians(newOppositeEdge);
776 }
777 // check if add bikelane
780 }
781 // check if add sidewalk
784 }
785 } else {
787 }
788 }
789 // edge created, then unmark as create edge source
791 // end undo list
794 } else {
795 std::cout << "edge created without an open CommandGroup" << std::endl;
796 }
797 // if we're creating edges in chain mode, mark junction as junction edge source
798 if (chainEdge) {
799 myJunctionSource = junction;
801 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
802 } else {
803 myJunctionSource = nullptr;
804 }
805 } else {
806 myViewNet->setStatusBarText(TL("An edge with the same geometry already exists!"));
807 }
808 } else {
809 myViewNet->setStatusBarText(TL("Start- and endpoint for an edge must be distinct!"));
810 }
811 update();
812 }
813 }
814}
815
816
817void
819 // if myCreateEdgeSource exist, unmark ist as create edge source
820 if (myJunctionSource != nullptr) {
821 // remove current created edge source
823 myJunctionSource = nullptr;
824 }
825}
826
827
828const GNEJunction*
832
833
834void
836 // refresh template selector
838 // show frame
840}
841
842
843void
845 // hide frame
847}
848
849
854
855
860
861
866
867
872
873
874void
879
880
881void
883 // iterate over lanes
884 for (const auto& lane : edge->getChildLanes()) {
885 // avoid sidewalks
886 if (lane->getAttribute(SUMO_ATTR_ALLOW) != "pedestrian") {
887 // extract disallow list
888 std::vector<std::string> disallowList = GNEAttributeCarrier::parse<std::vector<std::string> >(lane->getAttribute(SUMO_ATTR_DISALLOW));
889 // check if append pedestrian to disallow
890 if (std::find(disallowList.begin(), disallowList.end(), "pedestrian") == disallowList.end()) {
891 disallowList.push_back("pedestrian");
892 }
893 // update attribute
894 lane->setAttribute(SUMO_ATTR_DISALLOW, toString(disallowList), myViewNet->getUndoList());
895 }
896 }
897}
898
899
900void
901GNECreateEdgeFrame::addBikelane(GNEEdge* edge, const std::string& bikelaneWidth) const {
902 bool bikelaneFound = false;
903 // iterate over lanes
904 for (const auto& lane : edge->getChildLanes()) {
905 // check if there is already a SideWalk
906 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "bicycle") {
907 bikelaneFound = true;
908 }
909 }
910 // only add if previously there is no bikelanes
911 if (!bikelaneFound) {
912 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_BICYCLE, false);
913 // set width
914 if (bikelaneWidth != "default") {
915 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, bikelaneWidth, myViewNet->getUndoList());
916 }
917 }
918}
919
920
921void
922GNECreateEdgeFrame::addSidewalk(GNEEdge* edge, const std::string& sidewalkWidth) const {
923 bool sidewalkFound = false;
924 // iterate over lanes
925 for (const auto& lane : edge->getChildLanes()) {
926 // check if there is already a SideWalk
927 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "pedestrian") {
928 sidewalkFound = true;
929 }
930 }
931 // only add if previously there is no Sidewalk
932 if (!sidewalkFound) {
933 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_PEDESTRIAN, false);
934 // set width
935 if (sidewalkWidth != "default") {
936 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, sidewalkWidth, myViewNet->getUndoList());
937 }
938 }
939}
940
941/****************************************************************************/
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 GUIDesignButton
Definition GUIDesigns.h:82
#define GUIDesignComboBoxAttribute
Combo box static (cannot be edited) extended over the matrix column.
Definition GUIDesigns.h:302
#define GUIDesignComboBoxNCol
number of column of every combo box
Definition GUIDesigns.h:311
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:399
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:49
#define GUIDesignCheckButton
checkButton placed in left position
Definition GUIDesigns.h:192
#define GUIDesignRadioButton
Definition GUIDesigns.h:229
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition GUIDesigns.h:279
#define WRITE_WARNING(msg)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:305
@ 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
A road/street connecting two junctions (netedit-version)
Definition GNEEdge.h:53
void copyEdgeType(const GNEEdgeType *edgeType, GNEUndoList *undoList)
copy edge attributes from edgeType
Definition GNEEdge.cpp:1121
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:829
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition GNEEdge.cpp:1098
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
std::string getAttribute(SumoXMLAttr key) const
GNEViewNet * myViewNet
FOX need this.
Definition GNEFrame.h:121
virtual void show()
show Frame
Definition GNEFrame.cpp:120
virtual void hide()
hide Frame
Definition GNEFrame.cpp:129
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:147
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:280
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
Definition GNENet.cpp:264
GNEViewNet * getViewNet() const
get view net
Definition GNENet.cpp:2195
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.
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
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:1531
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37