Eclipse SUMO - Simulation of Urban MObility
GNEProhibitionFrame.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-2024 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 editing connection prohibits
19 /****************************************************************************/
20 
26 #include <netedit/GNEViewNet.h>
27 #include <netedit/GNEViewParent.h>
29 
30 #include "GNEProhibitionFrame.h"
31 
32 
33 // ===========================================================================
34 // FOX callback mapping
35 // ===========================================================================
36 
38  FXMAPFUNC(SEL_COMMAND, MID_OK, GNEProhibitionFrame::Selection::onCmdOK),
41 };
42 
43 // Object implementation
44 FXIMPLEMENT(GNEProhibitionFrame::Selection, FXVerticalFrame, SelectionMap, ARRAYNUMBER(SelectionMap))
45 
46 // ===========================================================================
47 // method definitions
48 // ===========================================================================
49 
50 // ---------------------------------------------------------------------------
51 // GNEProhibitionFrame::RelativeToConnection - methods
52 // ---------------------------------------------------------------------------
53 
55  MFXGroupBoxModule(prohibitionFrameParent, TL("Selected connection")),
56  myProhibitionFrameParent(prohibitionFrameParent) {
57  // Create label for current connection description and update it
58  myConnDescriptionLabel = new FXLabel(getCollapsableFrame(), "", nullptr, GUIDesignLabelFrameInformation);
59  // update description
60  updateDescription();
61 }
62 
63 
65 
66 
67 void
69  // update depending of myCurrentConn
70  if (myProhibitionFrameParent->myCurrentConn == nullptr) {
71  myConnDescriptionLabel->setText(TL("No Connection selected\n"));
72  } else {
73  myConnDescriptionLabel->setText(
74  (TL("- Junction: ") + myProhibitionFrameParent->myCurrentConn->getEdgeFrom()->getToJunction()->getID() + "\n" +
75  TL("- From lane: ") + myProhibitionFrameParent->myCurrentConn->getLaneFrom()->getMicrosimID() + "\n" +
76  TL("- To lane: ") + myProhibitionFrameParent->myCurrentConn->getLaneTo()->getMicrosimID()).c_str());
77  }
78 }
79 
80 // ---------------------------------------------------------------------------
81 // GNEProhibitionFrame::ProhibitionLegend - methods
82 // ---------------------------------------------------------------------------
83 
85  MFXGroupBoxModule(prohibitionFrameParent, TL("Information")),
86  myUndefinedColor(RGBColor::GREY),
87  myProhibitedColor(RGBColor(0, 179, 0)),
88  myProhibitingColor(RGBColor::RED),
89  myUnregulatedConflictColor(RGBColor::ORANGE),
90  myMutualConflictColor(RGBColor::CYAN) {
91  // Create labels for color legend
93  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
94  TL("Selected"), nullptr, GUIDesignLabelFrameInformation);
95  legendLabel->setTipText(TL("Current selected connection"));
96  legendLabel->setTextColor(MFXUtils::getFXColor(RGBColor::WHITE));
97  legendLabel->setBackColor(MFXUtils::getFXColor(prohibitionFrameParent->myViewNet->getVisualisationSettings().colorSettings.selectedProhibitionColor));
98  // label for conflicts
99  legendLabel = new MFXLabelTooltip(getCollapsableFrame(),
100  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
101  TL("No conflict"), nullptr, GUIDesignLabelFrameInformation);
102  legendLabel->setTipText(TL("No conflict with the selected connection"));
103  legendLabel->setBackColor(MFXUtils::getFXColor(myUndefinedColor));
104  // label for yields
105  legendLabel = new MFXLabelTooltip(getCollapsableFrame(),
106  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
107  TL("Yields"), nullptr, GUIDesignLabelFrameInformation);
108  legendLabel->setTipText(TL("Connection yields the selected connection"));
109  legendLabel->setBackColor(MFXUtils::getFXColor(myProhibitedColor));
110  // label for right of way
111  legendLabel = new MFXLabelTooltip(getCollapsableFrame(),
112  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
113  TL("Has right of way"), nullptr, GUIDesignLabelFrameInformation);
114  legendLabel->setTipText(TL("Connection has right of way with the selected connection"));
115  legendLabel->setBackColor(MFXUtils::getFXColor(myProhibitingColor));
116  // label for unregulated conflict
117  legendLabel = new MFXLabelTooltip(getCollapsableFrame(),
118  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
119  TL("Unregulated conflict"), nullptr, GUIDesignLabelFrameInformation);
120  legendLabel->setTipText(TL("Connection has an unregulated conflict with the selected connection"));
121  legendLabel->setBackColor(MFXUtils::getFXColor(myUnregulatedConflictColor));
122  // label for mutual conflict
123  legendLabel = new MFXLabelTooltip(getCollapsableFrame(),
124  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
125  TL("Mutual conflict"), nullptr, GUIDesignLabelFrameInformation);
126  legendLabel->setTipText(TL("Connection has a mutual conflict with the selected connection"));
127  legendLabel->setBackColor(MFXUtils::getFXColor(myMutualConflictColor));
128 }
129 
130 
132 
133 
134 const RGBColor&
136  return myUndefinedColor;
137 }
138 
139 
140 const RGBColor&
142  return myProhibitedColor;
143 }
144 
145 
146 const RGBColor&
148  return myProhibitingColor;
149 }
150 
151 
152 const RGBColor&
154  return myUnregulatedConflictColor;
155 }
156 
157 
158 const RGBColor&
160  return myMutualConflictColor;
161 }
162 
163 // ---------------------------------------------------------------------------
164 // GNEProhibitionFrame::Selection - methods
165 // ---------------------------------------------------------------------------
166 
168  MFXGroupBoxModule(prohibitionFrameParent, TL("Selection")),
169  myProhibitionFrameParent(prohibitionFrameParent) {
170  // Create "OK" button
172  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
173  TL("OK"),
175  mySaveButton->setTipText(TL("Save prohibition modifications (Enter)"));
176  // Create "Cancel" button
178  prohibitionFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
179  TL("Unselect connection"),
181  myCancelButton->setTipText(TL("Unselect connection (Esc)"));
182  // Currently mySaveButton is hidden
183  mySaveButton->hide();
184 }
185 
186 
188 
189 
190 long
191 GNEProhibitionFrame::Selection::onCmdOK(FXObject*, FXSelector, void*) {
192  return 1;
193 }
194 
195 
196 long
197 GNEProhibitionFrame::Selection::onCmdCancel(FXObject*, FXSelector, void*) {
198  if (myProhibitionFrameParent->myCurrentConn != nullptr) {
199  for (const auto& conn : myProhibitionFrameParent->myConcernedConns) {
200  conn->setSpecialColor(nullptr);
201  }
202  myProhibitionFrameParent->myCurrentConn->setSpecialColor(nullptr);
203  myProhibitionFrameParent->myCurrentConn = nullptr;
204  myProhibitionFrameParent->myConcernedConns.clear();
205  myProhibitionFrameParent->myRelativeToConnection->updateDescription();
206  myProhibitionFrameParent->myViewNet->updateViewNet();
207  }
208  return 1;
209 }
210 
211 
212 long
214  if (myProhibitionFrameParent->myCurrentConn) {
215  mySaveButton->enable();
216  myCancelButton->enable();
217  } else {
218  mySaveButton->disable();
219  myCancelButton->disable();
220  }
221  return 1;
222 }
223 
224 // ---------------------------------------------------------------------------
225 // GNEProhibitionFrame - methods
226 // ---------------------------------------------------------------------------
227 
229  GNEFrame(viewParent, viewNet, TL("Prohibitions")),
230  myCurrentConn(nullptr) {
231 
232  // create RelativeToConnection
234 
235  // create legend
236  myLegend = new Legend(this);
237 
238  // create Selection module
239  mySelectionModul = new Selection(this);
240 }
241 
242 
244 
245 
246 void
248  // build prohibition
250 }
251 
252 
253 void
255  GNEFrame::show();
256 }
257 
258 
259 void
261  GNEFrame::hide();
262 }
263 
264 
267  return mySelectionModul;
268 }
269 
270 // ---------------------------------------------------------------------------
271 // GNEProhibitionFrame - private methods
272 // ---------------------------------------------------------------------------
273 
274 void
275 GNEProhibitionFrame::buildProhibition(GNEConnection* conn, bool /* mayDefinitelyPass */, bool /* allowConflict */, bool /* toggle */) {
276  if (myCurrentConn != nullptr) {
277  mySelectionModul->onCmdCancel(nullptr, 0, nullptr);
278  }
279  if (conn != nullptr) {
280  myCurrentConn = conn;
282 
283  // determine prohibition status of all other connections with respect to the selected one
285  std::vector<GNEConnection*> connections = junction->getGNEConnections();
286  NBNode* node = junction->getNBNode();
287  NBEdge* currentConnFrom = myCurrentConn->getEdgeFrom()->getNBEdge();
288 
289  const int currentLinkIndex = node->getConnectionIndex(currentConnFrom, myCurrentConn->getNBEdgeConnection());
290  std::string currentFoesString = node->getFoes(currentLinkIndex);
291  std::string currentResponseString = node->getResponse(currentLinkIndex);
292  std::reverse(currentFoesString.begin(), currentFoesString.end());
293  std::reverse(currentResponseString.begin(), currentResponseString.end());
294  // iterate over all connections
295  for (const auto& connection : connections) {
296  if (connection != myCurrentConn) {
297  NBEdge* otherConnFrom = connection->getEdgeFrom()->getNBEdge();
298  const int linkIndex = node->getConnectionIndex(otherConnFrom, connection->getNBEdgeConnection());
299  std::string responseString = node->getResponse(linkIndex);
300  std::reverse(responseString.begin(), responseString.end());
301  // determine the prohibition status
302  bool foes = ((int)currentFoesString.size() > linkIndex) && (currentFoesString[linkIndex] == '1');
303  bool forbids = ((int)responseString.size() > currentLinkIndex) && (responseString[currentLinkIndex] == '1');
304  bool forbidden = ((int)currentResponseString.size() > linkIndex) && (currentResponseString[linkIndex] == '1');
305  // insert in myConcernedConns
306  myConcernedConns.insert(connection);
307  // change color depending of prohibition status
308  if (!foes) {
309  connection->setSpecialColor(&myLegend->getUndefinedColor());
310  } else {
311  if (forbids && forbidden) {
312  connection->setSpecialColor(&myLegend->getMutualConflictColor());
313  } else if (forbids) {
314  connection->setSpecialColor(&myLegend->getProhibitedColor());
315  } else if (forbidden) {
316  connection->setSpecialColor(&myLegend->getProhibitingColor());
317  } else {
318  connection->setSpecialColor(&myLegend->getUnregulatedConflictColor());
319  }
320  }
321  }
322  }
323  // update description
325  }
326 }
327 
328 
329 /****************************************************************************/
FXDEFMAP(GNEProhibitionFrame::Selection) SelectionMap[]
@ MID_CANCEL
Cancel-button pressed.
Definition: GUIAppEnum.h:306
@ MID_OK
Ok-button pressed.
Definition: GUIAppEnum.h:304
#define GUIDesignButton
Definition: GUIDesigns.h:88
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition: GUIDesigns.h:285
#define TL(string)
Definition: MsgHandler.h:315
GNEEdge * getEdgeFrom() const
get the name of the edge the vehicles leave
NBEdge::Connection & getNBEdgeConnection() const
get Edge::Connection
void setSpecialColor(const RGBColor *Color2)
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition: GNEEdge.cpp:683
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
Definition: GNEEdge.h:82
GNEViewNet * getViewNet() const
get view net
Definition: GNEFrame.cpp:150
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
std::vector< GNEConnection * > getGNEConnections() const
Returns all GNEConnections vinculated with this junction.
NBNode * getNBNode() const
Return net build node.
Legend(GNEProhibitionFrame *prohibitionFrameParent)
constructor
const RGBColor & getProhibitingColor() const
get color for connections with precedence
RGBColor myUndefinedColor
color for non-conflicting pairs of connections
const RGBColor & getProhibitedColor() const
get color for waiting connections
RGBColor myMutualConflictColor
color for mutual conflicts
const RGBColor & getUndefinedColor() const
get color for non-conflicting pairs of connections
RGBColor myProhibitedColor
color for waiting connections
RGBColor myUnregulatedConflictColor
color for unregulated conflicts
const RGBColor & getMutualConflictColor() const
get color for mutual conflicts
const RGBColor & getUnregulatedConflictColor() const
get color for unregulated conflicts
RGBColor myProhibitingColor
color for connections with precedence
void updateDescription() const
update description
MFXButtonTooltip * mySaveButton
"Save" button
MFXButtonTooltip * myCancelButton
"Cancel" button
long onCmdOK(FXObject *, FXSelector, void *)
Called when the user presses the OK-Button saves any prohibition modifications.
Selection(GNEProhibitionFrame *prohibitionFrameParent)
FOX-declaration.
long onCmdCancel(FXObject *, FXSelector, void *)
Called when the user presses the Cancel-button discards any prohibition modifications.
long onCmdRequireConnection(FXObject *, FXSelector, void *)
Called when the user presses the OK-Button saves any prohibition modifications.
GNEProhibitionFrame::Selection * mySelectionModul
Selection.
GNEProhibitionFrame::Legend * myLegend
prohibition legend
void handleProhibitionClick(const GNEViewNetHelper::ViewObjectsSelector &viewObjects)
handle prohibitions and set the relative coloring
RelativeToConnection * myRelativeToConnection
Relative To Connection.
void hide()
hide prohibition frame
GNEProhibitionFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
GNEConnection * myCurrentConn
the connection which prohibits
GNEProhibitionFrame::Selection * getSelectionModul() const
get selection module
void show()
show prohibition frame
void buildProhibition(GNEConnection *conn, bool mayDefinitelyPass, bool allowConflict, bool toggle)
FOX needs this.
std::set< GNEConnection * > myConcernedConns
the set of connections which
class used to group all variables related with objects under cursor after a click over view
GNEConnection * getConnectionFront() const
get front connection or a pointer to nullptr
const GNEViewNetHelper::MouseButtonKeyPressed & getMouseButtonKeyPressed() const
get Key Pressed module
Definition: GNEViewNet.cpp:733
GNEViewParent * getViewParent() const
get the net object
A single child window which contains a view of the simulation area.
Definition: GNEViewParent.h:88
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
MFXStaticToolTip * getStaticTooltipMenu() const
get static toolTip for menus
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
GUIVisualizationColorSettings colorSettings
color settings
MFXGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition: MFXUtils.cpp:112
The representation of a single edge during network building.
Definition: NBEdge.h:92
Represents a single node (junction) during network building.
Definition: NBNode.h:66
int getConnectionIndex(const NBEdge *from, const NBEdge::Connection &con) const
return the index of the given connection
Definition: NBNode.cpp:3921
const std::string getResponse(int linkIndex) const
get the 'response' string (right-of-way bit set) of the right-of-way logic
Definition: NBNode.cpp:1108
const std::string getFoes(int linkIndex) const
get the 'foes' string (conflict bit set) of the right-of-way logic
Definition: NBNode.cpp:1098
static const RGBColor WHITE
Definition: RGBColor.h:192
bool shiftKeyPressed() const
check if SHIFT is pressed during current event
bool controlKeyPressed() const
check if CONTROL is pressed during current event
RGBColor selectedProhibitionColor
prohibition selection color