SUMO - Simulation of Urban MObility
GNECrossingFrame.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-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
15 // The Widget for add Crossing elements
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <iostream>
27 #include <utils/common/ToString.h>
33 #include <netedit/GNEViewNet.h>
34 #include <netedit/GNEViewParent.h>
35 #include <netedit/GNENet.h>
40 #include <netedit/GNEUndoList.h>
42 
43 #include "GNECrossingFrame.h"
44 
45 
46 // ===========================================================================
47 // FOX callback mapping
48 // ===========================================================================
49 
50 FXDEFMAP(GNECrossingFrame) GNECrossingMap[] = {
52 };
53 
58 };
59 
60 FXDEFMAP(GNECrossingFrame::crossingParameters) GNECrossingParametersMap[] = {
63 };
64 
65 // Object implementation
66 FXIMPLEMENT(GNECrossingFrame, FXVerticalFrame, GNECrossingMap, ARRAYNUMBER(GNECrossingMap))
67 FXIMPLEMENT(GNECrossingFrame::edgesSelector, FXGroupBox, GNEEdgesMap, ARRAYNUMBER(GNEEdgesMap))
68 FXIMPLEMENT(GNECrossingFrame::crossingParameters, FXGroupBox, GNECrossingParametersMap, ARRAYNUMBER(GNECrossingParametersMap))
69 
70 // ===========================================================================
71 // static members
72 // ===========================================================================
75 
76 // ===========================================================================
77 // method definitions
78 // ===========================================================================
79 
80 // ---------------------------------------------------------------------------
81 // GNECrossingFrame::edgesSelector - methods
82 // ---------------------------------------------------------------------------
83 
85  FXGroupBox(crossingFrameParent->myContentFrame, ("selection of " + toString(SUMO_TAG_EDGE) + "s").c_str(), GUIDesignGroupBoxFrame),
86  myCrossingFrameParent(crossingFrameParent),
87  myCurrentJunction(0) {
88 
89  // Create button for selected edges
90  myUseSelectedEdges = new FXButton(this, ("Use selected " + toString(SUMO_TAG_EDGE) + "s").c_str(), 0, this, MID_GNE_ADDITIONALFRAME_USESELECTED, GUIDesignButton);
91 
92  // Create button for clear selection
93  myClearEdgesSelection = new FXButton(this, ("Clear " + toString(SUMO_TAG_EDGE) + "s").c_str(), 0, this, MID_GNE_ADDITIONALFRAME_CLEARSELECTION, GUIDesignButton);
94 
95  // Create button for invert selection
96  myInvertEdgesSelection = new FXButton(this, ("Invert " + toString(SUMO_TAG_EDGE) + "s").c_str(), 0, this, MID_GNE_ADDITIONALFRAME_INVERTSELECTION, GUIDesignButton);
97 }
98 
99 
101 
102 
105  return myCurrentJunction;
106 }
107 
108 
109 void
111  // restore color of all lanes of edge candidates
113  // Set current junction
114  myCurrentJunction = currentJunction;
115  // Update view net to show the new colors
116  myCrossingFrameParent->getViewNet()->update();
117  // check if use selected eges must be enabled
118  myUseSelectedEdges->disable();
119  for (auto i : myCurrentJunction->getGNEEdges()) {
120  if (i->isAttributeCarrierSelected()) {
121  myUseSelectedEdges->enable();
122  }
123  }
124  // Enable rest of elements
125  myClearEdgesSelection->enable();
126  myInvertEdgesSelection->enable();
127 }
128 
129 
130 void
132  // disable current junction
133  myCurrentJunction = NULL;
134  // disable all elements of the edgesSelector
135  myUseSelectedEdges->disable();
136  myClearEdgesSelection->disable();
137  myInvertEdgesSelection->disable();
138  // Disable crossing parameters
140 }
141 
142 
143 void
145  if (myCurrentJunction != NULL) {
146  // restore color of all lanes of edge candidates
147  for (auto i : myCurrentJunction->getGNEEdges()) {
148  for (auto j : i->getLanes()) {
149  j->setSpecialColor(0);
150  }
151  }
152  // Update view net to show the new colors
153  myCrossingFrameParent->getViewNet()->update();
154  myCurrentJunction = NULL;
155  }
156 }
157 
158 
159 long
162  return 1;
163 }
164 
165 
166 long
169  return 1;
170 }
171 
172 
173 long
176  return 1;
177 }
178 
179 // ---------------------------------------------------------------------------
180 // GNECrossingFrame::NeteditAttributes- methods
181 // ---------------------------------------------------------------------------
182 
184  FXGroupBox(crossingFrameParent->myContentFrame, "Crossing parameters", GUIDesignGroupBoxFrame),
185  myCrossingFrameParent(crossingFrameParent),
186  myCurrentParametersValid(true) {
187  FXHorizontalFrame* crossingParameter = NULL;
188  // create label and string textField for edges
189  crossingParameter = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
190  myCrossingEdgesLabel = new FXLabel(crossingParameter, toString(SUMO_ATTR_EDGES).c_str(), 0, GUIDesignLabelAttribute);
191  myCrossingEdges = new FXTextField(crossingParameter, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
192  myCrossingEdgesLabel->disable();
193  myCrossingEdges->disable();
194  // create label and checkbox for Priority
195  crossingParameter = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
196  myCrossingPriorityLabel = new FXLabel(crossingParameter, toString(SUMO_ATTR_PRIORITY).c_str(), 0, GUIDesignLabelAttribute);
197  myCrossingPriorityCheckButton = new FXCheckButton(crossingParameter, "", this, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButtonAttribute);
198  myCrossingPriorityLabel->disable();
200  // create label and textfield for width
201  crossingParameter = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
202  myCrossingWidthLabel = new FXLabel(crossingParameter, toString(SUMO_ATTR_WIDTH).c_str(), 0, GUIDesignLabelAttribute);
203  myCrossingWidth = new FXTextField(crossingParameter, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFieldReal);
204  myCrossingWidthLabel->disable();
205  myCrossingWidth->disable();
206  // Create help button
207  myHelpCrossingAttribute = new FXButton(this, "Help", 0, this, MID_HELP, GUIDesignButtonRectangular);
208  myHelpCrossingAttribute->disable();
209  // set colors
210  myCandidateColor = RGBColor(0, 64, 0, 255);
212 }
213 
214 
216 
217 
218 void
220  // obtain Tag Values
221  const auto& tagProperties = GNEAttributeCarrier::getTagProperties(SUMO_TAG_CROSSING);
222  // Enable all elements of the crossing frames
223  myCrossingEdgesLabel->enable();
224  myCrossingEdges->enable();
225  myCrossingPriorityLabel->enable();
226  if (hasTLS) {
228  } else {
230  }
231  myCrossingWidthLabel->enable();
232  myCrossingWidth->enable();
233  myHelpCrossingAttribute->enable();
234  // set values of parameters
235  onCmdSetAttribute(0, 0, 0);
236  myCrossingPriorityCheckButton->setCheck(hasTLS ? true :
237  GNEAttributeCarrier::parse<bool>(tagProperties.getDefaultValue(SUMO_ATTR_PRIORITY)));
238  myCrossingWidth->setText(tagProperties.getDefaultValue(SUMO_ATTR_WIDTH).c_str());
239  myCrossingWidth->setTextColor(FXRGB(0, 0, 0));
240 }
241 
242 
243 void
245  // clear all values of parameters
246  myCrossingEdges->setText("");
247  myCrossingPriorityCheckButton->setCheck(false);
248  myCrossingPriorityCheckButton->setText("false");
249  myCrossingWidth->setText("");
250  // Disable all elements of the crossing frames
251  myCrossingEdgesLabel->disable();
252  myCrossingEdges->disable();
253  myCrossingPriorityLabel->disable();
255  myCrossingWidthLabel->disable();
256  myCrossingWidth->disable();
257  myHelpCrossingAttribute->disable();
259 }
260 
261 
262 bool
264  return myCrossingEdgesLabel->isEnabled();
265 }
266 
267 
268 void
271  if (currentJunction != NULL) {
272  // Check if edge belongs to junction's edge
273  if (std::find(currentJunction->getGNEEdges().begin(), currentJunction->getGNEEdges().end(), edge) != currentJunction->getGNEEdges().end()) {
274  // Update text field with the new edge
275  std::vector<std::string> crossingEdges = GNEAttributeCarrier::parse<std::vector<std::string> > (myCrossingEdges->getText().text());
276  // Check if new edge must be added or removed
277  std::vector<std::string>::iterator itFinder = std::find(crossingEdges.begin(), crossingEdges.end(), edge->getID());
278  if (itFinder == crossingEdges.end()) {
279  crossingEdges.push_back(edge->getID());
280  } else {
281  crossingEdges.erase(itFinder);
282  }
283  myCrossingEdges->setText(joinToString(crossingEdges, " ").c_str());
284  }
285  // Update colors and attributes
286  onCmdSetAttribute(0, 0, 0);
287  }
288 }
289 
290 
291 void
293  myCrossingEdges->setText("");
294  // Update colors and attributes
295  onCmdSetAttribute(0, 0, 0);
296 }
297 
298 
299 void
301  std::vector<std::string> crossingEdges;
302  for (auto i : parentJunction->getGNEEdges()) {
303  if (std::find(myCurrentSelectedEdges.begin(), myCurrentSelectedEdges.end(), i) == myCurrentSelectedEdges.end()) {
304  crossingEdges.push_back(i->getID());
305  }
306  }
307  myCrossingEdges->setText(joinToString(crossingEdges, " ").c_str());
308  // Update colors and attributes
309  onCmdSetAttribute(0, 0, 0);
310 }
311 
312 
313 void
315  std::vector<std::string> crossingEdges;
316  for (auto i : parentJunction->getGNEEdges()) {
317  if (i->isAttributeCarrierSelected()) {
318  crossingEdges.push_back(i->getID());
319  }
320  }
321  myCrossingEdges->setText(joinToString(crossingEdges, " ").c_str());
322  // Update colors and attributes
323  onCmdSetAttribute(0, 0, 0);
324 }
325 
326 
327 std::vector<NBEdge*>
329  std::vector<NBEdge*> NBEdgeVector;
330  // Iterate over myCurrentSelectedEdges
331  for (auto i : myCurrentSelectedEdges) {
332  NBEdgeVector.push_back(i->getNBEdge());
333  }
334  return NBEdgeVector;
335 }
336 
337 
338 bool
340  if (myCrossingPriorityCheckButton->getCheck()) {
341  return true;
342  } else {
343  return false;
344  }
345 }
346 
347 
348 bool
351 }
352 
353 
354 double
356  return GNEAttributeCarrier::parse<double>(myCrossingWidth->getText().text());
357 }
358 
359 
360 const RGBColor&
362  return myCandidateColor;
363 }
364 
365 
366 const RGBColor&
368  return mySelectedColor;
369 }
370 
371 
372 long
375  // get string vector with the edges
376  std::vector<std::string> crossingEdges = GNEAttributeCarrier::parse<std::vector<std::string> > (myCrossingEdges->getText().text());
377  // Clear selected edges
378  myCurrentSelectedEdges.clear();
379  // iterate over vector of edge IDs
380  for (auto i : crossingEdges) {
383  // Check that edge exists and belongs to Junction
384  if (edge == 0) {
385  myCurrentParametersValid = false;
386  } else if (std::find(currentJunction->getGNEEdges().begin(), currentJunction->getGNEEdges().end(), edge) == currentJunction->getGNEEdges().end()) {
387  myCurrentParametersValid = false;
388  } else {
389  // select or unselected edge
390  auto itFinder = std::find(myCurrentSelectedEdges.begin(), myCurrentSelectedEdges.end(), edge);
391  if (itFinder == myCurrentSelectedEdges.end()) {
392  myCurrentSelectedEdges.push_back(edge);
393  } else {
394  myCurrentSelectedEdges.erase(itFinder);
395  }
396  }
397  }
398 
399  // change color of textfield dependig of myCurrentParametersValid
401  myCrossingEdges->setTextColor(FXRGB(0, 0, 0));
402  myCrossingEdges->killFocus();
403  } else {
404  myCrossingEdges->setTextColor(FXRGB(255, 0, 0));
405  myCurrentParametersValid = false;
406  }
407 
408  // Update colors of edges
410  if (std::find(myCurrentSelectedEdges.begin(), myCurrentSelectedEdges.end(), i) != myCurrentSelectedEdges.end()) {
411  for (auto j : i->getLanes()) {
412  j->setSpecialColor(&mySelectedColor);
413  }
414  } else {
415  for (auto j : i->getLanes()) {
416  j->setSpecialColor(&myCandidateColor);
417  }
418  }
419  }
420  // Update view net
421  myCrossingFrameParent->getViewNet()->update();
422 
423  // Check that at least there are a selected edge
424  if (crossingEdges.empty()) {
425  myCurrentParametersValid = false;
426  }
427 
428  // change label of crossing priority
429  if (myCrossingPriorityCheckButton->getCheck()) {
430  myCrossingPriorityCheckButton->setText("true");
431  } else {
432  myCrossingPriorityCheckButton->setText("false");
433  }
434 
435  // Check width
436  if (GNEAttributeCarrier::canParse<double>(myCrossingWidth->getText().text()) &&
437  GNEAttributeCarrier::parse<double>(myCrossingWidth->getText().text()) > 0) {
438  myCrossingWidth->setTextColor(FXRGB(0, 0, 0));
439  myCrossingWidth->killFocus();
440  } else {
441  myCrossingWidth->setTextColor(FXRGB(255, 0, 0));
442  myCurrentParametersValid = false;
443  }
444 
445  // Enable or disable create crossing button depending of the current parameters
447  return 0;
448 }
449 
450 
451 long
452 GNECrossingFrame::crossingParameters::onCmdHelp(FXObject*, FXSelector, void*) {
454  return 1;
455 }
456 
457 // ---------------------------------------------------------------------------
458 // GNECrossingFrame - methods
459 // ---------------------------------------------------------------------------
460 
461 GNECrossingFrame::GNECrossingFrame(FXHorizontalFrame* horizontalFrameParent, GNEViewNet* viewNet) :
462  GNEFrame(horizontalFrameParent, viewNet, "Crossings") {
463  // Create Groupbox for labels
464  myGroupBoxLabel = new FXGroupBox(myContentFrame, "Junction", GUIDesignGroupBoxFrame);
465  myCurrentJunctionLabel = new FXLabel(myGroupBoxLabel, "No junction selected", 0, GUIDesignLabelLeft);
466 
467  // Create edge Selector
468  myEdgeSelector = new edgesSelector(this);
469 
470  // Create crossingParameters
472 
473  // Create groupbox for create crossings
474  myGroupBoxButtons = new FXGroupBox(myContentFrame, "Create", GUIDesignGroupBoxFrame);
476  myCreateCrossingButton->disable();
477 
478  // Create groupbox and labels for legends
479  myGroupBoxLegend = new FXGroupBox(myContentFrame, "Legend", GUIDesignGroupBoxFrame);
480  myColorCandidateLabel = new FXLabel(myGroupBoxLegend, "Candidate", 0, GUIDesignLabelLeft);
482  myColorSelectedLabel = new FXLabel(myGroupBoxLegend, "Selected", 0, GUIDesignLabelLeft);
484 
485  // disable edge selector
487 }
488 
489 
491 }
492 
493 
494 void
496  // restore color of all lanes of edge candidates
498  // hide frame
499  GNEFrame::hide();
500 }
501 
502 
503 bool
505  // cast netElement
506  GNEJunction* currentJunction = dynamic_cast<GNEJunction*>(netElement);
507  GNEEdge* selectedEdge = dynamic_cast<GNEEdge*>(netElement);
508  GNELane* selectedLane = dynamic_cast<GNELane*>(netElement);
509 
510  // If current element is a junction
511  if (currentJunction != NULL) {
512  // change label
513  myCurrentJunctionLabel->setText((std::string("Current Junction: ") + currentJunction->getID()).c_str());
514  // Enable edge selector and crossing parameters
515  myEdgeSelector->enableEdgeSelector(currentJunction);
517  // clears selected edges
519  } else if (selectedEdge != NULL) {
520  myCrossingParameters->markEdge(selectedEdge);
521  } else if (selectedLane != NULL) {
522  myCrossingParameters->markEdge(&selectedLane->getParentEdge());
523  } else {
524  // set default label
525  myCurrentJunctionLabel->setText("No junction selected");
526  // restore color of all lanes of edge candidates
528  // Disable edge selector
530  }
531  return false;
532 }
533 
534 
535 long
536 GNECrossingFrame::onCmdCreateCrossing(FXObject*, FXSelector, void*) {
537  // First check that current parameters are valid
539  // iterate over junction's crossing to find duplicated crossings
541  // create new crossing
546  -1, -1,
548  false, true), true);
549  // clear selected edges
551  } else {
552  WRITE_WARNING("There is already another crossing with the same edges in the junction; Duplicated crossing aren't allowed.");
553  }
554  }
555  return 1;
556 }
557 
558 
559 void
561  if (value) {
562  myCreateCrossingButton->enable();
563  } else {
564  myCreateCrossingButton->disable();
565  }
566 }
567 
568 
571  return myEdgeSelector;
572 }
573 
574 
577  return myCrossingParameters;
578 }
579 
580 /****************************************************************************/
static const PositionVector EMPTY
empty Vector
void setCreateCrossingButton(bool value)
enable or disable button create edges
long onCmdClearSelection(FXObject *, FXSelector, void *)
called when clear selection button is pressed
clear selection of elements
Definition: GUIAppEnum.h:657
FXGroupBox * myGroupBoxLegend
groupbox for Legend
#define GUIDesignCheckButtonAttribute
checkButton without thick extended over the frame used for attributes
Definition: GUIDesigns.h:115
GNEEdge * retrieveEdge(const std::string &id, bool failHard=true)
get edge by id
Definition: GNENet.cpp:915
const RGBColor & getSelectedColor() const
get selected color
invert selection of eleents
Definition: GUIAppEnum.h:659
FXGroupBox * myGroupBoxButtons
groupbox for buttons
FXLabel * myCurrentJunctionLabel
Label for current Junction.
FXLabel * myColorCandidateLabel
Label for color candidate.
FXLabel * myCrossingWidthLabel
Label for width.
void disableEdgeSelector()
disable edgeSelector
bool myCurrentParametersValid
flag to check if current parameters are valid
long onCmdInvertSelection(FXObject *, FXSelector, void *)
called when invert selection button is pressed
const RGBColor & getCandidateColor() const
get candidate color
void enableCrossingParameters(bool hasTLS)
enable crossing parameters and set the default value of parameters
GNECrossingFrame::crossingParameters * myCrossingParameters
crossing parameters
GNECrossingFrame * myCrossingFrameParent
pointer to GNECrossingFrame parent
void markEdge(GNEEdge *edge)
mark or dismark edge
void restoreEdgeColors()
restore colors of all edges
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition: GNELane.h:47
GNEJunction * getCurrentJunction() const
get current junction
void useSelectedEdges(GNEJunction *parentJunction)
use selected eges
long onCmdHelp(FXObject *, FXSelector, void *)
Called when help button is pressed.
FXButton * myInvertEdgesSelection
button for invert selection
void openHelpAttributesDialog(SumoXMLTag tag) const
Open help attributes dialog.
Definition: GNEFrame.cpp:784
const std::vector< GNEEdge * > & getGNEEdges() const
Returns all GNEEdges vinculated with this Junction.
GNEViewNet * getViewNet() const
get view net
Definition: GNEFrame.cpp:766
GNECrossingFrame::crossingParameters * getCrossingParameters() const
get Crossing parameters
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:242
FXGroupBox * myGroupBoxLabel
groupbox for the junction label
bool isCurrentParametersValid() const
check if current parameters are valid
void hide()
hide crossing frame
GNEViewNet * myViewNet
View Net for changes.
Definition: GNEFrame.h:232
void enableEdgeSelector(GNEJunction *currentJunction)
enable edgeSelector
bool isTLControlled() const
Returns whether this node is controlled by any tls.
Definition: NBNode.h:297
GNEUndoList * getUndoList() const
get the undoList object
static const RGBColor GREEN
Definition: RGBColor.h:173
#define GUIDesignTextField
Definition: GUIDesigns.h:34
the edges of a route
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
FXVerticalFrame * myContentFrame
Vertical frame that holds all widgets of frame.
Definition: GNEFrame.h:235
GNEEdge & getParentEdge()
Returns underlying parent edge.
Definition: GNELane.cpp:1298
FXLabel * myCrossingPriorityLabel
Label for Priority.
help button
Definition: GUIAppEnum.h:400
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames ...
Definition: GUIDesigns.h:258
FXCheckButton * myCrossingPriorityCheckButton
CheckBox for Priority.
GNEJunction * myCurrentJunction
current Junction
static RGBColor myCandidateColor
color for candidate edges
bool addCrossing(GNENetElement *netElement)
add Crossing element
static RGBColor mySelectedColor
color for selected edges
long onCmdSetAttribute(FXObject *, FXSelector, void *)
const std::string getID() const
function to support debugging
GNECrossingFrame::edgesSelector * myEdgeSelector
edge selector
~GNECrossingFrame()
Destructor.
bool getCrossingPriority() const
get crossing priority
#define GUIDesignButtonRectangular
little button rectangular (46x23) used in frames (For example, in "help" buttons) ...
Definition: GUIDesigns.h:60
begin/end of the description of an edge
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:50
FXDEFMAP(GNECrossingFrame) GNECrossingMap[]
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition: GUIDesigns.h:46
GNECrossingFrame::edgesSelector * getEdgeSelector() const
get edge selector
FXTextField * myCrossingEdges
TextField for edges.
long onCmdCreateCrossing(FXObject *, FXSelector, void *)
#define GUIDesignButton
Definition: GUIDesigns.h:54
bool checkCrossingDuplicated(EdgeVector edges)
return true if there already exist a crossing with the same edges as the input
Definition: NBNode.cpp:2172
FXLabel * myCrossingEdgesLabel
Label for edges.
GNECrossingFrame * myCrossingFrameParent
pointer to GNECrossingFrame parent
void disableCrossingParameters()
disable crossing parameters and clear parameters
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:227
bool isCrossingParametersEnabled() const
check if currently the crossingParameters is enabled
FXTextField * myCrossingWidth
TextField for width.
GNECrossingFrame()
FOX needs this.
crossing between edges for pedestrians
virtual void hide()
hide Frame
Definition: GNEFrame.cpp:750
FXButton * myUseSelectedEdges
CheckBox for selected edges.
GNENet * getNet() const
get the net object
void invertEdges(GNEJunction *parentJunction)
invert edges
#define GUIDesignTextFieldReal
text field extended over Frame with thick frame and limited to Doubles/doubles
Definition: GUIDesigns.h:40
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition: MFXUtils.cpp:114
attribute edited
Definition: GUIAppEnum.h:535
FXLabel * myColorSelectedLabel
Label for color selected.
std::vector< GNEEdge * > myCurrentSelectedEdges
current selected edges
use selected elements
Definition: GUIAppEnum.h:653
FXButton * myHelpCrossingAttribute
button for help
static const TagValues & getTagProperties(SumoXMLTag tag)
get Tag Properties
#define GUIDesignLabelLeft
Definition: GUIDesigns.h:145
#define GUIDesignLabelAttribute
label extended over the matrix column with thick frame and height of 23
Definition: GUIDesigns.h:166
std::vector< NBEdge * > getCrossingEdges() const
get crossing NBedges
NBNode * getNBNode() const
Return net build node.
FXButton * myCreateCrossingButton
FXButton for create Crossing
FXButton * myClearEdgesSelection
button for clear selection
double getCrossingWidth() const
get crossing width
long onCmdUseSelectedEdges(FXObject *, FXSelector, void *)
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition: ToString.h:230