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-2025 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#define TEMPORAL_FILENAME std::string()
36
37// ===========================================================================
38// FOX callback mapping
39// ===========================================================================
40
44
50
51// Object implementation
52FXIMPLEMENT(GNETypeFrame::TypeSelector, MFXGroupBoxModule, typeSelectorMap, ARRAYNUMBER(typeSelectorMap))
53FXIMPLEMENT(GNETypeFrame::TypeEditor, MFXGroupBoxModule, typeEditorMap, ARRAYNUMBER(typeEditorMap))
54
55// ===========================================================================
56// method definitions
57// ===========================================================================
58
59// ---------------------------------------------------------------------------
60// GNETypeFrame::TypeSelector - methods
61// ---------------------------------------------------------------------------
62
64 MFXGroupBoxModule(typeFrameParent, TL("Current Type")),
65 myTypeFrameParent(typeFrameParent),
66 myCurrentType(nullptr) {
67 // Create MFXComboBoxIcon
68 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), typeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
70 // add default Types (always first)
71 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
72 if (DEFAULT_VTYPES.count(vType.second->getID()) != 0) {
73 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon(), FXRGB(255, 255, 200));
74 }
75 }
76 // fill myTypeMatchBox with list of VTypes IDs
77 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
78 if (DEFAULT_VTYPES.count(vType.second->getID()) == 0) {
79 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon());
80 }
81 }
82 // set DEFAULT_VEHTYPE as default VType
83 myCurrentType = myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID);
84 myTypeComboBox->setCurrentItem(myTypeComboBox->findItem(DEFAULT_VTYPE_ID.c_str()));
85 // TypeSelector is always shown
86 show();
87}
88
89
91
92
97
98
99void
104
105
106void
108 bool valid = false;
109 // clear items
110 myTypeComboBox->clearItems();
111 // add default Vehicle an Bike types in the first and second positions
112 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
113 if (DEFAULT_VTYPES.count(vType.second->getID()) != 0) {
114 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon(), FXRGB(255, 255, 200));
115 }
116 }
117 // fill myTypeMatchBox with list of VTypes IDs sorted by ID
118 std::map<std::string, GNEDemandElement*> types;
119 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
120 if (DEFAULT_VTYPES.count(vType.second->getID()) == 0) {
121 types[vType.second->getID()] = vType.second;
122 }
123 }
124 for (const auto& vType : types) {
125 myTypeComboBox->appendIconItem(vType.first.c_str(), vType.second->getACIcon());
126 }
127 // make sure that tag is in myTypeMatchBox
128 if (myCurrentType) {
129 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
130 if (myTypeComboBox->getItemText(i) == myCurrentType->getID()) {
131 myTypeComboBox->setCurrentItem(i);
132 valid = true;
133 }
134 }
135 }
136 // Check that give vType type is valid
137 if (!valid) {
138 // set DEFAULT_VEHTYPE as default VType
139 myCurrentType = myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID);
140 // refresh myTypeMatchBox again
141 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
142 if (myTypeComboBox->getItemText(i) == myCurrentType->getID()) {
143 myTypeComboBox->setCurrentItem(i);
144 }
145 }
146 }
147 // check if update other moduls
148 if (updateModuls) {
149 // refresh vehicle type editor module
150 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
151 // show modules
152 myTypeFrameParent->myTypeAttributesEditor->showAttributesEditor(myCurrentType, true);
153 }
154}
155
156
157long
158GNETypeFrame::TypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
159 // Check if value of myTypeMatchBox correspond of an allowed additional tags
160 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
161 if (vType.second->getID() == myTypeComboBox->getText().text()) {
162 // set pointer
163 myCurrentType = vType.second;
164 // set color of myTypeMatchBox to black (valid)
166 // refresh vehicle type editor module
167 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
168 // show modules if selected item is valid
169 myTypeFrameParent->myTypeAttributesEditor->showAttributesEditor(myCurrentType, true);
170 // update viewNet
171 myTypeFrameParent->getViewNet()->updateViewNet();
172 return 1;
173 }
174 }
175 myCurrentType = nullptr;
176 // refresh vehicle type editor module
177 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
178 // hide all modules if selected item isn't valid
179 myTypeFrameParent->myTypeAttributesEditor->hideAttributesEditor();
180 // set color of myTypeMatchBox to red (invalid)
182 // update viewNet
183 myTypeFrameParent->getViewNet()->updateViewNet();
184 return 1;
185}
186
187// ---------------------------------------------------------------------------
188// GNETypeFrame::TypeEditor - methods
189// ---------------------------------------------------------------------------
190
192 MFXGroupBoxModule(typeFrameParent, TL("Type Editor")),
193 myTypeFrameParent(typeFrameParent) {
194 // Create new vehicle type
196 // Create delete/reset vehicle type
198 // Create copy vehicle type
200}
201
202
204
205
206void
211
212
213void
217
218
219void
221 // first check if selected VType is valid
222 if (myTypeFrameParent->myTypeSelector->getCurrentType() == nullptr) {
223 // disable buttons
224 myDeleteResetTypeButton->disable();
225 myCopyTypeButton->disable();
226 } else if (GNEAttributeCarrier::parse<bool>(myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(GNE_ATTR_DEFAULT_VTYPE))) {
227 // enable copy button
228 myCopyTypeButton->enable();
229 // enable and set myDeleteTypeButton as "reset")
230 myDeleteResetTypeButton->setText(TL("Reset Type"));
232 // check if reset default vehicle type button has to be enabled or disabled
233 if (GNEAttributeCarrier::parse<bool>(myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(GNE_ATTR_DEFAULT_VTYPE_MODIFIED))) {
234 myDeleteResetTypeButton->enable();
235 } else {
236 myDeleteResetTypeButton->disable();
237 }
238 } else {
239 // enable copy button
240 myCopyTypeButton->enable();
241 // enable and set myDeleteTypeButton as "delete")
242 myDeleteResetTypeButton->setText(TL("Delete Type"));
244 myDeleteResetTypeButton->enable();
245 }
246 // update module
247 recalc();
248}
249
250
251long
252GNETypeFrame::TypeEditor::onCmdCreateType(FXObject*, FXSelector, void*) {
253 // obtain a new valid Type ID
254 const std::string typeID = myTypeFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_VTYPE);
255 // create new vehicle type
256 GNEDemandElement* type = new GNEVType(typeID, myTypeFrameParent->myViewNet->getNet(), TEMPORAL_FILENAME);
257 // add it using undoList (to allow undo-redo)
258 myTypeFrameParent->myViewNet->getUndoList()->begin(type, TL("create vehicle type"));
259 myTypeFrameParent->myViewNet->getUndoList()->add(new GNEChange_DemandElement(type, true), true);
260 myTypeFrameParent->myViewNet->getUndoList()->end();
261 // set created vehicle type in selector
262 myTypeFrameParent->myTypeSelector->setCurrentType(type);
263 return 1;
264}
265
266
267long
269 // continue depending of current mode
271 deleteType();
272 } else {
273 resetType();
274 }
275 return 1;
276}
277
278
279long
280GNETypeFrame::TypeEditor::onCmdCopyType(FXObject*, FXSelector, void*) {
281 // obtain a new valid Type ID
282 const std::string typeID = myTypeFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_VTYPE);
283 // obtain vehicle type in which new Type will be based
284 GNEVType* vType = dynamic_cast<GNEVType*>(myTypeFrameParent->myTypeSelector->getCurrentType());
285 // check that vType exist
286 if (vType) {
287 // create a new Type based on the current selected vehicle type
288 GNEDemandElement* typeCopy = new GNEVType(typeID, myTypeFrameParent->myViewNet->getNet(), vType);
289 // begin undo list operation
290 myTypeFrameParent->myViewNet->getUndoList()->begin(typeCopy, TL("copy vehicle type"));
291 // add it using undoList (to allow undo-redo)
292 myTypeFrameParent->myViewNet->getUndoList()->add(new GNEChange_DemandElement(typeCopy, true), true);
293 // end undo list operation
294 myTypeFrameParent->myViewNet->getUndoList()->end();
295 // set created vehicle type in selector
296 myTypeFrameParent->myTypeSelector->setCurrentType(typeCopy);
297 }
298 return 1;
299}
300
301
302void
304 // begin reset default vehicle type values
305 myTypeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::VTYPE, TL("reset default vehicle type values"));
306 // reset all values of default vehicle type
307 for (const auto& attrProperty : myTypeFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(SUMO_TAG_VTYPE)->getTagProperty()->getAttributeProperties()) {
308 // change all attributes with "" to reset it (except ID and vClass)
309 if ((attrProperty->getAttr() != SUMO_ATTR_ID) && (attrProperty->getAttr() != SUMO_ATTR_VCLASS)) {
310 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(attrProperty->getAttr(), "", myTypeFrameParent->myViewNet->getUndoList());
311 }
312 }
313 // change manually VClass (because it depends of Default VType)
314 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_VTYPE_ID) {
315 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PASSENGER), myTypeFrameParent->myViewNet->getUndoList());
316 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_BIKETYPE_ID) {
317 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_BICYCLE), myTypeFrameParent->myViewNet->getUndoList());
318 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_TAXITYPE_ID) {
319 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_TAXI), myTypeFrameParent->myViewNet->getUndoList());
320 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_RAILTYPE_ID) {
321 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_RAIL), myTypeFrameParent->myViewNet->getUndoList());
322 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_PEDTYPE_ID) {
323 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PEDESTRIAN), myTypeFrameParent->myViewNet->getUndoList());
324 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_CONTAINERTYPE_ID) {
325 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PEDESTRIAN), myTypeFrameParent->myViewNet->getUndoList());
326 }
327 // change special attribute GNE_ATTR_DEFAULT_VTYPE_MODIFIED
328 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(GNE_ATTR_DEFAULT_VTYPE_MODIFIED, "false", myTypeFrameParent->myViewNet->getUndoList());
329 // finish reset default vehicle type values
330 myTypeFrameParent->getViewNet()->getUndoList()->end();
331 // refresh TypeSelector
332 myTypeFrameParent->myTypeSelector->refreshTypeSelector(true);
333}
334
335
336void
338 // show question dialog if vtype has already assigned vehicles
339 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size() > 0) {
340 // declare title and info
341 std::string title = TLF("remove % '%'", toString(SUMO_TAG_VTYPE), myTypeFrameParent->myTypeSelector->getCurrentType()->getID());
342 std::string info;
343 const std::string numChildren = toString(myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size());
344 // continue depending of plural
345 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size() == 1) {
346 info = TLF("Delete % '%' will remove one vehicle. Continue?", toString(SUMO_TAG_VTYPE), myTypeFrameParent->myTypeSelector->getCurrentType()->getID());
347 } else {
348 info = TLF("Delete % '%' will remove % vehicles. Continue?", toString(SUMO_TAG_VTYPE), myTypeFrameParent->myTypeSelector->getCurrentType()->getID(), numChildren);
349 }
350 // Ask confirmation to user
351 const auto questionDialog = GNEQuestionBasicDialog(myTypeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows(), 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/****************************************************************************/
#define TEMPORAL_FILENAME
FXDEFMAP(GNETypeFrame::TypeSelector) typeSelectorMap[]
@ MID_GNE_DELETE
delete element
Definition GUIAppEnum.h:997
@ MID_GNE_COPY
copy element
@ MID_GNE_CREATE
create element
Definition GUIAppEnum.h:995
@ 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:365
#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:46
static T parse(const std::string &string)
parses a value of type T from string (used for basic types: int, double, bool, etc....
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
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
MFXGroupBoxModule (based on FXGroupBox).
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
MFXGroupBoxModule(GNEFrame *frame, const std::string &text, const int options=Options::COLLAPSIBLE)
constructor for frames