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-2023 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#include <config.h>
21
22#include <netedit/GNENet.h>
23#include <netedit/GNEViewNet.h>
24#include <netedit/GNEUndoList.h>
31
32#include "GNEMeanDataFrame.h"
33
34
35// ===========================================================================
36// FOX callback mapping
37// ===========================================================================
38
42
48
52
53// Object implementation
54FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, MFXGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))
55FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, MFXGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))
56FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, MFXGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))
57
58
59// ===========================================================================
60// method definitions
61// ===========================================================================
62
63// ---------------------------------------------------------------------------
64// GNEMeanDataFrame::MeanDataTypeSelector - methods
65// ---------------------------------------------------------------------------
66
68 MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),
69 myMeanDataFrameParent(meanDataFrameParent) {
70 // Create FXComboBox
71 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), GUIDesignComboBoxNCol, true, this, MID_GNE_SET_TYPE, GUIDesignComboBox);
72 // add mean data types
74 for (const auto& meanDataType : meanDataTypes) {
75 myTypeComboBox->appendIconItem(meanDataType.getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType.getGUIIcon()));
76 }
77 // set DEFAULT_VEHTYPE as default VType
78 myCurrentMeanData = meanDataTypes.front();
79 // Set visible items
80 myTypeComboBox->setNumVisible((int)myTypeComboBox->getNumItems());
81 // MeanDataTypeSelector is always shown
82 show();
83}
84
85
87
88
91 return myCurrentMeanData;
92}
93
94
95void
97 // clear items
98 myTypeComboBox->clearItems();
99 // add mean data types
101 for (const auto& meanDataType : meanDataTypes) {
102 myTypeComboBox->appendIconItem(meanDataType.getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType.getGUIIcon()));
103 }
104 // make sure that tag is in myTypeMatchBox
105 if (myCurrentMeanData.getTagStr() != myInvalidMeanData.getTagStr()) {
106 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
107 if (myTypeComboBox->getItem(i).text() == myCurrentMeanData.getTagStr()) {
108 myTypeComboBox->setCurrentItem(i);
109 }
110 }
111 } else {
112 myCurrentMeanData = meanDataTypes.front();
113 }
114 // refresh meanData editor module
115 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
116 // show modules
117 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
118 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
119}
120
121
122long
124 // add mean data types
126 // Check if value of myTypeMatchBox correspond of an allowed additional tags
127 for (const auto& meanDataType : meanDataTypes) {
128 if (meanDataType.getTagStr() == myTypeComboBox->getText().text()) {
129 // set pointer
130 myCurrentMeanData = meanDataType;
131 // set color of myTypeMatchBox to black (valid)
132 myTypeComboBox->setTextColor(FXRGB(0, 0, 0));
133 // refresh meanData editor module
134 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
135 // show modules if selected item is valid
136 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
137 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
138 // Write Warning in console if we're in testing mode
139 WRITE_DEBUG(("Selected item '" + myTypeComboBox->getText() + "' in MeanDataTypeSelector").text());
140 return 1;
141 }
142 }
143 myCurrentMeanData = myInvalidMeanData;
144 // refresh meanData editor module
145 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
146 // hide all modules if selected item isn't valid
147 myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();
148 myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();
149 // set color of myTypeMatchBox to red (invalid)
150 myTypeComboBox->setTextColor(FXRGB(255, 0, 0));
151 // Write Warning in console if we're in testing mode
152 WRITE_DEBUG("Selected invalid item in MeanDataTypeSelector");
153 return 1;
154}
155
156// ---------------------------------------------------------------------------
157// GNEMeanDataFrame::MeanDataEditor - methods
158// ---------------------------------------------------------------------------
159
161 MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),
162 myMeanDataFrameParent(meanDataFrameParent) {
163 // Create new meanData
164 myCreateMeanDataButton = new FXButton(getCollapsableFrame(), TL("Create MeanData"),
166 // Create delete/reset meanData
167 myDeleteMeanDataButton = new FXButton(getCollapsableFrame(), TL("Delete MeanData"),
169 // Create copy meanData
170 myCopyMeanDataButton = new FXButton(getCollapsableFrame(), TL("Copy MeanData"),
172}
173
174
176
177
178void
180 refreshMeanDataEditorModule();
181 show();
182}
183
184
185void
189
190
191void
193 // first check if selected VMeanData is valid
194 if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {
195 // disable buttons
196 myDeleteMeanDataButton->disable();
197 myCopyMeanDataButton->disable();
198 } else {
199 // enable buttons
200 myDeleteMeanDataButton->enable();
201 myCopyMeanDataButton->enable();
202 }
203 // update module
204 recalc();
205}
206
207
208long
210 // get current meanData type
211 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData().getTag();
212 // obtain a new valid MeanData ID
213 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
214 // create new meanData
215 GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myViewNet->getNet(),
216 myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData().getTag(), typeID);
217 // add it using undoList (to allow undo-redo)
218 myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::VTYPE, "create meanData");
219 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);
220 myMeanDataFrameParent->myViewNet->getUndoList()->end();
221 // set created meanData in selector
222 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);
223 return 1;
224}
225
226
227long
229 // begin undo list operation
230 myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::VTYPE, "delete meanData");
231 // remove meanData (and all of their children)
232 myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),
233 myMeanDataFrameParent->myViewNet->getUndoList());
234 // end undo list operation
235 myMeanDataFrameParent->myViewNet->getUndoList()->end();
236 // set created meanData in selector
237 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
238 return 1;
239}
240
241
242long
244 // get current meanData type
245 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData().getTag();
246 // obtain a new valid MeanData ID
247 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
248 // obtain meanData in which new MeanData will be based
249 GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());
250 // check that meanData exist
251 if (meanData) {
252 // create a new MeanData based on the current selected meanData
253 GNEMeanData* typeCopy = new GNEMeanData(myMeanDataFrameParent->myViewNet->getNet(),
254 myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData().getTag(), typeID);
255 // begin undo list operation
256 myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::VTYPE, "copy meanData");
257 // add it using undoList (to allow undo-redo)
258 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(typeCopy, true), true);
259 // end undo list operation
260 myMeanDataFrameParent->myViewNet->getUndoList()->end();
261 // refresh MeanData Selector (to show the new VMeanData)
262 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
263 // set created meanData in selector
264 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(typeCopy);
265 // refresh MeanData Editor Module
266 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
267 }
268 return 1;
269}
270
271// ---------------------------------------------------------------------------
272// GNEMeanDataFrame::MeanDataSelector - methods
273// ---------------------------------------------------------------------------
274
276 MFXGroupBoxModule(typeFrameParent, TL("Current MeanData")),
277 myMeanDataFrameParent(typeFrameParent),
278 myCurrentMeanData(nullptr) {
279 // get current meanData type
281 // Create FXComboBox
283 // add meanDatas
284 for (const auto& vMeanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
285 myMeanDataComboBox->appendIconItem(vMeanData->getID().c_str(), vMeanData->getACIcon());
286 }
287 if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {
289 } else {
290 myCurrentMeanData = nullptr;
291 }
292 // Set visible items
293 if (myMeanDataComboBox->getNumItems() <= 20) {
295 } else {
297 }
298 // MeanDataSelector is always shown
299 show();
300}
301
302
304
305
306void
308 // refresh mean data selector
309 refreshMeanDataSelector(false);
310 // show
311 show();
312}
313
314
315void
317 // hide attributes editor
318 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditorModule();
319 // hide
320 hide();
321}
322
323
326 return myCurrentMeanData;
327}
328
329
330void
332 myCurrentMeanData = vMeanData;
333 refreshMeanDataSelector(false);
334}
335
336
337void
339 // get current meanData type
340 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData().getTag();
341 // get mean datas sorted by ID
342 std::map<std::string, GNEMeanData*> sortedMeanDatas;
343 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
344 sortedMeanDatas[meanData->getID()] = meanData;
345 }
346 // clear items
347 myMeanDataComboBox->clearItems();
348 // fill myMeanDataMatchBox with meanDatas
349 for (const auto& sortedMeanData : sortedMeanDatas) {
350 myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());
351 }
352 // Set visible items
353 if (myMeanDataComboBox->getNumItems() <= 20) {
354 myMeanDataComboBox->setNumVisible((int)myMeanDataComboBox->getNumItems());
355 } else {
356 myMeanDataComboBox->setNumVisible(20);
357 }
358 // make sure that mean data exists
359 if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData, false)) {
360 bool validMeanData = false;
361 for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {
362 if (myMeanDataComboBox->getItem(i).text() == myCurrentMeanData->getID()) {
363 myMeanDataComboBox->setCurrentItem(i);
364 validMeanData = true;
365 }
366 }
367 if (!validMeanData) {
368 myCurrentMeanData = nullptr;
369 }
370 } else {
371 myCurrentMeanData = nullptr;
372 }
373 // check if enable or disable comboBox
374 if (sortedMeanDatas.size() > 0) {
375 myMeanDataComboBox->enable();
376 // check ifupdate myCurrentMeanData
377 if (myCurrentMeanData == nullptr) {
378 myCurrentMeanData = sortedMeanDatas.begin()->second;
379 }
380 } else {
381 myMeanDataComboBox->disable();
382 }
383 // refresh meanData editor module
384 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
385 // check if show attribute editor
386 if (!afterChangingID) {
387 if (myCurrentMeanData) {
388 // set myCurrentMeanData as inspected element (needed for attribute editor)
389 myMeanDataFrameParent->getViewNet()->setInspectedAttributeCarriers({myCurrentMeanData});
390 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributeEditorModule(false);
391 } else {
392 // set myCurrentMeanData as inspected element (needed for attribute editor)
393 myMeanDataFrameParent->getViewNet()->setInspectedAttributeCarriers({});
394 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditorModule();
395 }
396 }
397}
398
399
400void
402 if (myCurrentMeanData) {
403 myMeanDataComboBox->setIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());
404 }
405}
406
407
408long
410 // get current meanData type
411 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData().getTag();
412 // Check if value of myMeanDataMatchBox correspond of an allowed additional tags
413 for (const auto& vMeanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
414 if (vMeanData->getID() == myMeanDataComboBox->getText().text()) {
415 // set pointer
416 myCurrentMeanData = vMeanData;
417 // set color of myMeanDataMatchBox to black (valid)
418 myMeanDataComboBox->setTextColor(FXRGB(0, 0, 0));
419 // refresh meanData editor module
420 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
421 // set myCurrentMeanData as inspected element
422 myMeanDataFrameParent->getViewNet()->setInspectedAttributeCarriers({myCurrentMeanData});
423 // show modules if selected item is valid
424 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributeEditorModule(false);
425 // Write Warning in console if we're in testing mode
426 WRITE_DEBUG(("Selected item '" + myMeanDataComboBox->getText() + "' in MeanDataSelector").text());
427 // update viewNet
428 myMeanDataFrameParent->getViewNet()->updateViewNet();
429 return 1;
430 }
431 }
432 myCurrentMeanData = nullptr;
433 // refresh meanData editor module
434 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
435 // hide all modules if selected item isn't valid
436 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditorModule();
437 // set color of myMeanDataMatchBox to red (invalid)
438 myMeanDataComboBox->setTextColor(FXRGB(255, 0, 0));
439 // Write Warning in console if we're in testing mode
440 WRITE_DEBUG("Selected invalid item in MeanDataSelector");
441 // update viewNet
442 myMeanDataFrameParent->getViewNet()->updateViewNet();
443 return 1;
444}
445
446// ---------------------------------------------------------------------------
447// GNEMeanDataFrame - methods
448// ---------------------------------------------------------------------------
449
451 GNEFrame(viewParent, viewNet, "MeanData") {
452 // build meanData type selector
454 // build meanData editor
456 // build meanData selector
458 // build meanData attributes editor
460}
461
462
465
466
467void
469 // refresh meanData type selector
471 // show frame
473}
474
475
476void
478 // hide frame
480}
481
482
483void
489
490
491void
494
495/****************************************************************************/
FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[]
@ MID_GNE_DELETE
delete element
Definition GUIAppEnum.h:911
@ MID_GNE_COPY
copy element
Definition GUIAppEnum.h:921
@ MID_GNE_CREATE
create element
Definition GUIAppEnum.h:909
@ MID_GNE_SET_TYPE
used to select a type of element in a combo box
Definition GUIAppEnum.h:927
#define GUIDesignButton
Definition GUIDesigns.h:74
#define GUIDesignComboBox
Definition GUIDesigns.h:288
#define GUIDesignComboBoxNCol
number of column of every combo box
Definition GUIDesigns.h:306
@ MODEMEANDATA
#define WRITE_DEBUG(msg)
Definition MsgHandler.h:281
#define TL(string)
Definition MsgHandler.h:287
SumoXMLTag
Numbers representing SUMO-XML - element names.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_ID
static const std::vector< GNETagProperties > getTagPropertiesByType(const int tagPropertyCategory)
get tagProperties associated to the given GNETagProperties::TagType (NETWORKELEMENT,...
GNEViewNet * getViewNet() const
get view net
Definition GNEFrame.cpp:150
virtual void show()
show Frame
Definition GNEFrame.cpp:115
virtual void hide()
hide Frame
Definition GNEFrame.cpp:124
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 *)
GNEFrameAttributeModules::AttributesEditor * myMeanDataAttributesEditor
meanData attributes editor
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.
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
An Element which don't belong to GNENet but has influence in the simulation.
Definition GNEMeanData.h:33
const std::map< SumoXMLTag, std::set< GNEMeanData * > > & getMeanDatas() const
get meanDatas
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:120
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
GNENet * getNet() const
get the net object
A single child window which contains a view of the simulation area.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
ComboBox with icon.
FXint getNumItems() const
Return the number of items in the list.
void setNumVisible(FXint nvis)
Set the number of visible items in the drop down list.
FXint appendIconItem(const FXString &text, FXIcon *icon=nullptr, FXColor bgColor=FXRGB(255, 255, 255), void *ptr=nullptr)
append icon
MFXGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
C++ TraCI client API implementation.