Eclipse SUMO - Simulation of Urban MObility
GNECreateEdgeFrame.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2022 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 
22 #include <netbuild/NBNetBuilder.h>
23 #include <netedit/GNENet.h>
24 #include <netedit/GNEUndoList.h>
25 #include <netedit/GNEViewNet.h>
26 #include <netedit/GNEViewParent.h>
34 #include <netimport/NITypeLoader.h>
39 
40 
41 #include "GNECreateEdgeFrame.h"
42 
43 // ===========================================================================
44 // FOX callback mapping
45 // ===========================================================================
46 
53 };
54 
59 };
60 
61 // Object implementation
62 FXIMPLEMENT(GNECreateEdgeFrame::EdgeTypeSelector, FXGroupBoxModule, EdgeTypeSelectorMap, ARRAYNUMBER(EdgeTypeSelectorMap))
63 FXIMPLEMENT(GNECreateEdgeFrame::LaneTypeSelector, FXGroupBoxModule, LaneTypeSelectorMap, ARRAYNUMBER(LaneTypeSelectorMap))
64 
65 
66 // ===========================================================================
67 // method definitions
68 // ===========================================================================
69 
70 // ---------------------------------------------------------------------------
71 // GNECreateEdgeFrame::EdgeTypeSelector - methods
72 // ---------------------------------------------------------------------------
73 
75  FXGroupBoxModule(createEdgeFrameParent->myContentFrame, "Template selector"),
76  myCreateEdgeFrameParent(createEdgeFrameParent),
77  myDefaultEdgeType(new GNEEdgeType(createEdgeFrameParent)),
78  myCurrentIndex(0) {
79  // default edge radio button
80  myUseDefaultEdgeType = new FXRadioButton(getCollapsableFrame(), "Create default edge", this, MID_GNE_CREATEEDGEFRAME_SELECTRADIOBUTTON, GUIDesignRadioButton);
81  // use custom edge radio button
82  myUseCustomEdgeType = new FXRadioButton(getCollapsableFrame(), "Use edgeType/template", this, MID_GNE_CREATEEDGEFRAME_SELECTRADIOBUTTON, GUIDesignRadioButton);
83  // edge types combo box
84  myEdgeTypesComboBox = new FXComboBox(getCollapsableFrame(), GUIDesignComboBoxNCol, this, MID_GNE_CREATEEDGEFRAME_SELECT, GUIDesignComboBoxAttribute);
85  // create horizontal frame
86  FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
87  // create new edge type button
88  myAddEdgeTypeButton = new FXButton(horizontalFrameButtons, "Add\t\tAdd edge type", GUIIconSubSys::getIcon(GUIIcon::ADD),
90  // create delete edge type button
91  myDeleteEdgeTypeButton = new FXButton(horizontalFrameButtons, "Delete\t\tDelete edge type", GUIIconSubSys::getIcon(GUIIcon::REMOVE),
93 
94  // create delete edge type button
95  myCreateFromTemplate = new FXButton(getCollapsableFrame(), "Create from template\t\tCreate edgeType from template", GUIIconSubSys::getIcon(GUIIcon::EDGE),
97  // by default, create custom edge
98  myUseDefaultEdgeType->setCheck(TRUE);
99 }
100 
101 
103  delete myDefaultEdgeType;
104 }
105 
106 
107 void
109  // get template editor
110  const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
111  // get current item
112  const int index = myEdgeTypesComboBox->getCurrentItem();
113  // fill combo box
114  fillComboBox();
115  // set default edgeType
116  if (myUseDefaultEdgeType->getCheck()) {
117  // disable create from template
118  myCreateFromTemplate->disable();
119  // disable comboBox
120  myEdgeTypesComboBox->disable();
121  // disable buttons
122  myAddEdgeTypeButton->disable();
123  myDeleteEdgeTypeButton->disable();
124  // show default edgeType attributes
125  myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(myDefaultEdgeType, {SUMO_ATTR_ID});
126  // show lane attributes
127  myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
128  } else if (myUseCustomEdgeType->getCheck()) {
129  // enable buttons
130  myAddEdgeTypeButton->enable();
131  myDeleteEdgeTypeButton->enable();
132  // check conditions
133  if (myEdgeTypesComboBox->getNumItems() == 0) {
134  // disable comboBox and edgeType
135  myEdgeTypesComboBox->disable();
136  myDeleteEdgeTypeButton->disable();
137  // hide attributes creators
138  myCreateEdgeFrameParent->myEdgeTypeAttributes->hideAttributesCreatorModule();
139  myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
140  } else if (templateEditor->getEdgeTemplate() && (index == 0)) {
141  // enable create from template
142  myCreateFromTemplate->enable();
143  // enable comboBox
144  myEdgeTypesComboBox->enable();
145  // disable delete edge type button (because templates cannot be deleted)
146  myDeleteEdgeTypeButton->disable();
147  // show edgeType attributes and disable
148  myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(templateEditor->getEdgeTemplate(), {SUMO_ATTR_ID});
149  myCreateEdgeFrameParent->myEdgeTypeAttributes->disableAttributesCreator();
150  // show lane attributes (will be automatic disabled)
151  myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
152  } else {
153  // disable create from template
154  myCreateFromTemplate->disable();
155  // enable comboBox
156  myEdgeTypesComboBox->enable();
157  // get edgeType
158  myEdgeTypeSelected = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text(), false);
159  // check if exist
160  if (myEdgeTypeSelected) {
161  // show edgeType attributes
162  myCreateEdgeFrameParent->myEdgeTypeAttributes->showAttributesCreatorModule(myEdgeTypeSelected, {});
163  // show lane attributes
164  myCreateEdgeFrameParent->myLaneTypeSelector->showLaneTypeSelector();
165  } else {
166  // hide edgeType attributes
167  myCreateEdgeFrameParent->myEdgeTypeAttributes->hideAttributesCreatorModule();
168  // hide lane attributes
169  myCreateEdgeFrameParent->myLaneTypeSelector->hideLaneTypeSelector();
170  // set comboBox text
171  myEdgeTypesComboBox->setTextColor(FXRGB(255, 0, 0));
172  }
173  }
174  }
175  // recalc
176  recalc();
177 }
178 
179 
180 void
181 GNECreateEdgeFrame::EdgeTypeSelector::updateIDinComboBox(const std::string& oldID, const std::string& newID) {
182  for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
183  if (myEdgeTypesComboBox->getItem(i).text() == oldID) {
184  myEdgeTypesComboBox->setItemText(i, newID.c_str());
185  }
186  }
187 }
188 
189 
190 bool
192  if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
193  if ((myUseCustomEdgeType->getCheck() == TRUE) && (myEdgeTypesComboBox->getCurrentItem() == 0)) {
194  return true;
195  } else {
196  return false;
197  }
198  } else {
199  return false;
200  }
201 }
202 
203 
204 bool
206  return (myUseDefaultEdgeType->getCheck() == TRUE);
207 }
208 
209 
212  return myDefaultEdgeType;
213 }
214 
215 
218  if (myUseDefaultEdgeType->getCheck() == TRUE) {
219  return myDefaultEdgeType;
220  } else {
221  return myEdgeTypeSelected;
222  }
223 }
224 
225 
226 void
228  myEdgeTypeSelected = nullptr;
229  myCurrentIndex--;
230  if (myCurrentIndex < 0) {
231  myCurrentIndex = 0;
232  }
233 }
234 
235 
236 void
238  for (int i = 0; i < myEdgeTypesComboBox->getNumItems(); i++) {
239  if (myEdgeTypesComboBox->getItem(i).text() == edgeType->getID()) {
240  // set current item and index
241  myEdgeTypesComboBox->setCurrentItem(i);
242  myCurrentIndex = i;
243  // set buttons
244  myUseDefaultEdgeType->setCheck(FALSE);
245  myUseCustomEdgeType->setCheck(TRUE);
246  // refresh
247  refreshEdgeTypeSelector();
248  }
249  }
250 }
251 
252 
253 void
255  myUseDefaultEdgeType->setCheck(FALSE);
256  myUseCustomEdgeType->setCheck(TRUE);
257  refreshEdgeTypeSelector();
258 }
259 
260 
261 long
263  // check what object was pressed
264  if (obj == myUseDefaultEdgeType) {
265  // update radio buttons
266  myUseDefaultEdgeType->setCheck(TRUE);
267  myUseCustomEdgeType->setCheck(FALSE);
268  } else {
269  // update radio buttons
270  myUseDefaultEdgeType->setCheck(FALSE);
271  myUseCustomEdgeType->setCheck(TRUE);
272  }
273  // refresh template selector
274  refreshEdgeTypeSelector();
275  return 0;
276 }
277 
278 
279 long
281  // create new edge type
282  GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
283  // add it using undoList
284  myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::EDGE, "create new edge type");
285  myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
286  myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
287  // update myEdgeTypeSelected
288  myEdgeTypeSelected = edgeType;
289  // select last item
290  myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
291  // refresh EdgeTypeSelector
292  refreshEdgeTypeSelector();
293  return 0;
294 }
295 
296 
297 long
299  // first check if we have to reset myEdgeTypeSelected
300  if (myEdgeTypeSelected && (myEdgeTypeSelected->getID() == myEdgeTypesComboBox->getText().text())) {
301  myEdgeTypeSelected = nullptr;
302  }
303  // get edgeType to remove
304  GNEEdgeType* edgeType = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveEdgeType(myEdgeTypesComboBox->getText().text());
305  // remove it using undoList
306  myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::EDGE, "delete edge type");
307  myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
308  myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
309  // refresh EdgeTypeSelector
310  refreshEdgeTypeSelector();
311  return 0;
312 }
313 
314 
315 long
317  // update current index
318  myCurrentIndex = myEdgeTypesComboBox->getCurrentItem();
319  // refresh edgeType selector
320  refreshEdgeTypeSelector();
321  return 0;
322 }
323 
324 
325 long
327  if (myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate()) {
328  // create new edge type
329  GNEEdgeType* edgeType = new GNEEdgeType(myCreateEdgeFrameParent->getViewNet()->getNet());
330  // copy all template values
331  edgeType->copyTemplate(myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate());
332  // add it using undoList
333  myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::EDGE, "create new edge type");
334  myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
335  myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
336  // update myEdgeTypeSelected
337  myEdgeTypeSelected = edgeType;
338  // select last item
339  myCurrentIndex = (myEdgeTypesComboBox->getNumItems() - 1);
340  // refresh EdgeTypeSelector
341  refreshEdgeTypeSelector();
342  }
343  return 0;
344 }
345 
346 
347 void
349  // get template editor
350  const GNEInspectorFrame::TemplateEditor* templateEditor = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor();
351  // get edge types
352  const auto& edgeTypes = myCreateEdgeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdgeTypes();
353  // clear edge types
354  myEdgeTypesComboBox->clearItems();
355  // set comboBox text color
356  myEdgeTypesComboBox->setTextColor(FXRGB(0, 0, 0));
357  // add template
358  if (templateEditor->getEdgeTemplate()) {
359  myEdgeTypesComboBox->appendItem(("template: " + templateEditor->getEdgeTemplate()->getID()).c_str(), nullptr);
360  }
361  // add edge types
362  for (const auto& edgeType : edgeTypes) {
363  myEdgeTypesComboBox->appendItem(edgeType.second->getID().c_str(), nullptr);
364  }
365  // set num visible antes
366  if (myEdgeTypesComboBox->getNumItems() <= 10) {
367  myEdgeTypesComboBox->setNumVisible(myEdgeTypesComboBox->getNumItems());
368  } else {
369  myEdgeTypesComboBox->setNumVisible(10);
370  }
371  // set current item
372  if ((myCurrentIndex < 0) || (myCurrentIndex >= myEdgeTypesComboBox->getNumItems())) {
373  myCurrentIndex = myEdgeTypesComboBox->getNumItems() - 1;
374  }
375  myEdgeTypesComboBox->setCurrentItem(myCurrentIndex);
376 }
377 
378 // ---------------------------------------------------------------------------
379 // GNECreateEdgeFrame::LaneTypeSelector - methods
380 // ---------------------------------------------------------------------------
381 
383  FXGroupBoxModule(createEdgeFrameParent->myContentFrame, "LaneType selector"),
384  myCreateEdgeFrameParent(createEdgeFrameParent),
385  myLaneIndex(0) {
386  // lane types combo box
388  // create horizontal frame
389  FXHorizontalFrame* horizontalFrameButtons = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
390  // create new lane type button
391  myAddLaneTypeButton = new FXButton(horizontalFrameButtons, "Add\t\tAdd lane type", GUIIconSubSys::getIcon(GUIIcon::ADD),
393  // create delete lane type button
394  myDeleteLaneTypeButton = new FXButton(horizontalFrameButtons, "Delete\t\tDelete lane type", GUIIconSubSys::getIcon(GUIIcon::REMOVE),
396 }
397 
398 
400 }
401 
402 
403 void
405  // start at first lane
406  myLaneIndex = 0;
407  // refresh laneTypeSelector
408  refreshLaneTypeSelector();
409  // show
410  show();
411 }
412 
413 
414 void
416  // hide attributes creator modul
417  myCreateEdgeFrameParent->myLaneTypeAttributes->hideAttributesCreatorModule();
418  // hide
419  hide();
420 }
421 
422 
423 void
425  // clear lane types
426  myLaneTypesComboBox->clearItems();
427  // first check if use template
428  if (myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
429  const GNEEdgeTemplate* edgeTemplate = myCreateEdgeFrameParent->getViewNet()->getViewParent()->getInspectorFrame()->getTemplateEditor()->getEdgeTemplate();
430  // fill comboBox
431  for (const auto& laneTemplate : edgeTemplate->getLaneTemplates()) {
432  myLaneTypesComboBox->appendItem(laneTemplate->getAttribute(SUMO_ATTR_ID).c_str(), nullptr);
433  }
434  // update comboBox
435  updateComboBox();
436  // show laneTypeAttributes
437  myCreateEdgeFrameParent->myLaneTypeAttributes->showAttributesCreatorModule(edgeTemplate->getLaneTemplates().at(myLaneIndex), {SUMO_ATTR_ID});
438  // disable laneAttributes (because is a template)
439  myCreateEdgeFrameParent->myLaneTypeAttributes->disableAttributesCreator();
440  // disable add and remove buttons
441  myAddLaneTypeButton->disable();
442  myDeleteLaneTypeButton->disable();
443  } else {
444  // get edgeType
445  const GNEEdgeType* edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
446  // fill comboBox
447  for (const auto& laneType : edgeType->getLaneTypes()) {
448  myLaneTypesComboBox->appendItem(laneType->getAttribute(SUMO_ATTR_ID).c_str(), nullptr);
449  }
450  // update comboBox
451  updateComboBox();
452  // show laneTypeAttributes
453  myCreateEdgeFrameParent->myLaneTypeAttributes->showAttributesCreatorModule(edgeType->getLaneTypes().at(myLaneIndex), {});
454  // enable add and remove buttons
455  myAddLaneTypeButton->enable();
456  // check if enable or disable remove lane button
457  if (edgeType->getLaneTypes().size() > 1) {
458  myDeleteLaneTypeButton->enable();
459  } else {
460  myDeleteLaneTypeButton->disable();
461  }
462  }
463  // recalc
464  recalc();
465 }
466 
467 
468 long
470  // check what edgeType is being edited
471  if (myCreateEdgeFrameParent->myEdgeTypeSelector->useDefaultEdgeType()) {
472  // add new lane in default edge type
473  myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()->addLaneType(new GNELaneType(myCreateEdgeFrameParent->myEdgeTypeSelector->getDefaultEdgeType()));
474  // refresh laneTypeSelector
475  refreshLaneTypeSelector();
476  // set combo box
477  myLaneTypesComboBox->setCurrentItem(myLaneTypesComboBox->getNumItems() - 1);
478  } else if (!myCreateEdgeFrameParent->myEdgeTypeSelector->useEdgeTemplate()) {
479  // get selected
480  const auto edgeType = myCreateEdgeFrameParent->myEdgeTypeSelector->getEdgeTypeSelected();
481  if (edgeType) {
482  // create new edgeType
483  GNEEdgeType* newEdgeType = new GNEEdgeType(edgeType);
484  // create laneTypes
485  for (const auto& laneType : edgeType->getLaneTypes()) {
486  newEdgeType->addLaneType(new GNELaneType(newEdgeType, laneType));
487  }
488  // add new lane
489  newEdgeType->addLaneType(new GNELaneType(newEdgeType));
490  // remove old edgeTyp und and newEdgeType
491  myCreateEdgeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::LANE, "add laneType");
492  myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(edgeType, false), true);
493  myCreateEdgeFrameParent->getViewNet()->getUndoList()->add(new GNEChange_EdgeType(newEdgeType, true), true);
494  myCreateEdgeFrameParent->getViewNet()->getUndoList()->end();
495  // update index
496  myLaneIndex = myLaneTypesComboBox->getNumItems() - 1;
497  // set current edgeType in selector
498  myCreateEdgeFrameParent->myEdgeTypeSelector->setCurrentEdgeType(newEdgeType);
499  }
500  }
501  return 0;
502 }
503 
504 
505 long
507  return 0;
508 }
509 
510 
511 long
513  // update index
514  myLaneIndex = myLaneTypesComboBox->getCurrentItem();
515  // refresh laneType selector
516  refreshLaneTypeSelector();
517  return 0;
518 }
519 
520 
521 void
523  // check lane index
524  if (myLaneIndex > myLaneTypesComboBox->getNumItems()) {
525  myLaneIndex = 0;
526  }
527  // set current item
528  myLaneTypesComboBox->setCurrentItem(myLaneIndex);
529  // set num visible items
530  if (myLaneTypesComboBox->getNumItems() <= 10) {
531  myLaneTypesComboBox->setNumVisible(myLaneTypesComboBox->getNumItems());
532  } else {
533  myLaneTypesComboBox->setNumVisible(10);
534  }
535 }
536 
537 // ---------------------------------------------------------------------------
538 // GNECreateEdgeFrame::Legend - methods
539 // ---------------------------------------------------------------------------
540 
542  FXGroupBoxModule(createEdgeFrameParent->myContentFrame, "Information") {
543  // crate information
544  std::ostringstream information;
545  // add label for shift+click
546  information
547  << "- ESC:" << "\n"
548  << " Deselect origin" << "\n"
549  << "- Control+Click:" << "\n"
550  << " Move view" << "\n"
551  << "- Shift+Click:" << "\n"
552  << " Splits edge in both directions" << "\n"
553  << "- Alt+Shift+Click:" << "\n"
554  << " Splits edge in one direction";
555  // create label
556  new FXLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
557 }
558 
559 
561 
562 // ---------------------------------------------------------------------------
563 // GNECreateEdgeFrame - methods
564 // ---------------------------------------------------------------------------
565 
566 GNECreateEdgeFrame::GNECreateEdgeFrame(FXHorizontalFrame* horizontalFrameParent, GNEViewNet* viewNet) :
567  GNEFrame(horizontalFrameParent, viewNet, "Create Edge"),
569  myCreateEdgeSource(nullptr) {
570  // create custom edge selector
572  // Create edgeType parameters
574  // lane type selector
576  // Create laneType parameters
578  // create edge selector legend
579  myLegend = new Legend(this);
580 }
581 
582 
584 
585 
586 void
587 GNECreateEdgeFrame::processClick(const Position& clickedPosition, const GNEViewNetHelper::ObjectsUnderCursor& objectsUnderCursor,
588  const bool oppositeEdge, const bool chainEdge) {
589  // first check if there is an edge template, an edge type (default or custom)
591  WRITE_WARNING("Select either default edgeType or a custom edgeType or template");
592  } else {
593  // obtain junction depending of gridEnabled
594  GNEJunction* junction = nullptr;
595  if (objectsUnderCursor.getJunctionFront()) {
596  junction = objectsUnderCursor.getJunctionFront();
599  }
600  // begin undo list
603  }
604  // if we didn't clicked over another junction, then create a new
605  if (junction == nullptr) {
606  junction = myViewNet->getNet()->createJunction(myViewNet->snapToActiveGrid(clickedPosition), myViewNet->getUndoList());
607  }
608  // now check if we have to create a new edge
609  if (myCreateEdgeSource == nullptr) {
610  myCreateEdgeSource = junction;
612  update();
613  } else {
614  // make sure that junctions source and destiny are different
615  if (myCreateEdgeSource != junction) {
616  // may fail to prevent double edges
617  GNEEdge* newEdge = myViewNet->getNet()->createEdge(myCreateEdgeSource, junction, nullptr, myViewNet->getUndoList());
618  // check if edge was sucesfully created
619  if (newEdge) {
620  // set parameters
623  } else if (myEdgeTypeSelector->useDefaultEdgeType()) {
625  } else {
627  }
628  // create another edge, if create opposite edge is enabled
629  if (oppositeEdge && (myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(junction, myCreateEdgeSource, false) == nullptr)) {
630  GNEEdge* newOppositeEdge = myViewNet->getNet()->createEdge(junction, myCreateEdgeSource, nullptr,
631  myViewNet->getUndoList(), "-" + newEdge->getNBEdge()->getID());
632  // set parameters
635  } else if (myEdgeTypeSelector->useDefaultEdgeType()) {
637  } else {
639  }
640  }
641  // edge created, then unmark as create edge source
643  // end undo list
645  myViewNet->getUndoList()->end();
646  } else {
647  std::cout << "edge created without an open CommandGroup )-:\n";
648  }
649  // if we're creating edges in chain mode, mark junction as junction edge source
650  if (chainEdge) {
651  myCreateEdgeSource = junction;
654  } else {
655  myCreateEdgeSource = nullptr;
656  }
657  } else {
658  myViewNet->setStatusBarText("An " + toString(SUMO_TAG_EDGE) + " with the same geometry already exists!");
659  }
660  } else {
661  myViewNet->setStatusBarText("Start- and endpoint for an " + toString(SUMO_TAG_EDGE) + " must be distinct!");
662  }
663  update();
664  }
665  }
666 }
667 
668 
669 void
671  // if myCreateEdgeSource exist, unmark ist as create edge source
672  if (myCreateEdgeSource != nullptr) {
673  // remove current created edge source
675  myCreateEdgeSource = nullptr;
676  }
677 }
678 
679 
680 const GNEJunction*
682  return myCreateEdgeSource;
683 }
684 
685 
686 void
687 GNECreateEdgeFrame::updateObjectsUnderSnappedCursor(const std::vector<GUIGlObject*>& GUIGlObjects) {
689 }
690 
691 
692 void
694  // refresh template selector
696  // show frame
697  GNEFrame::show();
698 }
699 
700 
701 void
703  // hide frame
704  GNEFrame::hide();
705 }
706 
707 
710  return myEdgeTypeSelector;
711 }
712 
713 
716  return myEdgeTypeAttributes;
717 }
718 
719 
722  return myLaneTypeSelector;
723 }
724 
725 
728  return myLaneTypeAttributes;
729 }
730 
731 
732 void
736 }
737 
738 /****************************************************************************/
FXDEFMAP(GNECreateEdgeFrame::EdgeTypeSelector) EdgeTypeSelectorMap[]
@ MID_GNE_CREATEEDGEFRAME_CREATEFROMTEMPLATE
create edge type from template
Definition: GUIAppEnum.h:938
@ MID_GNE_CREATEEDGEFRAME_DELETE
delete edge type
Definition: GUIAppEnum.h:934
@ MID_GNE_CREATEEDGEFRAME_ADD
add new edge type
Definition: GUIAppEnum.h:932
@ MID_GNE_CREATEEDGEFRAME_SELECT
delete edge type
Definition: GUIAppEnum.h:936
@ MID_GNE_CREATEEDGEFRAME_SELECTRADIOBUTTON
Definition: GUIAppEnum.h:930
#define GUIDesignButton
Definition: GUIDesigns.h:68
#define GUIDesignComboBoxAttribute
Combo box static (cannot be edited) extended over the matrix column.
Definition: GUIDesigns.h:276
#define GUIDesignComboBoxNCol
number of column of every combo box
Definition: GUIDesigns.h:285
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:343
#define GUIDesignRadioButton
Definition: GUIDesigns.h:179
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition: GUIDesigns.h:244
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:280
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_ID
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
FXGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toogled)
GNENet * getNet() const
get pointer to net
GNEEdgeType * getEdgeTypeSelected() const
get edgeType selected
long onCmdSelectEdgeType(FXObject *, FXSelector, void *)
Called when the user press select an edgeType in comboBox.
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.
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.
void refreshEdgeTypeSelector()
refresh edge type selector
long onCmdRadioButton(FXObject *, FXSelector, void *)
void setCurrentEdgeType(const GNEEdgeType *edgeType)
set current edgeType
void clearEdgeTypeSelected()
clear edgeType selected
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(FXHorizontalFrame *horizontalFrameParent, GNEViewNet *viewNet)
Constructor.
GNECreateEdgeFrame::LaneTypeSelector * myLaneTypeSelector
lane type selector
void updateObjectsUnderSnappedCursor(const std::vector< GUIGlObject * > &GUIGlObjects)
update objects under snapped cursor
GNEFrameAttributeModules::AttributesCreator * getEdgeTypeAttributes() const
get edgeType attributes
GNEFrameAttributeModules::AttributesCreator * myLaneTypeAttributes
internal laneType attributes
GNEFrameAttributeModules::AttributesCreator * getLaneTypeAttributes() const
get laneType attributes
const GNEJunction * getJunctionSource() const
get junction source for new edge
~GNECreateEdgeFrame()
Destructor.
GNEFrameAttributeModules::AttributesCreator * myEdgeTypeAttributes
internal edgeType attributes
GNECreateEdgeFrame::Legend * myLegend
Legend.
GNEJunction * myCreateEdgeSource
source junction for new edge
GNEViewNetHelper::ObjectsUnderCursor myObjectsUnderSnappedCursor
objects under snapped cursor
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:732
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition: GNEEdge.cpp:435
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition: GNEEdge.cpp:701
const std::vector< GNELaneTemplate * > & getLaneTemplates() const
get vector with the lane templates of this edge
const std::string & getID() const
return ID of object
void copyTemplate(const GNEEdgeTemplate *edgeTemplate)
copy edge template
Definition: GNEEdgeType.cpp:88
const std::vector< GNELaneType * > & getLaneTypes() const
get laneTypes
void addLaneType(GNELaneType *laneType)
add laneType
GNEViewNet * myViewNet
View Net.
Definition: GNEFrame.h:114
FXVerticalFrame * myContentFrame
Vertical frame that holds all widgets of frame.
Definition: GNEFrame.h:117
virtual void show()
show Frame
Definition: GNEFrame.cpp:108
virtual void hide()
hide Frame
Definition: GNEFrame.cpp:117
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 * retrieveEdgeType(const std::string &id, bool hardFail=true) const
get edge type by id
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:125
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:230
GNEJunction * createJunction(const Position &pos, GNEUndoList *undoList)
creates a new junction
Definition: GNENet.cpp:214
const std::string & getID() const
get ID
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 staturBar text
Definition: GNEViewNet.cpp:629
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.
const std::string & getID() const
Definition: NBEdge.h:1465
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37