74 myTextFieldJunctionID->disable();
83 if (junctionID.empty()) {
84 myTextFieldJunctionID->setText(
"");
86 myTextFieldJunctionID->setText(junctionID.c_str());
96 myCrossingFrameParent(crossingFrameParent),
97 myCurrentJunction(nullptr) {
112 return myCurrentJunction;
121 myCurrentJunction = currentJunction;
123 myCrossingFrameParent->getViewNet()->updateViewNet();
125 myUseSelectedEdges->disable();
126 for (
const auto& edge : myCurrentJunction->getChildEdges()) {
127 if (edge->isAttributeCarrierSelected()) {
128 myUseSelectedEdges->enable();
132 myClearEdgesSelection->enable();
139 myCurrentJunction =
nullptr;
141 myUseSelectedEdges->disable();
142 myClearEdgesSelection->disable();
144 myCrossingFrameParent->myCrossingParameters->disableCrossingParameters();
146 myCrossingFrameParent->getViewNet()->updateViewNet();
152 if (myCurrentJunction !=
nullptr) {
154 for (
const auto& edge : myCurrentJunction->getChildEdges()) {
158 myCrossingFrameParent->getViewNet()->updateViewNet();
159 myCurrentJunction =
nullptr;
166 myCrossingFrameParent->myCrossingParameters->useSelectedEdges(myCurrentJunction);
173 myCrossingFrameParent->myCrossingParameters->clearEdges();
183 myCrossingFrameParent(crossingFrameParent),
184 myCurrentParametersValid(true) {
185 FXHorizontalFrame* crossingParameter =
nullptr;
217 const auto crossingTagProperties = myCrossingFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(
SUMO_TAG_CROSSING)->getTagProperty();
219 myCrossingEdgesLabel->enable();
220 myCrossingEdges->enable();
221 myCrossingPriorityLabel->enable();
224 myCrossingPriorityCheckButton->disable();
226 myCrossingPriorityCheckButton->enable();
228 myCrossingWidthLabel->enable();
229 myCrossingWidth->enable();
230 myHelpCrossingAttribute->enable();
232 onCmdSetAttribute(
nullptr, 0,
nullptr);
235 myCrossingPriorityCheckButton->setCheck(TRUE);
237 myCrossingPriorityCheckButton->setCheck(crossingTagProperties->getDefaultBoolValue(
SUMO_ATTR_PRIORITY));
239 myCrossingWidth->setText(crossingTagProperties->getDefaultStringValue(
SUMO_ATTR_WIDTH).c_str());
240 myCrossingWidth->setTextColor(FXRGB(0, 0, 0));
247 myCrossingEdges->setText(
"");
248 myCrossingPriorityCheckButton->setCheck(
false);
249 myCrossingPriorityCheckButton->setText(
"false");
250 myCrossingWidth->setText(
"");
252 myCrossingEdgesLabel->disable();
253 myCrossingEdges->disable();
254 myCrossingPriorityLabel->disable();
255 myCrossingPriorityCheckButton->disable();
256 myCrossingWidthLabel->disable();
257 myCrossingWidth->disable();
258 myHelpCrossingAttribute->disable();
259 myCrossingFrameParent->myCreateCrossing->setCreateCrossingButton(
false);
265 return myCrossingEdgesLabel->isEnabled();
271 GNEJunction* currentJunction = myCrossingFrameParent->myEdgeSelector->getCurrentJunction();
272 if (currentJunction !=
nullptr) {
276 std::vector<std::string> crossingEdges = GNEAttributeCarrier::parse<std::vector<std::string> > (myCrossingEdges->getText().text());
278 std::vector<std::string>::iterator itFinder = std::find(crossingEdges.begin(), crossingEdges.end(), edge->
getID());
279 if (itFinder == crossingEdges.end()) {
280 crossingEdges.push_back(edge->
getID());
282 crossingEdges.erase(itFinder);
284 myCrossingEdges->setText(
joinToString(crossingEdges,
" ").c_str());
287 onCmdSetAttribute(
nullptr, 0,
nullptr);
294 myCrossingEdges->setText(
"");
296 onCmdSetAttribute(
nullptr, 0,
nullptr);
302 std::vector<std::string> crossingEdges;
304 if (edge->isAttributeCarrierSelected()) {
305 crossingEdges.push_back(edge->getID());
308 myCrossingEdges->setText(
joinToString(crossingEdges,
" ").c_str());
310 onCmdSetAttribute(
nullptr, 0,
nullptr);
316 std::vector<NBEdge*> NBEdgeVector;
318 for (
const auto& edge : myCurrentSelectedEdges) {
319 NBEdgeVector.push_back(edge->getNBEdge());
327 if (myCrossingPriorityCheckButton->getCheck()) {
337 return myCurrentParametersValid;
343 return GNEAttributeCarrier::parse<double>(myCrossingWidth->getText().text());
349 myCurrentParametersValid =
true;
351 const auto& crossingEdgeIDs = GNEAttributeCarrier::parse<std::vector<std::string> > (myCrossingEdges->getText().text());
352 GNEJunction* currentJunction = myCrossingFrameParent->myEdgeSelector->getCurrentJunction();
354 myCurrentSelectedEdges.clear();
356 for (
const auto& crossingEdgeID : crossingEdgeIDs) {
359 if (edge ==
nullptr) {
360 myCurrentParametersValid =
false;
361 }
else if (currentJunction && (std::find(currentJunction->getChildEdges().begin(), currentJunction->getChildEdges().end(), edge) == currentJunction->getChildEdges().end())) {
362 myCurrentParametersValid =
false;
365 auto itFinder = std::find(myCurrentSelectedEdges.begin(), myCurrentSelectedEdges.end(), edge);
366 if (itFinder == myCurrentSelectedEdges.end()) {
367 myCurrentSelectedEdges.push_back(edge);
369 myCurrentSelectedEdges.erase(itFinder);
374 if (myCurrentParametersValid) {
375 myCrossingEdges->setTextColor(FXRGB(0, 0, 0));
376 myCrossingEdges->killFocus();
378 myCrossingEdges->setTextColor(FXRGB(255, 0, 0));
379 myCurrentParametersValid =
false;
382 if (currentJunction) {
383 if (myCurrentSelectedEdges.empty()) {
384 for (
const auto& edge : myCrossingFrameParent->myEdgeSelector->getCurrentJunction()->getChildEdges()) {
386 edge->resetCandidateFlags();
388 edge->setPossibleCandidate(
true);
392 for (
GNEEdge* e : myCurrentSelectedEdges) {
393 selected.push_back(e->getNBEdge());
395 for (
const auto& edge : myCrossingFrameParent->myEdgeSelector->getCurrentJunction()->getChildEdges()) {
397 edge->resetCandidateFlags();
399 if (std::find(myCurrentSelectedEdges.begin(), myCurrentSelectedEdges.end(), edge) != myCurrentSelectedEdges.end()) {
400 edge->setTargetCandidate(
true);
403 newCandidates.push_back(edge->getNBEdge());
404 if (currentJunction->getNBNode()->checkCrossing(newCandidates,
true) == 0) {
405 edge->setInvalidCandidate(
true);
407 edge->setPossibleCandidate(
true);
414 myCrossingFrameParent->getViewNet()->updateViewNet();
416 if (crossingEdgeIDs.empty()) {
417 myCurrentParametersValid =
false;
420 if (myCrossingPriorityCheckButton->getCheck()) {
421 myCrossingPriorityCheckButton->setText(
"true");
423 myCrossingPriorityCheckButton->setText(
"false");
427 if (GNEAttributeCarrier::canParse<double>(myCrossingWidth->getText().text()) &&
428 GNEAttributeCarrier::parse<double>(myCrossingWidth->getText().text()) > 0) {
429 myCrossingWidth->setTextColor(FXRGB(0, 0, 0));
430 myCrossingWidth->killFocus();
432 myCrossingWidth->setTextColor(FXRGB(255, 0, 0));
433 myCurrentParametersValid =
false;
437 myCrossingFrameParent->myCreateCrossing->setCreateCrossingButton(myCurrentParametersValid);
453 myCrossingFrameParent(crossingFrameParent) {
466 if (myCrossingFrameParent->myCrossingParameters->isCurrentParametersValid()) {
468 if (myCrossingFrameParent->myEdgeSelector->getCurrentJunction()->getNBNode()->checkCrossingDuplicated(myCrossingFrameParent->myCrossingParameters->getCrossingEdges()) ==
false) {
470 myCrossingFrameParent->myViewNet->getUndoList()->add(
new GNEChange_Crossing(myCrossingFrameParent->myEdgeSelector->getCurrentJunction(),
471 myCrossingFrameParent->myCrossingParameters->getCrossingEdges(),
472 myCrossingFrameParent->myCrossingParameters->getCrossingWidth(),
473 myCrossingFrameParent->myCrossingParameters->getCrossingPriority(),
478 myCrossingFrameParent->myEdgeSelector->onCmdClearSelection(0, 0, 0);
480 myCrossingFrameParent->getViewNet()->getViewParent()->getCreateEdgeFrame()->getEdgeTypeSelector()->enableCheckBoxDisablePedestrians();
482 WRITE_WARNING(
TL(
"There is already another crossing with the same edges in the junction; Duplicated crossing aren't allowed."));
492 myCreateCrossingButton->enable();
494 myCreateCrossingButton->disable();
528 GNEFrame(viewParent, viewNet,
TL(
"Crossings")) {
FXDEFMAP(GNECrossingFrame::EdgesSelector) EdgesSelectorMap[]
@ MID_GNE_SET_ATTRIBUTE
attribute edited
@ MID_GNE_CLEARSELECTION
clear selection of elements
@ MID_GNE_USESELECTED
use selected elements
@ MID_GNE_CREATE
create element
@ MID_GNE_SELECT
select element
#define GUIDesignTextField
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
#define GUIDesignButtonRectangular
little rectangular button used in frames (For example, in "help" buttons)
#define GUIDesignLabel(justify)
#define GUIDesignTextFieldNCol
Num of column of text field.
#define GUIDesignCheckButton
checkButton placed in left position
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
#define WRITE_WARNING(msg)
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
@ SUMO_TAG_CROSSING
crossing between edges for pedestrians
@ SUMO_ATTR_EDGES
the edges of a route
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
const std::string getID() const
get ID (all Attribute Carriers have one)
GNENet * getNet() const
get pointer to net
void resetCandidateFlags()
reset candidate flags
bool isInvalidCandidate() const
check if this element is a invalid candidate
void setCreateCrossingButton(bool value)
enable or disable button create crossing
CreateCrossing(GNECrossingFrame *crossingFrameParent)
FOX-declaration.
~CreateCrossing()
destructor
FXButton * myCreateCrossingButton
@field FXButton for create Crossing
long onCmdCreateCrossing(FXObject *, FXSelector, void *)
void enableCrossingParameters(bool hasTLS)
enable crossing parameters and set the default value of parameters
std::vector< NBEdge * > getCrossingEdges() const
get crossing NBedges
double getCrossingWidth() const
get crossing width
long onCmdHelp(FXObject *, FXSelector, void *)
Called when help button is pressed.
FXLabel * myCrossingWidthLabel
Label for width.
void markEdge(GNEEdge *edge)
mark or dismark edge
bool getCrossingPriority() const
get crossing priority
CrossingParameters(GNECrossingFrame *crossingFrameParent)
FOX-declaration.
void disableCrossingParameters()
disable crossing parameters and clear parameters
FXTextField * myCrossingWidth
TextField for width.
void useSelectedEdges(GNEJunction *parentJunction)
use selected eges
bool isCrossingParametersEnabled() const
check if currently the CrossingParameters is enabled
FXButton * myHelpCrossingAttribute
button for help
FXTextField * myCrossingEdges
TextField for edges.
FXCheckButton * myCrossingPriorityCheckButton
CheckBox for Priority.
void clearEdges()
clear edges
FXLabel * myCrossingEdgesLabel
Label for edges.
bool isCurrentParametersValid() const
check if current parameters are valid
FXLabel * myCrossingPriorityLabel
Label for Priority.
long onCmdSetAttribute(FXObject *, FXSelector, void *)
~CrossingParameters()
destructor
long onCmdUseSelectedEdges(FXObject *, FXSelector, void *)
EdgesSelector(GNECrossingFrame *crossingFrameParent)
FOX-declaration.
long onCmdClearSelection(FXObject *, FXSelector, void *)
called when clear selection button is pressed
~EdgesSelector()
destructor
GNEJunction * getCurrentJunction() const
get current junction
FXButton * myClearEdgesSelection
button for clear selection
void restoreEdgeColors()
restore colors of all edges
void enableEdgeSelector(GNEJunction *currentJunction)
enable edgeSelector
void disableEdgeSelector()
disable edgeSelector
FXButton * myUseSelectedEdges
CheckBox for selected edges.
GNECrossingFrame::CreateCrossing * myCreateCrossing
create crossing modul
GNECrossingFrame::Information * myInformation
information modul
GNECrossingFrame::EdgesSelector * myEdgeSelector
edge selector modul
~GNECrossingFrame()
Destructor.
void clearEdgesHotkey()
clear edges (used when user press ESC key in Crossing mode)
GNECrossingFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
void hide()
hide crossing frame
GNECrossingFrame::CrossingParameters * myCrossingParameters
crossing parameters modul
void createCrossingHotkey()
create crossing (used when user press ENTER key in Crossing mode)
GNECrossingFrame::EdgesSelector * getEdgesSelector() const
get edge selector modul
void addCrossing(const GNEViewNetHelper::ViewObjectsSelector &viewObjects)
add Crossing element
GNECrossingFrame::JunctionInformation * myJunctionInformation
FOX need this.
A road/street connecting two junctions (netedit-version)
GNEViewNet * getViewNet() const
get view net
GNEViewNet * myViewNet
FOX need this.
virtual void hide()
hide Frame
const GNEHierarchicalContainerChildren< GNEEdge * > & getChildEdges() const
get child edges
NBNode * getNBNode() const
Return net build node.
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
class used to group all variables related with objects under cursor after a click over view
const std::vector< GNEAttributeCarrier * > & getAttributeCarriers() const
get vector with ACs
GNEEdge * getEdgeFront() const
get front edge or a pointer to nullptr
GNEJunction * getJunctionFront() const
get front junction or a pointer to nullptr
void updateViewNet(const bool ignoreViewUpdater=true) const
Mark the entire GNEViewNet to be repainted later.
A single child window which contains a view of the simulation area.
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
GUIVisualizationCandidateColorSettings candidateColorSettings
candidate color settings
C++ TraCI client API implementation.
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)
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
bool isTLControlled() const
Returns whether this node is controlled by any tls.
static const PositionVector EMPTY
empty Vector
static const RGBColor WHITE
static const RGBColor invalid
color for invalid elements
static const RGBColor target
color for selected candidate target
static const RGBColor possible
color for possible candidate element