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-2023 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#include <config.h>
21
23#include <netedit/GNENet.h>
24#include <netedit/GNEUndoList.h>
25#include <netedit/GNEViewNet.h>
37
38
39#include "GNECreateEdgeFrame.h"
40
41// ===========================================================================
42// FOX callback mapping
43// ===========================================================================
44
53
59
60// Object implementation
61FXIMPLEMENT(GNECreateEdgeFrame::EdgeTypeSelector, MFXGroupBoxModule, EdgeTypeSelectorMap, ARRAYNUMBER(EdgeTypeSelectorMap))
62FXIMPLEMENT(GNECreateEdgeFrame::LaneTypeSelector, MFXGroupBoxModule, LaneTypeSelectorMap, ARRAYNUMBER(LaneTypeSelectorMap))
63
64
65// ===========================================================================
66// method definitions
67// ===========================================================================
68
69// ---------------------------------------------------------------------------
70// GNECreateEdgeFrame::EdgeTypeSelector - methods
71// ---------------------------------------------------------------------------
72
74 MFXGroupBoxModule(createEdgeFrameParent, TL("Template selector")),
75 myCreateEdgeFrameParent(createEdgeFrameParent),
76 myDefaultEdgeType(new GNEEdgeType(createEdgeFrameParent)),
77 myCurrentIndex(0) {
78 // default edge radio button
79 myUseDefaultEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Create default edge"),
81 // checkboxes
82 myNoPedestriansCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Disallow for pedestrians"),
84 myAddSidewalkCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Add sidewalk"),
86 // use custom edge radio button
87 myUseCustomEdgeType = new FXRadioButton(getCollapsableFrame(), TL("Use edgeType/template"),
89 // edge types combo box
90 myEdgeTypesComboBox = new FXComboBox(getCollapsableFrame(), GUIDesignComboBoxNCol,
92 // create horizontal frame
93 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
94 // create new edge type button
95 myAddEdgeTypeButton = new FXButton(horizontalFrameButtons, (TL("Add") + std::string("\t\t") + TL("Add edge type")).c_str(), GUIIconSubSys::getIcon(GUIIcon::ADD),
97 // create delete edge type button
98 myDeleteEdgeTypeButton = new FXButton(horizontalFrameButtons, (TL("Delete") + std::string("\t\t") + TL("Delete edge type")).c_str(), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
100 // create delete edge type button
101 myCreateFromTemplate = new FXButton(getCollapsableFrame(), (TL("Create from template") + std::string("\t\t") + TL("Create edgeType from template")).c_str(), GUIIconSubSys::getIcon(GUIIcon::EDGE),
103 // by default, create custom edge
104 myUseDefaultEdgeType->setCheck(TRUE);
105 // check if enable disable pedestrians
106 for (const auto& junction : createEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getJunctions()) {
107 if (junction.second->getNBNode()->getCrossings().size() > 0) {
108 enableCheckBoxDisablePedestrians();
109 }
110 }
111}
112
113
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 // set default edgeType
128 if (myUseDefaultEdgeType->getCheck()) {
129 // enable check boxes
130 myAddSidewalkCheckButton->enable();
131 myNoPedestriansCheckButton->enable();
132 // disable create from template
133 myCreateFromTemplate->disable();
134 // disable comboBox
135 myEdgeTypesComboBox->disable();
136 // disable buttons
137 myAddEdgeTypeButton->disable();
138 myDeleteEdgeTypeButton->disable();
139 // show default edgeType attributes
140 myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(myDefaultEdgeType, {SUMO_ATTR_ID});
141 // show lane attributes
142 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
143 } else if (myUseCustomEdgeType->getCheck()) {
144 // disable check boxes
145 myAddSidewalkCheckButton->disable();
146 myNoPedestriansCheckButton->disable();
147 // enable buttons
148 myAddEdgeTypeButton->enable();
149 myDeleteEdgeTypeButton->enable();
150 // check conditions
151 if (myEdgeTypesComboBox->getNumItems() == 0) {
152 // disable comboBox and edgeType
153 myEdgeTypesComboBox->disable();
154 myDeleteEdgeTypeButton->disable();
155 // hide attributes creators
156 myCreateEdgeFrameParent->myEdgeTypeAttributes->hideAttributesCreatorModule();
157 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
158 } else if (templateEditor->getEdgeTemplate() && (index == 0)) {
159 // enable create from template
160 myCreateFromTemplate->enable();
161 // enable comboBox
162 myEdgeTypesComboBox->enable();
163 // disable delete edge type button (because templates cannot be deleted)
164 myDeleteEdgeTypeButton->disable();
165 // show edgeType attributes and disable
166 myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(templateEditor->getEdgeTemplate(), {SUMO_ATTR_ID});
167 myCreateEdgeFrameParent->myEdgeTypeAttributes->disableAttributesCreator();
168 // show lane attributes (will be automatic disabled)
169 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
170 } else {
171 // disable create from template
172 myCreateFromTemplate->disable();
173 // enable comboBox
174 myEdgeTypesComboBox->enable();
175 // get edgeType
176 myEdgeTypeSelected = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text(), false);
177 // check if exist
178 if (myEdgeTypeSelected) {
179 // show edgeType attributes
180 myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(myEdgeTypeSelected, {});
181 // show lane attributes
182 myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
183 } else {
184 // hide edgeType attributes
185 myCreateEdgeFrameParent->myEdgeTypeAttributes->hideAttributesCreatorModule();
186 // hide lane attributes
187 myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
188 // set comboBox text
189 myEdgeTypesComboBox->setTextColor(FXRGB(255, 0, 0));
190 }
191 }
192 }
193 // recalc
194 recalc();
195}
196
197
198void
199GNECreateEdgeFrame::EdgeTypeSelector::updateIDinComboBox(const std::string& oldID, const std::string& newID) {
200 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
201 if (myEdgeTypesComboBox->getItem(i).text() == oldID) {
202 myEdgeTypesComboBox->setItemText(i, newID.c_str());
203 }
204 }
205}
206
207
208bool
210 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
211 if ((myUseCustomEdgeType->getCheck() == TRUE) && (myEdgeTypesComboBox->getCurrentItem() == 0)) {
212 return true;
213 } else {
214 return false;
215 }
216 } else {
217 return false;
218 }
219}
220
221
222bool
224 return (myUseDefaultEdgeType->getCheck() == TRUE);
225}
226
227
228void
230 myNoPedestriansCheckButton->setCheck(TRUE);
231}
232
233
236 return myDefaultEdgeType;
237}
238
239
242 if (myUseDefaultEdgeType->getCheck() == TRUE) {
243 return myDefaultEdgeType;
244 } else {
245 return myEdgeTypeSelected;
246 }
247}
248
249
250bool
252 return (myNoPedestriansCheckButton->getCheck() == TRUE);
253}
254
255
256bool
258 return (myAddSidewalkCheckButton->getCheck() == TRUE);
259}
260
261
262void
264 myEdgeTypeSelected = nullptr;
265 myCurrentIndex--;
266 if (myCurrentIndex < 0) {
267 myCurrentIndex = 0;
268 }
269}
270
271
272void
274 for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
275 if (myEdgeTypesComboBox->getItem(i).text() == edgeType->getID()) {
276 // set current item and index
277 myEdgeTypesComboBox->setCurrentItem(i);
278 myCurrentIndex = i;
279 // set buttons
280 myUseDefaultEdgeType->setCheck(FALSE);
281 myUseCustomEdgeType->setCheck(TRUE);
282 // refresh
283 refreshEdgeTypeSelector();
284 }
285 }
286}
287
288
289void
291 myUseDefaultEdgeType->setCheck(FALSE);
292 myUseCustomEdgeType->setCheck(TRUE);
293 refreshEdgeTypeSelector();
294}
295
296
297long
299 // check what object was pressed
300 if (obj == myUseDefaultEdgeType) {
301 // update radio buttons
302 myUseDefaultEdgeType->setCheck(TRUE);
303 myUseCustomEdgeType->setCheck(FALSE);
304 } else {
305 // update radio buttons
306 myUseDefaultEdgeType->setCheck(FALSE);
307 myUseCustomEdgeType->setCheck(TRUE);
308 }
309 // refresh template selector
310 refreshEdgeTypeSelector();
311 return 0;
312}
313
314
315long
317 // create new edge type
318 GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
319 // add it using undoList
320 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge type"));
321 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
322 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
323 // update myEdgeTypeSelected
324 myEdgeTypeSelected = edgeType;
325 // select last item
326 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
327 // refresh EdgeTypeSelector
328 refreshEdgeTypeSelector();
329 return 0;
330}
331
332
333long
335 // first check if we have to reset myEdgeTypeSelected
336 if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
337 myEdgeTypeSelected = nullptr;
338 }
339 // get edgeType to remove
340 GNEEdgeType* edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text());
341 // remove it using undoList
342 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::EDGE, TL("delete edge type"));
343 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
344 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
345 // refresh EdgeTypeSelector
346 refreshEdgeTypeSelector();
347 return 0;
348}
349
350
351long
353 // update current index
354 myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
355 // refresh edgeType selector
356 refreshEdgeTypeSelector();
357 return 0;
358}
359
360
361long
363 if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
364 // create new edge type
365 GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
366 // copy all template values
367 edgeType->copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
368 // add it using undoList
369 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge type"));
370 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
371 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
372 // update myEdgeTypeSelected
373 myEdgeTypeSelected = edgeType;
374 // select last item
375 myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
376 // refresh EdgeTypeSelector
377 refreshEdgeTypeSelector();
378 }
379 return 0;
380}
381
382
383long
385 if (myAddSidewalkCheckButton->getCheck() == TRUE) {
386 myNoPedestriansCheckButton->setCheck(TRUE);
387 myNoPedestriansCheckButton->disable();
388 } else {
389 myNoPedestriansCheckButton->enable();
390 }
391 return 1;
392}
393
394
395void
397 // get template editor
398 const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
399 // get edge types
400 const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
401 // clear edge types
402 myEdgeTypesComboBox->clearItems();
403 // set comboBox text color
404 myEdgeTypesComboBox->setTextColor(FXRGB(0, 0, 0));
405 // add template
406 if (templateEditor->getEdgeTemplate()) {
407 myEdgeTypesComboBox->appendItem((TL("template: ") + templateEditor->getEdgeTemplate()->getID()).c_str(), nullptr);
408 }
409 // add edge types
410 for (const auto& edgeType : edgeTypes) {
411 myEdgeTypesComboBox->appendItem(edgeType.second->getID().c_str(), nullptr);
412 }
413 // set num visible antes
414 if (myEdgeTypesComboBox->getNumItems() <= 10) {
415 myEdgeTypesComboBox->setNumVisible(myEdgeTypesComboBox->getNumItems());
416 } else {
417 myEdgeTypesComboBox->setNumVisible(10);
418 }
419 // set current item
420 if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
421 myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
422 }
423 myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
424}
425
426// ---------------------------------------------------------------------------
427// GNECreateEdgeFrame::LaneTypeSelector - methods
428// ---------------------------------------------------------------------------
429
431 MFXGroupBoxModule(createEdgeFrameParent, TL("LaneType selector")),
432 myCreateEdgeFrameParent(createEdgeFrameParent),
433 myLaneIndex(0) {
434 // lane types combo box
436 // create horizontal frame
437 FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
438 // create new lane type button
439 myAddLaneTypeButton = new FXButton(horizontalFrameButtons, (TL("Add") + std::string("\t\t") + TL("Add lane type")).c_str(), GUIIconSubSys::getIcon(GUIIcon::ADD),
441 // create delete lane type button
442 myDeleteLaneTypeButton = new FXButton(horizontalFrameButtons, (TL("Delete") + std::string("\t\t") + TL("Delete lane type")).c_str(), GUIIconSubSys::getIcon(GUIIcon::REMOVE),
444}
445
446
449
450
451void
453 // start at first lane
454 myLaneIndex = 0;
455 // refresh laneTypeSelector
456 refreshLaneTypeSelector();
457 // show
458 show();
459}
460
461
462void
464 // hide attributes creator module
465 myCreateEdgeFrameParent->myLaneTypeAttributes->hideAttributesCreatorModule();
466 // hide
467 hide();
468}
469
470
471void
473 // clear lane types
474 myLaneTypesComboBox->clearItems();
475 // first check if use template
476 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
477 const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
478 // fill comboBox
479 for (const auto& laneTemplate : edgeTemplate->getLaneTemplates()) {
480 myLaneTypesComboBox->appendItem(laneTemplate->getAttribute(SUMO_ATTR_ID).c_str(), nullptr);
481 }
482 // update comboBox
483 updateComboBox();
484 // show laneTypeAttributes
485 myCreateEdgeFrameParent->myLaneTypeAttributes->showAttributesCreatorModule(edgeTemplate->getLaneTemplates().at(myLaneIndex), {SUMO_ATTR_ID});
486 // disable laneAttributes (because is a template)
487 myCreateEdgeFrameParent->myLaneTypeAttributes->disableAttributesCreator();
488 // disable add and remove buttons
489 myAddLaneTypeButton->disable();
490 myDeleteLaneTypeButton->disable();
491 } else {
492 // get edgeType
493 const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
494 // fill comboBox
495 for (const auto& laneType : edgeType->getLaneTypes()) {
496 myLaneTypesComboBox->appendItem(laneType->getAttribute(SUMO_ATTR_ID).c_str(), nullptr);
497 }
498 // update comboBox
499 updateComboBox();
500 // show laneTypeAttributes
501 myCreateEdgeFrameParent->myLaneTypeAttributes->showAttributesCreatorModule(edgeType->getLaneTypes().at(myLaneIndex), {});
502 // enable add and remove buttons
503 myAddLaneTypeButton->enable();
504 // check if enable or disable remove lane button
505 if (edgeType->getLaneTypes().size() > 1) {
506 myDeleteLaneTypeButton->enable();
507 } else {
508 myDeleteLaneTypeButton->disable();
509 }
510 }
511 // recalc
512 recalc();
513}
514
515
516long
518 // check what edgeType is being edited
519 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType()) {
520 // add new lane in default edge type
521 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->addLaneType(new GNELaneType(myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()));
522 // refresh laneTypeSelector
523 refreshLaneTypeSelector();
524 // set combo box
525 myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
526 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
527 // get selected
528 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
529 if (edgeType) {
530 // create new edgeType
531 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
532 // create laneTypes
533 for (const auto& laneType : edgeType->getLaneTypes()) {
534 newEdgeType->addLaneType(new GNELaneType(newEdgeType, laneType));
535 }
536 // add new lane
537 newEdgeType->addLaneType(new GNELaneType(newEdgeType));
538 // remove old edgeTyp und and newEdgeType
539 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANE, TL("add laneType"));
540 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
541 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
542 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
543 // update index
544 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
545 // set current edgeType in selector
546 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
547 }
548 }
549 return 0;
550}
551
552
553long
555 // check what edgeType is being edited
556 if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType()) {
557 // add new lane in default edge type
558 myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->removeLaneType(myLaneIndex);
559 // refresh laneTypeSelector
560 refreshLaneTypeSelector();
561 // set combo box
562 myLaneTypesComboBox->setCurrentItem(0);
563 } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
564 // get selected
565 const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
566 if (edgeType) {
567 // create new edgeType
568 GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
569 // create laneTypes (except current)
570 for (int i = 0; i < (int)edgeType->getLaneTypes().size(); i++) {
571 if (i != myLaneIndex) {
572 newEdgeType->addLaneType(new GNELaneType(newEdgeType, edgeType->getLaneTypes().at(i)));
573 }
574 }
575 // remove old edgeTyp und and newEdgeType
576 myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANE, TL("remove laneType"));
577 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
578 myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
579 myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
580 // update index
581 myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
582 // set current edgeType in selector
583 myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
584 }
585 }
586 return 0;
587}
588
589
590long
592 // update index
593 myLaneIndex = myLaneTypesComboBox->getCurrentItem();
594 // refresh laneType selector
595 refreshLaneTypeSelector();
596 return 0;
597}
598
599
600void
602 // check lane index
603 if (myLaneIndex > myLaneTypesComboBox->getNumItems()) {
604 myLaneIndex = 0;
605 }
606 // set current item
607 myLaneTypesComboBox->setCurrentItem(myLaneIndex);
608 // set num visible items
609 if (myLaneTypesComboBox->getNumItems() <= 10) {
610 myLaneTypesComboBox->setNumVisible(myLaneTypesComboBox->getNumItems());
611 } else {
612 myLaneTypesComboBox->setNumVisible(10);
613 }
614}
615
616// ---------------------------------------------------------------------------
617// GNECreateEdgeFrame::Legend - methods
618// ---------------------------------------------------------------------------
619
621 MFXGroupBoxModule(createEdgeFrameParent, TL("Information")) {
622 std::ostringstream information;
623 // add label for shift+click
624 information
625 << "- " << TL("ESC:") << "\n"
626 << " " << TL("Deselect origin") << "\n"
627 << "- " << TL("Control+Click:") << "\n"
628 << " " << TL("Move view") << "\n"
629 << "- " << TL("Shift+Click:") << "\n"
630 << " " << TL("Splits edge in both directions") << "\n"
631 << "- " << TL("Alt+Shift+Click:") << "\n"
632 << " " << TL("Splits edge in one direction");
633 // create label
634 new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
635}
636
637
639
640// ---------------------------------------------------------------------------
641// GNECreateEdgeFrame - methods
642// ---------------------------------------------------------------------------
643
645 GNEFrame(viewParent, viewNet, TL("Create Edge")),
647 myCreateEdgeSource(nullptr) {
648 // create custom edge selector
650 // Create edgeType parameters
652 // lane type selector
654 // Create laneType parameters
656 // create edge selector legend
657 myLegend = new Legend(this);
658}
659
660
662
663
664void
666 const bool oppositeEdge, const bool chainEdge) {
667 // first check if there is an edge template, an edge type (default or custom)
669 WRITE_WARNING(TL("Select either default edgeType or a custom edgeType or template"));
670 } else if (!myEdgeTypeAttributes->areValuesValid()) {
671 WRITE_WARNING(TL("Invalid edge attributes"));
672 } else if (!myLaneTypeAttributes->areValuesValid()) {
673 WRITE_WARNING(TL("Invalid lane attributes"));
674 } else {
675 // obtain junction depending of gridEnabled
676 GNEJunction* junction = nullptr;
677 if (objectsUnderCursor.getJunctionFront()) {
678 junction = objectsUnderCursor.getJunctionFront();
681 }
682 // begin undo list
684 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
685 }
686 // if we didn't clicked over another junction, then create a new
687 if (junction == nullptr) {
688 junction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition), myViewNet->getUndoList());
689 }
690 // now check if we have to create a new edge
691 if (myCreateEdgeSource == nullptr) {
692 myCreateEdgeSource = junction;
694 update();
695 } else {
696 // make sure that junctions source and destiny are different
697 if (myCreateEdgeSource != junction) {
698 // may fail to prevent double edges
699 GNEEdge* newEdge = myViewNet->getNet()->createEdge(myCreateEdgeSource, junction, nullptr, myViewNet->getUndoList());
700 // check if edge was successfully created
701 if (newEdge) {
702 // set parameters
707 // check pedestrians and sidewalks
709 disablePedestrians(newEdge);
710 }
712 addSidewalk(newEdge);
713 }
714 } else {
716 }
717 // create another edge, if create opposite edge is enabled
718 if (oppositeEdge && (myViewNet->getNet()->getAttributeCarriers()->retrieveEdges(junction, myCreateEdgeSource).size() == 0)) {
719 GNEEdge* newOppositeEdge = myViewNet->getNet()->createEdge(junction, myCreateEdgeSource, nullptr,
720 myViewNet->getUndoList(), "-" + newEdge->getNBEdge()->getID());
721 // set parameters
726 // check pedestrians and sidewalks
728 disablePedestrians(newOppositeEdge);
729 }
731 addSidewalk(newOppositeEdge);
732 }
733 } else {
735 }
736 }
737 // edge created, then unmark as create edge source
739 // end undo list
742 } else {
743 std::cout << "edge created without an open CommandGroup" << std::endl;
744 }
745 // if we're creating edges in chain mode, mark junction as junction edge source
746 if (chainEdge) {
747 myCreateEdgeSource = junction;
749 myViewNet->getUndoList()->begin(GUIIcon::EDGE, TL("create new edge"));
750 } else {
751 myCreateEdgeSource = nullptr;
752 }
753 } else {
754 myViewNet->setStatusBarText(TL("An edge with the same geometry already exists!"));
755 }
756 } else {
757 myViewNet->setStatusBarText(TL("Start- and endpoint for an edge must be distinct!"));
758 }
759 update();
760 }
761 }
762}
763
764
765void
767 // if myCreateEdgeSource exist, unmark ist as create edge source
768 if (myCreateEdgeSource != nullptr) {
769 // remove current created edge source
771 myCreateEdgeSource = nullptr;
772 }
773}
774
775
776const GNEJunction*
780
781
782void
783GNECreateEdgeFrame::updateObjectsUnderSnappedCursor(const std::vector<GUIGlObject*>& GUIGlObjects) {
785}
786
787
788void
790 // refresh template selector
792 // show frame
794}
795
796
797void
799 // hide frame
801}
802
803
808
809
814
815
820
821
826
827
828void
833
834
835void
837 // iterate over lanes
838 for (const auto& lane : edge->getLanes()) {
839 // avoid sidewalks
840 if (lane->getAttribute(SUMO_ATTR_ALLOW) != "pedestrian") {
841 // extract disallow list
842 std::vector<std::string> disallowList = GNEAttributeCarrier::parse<std::vector<std::string> >(lane->getAttribute(SUMO_ATTR_DISALLOW));
843 // check if append pedestrian to disallow
844 if (std::find(disallowList.begin(), disallowList.end(), "pedestrian") == disallowList.end()) {
845 disallowList.push_back("pedestrian");
846 }
847 // update attribute
848 lane->setAttribute(SUMO_ATTR_DISALLOW, toString(disallowList), myViewNet->getUndoList());
849 }
850 }
851}
852
853
854void
856 bool sidewalkFound = false;
857 // iterate over lanes
858 for (const auto& lane : edge->getLanes()) {
859 // check if there is already a SideWalk
860 if (lane->getAttribute(SUMO_ATTR_ALLOW) == "pedestrian") {
861 sidewalkFound = true;
862 }
863 }
864 // only add if previously there is no Sidewalk
865 if (!sidewalkFound) {
866 // update num lanes
868 // set last lane allow attribute
869 edge->getLanes().front()->setAttribute(SUMO_ATTR_ALLOW, "pedestrian", myViewNet->getUndoList());
870 // set width
871 edge->getLanes().front()->setAttribute(SUMO_ATTR_WIDTH, toString(OptionsCont::getOptions().getFloat("default.sidewalk-width")), myViewNet->getUndoList());
872 }
873}
874
875/****************************************************************************/
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:74
#define GUIDesignComboBoxAttribute
Combo box static (cannot be edited) extended over the matrix column.
Definition GUIDesigns.h:297
#define GUIDesignComboBoxNCol
number of column of every combo box
Definition GUIDesigns.h:306
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:394
#define GUIDesignCheckButton
checkButton placed in left position
Definition GUIDesigns.h:187
#define GUIDesignRadioButton
Definition GUIDesigns.h:224
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition GUIDesigns.h:274
#define WRITE_WARNING(msg)
Definition MsgHandler.h:270
#define TL(string)
Definition MsgHandler.h:287
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_NUMLANES
@ 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 areValuesValid() const
check if parameters of 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
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 onUpdAddSideWalk(FXObject *, FXSelector, void *)
Called when add sidewalk check buton is updated.
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
FXComboBox * 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
void processClick(const Position &clickedPosition, const GNEViewNetHelper::ObjectsUnderCursor &objectsUnderCursor, const bool oppositeEdge, const bool chainEdge)
handle processClick and set the relative colouring
EdgeTypeSelector * getEdgeTypeSelector() const
get edgeType selector
void abortEdgeCreation()
abort current edge creation
void show()
show create edge frame
GNECreateEdgeFrame::LaneTypeSelector * myLaneTypeSelector
lane type selector
GNEAttributesCreator * getLaneTypeAttributes() const
get laneType attributes
void updateObjectsUnderSnappedCursor(const std::vector< GUIGlObject * > &GUIGlObjects)
update objects under snapped cursor
GNEAttributesCreator * myEdgeTypeAttributes
internal edgeType attributes
GNEAttributesCreator * getEdgeTypeAttributes() const
get edgeType attributes
const GNEJunction * getJunctionSource() const
get junction source for new edge
GNEAttributesCreator * myLaneTypeAttributes
internal laneType attributes
void disablePedestrians(GNEEdge *edge) const
disable pedestrians in the given edge (within undoRedo)
GNECreateEdgeFrame::Legend * myLegend
Legend.
GNEJunction * myCreateEdgeSource
source junction for new edge
GNEViewNetHelper::ObjectsUnderCursor myObjectsUnderSnappedCursor
objects under snapped cursor
GNECreateEdgeFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
void hide()
hide create edge frame
void addSidewalk(GNEEdge *edge) const
disable pedestrians in the given edge (within undoRedo)
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:785
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition GNEEdge.cpp:480
const std::vector< GNELane * > & getLanes() const
returns a reference to the lane vector
Definition GNEEdge.cpp:840
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition GNEEdge.cpp:750
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
Definition GNEEdge.cpp:958
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 * myViewNet
FOX need this.
Definition GNEFrame.h:117
virtual void show()
show Frame
Definition GNEFrame.cpp:115
virtual void hide()
hide Frame
Definition GNEFrame.cpp:124
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:120
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:228
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
Definition GNENet.cpp:212
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
void updateObjectUnderCursor(const std::vector< GUIGlObject * > &GUIGlObjects)
update objects under cursor (Called only in onLeftBtnPress(...) function)
GNEJunction * getJunctionFront() const
get front junction or a pointer to nullptr
GNENet * getNet() const
get the net object
GNEViewParent * getViewParent() const
get the net object
GNEUndoList * getUndoList() const
get the undoList object
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 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.
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:1515
static OptionsCont & getOptions()
Retrieves the options.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37