Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEMeanDataFrame.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 meanData elements
19/****************************************************************************/
20
25#include <netedit/GNENet.h>
27#include <netedit/GNEUndoList.h>
28#include <netedit/GNEViewNet.h>
32
33#include "GNEMeanDataFrame.h"
34
35// ===========================================================================
36// FOX callback mapping
37// ===========================================================================
38
42
48
52
53// Object implementation
54FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, GNEGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))
55FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, GNEGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))
56FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, GNEGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))
57
58
59// ===========================================================================
60// method definitions
61// ===========================================================================
62
63// ---------------------------------------------------------------------------
64// GNEMeanDataFrame::MeanDataTypeSelector - methods
65// ---------------------------------------------------------------------------
66
68 GNEGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),
69 myMeanDataFrameParent(meanDataFrameParent) {
70 // Create MFXComboBoxIcon
71 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), meanDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
73 // add mean data types
74 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
75 for (const auto& meanDataType : tagPropertiesMeanDatas) {
76 myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
77 }
78 // set DEFAULT_VEHTYPE as default VType
79 myCurrentMeanData = tagPropertiesMeanDatas.front();
80 // MeanDataTypeSelector is always shown
81 show();
82}
83
84
86
87
90 return myCurrentMeanData;
91}
92
93
94void
96 // clear items
97 myTypeComboBox->clearItems();
98 // add mean data types
99 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
100 for (const auto& meanDataType : tagPropertiesMeanDatas) {
101 myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
102 }
103 // make sure that tag is in myTypeMatchBox
104 if (myCurrentMeanData != nullptr) {
105 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
106 if (myTypeComboBox->getItemText(i) == myCurrentMeanData->getTagStr()) {
107 myTypeComboBox->setCurrentItem(i);
108 }
109 }
110 } else {
111 myCurrentMeanData = tagPropertiesMeanDatas.front();
112 }
113 // refresh meanData editor module
114 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
115 // show modules
116 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
117 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
118}
119
120
121long
123 // add mean data types
124 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
125 // Check if value of myTypeMatchBox correspond of an allowed additional tags
126 for (const auto& meanDataType : tagPropertiesMeanDatas) {
127 if (meanDataType->getTagStr() == myTypeComboBox->getText().text()) {
128 // set pointer
129 myCurrentMeanData = meanDataType;
130 // set color of myTypeMatchBox to black (valid)
131 myTypeComboBox->setTextColor(GUIDesignTextColorBlack);
132 // refresh meanData editor module
133 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
134 // show modules if selected item is valid
135 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
136 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
137 return 1;
138 }
139 }
140 myCurrentMeanData = nullptr;
141 // refresh meanData editor module
142 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
143 // hide all modules if selected item isn't valid
144 myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();
145 myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();
146 // set color of myTypeMatchBox to red (invalid)
147 myTypeComboBox->setTextColor(GUIDesignTextColorRed);
148 return 1;
149}
150
151// ---------------------------------------------------------------------------
152// GNEMeanDataFrame::MeanDataEditor - methods
153// ---------------------------------------------------------------------------
154
156 GNEGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),
157 myMeanDataFrameParent(meanDataFrameParent) {
158 // Create new meanData
161 // Create delete/reset meanData
164 // Create copy meanData
167}
168
169
171
172
173void
175 refreshMeanDataEditorModule();
176 show();
177}
178
179
180void
184
185
186void
188 // first check if selected VMeanData is valid
189 if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {
190 // disable buttons
191 myDeleteMeanDataButton->disable();
192 myCopyMeanDataButton->disable();
193 } else {
194 // enable buttons
195 myDeleteMeanDataButton->enable();
196 myCopyMeanDataButton->enable();
197 }
198 // update module
199 recalc();
200}
201
202
203long
205 auto net = myMeanDataFrameParent->myViewNet->getNet();
206 // get current meanData type
207 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
208 // obtain a new valid MeanData ID
209 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
210 // create new meanData
211 GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag(), typeID,
212 net, net->getGNEApplicationWindow()->getFileBucketHandler()->getDefaultBucket(FileBucket::Type::MEANDATA));
213 // add it using undoList (to allow undo-redo)
214 net->getUndoList()->begin(meanData, "create meanData");
215 net->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);
216 net->getUndoList()->end();
217 // set created meanData in selector
218 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);
219 return 1;
220}
221
222
223long
225 // begin undo list operation
226 myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, "delete meanData");
227 // remove meanData (and all of their children)
228 myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),
229 myMeanDataFrameParent->myViewNet->getUndoList());
230 // end undo list operation
231 myMeanDataFrameParent->myViewNet->getUndoList()->end();
232 // set created meanData in selector
233 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
234 return 1;
235}
236
237
238long
240 // get current meanData type
241 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
242 // obtain a new valid MeanData ID
243 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
244 // obtain meanData in which new MeanData will be based
245 GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());
246 // check that meanData exist
247 if (meanData) {
248 // create a new MeanData based on the current selected meanData
249 GNEMeanData* meanDataCopy = new GNEMeanData(meanData->getTagProperty()->getTag(), typeID, myMeanDataFrameParent->myViewNet->getNet(),
250 meanData->getFileBucket());
251 // begin undo list operation
252 myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanDataCopy, "copy meanData");
253 // add it using undoList (to allow undo-redo)
254 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanDataCopy, true), true);
255 // end undo list operation
256 myMeanDataFrameParent->myViewNet->getUndoList()->end();
257 // refresh MeanData Selector (to show the new VMeanData)
258 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
259 // set created meanData in selector
260 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanDataCopy);
261 // refresh MeanData Editor Module
262 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
263 }
264 return 1;
265}
266
267// ---------------------------------------------------------------------------
268// GNEMeanDataFrame::MeanDataSelector - methods
269// ---------------------------------------------------------------------------
270
272 GNEGroupBoxModule(typeFrameParent, TL("Current MeanData")),
273 myMeanDataFrameParent(typeFrameParent),
274 myCurrentMeanData(nullptr) {
275 // get current meanData type
277 // Create MFXComboBoxIcon
280 // add meanDatas
281 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
282 myMeanDataComboBox->appendIconItem(meanData.second->getID().c_str(), meanData.second->getACIcon());
283 }
284 if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {
286 } else {
287 myCurrentMeanData = nullptr;
288 }
289 // MeanDataSelector is always shown
290 show();
291}
292
293
295
296
297void
299 // refresh mean data selector
300 refreshMeanDataSelector(false);
301 // show
302 show();
303}
304
305
306void
308 // hide attributes editor
309 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
310 // hide
311 hide();
312}
313
314
317 return myCurrentMeanData;
318}
319
320
321void
323 myCurrentMeanData = vMeanData;
324 refreshMeanDataSelector(false);
325}
326
327
328void
330 // get current meanData type
331 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
332 // get mean datas sorted by ID
333 std::map<std::string, GNEMeanData*> sortedMeanDatas;
334 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
335 sortedMeanDatas[meanData.second->getID()] = meanData.second;
336 }
337 // clear items
338 myMeanDataComboBox->clearItems();
339 // fill myMeanDataMatchBox with meanDatas
340 for (const auto& sortedMeanData : sortedMeanDatas) {
341 myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());
342 }
343 // make sure that mean data exists
344 if (myCurrentMeanData && myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData->getTagProperty()->getTag(), myCurrentMeanData->getID(), false)) {
345 bool validMeanData = false;
346 for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {
347 if (myMeanDataComboBox->getItemText(i) == myCurrentMeanData->getID()) {
348 myMeanDataComboBox->setCurrentItem(i);
349 validMeanData = true;
350 }
351 }
352 if (!validMeanData) {
353 myCurrentMeanData = nullptr;
354 }
355 } else {
356 myCurrentMeanData = nullptr;
357 }
358 // check if enable or disable comboBox
359 if (sortedMeanDatas.size() > 0) {
360 myMeanDataComboBox->enable();
361 // check ifupdate myCurrentMeanData
362 if (myCurrentMeanData == nullptr) {
363 myCurrentMeanData = sortedMeanDatas.begin()->second;
364 }
365 } else {
366 myMeanDataComboBox->disable();
367 }
368 // refresh meanData editor module
369 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
370 // check if show attribute editor
371 if (!afterChangingID) {
372 if (myCurrentMeanData) {
373 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
374 } else {
375 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
376 }
377 }
378}
379
380
381void
383 if (myCurrentMeanData) {
384 myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());
385 }
386}
387
388
389long
391 // get current meanData type
392 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
393 // Check if value of myMeanDataMatchBox correspond of an allowed additional tags
394 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
395 if (meanData.second->getID() == myMeanDataComboBox->getText().text()) {
396 // set pointer
397 myCurrentMeanData = meanData.second;
398 // set color of myMeanDataMatchBox to black (valid)
399 myMeanDataComboBox->setTextColor(GUIDesignTextColorBlack);
400 // refresh meanData editor module
401 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
402 // show modules if selected item is valid
403 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
404 // update viewNet
405 myMeanDataFrameParent->getViewNet()->updateViewNet();
406 return 1;
407 }
408 }
409 myCurrentMeanData = nullptr;
410 // refresh meanData editor module
411 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
412 // hide all modules if selected item isn't valid
413 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
414 // set color of myMeanDataMatchBox to red (invalid)
415 myMeanDataComboBox->setTextColor(GUIDesignTextColorRed);
416 // update viewNet
417 myMeanDataFrameParent->getViewNet()->updateViewNet();
418 return 1;
419}
420
421// ---------------------------------------------------------------------------
422// GNEMeanDataFrame - methods
423// ---------------------------------------------------------------------------
424
426 GNEFrame(viewParent, viewNet, TL("MeanData")) {
427 // build meanData type selector
429 // build meanData editor
431 // build meanData selector
433 // build meanData attributes editor
435}
436
437
440
441
442void
444 // refresh meanData type selector
446 // show frame
448}
449
450
451void
453 // hide frame
455}
456
457
458void
464
465
466void
469
470/****************************************************************************/
FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[]
@ 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
@ MODEMEANDATA
#define TL(string)
Definition MsgHandler.h:304
SumoXMLTag
Numbers representing SUMO-XML - element names.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_ID
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
GNEViewNet * getViewNet() const
get view net
Definition GNEFrame.cpp:145
virtual void show()
show Frame
Definition GNEFrame.cpp:110
virtual void hide()
hide Frame
Definition GNEFrame.cpp:119
GNEGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
void hideMeanDataEditorModule()
hide MeanDataEditor box
void refreshMeanDataEditorModule()
update MeanDataEditor modul
FXButton * myCopyMeanDataButton
"copy meanData"
FXButton * myCreateMeanDataButton
"create meanData" button
long onCmdCopyMeanData(FXObject *, FXSelector, void *)
Called when "Copy Vehicle MeanData" button is clicked.
long onCmdCreateMeanData(FXObject *, FXSelector, void *)
MeanDataEditor(GNEMeanDataFrame *meanDataFrameParent)
FOX-declaration.
void showMeanDataEditorModule()
show MeanDataEditor modul
long onCmdDeletetMeanData(FXObject *, FXSelector, void *)
Called when "Delete Vehicle MeanData" button is clicked.
FXButton * myDeleteMeanDataButton
"delete meanData" button
void showMeanDataSelector()
show MeanDataSelector
void hideMeanDataSelector()
hide MeanDataSelector
GNEMeanData * myCurrentMeanData
pointer to current meanData
MeanDataSelector(GNEMeanDataFrame *typeFrameParent)
FOX-declaration.
GNEMeanData * getCurrentMeanData() const
get current Vehicle MeanData
void refreshMeanDataSelectorIDs()
refresh meanData selector (only IDs, without refreshing attributes)
MFXComboBoxIcon * myMeanDataComboBox
comboBox with the list of meanDatas
void refreshMeanDataSelector(bool afterChangingID)
refresh meanData selector
void setCurrentMeanData(GNEMeanData *vMeanData)
set current Vehicle MeanData
GNEMeanDataFrame * myMeanDataFrameParent
pointer to Frame Parent
long onCmdSelectItem(FXObject *, FXSelector, void *)
void refreshMeanDataTypeSelector()
refresh meanData selector
const GNETagProperties * getCurrentMeanData() const
get current MeanData
long onCmdSelectItem(FXObject *, FXSelector, void *)
void hide()
hide Frame
void attributeUpdated(SumoXMLAttr attribute)
function called after set a valid attribute in AttributeCreator/AttributeEditor/ParametersEditor/....
MeanDataSelector * myMeanDataSelector
meanData selector
void show()
show Frame
~GNEMeanDataFrame()
Destructor.
GNEAttributesEditor * myMeanDataAttributesEditor
meanData attributes editor
GNEMeanDataFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor (protected due GNEMeanDataFrame is abtract)
MeanDataTypeSelector * myMeanDataTypeSelector
meanData type selector
void updateFrameAfterUndoRedo()
function called after undo/redo in the current frame
MeanDataEditor * myMeanDataEditor
meanData editor
FileBucket * getFileBucket() const override
get reference to fileBucket in which save this AC
const std::unordered_map< SumoXMLTag, std::map< const std::string, GNEMeanData * >, std::hash< int > > & getMeanDatas() const
get meanDatas
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:174
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
GNENet * getNet() const
get the net object
GNEViewParent * getViewParent() const
get the net object
A single child window which contains a view of the simulation area.
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
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
MFXStaticToolTip * getStaticTooltipMenu() const
get static toolTip for menus
FXint appendIconItem(const FXString &text, FXIcon *icon=nullptr, FXColor bgColor=FXRGB(255, 255, 255), void *ptr=nullptr)
append icon item in the last position
C++ TraCI client API implementation.