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
21#include <netedit/GNENet.h>
23#include <netedit/GNEUndoList.h>
29
30#include "GNETypeFrame.h"
31
32#define TEMPORAL_FILENAME std::string()
33
34// ===========================================================================
35// FOX callback mapping
36// ===========================================================================
37
41
47
48// Object implementation
49FXIMPLEMENT(GNETypeFrame::TypeSelector, MFXGroupBoxModule, typeSelectorMap, ARRAYNUMBER(typeSelectorMap))
50FXIMPLEMENT(GNETypeFrame::TypeEditor, MFXGroupBoxModule, typeEditorMap, ARRAYNUMBER(typeEditorMap))
51
52// ===========================================================================
53// method definitions
54// ===========================================================================
55
56// ---------------------------------------------------------------------------
57// GNETypeFrame::TypeSelector - methods
58// ---------------------------------------------------------------------------
59
61 MFXGroupBoxModule(typeFrameParent, TL("Current Type")),
62 myTypeFrameParent(typeFrameParent),
63 myCurrentType(nullptr) {
64 // Create MFXComboBoxIcon
65 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), GUIDesignComboBoxNCol, true, GUIDesignComboBoxVisibleItems,
67 // add default Types (always first)
68 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
69 if (DEFAULT_VTYPES.count(vType.second->getID()) != 0) {
70 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon(), FXRGB(255, 255, 200));
71 }
72 }
73 // fill myTypeMatchBox with list of VTypes IDs
74 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
75 if (DEFAULT_VTYPES.count(vType.second->getID()) == 0) {
76 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon());
77 }
78 }
79 // set DEFAULT_VEHTYPE as default VType
80 myCurrentType = myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID);
81 myTypeComboBox->setCurrentItem(myTypeComboBox->findItem(DEFAULT_VTYPE_ID.c_str()));
82 // TypeSelector is always shown
83 show();
84}
85
86
88
89
94
95
96void
98 myCurrentType = vType;
99 refreshTypeSelector(true);
100}
101
102
103void
105 bool valid = false;
106 // clear items
107 myTypeComboBox->clearItems();
108 // add default Vehicle an Bike types in the first and second positions
109 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
110 if (DEFAULT_VTYPES.count(vType.second->getID()) != 0) {
111 myTypeComboBox->appendIconItem(vType.second->getID().c_str(), vType.second->getACIcon(), FXRGB(255, 255, 200));
112 }
113 }
114 // fill myTypeMatchBox with list of VTypes IDs sorted by ID
115 std::map<std::string, GNEDemandElement*> types;
116 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
117 if (DEFAULT_VTYPES.count(vType.second->getID()) == 0) {
118 types[vType.second->getID()] = vType.second;
119 }
120 }
121 for (const auto& vType : types) {
122 myTypeComboBox->appendIconItem(vType.first.c_str(), vType.second->getACIcon());
123 }
124 // make sure that tag is in myTypeMatchBox
125 if (myCurrentType) {
126 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
127 if (myTypeComboBox->getItemText(i) == myCurrentType->getID()) {
128 myTypeComboBox->setCurrentItem(i);
129 valid = true;
130 }
131 }
132 }
133 // Check that give vType type is valid
134 if (!valid) {
135 // set DEFAULT_VEHTYPE as default VType
136 myCurrentType = myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(SUMO_TAG_VTYPE, DEFAULT_VTYPE_ID);
137 // refresh myTypeMatchBox again
138 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
139 if (myTypeComboBox->getItemText(i) == myCurrentType->getID()) {
140 myTypeComboBox->setCurrentItem(i);
141 }
142 }
143 }
144 // check if update other moduls
145 if (updateModuls) {
146 // refresh vehicle type editor module
147 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
148 // show modules
149 myTypeFrameParent->myTypeAttributesEditor->showAttributesEditor(myCurrentType, true);
150 }
151}
152
153
154long
155GNETypeFrame::TypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
156 // Check if value of myTypeMatchBox correspond of an allowed additional tags
157 for (const auto& vType : myTypeFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE)) {
158 if (vType.second->getID() == myTypeComboBox->getText().text()) {
159 // set pointer
160 myCurrentType = vType.second;
161 // set color of myTypeMatchBox to black (valid)
162 myTypeComboBox->setTextColor(FXRGB(0, 0, 0));
163 // refresh vehicle type editor module
164 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
165 // show modules if selected item is valid
166 myTypeFrameParent->myTypeAttributesEditor->showAttributesEditor(myCurrentType, true);
167 // update viewNet
168 myTypeFrameParent->getViewNet()->updateViewNet();
169 return 1;
170 }
171 }
172 myCurrentType = nullptr;
173 // refresh vehicle type editor module
174 myTypeFrameParent->myTypeEditor->refreshTypeEditorModule();
175 // hide all modules if selected item isn't valid
176 myTypeFrameParent->myTypeAttributesEditor->hideAttributesEditor();
177 // set color of myTypeMatchBox to red (invalid)
178 myTypeComboBox->setTextColor(FXRGB(255, 0, 0));
179 // update viewNet
180 myTypeFrameParent->getViewNet()->updateViewNet();
181 return 1;
182}
183
184// ---------------------------------------------------------------------------
185// GNETypeFrame::TypeEditor - methods
186// ---------------------------------------------------------------------------
187
189 MFXGroupBoxModule(typeFrameParent, TL("Type Editor")),
190 myTypeFrameParent(typeFrameParent) {
191 // Create new vehicle type
193 // Create delete/reset vehicle type
195 // Create copy vehicle type
197}
198
199
201
202
203void
205 refreshTypeEditorModule();
206 show();
207}
208
209
210void
214
215
216void
218 // first check if selected VType is valid
219 if (myTypeFrameParent->myTypeSelector->getCurrentType() == nullptr) {
220 // disable buttons
221 myDeleteResetTypeButton->disable();
222 myCopyTypeButton->disable();
223 } else if (GNEAttributeCarrier::parse<bool>(myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(GNE_ATTR_DEFAULT_VTYPE))) {
224 // enable copy button
225 myCopyTypeButton->enable();
226 // enable and set myDeleteTypeButton as "reset")
227 myDeleteResetTypeButton->setText(TL("Reset Type"));
228 myDeleteResetTypeButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::RESET));
229 // check if reset default vehicle type button has to be enabled or disabled
230 if (GNEAttributeCarrier::parse<bool>(myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(GNE_ATTR_DEFAULT_VTYPE_MODIFIED))) {
231 myDeleteResetTypeButton->enable();
232 } else {
233 myDeleteResetTypeButton->disable();
234 }
235 } else {
236 // enable copy button
237 myCopyTypeButton->enable();
238 // enable and set myDeleteTypeButton as "delete")
239 myDeleteResetTypeButton->setText(TL("Delete Type"));
240 myDeleteResetTypeButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::MODEDELETE));
241 myDeleteResetTypeButton->enable();
242 }
243 // update module
244 recalc();
245}
246
247
248long
249GNETypeFrame::TypeEditor::onCmdCreateType(FXObject*, FXSelector, void*) {
250 // obtain a new valid Type ID
251 const std::string typeID = myTypeFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_VTYPE);
252 // create new vehicle type
253 GNEDemandElement* type = new GNEVType(typeID, myTypeFrameParent->myViewNet->getNet(), TEMPORAL_FILENAME);
254 // add it using undoList (to allow undo-redo)
255 myTypeFrameParent->myViewNet->getUndoList()->begin(type, TL("create vehicle type"));
256 myTypeFrameParent->myViewNet->getUndoList()->add(new GNEChange_DemandElement(type, true), true);
257 myTypeFrameParent->myViewNet->getUndoList()->end();
258 // set created vehicle type in selector
259 myTypeFrameParent->myTypeSelector->setCurrentType(type);
260 return 1;
261}
262
263
264long
266 // continue depending of current mode
267 if (myDeleteResetTypeButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::MODEDELETE)) {
268 deleteType();
269 } else {
270 resetType();
271 }
272 return 1;
273}
274
275
276long
277GNETypeFrame::TypeEditor::onCmdCopyType(FXObject*, FXSelector, void*) {
278 // obtain a new valid Type ID
279 const std::string typeID = myTypeFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateDemandElementID(SUMO_TAG_VTYPE);
280 // obtain vehicle type in which new Type will be based
281 GNEVType* vType = dynamic_cast<GNEVType*>(myTypeFrameParent->myTypeSelector->getCurrentType());
282 // check that vType exist
283 if (vType) {
284 // create a new Type based on the current selected vehicle type
285 GNEDemandElement* typeCopy = new GNEVType(typeID, myTypeFrameParent->myViewNet->getNet(), vType);
286 // begin undo list operation
287 myTypeFrameParent->myViewNet->getUndoList()->begin(typeCopy, TL("copy vehicle type"));
288 // add it using undoList (to allow undo-redo)
289 myTypeFrameParent->myViewNet->getUndoList()->add(new GNEChange_DemandElement(typeCopy, true), true);
290 // end undo list operation
291 myTypeFrameParent->myViewNet->getUndoList()->end();
292 // set created vehicle type in selector
293 myTypeFrameParent->myTypeSelector->setCurrentType(typeCopy);
294 }
295 return 1;
296}
297
298
299void
301 // begin reset default vehicle type values
302 myTypeFrameParent->getViewNet()->getUndoList()->begin(GUIIcon::VTYPE, TL("reset default vehicle type values"));
303 // reset all values of default vehicle type
304 for (const auto& attrProperty : myTypeFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(SUMO_TAG_VTYPE)->getTagProperty()->getAttributeProperties()) {
305 // change all attributes with "" to reset it (except ID and vClass)
306 if ((attrProperty->getAttr() != SUMO_ATTR_ID) && (attrProperty->getAttr() != SUMO_ATTR_VCLASS)) {
307 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(attrProperty->getAttr(), "", myTypeFrameParent->myViewNet->getUndoList());
308 }
309 }
310 // change manually VClass (because it depends of Default VType)
311 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_VTYPE_ID) {
312 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PASSENGER), myTypeFrameParent->myViewNet->getUndoList());
313 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_BIKETYPE_ID) {
314 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_BICYCLE), myTypeFrameParent->myViewNet->getUndoList());
315 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_TAXITYPE_ID) {
316 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_TAXI), myTypeFrameParent->myViewNet->getUndoList());
317 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_RAILTYPE_ID) {
318 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_RAIL), myTypeFrameParent->myViewNet->getUndoList());
319 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_PEDTYPE_ID) {
320 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PEDESTRIAN), myTypeFrameParent->myViewNet->getUndoList());
321 } else if (myTypeFrameParent->myTypeSelector->getCurrentType()->getAttribute(SUMO_ATTR_ID) == DEFAULT_CONTAINERTYPE_ID) {
322 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(SUMO_ATTR_VCLASS, toString(SVC_PEDESTRIAN), myTypeFrameParent->myViewNet->getUndoList());
323 }
324 // change special attribute GNE_ATTR_DEFAULT_VTYPE_MODIFIED
325 myTypeFrameParent->myTypeSelector->getCurrentType()->setAttribute(GNE_ATTR_DEFAULT_VTYPE_MODIFIED, "false", myTypeFrameParent->myViewNet->getUndoList());
326 // finish reset default vehicle type values
327 myTypeFrameParent->getViewNet()->getUndoList()->end();
328 // refresh TypeSelector
329 myTypeFrameParent->myTypeSelector->refreshTypeSelector(true);
330}
331
332
333void
335 // show question dialog if vtype has already assigned vehicles
336 if (myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size() > 0) {
337 std::string plural = myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size() == 1 ? ("") : ("s");
338 // Ask confirmation to user
339 FXuint answer = FXMessageBox::question(getApp(), MBOX_YES_NO,
340 ("Remove " + toString(SUMO_TAG_VTYPE) + "s").c_str(), "%s",
341 ("Delete " + toString(SUMO_TAG_VTYPE) + " '" + myTypeFrameParent->myTypeSelector->getCurrentType()->getID() +
342 "' will remove " + toString(myTypeFrameParent->myTypeSelector->getCurrentType()->getChildDemandElements().size()) +
343 " vehicle" + plural + ". Continue?").c_str());
344 if (answer == 1) { // 1:yes, 2:no, 4:esc
345 // begin undo list operation
346 myTypeFrameParent->myViewNet->getUndoList()->begin(myTypeFrameParent->myTypeSelector->getCurrentType(), ("delete vehicle type"));
347 // remove vehicle type (and all of their children)
348 myTypeFrameParent->myViewNet->getNet()->deleteDemandElement(myTypeFrameParent->myTypeSelector->getCurrentType(),
349 myTypeFrameParent->myViewNet->getUndoList());
350 // end undo list operation
351 myTypeFrameParent->myViewNet->getUndoList()->end();
352 }
353 } else {
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}
363
364// ---------------------------------------------------------------------------
365// GNETypeFrame - methods
366// ---------------------------------------------------------------------------
367
369 GNEFrame(viewParent, viewNet, TL("Types")) {
370
371 // create module for edit vehicle types (Create, copy, etc.)
372 myTypeEditor = new TypeEditor(this);
373
374 // create vehicle type selector
375 myTypeSelector = new TypeSelector(this);
376
377 // Create vehicle type attributes editor
379
380 // set "VTYPE_DEFAULT" as default vehicle Type
382}
383
384
386
387
388void
390 // refresh vehicle type and Attribute Editor
392 // show modules
394 // show frame
396}
397
398
403
404
405void
407 // after changing an attribute myTypeSelector, we need to update the list of typeSelector, because ID could be changed
409 //... and typeEditor (due reset)
411}
412
413/****************************************************************************/
#define TEMPORAL_FILENAME
FXDEFMAP(GNETypeFrame::TypeSelector) typeSelectorMap[]
@ MID_GNE_DELETE
delete element
Definition GUIAppEnum.h:995
@ MID_GNE_COPY
copy element
@ MID_GNE_CREATE
create element
Definition GUIAppEnum.h:993
@ MID_GNE_SET_TYPE
used to select a type of element in a combo box
#define GUIDesignButton
Definition GUIDesigns.h:82
#define GUIDesignComboBox
Definition GUIDesigns.h:293
#define GUIDesignComboBoxNCol
number of column of every combo box
Definition GUIDesigns.h:311
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:49
GLenum myCurrentType
#define TL(string)
Definition MsgHandler.h:305
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
void showAttributesEditor(GNEAttributeCarrier *AC, const bool primaryAttributeEditor)
edit attributes of the given AC (usually the edited template AC)
GNEViewNet * myViewNet
FOX need this.
Definition GNEFrame.h:121
virtual void show()
show Frame
Definition GNEFrame.cpp:120
virtual void hide()
hide Frame
Definition GNEFrame.cpp:129
GNEDemandElement * retrieveDemandElement(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named demand element.
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:147
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
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.
void setCurrentType(GNEDemandElement *vType)
set 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/....
GNENet * getNet() const
get the net object
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)