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),
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 myCreateDefaultShortEdgeType->hide();
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
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(myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType(), 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(GUIDesignTextColorRed);
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 if ((myCreateDefaultEdgeType->getCheck() == TRUE) || (myCreateDefaultShortEdgeType->getCheck() == TRUE)) {
246 return myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType();
247 } else {
248 return myEdgeTypeSelected;
249 }
250}
251
252
253bool
255 return (myNoPedestriansCheckButton->getCheck() == TRUE);
256}
257
258
259bool
261 return (myAddSidewalkCheckButton->getCheck() == TRUE);
262}
263
264
265bool
267 return (myAddBikelaneCheckButton->getCheck() == TRUE);
268}
269
270
271void
273 myEdgeTypeSelected = nullptr;
274 myCurrentIndex--;
275 if (myCurrentIndex < 0) {
276 myCurrentIndex = 0;
277 }
278}
279
280
281void
283 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
284 if (myEdgeTypesComboBox->getItemText(i) == edgeType->getID()) {
285 // set current item and index
286 myEdgeTypesComboBox->setCurrentItem(i);
287 myCurrentIndex = i;
288 // set buttons
289 myCreateDefaultEdgeType->setCheck(FALSE);
290 myCreateDefaultShortEdgeType->setCheck(FALSE);
291 myCreateCustomEdgeType->setCheck(TRUE);
292 // refresh
293 refreshEdgeTypeSelector();
294 }
295 }
296}
297
298
299void
301 myCreateDefaultEdgeType->setCheck(FALSE);
302 myCreateDefaultShortEdgeType->setCheck(FALSE);
303 myCreateCustomEdgeType->setCheck(TRUE);
304 refreshEdgeTypeSelector();
305}
306
307
308void
310 if (value) {
311 myCreateDefaultShortEdgeType->show();
312 } else {
313 myCreateDefaultShortEdgeType->hide();
314 }
315}
316
317
318long
320 // update radio buttons
321 if (obj == myCreateDefaultEdgeType) {
322 myCreateDefaultEdgeType->setCheck(TRUE);
323 myCreateDefaultShortEdgeType->setCheck(FALSE);
324 myCreateCustomEdgeType->setCheck(FALSE);
325 } else if (obj == myCreateDefaultShortEdgeType) {
326 myCreateDefaultEdgeType->setCheck(FALSE);
327 myCreateDefaultShortEdgeType->setCheck(TRUE);
328 myCreateCustomEdgeType->setCheck(FALSE);
329 } else {
330 myCreateDefaultEdgeType->setCheck(FALSE);
331 myCreateDefaultShortEdgeType->setCheck(FALSE);
332 myCreateCustomEdgeType->setCheck(TRUE);
333 }
334 // refresh template selector
335 refreshEdgeTypeSelector();
336 return 0;
337}
338
339
340long
342 // create new edge type
343 auto net = myCreateEdgeFrameParent->getViewNet()->getNet();
344 GNEEdgeType* edgeType = new GNEEdgeType(net, net->getAttributeCarriers()->generateEdgeTypeID());
345 // add it using undoList
346 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
347 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
348 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
349 // update myEdgeTypeSelected
350 myEdgeTypeSelected = edgeType;
351 // select last item
352 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
353 // refresh EdgeTypeSelector
354 refreshEdgeTypeSelector();
355 return 0;
356}
357
358
359long
361 // first check if we have to reset myEdgeTypeSelected
362 if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
363 myEdgeTypeSelected = nullptr;
364 }
365 // get edgeType to remove
366 GNEEdgeType* edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text());
367 // remove it using undoList
368 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("delete edge type"));
369 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
370 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
371 // refresh EdgeTypeSelector
372 refreshEdgeTypeSelector();
373 return 0;
374}
375
376
377long
379 // update current index
380 myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
381 // refresh edgeType selector
382 refreshEdgeTypeSelector();
383 return 0;
384}
385
386
387long
389 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
390 // create new edge type
391 auto net = myCreateEdgeFrameParent->getViewNet()->getNet();
392 GNEEdgeType* edgeType = new GNEEdgeType(net, net->getAttributeCarriers()->generateEdgeTypeID());
393 // copy all template values
394 edgeType->copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
395 // add it using undoList
396 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(edgeType, TL("create new edge type"));
397 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
398 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
399 // update myEdgeTypeSelected
400 myEdgeTypeSelected = edgeType;
401 // select last item
402 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
403 // refresh EdgeTypeSelector
404 refreshEdgeTypeSelector();
405 }
406 return 0;
407}
408
409
410long
412 if (myAddSidewalkCheckButton->getCheck() == TRUE) {
413 myNoPedestriansCheckButton->setCheck(TRUE);
414 myNoPedestriansCheckButton->disable();
415 } else {
416 myNoPedestriansCheckButton->enable();
417 }
418 // show default edgeType attributes again (for refresh sidewalk and bike widths)
419 myCreateEdgeFrameParent->myEdgeTypeAttributesEditor->showAttributesEditor(myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType(), true);
420 return 1;
421}
422
423
424void
426 // get template editor
427 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
428 // get edge types
429 const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
430 // clear edge types
431 myEdgeTypesComboBox->clearItems();
432 // set comboBox text color
433 myEdgeTypesComboBox->setTextColor(GUIDesignTextColorBlack);
434 // add template
435 if (templateEditor->getEdgeTemplate()) {
436 myEdgeTypesComboBox->appendIconItem((TL("template: ") + templateEditor->getEdgeTemplate()->getID()).c_str(), nullptr);
437 }
438 if (edgeTypes.size() > 0) {
439 // add edge types
440 for (const auto& edgeType : edgeTypes) {
441 myEdgeTypesComboBox->appendIconItem(edgeType.second->getID().c_str(), edgeType.second->getACIcon());
442 }
443 // set current item
444 if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
445 myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
446 }
447 myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
448 myEdgeTypesComboBox->enable();
449 } else {
450 myEdgeTypesComboBox->disable();
451 }
452}
453
454// ---------------------------------------------------------------------------
455// GNECreateEdgeFrame::LaneTypeSelector - methods
456// ---------------------------------------------------------------------------
457
459 GNEGroupBoxModule(createEdgeFrameParent, TL("LaneType selector")),
460 myCreateEdgeFrameParent(createEdgeFrameParent),
461 myLaneIndex(0) {
462 // lane types combo box
465 // create horizontal frame
466 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
467 // create new lane type button
468 myAddLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Add"), "", TL("Add lane type"), GUIIconSubSys::getIcon(GUIIcon::ADD),
470 // create delete lane type button
471 myDeleteLaneTypeButton = GUIDesigns::buildFXButton(horizontalFrameButtons, TL("Delete"), "", TL("Delete lane type"), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
473}
474
475
478
479
480void
482 // start at first lane
483 myLaneIndex = 0;
484 // refresh laneTypeSelector
485 refreshLaneTypeSelector();
486 // show
487 show();
488}
489
490
491void
493 // hide attributes creator module
494 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->hideAttributesEditor();
495 // hide
496 hide();
497}
498
499
500void
502 // clear lane types
503 myLaneTypesComboBox->clearItems();
504 // first check if use template
505 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
506 const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
507 // fill comboBox
508 for (const auto& laneTemplate : edgeTemplate->getLaneTemplates()) {
509 myLaneTypesComboBox->appendIconItem(laneTemplate->getAttribute(SUMO_ATTR_ID).c_str(), laneTemplate->getACIcon());
510 }
511 // update comboBox
512 updateComboBox();
513 // show laneTypeAttributes
514 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeTemplate->getLaneTemplates().at(myLaneIndex), false);
515 // disable laneAttributes (because is a template)
516 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->disableAttributesEditor();
517 // disable add and remove buttons
518 myAddLaneTypeButton->disable();
519 myDeleteLaneTypeButton->disable();
520 } else {
521 // get edgeType
522 const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
523 // fill comboBox
524 for (const auto& laneType : edgeType->getLaneTypes()) {
525 myLaneTypesComboBox->appendIconItem(laneType->getAttribute(SUMO_ATTR_ID).c_str(), laneType->getACIcon());
526 }
527 // update comboBox
528 updateComboBox();
529 // show laneTypeAttributes
530 myCreateEdgeFrameParent->myLaneTypeAttributesEditor->showAttributesEditor(edgeType->getLaneTypes().at(myLaneIndex), false);
531 // enable add and remove buttons
532 myAddLaneTypeButton->enable();
533 // check if enable or disable remove lane button
534 if (edgeType->getLaneTypes().size() > 1) {
535 myDeleteLaneTypeButton->enable();
536 } else {
537 myDeleteLaneTypeButton->disable();
538 }
539 }
540 // recalc
541 recalc();
542}
543
544
545long
547 // check what edgeType is being edited
548 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
549 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
550 // add new lane in default edge type
551 auto edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType();
552 edgeType->addLaneType(new GNELaneType(edgeType));
553 // refresh laneTypeSelector
554 refreshLaneTypeSelector();
555 // set combo box
556 myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
557 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
558 // get selected
559 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
560 if (edgeType) {
561 // create new edgeType
562 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
563 // create laneTypes
564 for (const auto& laneType : edgeType->getLaneTypes()) {
565 newEdgeType->addLaneType(new GNELaneType(newEdgeType, laneType));
566 }
567 // add new lane
568 newEdgeType->addLaneType(new GNELaneType(newEdgeType));
569 // remove old edgeTyp und and newEdgeType
570 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("add laneType"));
571 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
572 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
573 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
574 // update index
575 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
576 // set current edgeType in selector
577 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
578 }
579 }
580 return 0;
581}
582
583
584long
586 // check what edgeType is being edited
587 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType() ||
588 myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeTypeShort()) {
589 // add new lane in default edge type
590 myCreateEdgeFrameParent->getViewNet()->getNet()->getACTemplates()->getDefaultEdgeType()->removeLaneType(myLaneIndex);
591 // refresh laneTypeSelector
592 refreshLaneTypeSelector();
593 // set combo box
594 myLaneTypesComboBox->setCurrentItem(0);
595 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
596 // get selected
597 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
598 if (edgeType) {
599 // create new edgeType
600 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
601 // create laneTypes (except current)
602 for (int i = 0; i < (int)edgeType->getLaneTypes().size(); i++) {
603 if (i != myLaneIndex) {
604 newEdgeType->addLaneType(new GNELaneType(newEdgeType, edgeType->getLaneTypes().at(i)));
605 }
606 }
607 // remove old edgeTyp und and newEdgeType
608 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANETYPE, TL("remove laneType"));
609 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
610 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
611 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
612 // update index
613 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
614 // set current edgeType in selector
615 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
616 }
617 }
618 return 0;
619}
620
621
622long
624 // update index
625 myLaneIndex = myLaneTypesComboBox->getCurrentItem();
626 // refresh laneType selector
627 refreshLaneTypeSelector();
628 return 0;
629}
630
631
632void
634 // check lane index
635 if (myLaneIndex >= myLaneTypesComboBox->getNumItems()) {
636 myLaneIndex = 0;
637 }
638 // set current item
639 myLaneTypesComboBox->setCurrentItem(myLaneIndex);
640}
641
642// ---------------------------------------------------------------------------
643// GNECreateEdgeFrame::Legend - methods
644// ---------------------------------------------------------------------------
645
647 GNEGroupBoxModule(createEdgeFrameParent, TL("Information")) {
648 std::ostringstream information;
649 // add label for shift+click
650 information
651 << "- " << TL("ESC:") << "\n"
652 << " " << TL("Deselect origin") << "\n"
653 << "- " << TL("Control+Click:") << "\n"
654 << " " << TL("Move view") << "\n"
655 << "- " << TL("Shift+Click:") << "\n"
656 << " " << TL("Splits edge in both directions") << "\n"
657 << "- " << TL("Alt+Shift+Click:") << "\n"
658 << " " << TL("Splits edge in one direction");
659 // create label
660 new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
661}
662
663
665
666// ---------------------------------------------------------------------------
667// GNECreateEdgeFrame - methods
668// ---------------------------------------------------------------------------
669
671 GNEFrame(viewParent, viewNet, TL("Create Edge")),
672 myJunctionSource(nullptr) {
673 // create custom edge selector
675 // Create edgeType parameters
677 // lane type selector
679 // Create laneType parameters
681 // create edge selector legend
682 myLegend = new Legend(this);
683}
684
685
687
688
689void
691 const bool oppositeEdge, const bool chainEdge) {
692 // first check if there is an edge template, an edge type (default or custom)
695 WRITE_WARNING(TL("Select either default edgeType or short edge or a custom edgeType or template"));
697 // get edge type
698 auto edgeType = myViewNet->getNet()->getACTemplates()->getDefaultEdgeType();
699 // if grid is enabled and currently there isn't a junction under mouse, make a new search snapping position to grid
700 if ((viewObjects.getJunctionFront() == nullptr) && myViewNet->getVisualisationSettings().showGrid) {
702 }
703 // obtain junction depending of gridEnabled
704 GNEJunction* junction = viewObjects.getJunctionFront();
705 // begin undo list
707 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
708 }
709 // if we didn't clicked over another junction, then create a new
710 if (junction == nullptr) {
711 junction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition), myViewNet->getUndoList());
712 }
713 // now check if we have to create a new edge
714 if (myJunctionSource == nullptr) {
715 // check if create edge type short
717 // create new junction
718 auto newJunction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition) + Position(5, 0), myViewNet->getUndoList());
719 // create new small edge
720 GNEEdge* newEdge = myViewNet->getNet()->createEdge(junction, newJunction, nullptr, myViewNet->getUndoList());
721 // set parameters
722 newEdge->copyEdgeType(edgeType, myViewNet->getUndoList());
723 // check pedestrians and sidewalks
725 disablePedestrians(newEdge);
726 }
727 // check if add bikelane
730 }
731 // check if add sidewalk
734 }
735 // end undo list
738 } else {
739 std::cout << "edge created without an open CommandGroup" << std::endl;
740 }
741 } else {
742 myJunctionSource = junction;
744 }
745 update();
746 } else {
747 // make sure that junctions source and destination are different
748 if (myJunctionSource != junction) {
749 // may fail to prevent double edges
750 GNEEdge* newEdge = myViewNet->getNet()->createEdge(myJunctionSource, junction, nullptr, myViewNet->getUndoList());
751 // check if edge was successfully created
752 if (newEdge) {
753 // set parameters
757 newEdge->copyEdgeType(edgeType, myViewNet->getUndoList());
758 // check pedestrians and sidewalks
760 disablePedestrians(newEdge);
761 }
762 // check if add bikelane
765 }
766 // check if add sidewalk
769 }
770 } else {
772 }
773 // create another edge, if create opposite edge is enabled
774 if (oppositeEdge && (myViewNet->getNet()->getAttributeCarriers()->retrieveEdges(junction, myJunctionSource).size() == 0)) {
775 GNEEdge* newOppositeEdge = myViewNet->getNet()->createEdge(junction, myJunctionSource, nullptr,
776 myViewNet->getUndoList(), "-" + newEdge->getNBEdge()->getID());
777 // set parameters
781 newOppositeEdge->copyEdgeType(edgeType, myViewNet->getUndoList());
782 // check pedestrians and sidewalks
784 disablePedestrians(newOppositeEdge);
785 }
786 // check if add bikelane
788 addBikelane(newOppositeEdge, edgeType->getAttribute(SUMO_ATTR_BIKELANEWIDTH));
789 }
790 // check if add sidewalk
792 addSidewalk(newOppositeEdge, edgeType->getAttribute(SUMO_ATTR_SIDEWALKWIDTH));
793 }
794 } else {
796 }
797 }
798 // edge created, then unmark as create edge source
800 // end undo list
803 } else {
804 std::cout << "edge created without an open CommandGroup" << std::endl;
805 }
806 // if we're creating edges in chain mode, mark junction as junction edge source
807 if (chainEdge) {
808 myJunctionSource = junction;
810 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
811 } else {
812 myJunctionSource = nullptr;
813 }
814 } else {
815 myViewNet->setStatusBarText(TL("An edge with the same geometry already exists!"));
816 }
817 } else {
818 myViewNet->setStatusBarText(TL("Start- and endpoint for an edge must be distinct!"));
819 }
820 update();
821 }
822 }
823}
824
825
826void
828 // if myCreateEdgeSource exist, unmark ist as create edge source
829 if (myJunctionSource != nullptr) {
830 // remove current created edge source
832 myJunctionSource = nullptr;
833 }
834}
835
836
837const GNEJunction*
841
842
843void
845 // refresh template selector
847 // show frame
849}
850
851
852void
854 // hide frame
856}
857
858
863
864
869
870
875
876
881
882
883void
888
889
890void
892 // iterate over lanes
893 for (const auto& lane : edge->getChildLanes()) {
894 // avoid sidewalks
895 if (lane->getAttribute(SUMO_ATTR_ALLOW) != "pedestrian") {
896 // extract disallow list
897 std::vector<std::string> disallowList = GNEAttributeCarrier::parse<std::vector<std::string> >(lane->getAttribute(SUMO_ATTR_DISALLOW));
898 // check if append pedestrian to disallow
899 if (std::find(disallowList.begin(), disallowList.end(), "pedestrian") == disallowList.end()) {
900 disallowList.push_back("pedestrian");
901 }
902 // update attribute
903 lane->setAttribute(SUMO_ATTR_DISALLOW, toString(disallowList), myViewNet->getUndoList());
904 }
905 }
906}
907
908
909void
910GNECreateEdgeFrame::addBikelane(GNEEdge* edge, const std::string& bikelaneWidth) const {
911 bool bikelaneFound = false;
912 // iterate over lanes
913 for (const auto& lane : edge->getChildLanes()) {
914 // check if there is already a SideWalk
915 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "bicycle") {
916 bikelaneFound = true;
917 }
918 }
919 // only add if previously there is no bikelanes
920 if (!bikelaneFound) {
921 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_BICYCLE, false);
922 // set width
923 if (bikelaneWidth != "default") {
924 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, bikelaneWidth, myViewNet->getUndoList());
925 }
926 }
927}
928
929
930void
931GNECreateEdgeFrame::addSidewalk(GNEEdge* edge, const std::string& sidewalkWidth) const {
932 bool sidewalkFound = false;
933 // iterate over lanes
934 for (const auto& lane : edge->getChildLanes()) {
935 // check if there is already a SideWalk
936 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "pedestrian") {
937 sidewalkFound = true;
938 }
939 }
940 // only add if previously there is no Sidewalk
941 if (!sidewalkFound) {
942 edge->getNet()->getViewNet()->addRestrictedLane(edge->getChildLanes().at(0), SVC_PEDESTRIAN, false);
943 // set width
944 if (sidewalkWidth != "default") {
945 edge->getChildLanes().at(0)->setAttribute(SUMO_ATTR_WIDTH, sidewalkWidth, myViewNet->getUndoList());
946 }
947 }
948}
949
950/****************************************************************************/
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:49
const std::string getID() const override
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
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.
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 showDefaultShortEdgeCheckBox(const bool value)
check if show default short edge checkbox (only in JuPedSim view)
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:1068
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:773
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition GNEEdge.cpp:1045
std::string getAttribute(SumoXMLAttr key) const override
Definition GNEEdge.cpp:1122
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
GNEGroupBoxModule (based on FXGroupBox)
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)
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
GNEEdgeType * getDefaultEdgeType() const
get default edge type
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::ACTemplate * getACTemplates() const
get all attribute carriers templates used in this net
Definition GNENet.cpp:180
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:174
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:304
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
Definition GNENet.cpp:285
GNEViewNet * getViewNet() const
get view net (used for simplify code)
Definition GNENet.cpp:144
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.
const std::string & getID() const
Definition NBEdge.h:1551
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37