Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNETypeFrame.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-2026 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 edit Type elements (vehicle, person and container)
19/****************************************************************************/
20
22#include <netedit/GNENet.h>
24#include <netedit/GNEUndoList.h>
32
33#include "GNETypeFrame.h"
34
35// ===========================================================================
36// FOX callback mapping
37// ===========================================================================
38
42
48
49// Object implementation
50FXIMPLEMENT(GNETypeFrame::TypeSelector, GNEGroupBoxModule, typeSelectorMap, ARRAYNUMBER(typeSelectorMap))
51FXIMPLEMENT(GNETypeFrame::TypeEditor, GNEGroupBoxModule, typeEditorMap, ARRAYNUMBER(typeEditorMap))
52
53// ===========================================================================
54// method definitions
55// ===========================================================================
56
57// ---------------------------------------------------------------------------
58// GNETypeFrame::TypeSelector - methods
59// ---------------------------------------------------------------------------
60
62 GNEGroupBoxModule(typeFrameParent, TL("Current Type")),
63 myTypeFrameParent(typeFrameParent),
64 myCurrentType(nullptr) {
65 // Create MFXComboBoxIcon
66 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), typeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
68 // add default Types (always first)
69 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
70 if (DEFAULT_VTYPES.count(vType.second->getID()) != 0) {
71 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon(), FXRGB(255, 255, 200));
72 }
73 }
74 // fill myTypeMatchBox with list of VTypes IDs
75 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
76 if (DEFAULT_VTYPES.count(vType.second->getID()) == 0) {
77 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon());
78 }
79 }
80 // set DEFAULT_VEHTYPE as default VType
81 myCurrentType = myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID);
82 myTypeComboBox->setCurrentItem(myTypeComboBox->findItem(DEFAULT_VTYPE_ID.c_str()));
83 // TypeSelector is always shown
84 show();
85}
86
87
89
90
95
96
97void
102
103
104void
106 bool valid = false;
107 // clear items
108 myTypeComboBox->clearItems();
109 // add default Vehicle an Bike types in the first and second positions
110 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
111 if (DEFAULT_VTYPES.count(vType.second->getID()) != 0) {
112 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon(), FXRGB(255, 255, 200));
113 }
114 }
115 // fill myTypeMatchBox with list of VTypes IDs sorted by ID
116 std::map<std::string, GNEDemandElement*> types;
117 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
118 if (DEFAULT_VTYPES.count(vType.second->getID()) == 0) {
119 types[vType.second->getID()] = vType.second;
120 }
121 }
122 for (const auto& vType : types) {
123 myTypeComboBox->appendIconItem(vType.first.c_str(), vType.second->getACIcon());
124 }
125 // make sure that tag is in myTypeMatchBox
126 if (myCurrentType) {
127 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
128 if (myTypeComboBox->getItemText(i) == myCurrentType->getID()) {
129 myTypeComboBox->setCurrentItem(i);
130 valid = true;
131 }
132 }
133 }
134 // Check that give vType type is valid
135 if (!valid) {
136 // set DEFAULT_VEHTYPE as default VType
137 myCurrentType = myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID);
138 // refresh myTypeMatchBox again
139 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
140 if (myTypeComboBox->getItemText(i) == myCurrentType->getID()) {
141 myTypeComboBox->setCurrentItem(i);
142 }
143 }
144 }
145 // check if update other moduls
146 if (updateModuls) {
147 // refresh vehicle type editor module
148 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
149 // show modules
150 myTypeFrameParent->myTypeAttributesEditor->showAttributesEditor(myCurrentType, true);
151 }
152}
153
154
155long
156GNETypeFrame::TypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
157 // Check if value of myTypeMatchBox correspond of an allowed additional tags
158 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
159 if (vType.second->getID() == myTypeComboBox->getText().text()) {
160 // set pointer
161 myCurrentType = vType.second;
162 // set color of myTypeMatchBox to black (valid)
164 // refresh vehicle type editor module
165 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
166 // show modules if selected item is valid
167 myTypeFrameParent->myTypeAttributesEditor->showAttributesEditor(myCurrentType, true);
168 // update viewNet
169 myTypeFrameParent->getViewNet()->updateViewNet();
170 return 1;
171 }
172 }
173 myCurrentType = nullptr;
174 // refresh vehicle type editor module
175 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
176 // hide all modules if selected item isn't valid
177 myTypeFrameParent->myTypeAttributesEditor->hideAttributesEditor();
178 // set color of myTypeMatchBox to red (invalid)
180 // update viewNet
181 myTypeFrameParent->getViewNet()->updateViewNet();
182 return 1;
183}
184
185// ---------------------------------------------------------------------------
186// GNETypeFrame::TypeEditor - methods
187// ---------------------------------------------------------------------------
188
190 GNEGroupBoxModule(typeFrameParent, TL("Type Editor")),
191 myTypeFrameParent(typeFrameParent) {
192 // Create new vehicle type
194 // Create delete/reset vehicle type
196 // Create copy vehicle type
198}
199
200
202
203
204void
209
210
211void
215
216
217void
219 // first check if selected VType is valid
220 if (myTypeFrameParent->myTypeSelector->getCurrentType() == nullptr) {
221 // disable buttons
222 myDeleteResetTypeButton->disable();
223 myCopyTypeButton->disable();
224 } else if (GNEAttributeCarrier::parse<bool>(myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(GNE_ATTR_DEFAULT_VTYPE))) {
225 // enable copy button
226 myCopyTypeButton->enable();
227 // enable and set myDeleteTypeButton as "reset")
228 myDeleteResetTypeButton->setText(TL("Reset Type"));
230 // check if reset default vehicle type button has to be enabled or disabled
231 if (GNEAttributeCarrier::parse<bool>(myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(GNE_ATTR_DEFAULT_VTYPE_MODIFIED))) {
232 myDeleteResetTypeButton->enable();
233 } else {
234 myDeleteResetTypeButton->disable();
235 }
236 } else {
237 // enable copy button
238 myCopyTypeButton->enable();
239 // enable and set myDeleteTypeButton as "delete")
240 myDeleteResetTypeButton->setText(TL("Delete Type"));
242 myDeleteResetTypeButton->enable();
243 }
244 // update module
245 recalc();
246}
247
248
249long
250GNETypeFrame::TypeEditor::onCmdCreateType(FXObject*, FXSelector, void*) {
251 auto net = myTypeFrameParent->myViewNet->getNet();
252 // obtain a new valid Type ID
253 const std::string typeID = net->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_VTYPE);
254 // create new vehicle type
255 GNEDemandElement* type = new GNEVType(typeID, net, net->getGNEApplicationWindow()->getFileBucketHandler()->getDefaultBucket(FileBucket::Type::DEMAND));
256 // add it using undoList (to allow undo-redo)
257 net->getUndoList()->begin(type, TL("create vehicle type"));
258 net->getUndoList()->add(new GNEChange_DemandElement(type, true), true);
259 net->getUndoList()->end();
260 // set created vehicle type in selector
261 myTypeFrameParent->myTypeSelector->setCurrentType(type);
262 return 1;
263}
264
265
266long
268 // continue depending of current mode
270 deleteType();
271 } else {
272 resetType();
273 }
274 return 1;
275}
276
277
278long
279GNETypeFrame::TypeEditor::onCmdCopyType(FXObject*, FXSelector, void*) {
280 // obtain a new valid Type ID
281 const std::string typeID = myTypeFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_VTYPE);
282 // obtain vehicle type in which new Type will be based
283 GNEVType* vType = dynamic_cast<GNEVType*>(myTypeFrameParent->myTypeSelector->getCurrentType());
284 // check that vType exist
285 if (vType) {
286 // create a new Type based on the current selected vehicle type
287 GNEDemandElement* typeCopy = new GNEVType(typeID, myTypeFrameParent->myViewNet->getNet(), vType);
288 // begin undo list operation
289 myTypeFrameParent->myViewNet->getUndoList()->begin(typeCopy, TL("copy vehicle type"));
290 // add it using undoList (to allow undo-redo)
291 myTypeFrameParent->myViewNet->getUndoList()->add(new GNEChange_DemandElement(typeCopy, true), true);
292 // end undo list operation
293 myTypeFrameParent->myViewNet->getUndoList()->end();
294 // set created vehicle type in selector
295 myTypeFrameParent->myTypeSelector->setCurrentType(typeCopy);
296 }
297 return 1;
298}
299
300
301void
303 // begin reset default vehicle type values
304 myTypeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::VTYPE, TL("reset default vehicle type values"));
305 // reset all values of default vehicle type
306 for (const auto& attrProperty : myTypeFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(SUMO_TAG_VTYPE)->getTagProperty()->getAttributeProperties()) {
307 // change all attributes with "" to reset it (except ID and vClass)
308 if ((attrProperty->getAttr() != SUMO_ATTR_ID) && (attrProperty->getAttr() != SUMO_ATTR_VCLASS)) {
309 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(attrProperty->getAttr(), "", myTypeFrameParent->myViewNet->getUndoList());
310 }
311 }
312 // change manually VClass (because it depends of Default VType)
313 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_VTYPE_ID) {
314 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PASSENGER), myTypeFrameParent->myViewNet->getUndoList());
315 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_BIKETYPE_ID) {
316 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_BICYCLE), myTypeFrameParent->myViewNet->getUndoList());
317 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_TAXITYPE_ID) {
318 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_TAXI), myTypeFrameParent->myViewNet->getUndoList());
319 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_RAILTYPE_ID) {
320 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_RAIL), myTypeFrameParent->myViewNet->getUndoList());
321 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_PEDTYPE_ID) {
322 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PEDESTRIAN), myTypeFrameParent->myViewNet->getUndoList());
323 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_CONTAINERTYPE_ID) {
324 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PEDESTRIAN), myTypeFrameParent->myViewNet->getUndoList());
325 }
326 // change special attribute GNE_ATTR_DEFAULT_VTYPE_MODIFIED
327 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(GNE_ATTR_DEFAULT_VTYPE_MODIFIED, "false", myTypeFrameParent->myViewNet->getUndoList());
328 // finish reset default vehicle type values
329 myTypeFrameParent->getViewNet()->getUndoList()->end();
330 // refresh TypeSelector
331 myTypeFrameParent->myTypeSelector->refreshTypeSelector(true);
332}
333
334
335void
337 // show question dialog if vtype has already assigned vehicles
338 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size() > 0) {
339 // declare title and info
340 std::string title = TLF("remove % '%'", toString(SUMO_TAG_VTYPE), myTypeFrameParent->myTypeSelector->getCurrentType()->getID());
341 std::string info;
342 const std::string numChildren = toString(myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size());
343 // continue depending of plural
344 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size() == 1) {
345 info = TLF("Delete % '%' will remove one vehicle. Continue?", toString(SUMO_TAG_VTYPE), myTypeFrameParent->myTypeSelector->getCurrentType()->getID());
346 } else {
347 info = TLF("Delete % '%' will remove % vehicles. Continue?", toString(SUMO_TAG_VTYPE), myTypeFrameParent->myTypeSelector->getCurrentType()->getID(), numChildren);
348 }
349 // Ask confirmation to user
350 const GNEQuestionBasicDialog questionDialog(myTypeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows(),
351 GNEDialog::Buttons::YES_NO, title, info);
352 // continue depending of answer
353 if (questionDialog.getResult() == GNEDialog::Result::ACCEPT) {
354 // begin undo list operation
355 myTypeFrameParent->myViewNet->getUndoList()->begin(myTypeFrameParent->myTypeSelector->getCurrentType(), ("delete vehicle type"));
356 // remove vehicle type (and all of their children)
357 myTypeFrameParent->myViewNet->getNet()->deleteDemandElement(myTypeFrameParent->myTypeSelector->getCurrentType(),
358 myTypeFrameParent->myViewNet->getUndoList());
359 // end undo list operation
360 myTypeFrameParent->myViewNet->getUndoList()->end();
361 }
362 } else {
363 // begin undo list operation
364 myTypeFrameParent->myViewNet->getUndoList()->begin(myTypeFrameParent->myTypeSelector->getCurrentType(), ("delete vehicle type"));
365 // remove vehicle type (and all of their children)
366 myTypeFrameParent->myViewNet->getNet()->deleteDemandElement(myTypeFrameParent->myTypeSelector->getCurrentType(),
367 myTypeFrameParent->myViewNet->getUndoList());
368 // end undo list operation
369 myTypeFrameParent->myViewNet->getUndoList()->end();
370 }
371}
372
373// ---------------------------------------------------------------------------
374// GNETypeFrame - methods
375// ---------------------------------------------------------------------------
376
378 GNEFrame(viewParent, viewNet, TL("Types")) {
379
380 // create module for edit vehicle types (Create, copy, etc.)
381 myTypeEditor = new TypeEditor(this);
382
383 // create vehicle type selector
384 myTypeSelector = new TypeSelector(this);
385
386 // Create vehicle type attributes editor
388
389 // set "VTYPE_DEFAULT" as default vehicle Type
390 myTypeSelector->setCurrentType(myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID));
391}
392
393
395
396
397void
399 // refresh vehicle type and Attribute Editor
400 myTypeSelector->refreshTypeSelector(true);
401 // show modules
402 myTypeAttributesEditor->showAttributesEditor(myTypeSelector->getCurrentType(), true);
403 // show frame
405}
406
407
412
413
414void
416 // after changing an attribute myTypeSelector, we need to update the list of typeSelector, because ID could be changed
417 myTypeSelector->refreshTypeSelector(false);
418 //... and typeEditor (due reset)
419 myTypeEditor->refreshTypeEditorModule();
420}
421
422/****************************************************************************/
FXDEFMAP(GNETypeFrame::TypeSelector) typeSelectorMap[]
@ MID_GNE_DELETE
delete element
@ MID_GNE_COPY
copy element
@ MID_GNE_CREATE
create element
@ MID_GNE_SET_TYPE
used to select a type of element in a combo box
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButton
Definition GUIDesigns.h:100
#define GUIDesignComboBox
Definition GUIDesigns.h:295
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:64
#define GUIDesignTextColorBlack
black color (for correct text)
Definition GUIDesigns.h:38
@ MODEDELETE
Definition GUIIcons.h:367
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
const std::string DEFAULT_TAXITYPE_ID
const std::string DEFAULT_RAILTYPE_ID
const std::string DEFAULT_PEDTYPE_ID
const std::set< std::string > DEFAULT_VTYPES
const std::string DEFAULT_VTYPE_ID
const std::string DEFAULT_CONTAINERTYPE_ID
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_TAXI
vehicle is a taxi
@ SVC_PEDESTRIAN
pedestrian
const std::string DEFAULT_BIKETYPE_ID
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ GNE_ATTR_DEFAULT_VTYPE
Flag to check if VType is a default VType.
@ SUMO_ATTR_VCLASS
@ SUMO_ATTR_ID
@ GNE_ATTR_DEFAULT_VTYPE_MODIFIED
Flag to check if a default VType was modified.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
static T parse(const std::string &string)
parses a value of type T from string (used for basic types: int, double, bool, etc....
Result getResult() const
get result to indicate if this dialog was closed accepting or rejecting changes
GNEViewNet * myViewNet
FOX need this.
Definition GNEFrame.h:122
virtual void show()
show Frame
Definition GNEFrame.cpp:110
virtual void hide()
hide Frame
Definition GNEFrame.cpp:119
GNEFrame(GNEViewParent *viewParent, GNEViewNet *viewNet, const std::string &frameLabel)
Constructor.
Definition GNEFrame.cpp:42
GNEGroupBoxModule (based on FXGroupBox).
GNEGroupBoxModule(GNEFrame *frame, const std::string &text, const int options=Options::COLLAPSIBLE)
constructor for frames
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
void resetType()
reset type
long onCmdDeleteResetType(FXObject *, FXSelector, void *)
Called when "Delete/Reset Vehicle Type" button is clicked.
void deleteType()
delete type
void showTypeEditorModule()
show TypeEditor modul
FXButton * myCreateTypeButton
"create vehicle type" button
long onCmdCreateType(FXObject *, FXSelector, void *)
FXButton * myDeleteResetTypeButton
"delete/reset vehicle type" button
GNETypeFrame * myTypeFrameParent
pointer to vehicle type Frame Parent
FXButton * myCopyTypeButton
"copy vehicle type"
TypeEditor(GNETypeFrame *typeFrameParent)
FOX-declaration.
void hideTypeEditorModule()
hide TypeEditor box
void refreshTypeEditorModule()
update TypeEditor modul
long onCmdCopyType(FXObject *, FXSelector, void *)
Called when "Copy Vehicle Type" button is clicked.
TypeSelector(GNETypeFrame *typeFrameParent)
FOX-declaration.
void setCurrentType(GNEDemandElement *vType)
set current Vehicle Type
GNETypeFrame * myTypeFrameParent
pointer to Frame Parent
MFXComboBoxIcon * myTypeComboBox
comboBox with the list of vTypes
GNEDemandElement * myCurrentType
pointer to current vehicle type
long onCmdSelectItem(FXObject *, FXSelector, void *)
Called when the user select another element in ComboBox.
void refreshTypeSelector(const bool updateModuls)
refresh vehicle type selector
GNEDemandElement * getCurrentType() const
get current Vehicle Type
void show()
show Frame
GNETypeFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor.
TypeSelector * getTypeSelector() const
get vehicle type selector
GNEAttributesEditor * myTypeAttributesEditor
editorinternal vehicle type attributes
TypeEditor * myTypeEditor
Vehicle Type editor (Create, copy, etc.).
~GNETypeFrame()
Destructor.
TypeSelector * myTypeSelector
vehicle type selector
void attributeUpdated(SumoXMLAttr attribute)
function called after set a valid attribute in AttributeCreator/AttributeEditor/ParametersEditor/....
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
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon