1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
10 /// @file    GNEVehicleTypeDialog.cpp
11 /// @author  Pablo Alvarez Lopez
12 /// @date    Jan 2019
13 /// @version $Id$
14 ///
15 // Dialog for edit vehicleTypes
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <iostream>
24 #include <utils/common/MsgHandler.h>
25 #include <utils/gui/windows/GUIAppEnum.h>
26 #include <utils/gui/images/GUIIconSubSys.h>
27 #include <utils/gui/div/GUIDesigns.h>
28 #include <netedit/changes/GNEChange_DemandElement.h>
29 #include <netedit/additionals/GNECalibrator.h>
30 #include <netedit/netelements/GNEEdge.h>
31 #include <netedit/netelements/GNELane.h>
32 #include <netedit/GNEViewNet.h>
33 #include <netedit/GNENet.h>
34 #include <netedit/demandelements/GNEVehicleType.h>
35 #include <netedit/GNEUndoList.h>
36 
37 #include "GNEVehicleTypeDialog.h"
38 
39 
40 // ===========================================================================
41 // FOX callback mapping
42 // ===========================================================================
43 
44 FXDEFMAP(GNEVehicleTypeDialog::VTypeAtributes) VTypeAtributesMap[] = {
45     FXMAPFUNC(SEL_COMMAND,  MID_GNE_SET_ATTRIBUTE,          GNEVehicleTypeDialog::VTypeAtributes::onCmdSetVariable),
46     FXMAPFUNC(SEL_COMMAND,  MID_GNE_SET_ATTRIBUTE_DIALOG,   GNEVehicleTypeDialog::VTypeAtributes::onCmdSetColor)
47 };
48 
49 FXDEFMAP(GNEVehicleTypeDialog::CarFollowingModelParameters) CarFollowingModelParametersMap[] = {
50     FXMAPFUNC(SEL_COMMAND,  MID_GNE_SET_ATTRIBUTE,  GNEVehicleTypeDialog::CarFollowingModelParameters::onCmdSetVariable),
51 };
52 
53 // Object implementation
FXIMPLEMENT(GNEVehicleTypeDialog::VTypeAtributes,FXVerticalFrame,VTypeAtributesMap,ARRAYNUMBER (VTypeAtributesMap))54 FXIMPLEMENT(GNEVehicleTypeDialog::VTypeAtributes,               FXVerticalFrame,    VTypeAtributesMap,              ARRAYNUMBER(VTypeAtributesMap))
55 FXIMPLEMENT(GNEVehicleTypeDialog::CarFollowingModelParameters,  FXGroupBox,         CarFollowingModelParametersMap, ARRAYNUMBER(CarFollowingModelParametersMap))
56 
57 // ===========================================================================
58 // member method definitions
59 // ===========================================================================
60 
61 // ---------------------------------------------------------------------------
62 // GNEVehicleTypeDialog::VClassRow - methods
63 // ---------------------------------------------------------------------------
64 
65 GNEVehicleTypeDialog::VTypeAtributes::VClassRow::VClassRow(VTypeAtributes* VTypeAtributesParent, FXVerticalFrame* column) :
66     FXHorizontalFrame(column, GUIDesignAuxiliarHorizontalFrame),
67     myVTypeAtributesParent(VTypeAtributesParent) {
68     // create two auxiliar frames
69     FXVerticalFrame* verticalFrameLabelAndComboBox = new FXVerticalFrame(this, GUIDesignAuxiliarVerticalFrame);
70     // create FXComboBox for VClass
71     new FXLabel(verticalFrameLabelAndComboBox, toString(SUMO_ATTR_VCLASS).c_str(), nullptr, GUIDesignLabelAttribute150);
72     myComboBoxVClass = new FXComboBox(verticalFrameLabelAndComboBox, GUIDesignComboBoxNCol,
73                                       VTypeAtributesParent, MID_GNE_SET_ATTRIBUTE, GUIDesignComboBox);
74     myComboBoxVClassLabelImage = new FXLabel(this, "", nullptr, GUIDesignLabelTickedIcon180x46);
75     myComboBoxVClassLabelImage->setBackColor(FXRGBA(255, 255, 255, 255));
76     // fill combo Box with all VClass
77     std::vector<std::string> VClassStrings = SumoVehicleClassStrings.getStrings();
78     for (auto i : VClassStrings) {
79         if (i != SumoVehicleClassStrings.getString(SVC_IGNORING)) {
80             myComboBoxVClass->appendItem(i.c_str());
81         }
82     }
83     // only show 10 VClasses
84     myComboBoxVClass->setNumVisible(10);
85 }
86 
87 
88 void
setVariable()89 GNEVehicleTypeDialog::VTypeAtributes::VClassRow::setVariable() {
90     // set color of myComboBoxVClass, depending if current value is valid or not
91     myComboBoxVClass->setTextColor(FXRGB(0, 0, 0));
92     if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->isValid(SUMO_ATTR_VCLASS, myComboBoxVClass->getText().text())) {
93         myComboBoxVClass->setTextColor(FXRGB(0, 0, 0));
94         myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_VCLASS, myComboBoxVClass->getText().text(),
95                 myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
96         setVClassLabelImage();
97     } else {
98         myComboBoxVClass->setTextColor(FXRGB(255, 0, 0));
99         myVTypeAtributesParent->myVehicleTypeDialog->myVehicleTypeValid = false;
100         myVTypeAtributesParent->myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_VCLASS;
101     }
102 }
103 
104 
105 void
updateValues()106 GNEVehicleTypeDialog::VTypeAtributes::VClassRow::updateValues() {
107     myComboBoxVClass->setText(myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_VCLASS).c_str());
108     setVClassLabelImage();
109 }
110 
111 
112 void
setVClassLabelImage()113 GNEVehicleTypeDialog::VTypeAtributes::VClassRow::setVClassLabelImage() {
114     // by default vclass is passenger
115     if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_VCLASS).empty()) {
116         myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_PASSENGER));
117     } else {
118         // set Icon in label depending of current VClass
119         switch (getVehicleClassID(myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_VCLASS))) {
120             case SVC_PRIVATE:
121                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_PRIVATE));
122                 break;
123             case SVC_EMERGENCY:
124                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_EMERGENCY));
125                 break;
126             case SVC_AUTHORITY:
127                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_AUTHORITY));
128                 break;
129             case SVC_ARMY:
130                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_ARMY));
131                 break;
132             case SVC_VIP:
133                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_VIP));
134                 break;
135             case SVC_PASSENGER:
136                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_PASSENGER));
137                 break;
138             case SVC_HOV:
139                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_HOV));
140                 break;
141             case SVC_TAXI:
142                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_TAXI));
143                 break;
144             case SVC_BUS:
145                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_BUS));
146                 break;
147             case SVC_COACH:
148                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_COACH));
149                 break;
150             case SVC_DELIVERY:
151                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_DELIVERY));
152                 break;
153             case SVC_TRUCK:
154                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_TRUCK));
155                 break;
156             case SVC_TRAILER:
157                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_TRAILER));
158                 break;
159             case SVC_TRAM:
160                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_TRAM));
161                 break;
162             case SVC_RAIL_URBAN:
163                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_RAIL_URBAN));
164                 break;
165             case SVC_RAIL:
166                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_RAIL));
167                 break;
168             case SVC_RAIL_ELECTRIC:
169                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_RAIL_ELECTRIC));
170                 break;
171             case SVC_MOTORCYCLE:
172                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_MOTORCYCLE));
173                 break;
174             case SVC_MOPED:
175                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_MOPED));
176                 break;
177             case SVC_BICYCLE:
178                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_BICYCLE));
179                 break;
180             case SVC_PEDESTRIAN:
181                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_PEDESTRIAN));
182                 break;
183             case SVC_E_VEHICLE:
184                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_EVEHICLE));
185                 break;
186             case SVC_SHIP:
187                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_SHIP));
188                 break;
189             case SVC_CUSTOM1:
190                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_CUSTOM1));
191                 break;
192             case SVC_CUSTOM2:
193                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_CUSTOM2));
194                 break;
195             default:
196                 myComboBoxVClassLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_IGNORING));
197                 break;
198         }
199     }
200 }
201 
202 // ---------------------------------------------------------------------------
203 // GNEVehicleTypeDialog::VShapeRow - methods
204 // ---------------------------------------------------------------------------
205 
VShapeRow(VTypeAtributes * VTypeAtributesParent,FXVerticalFrame * column)206 GNEVehicleTypeDialog::VTypeAtributes::VShapeRow::VShapeRow(VTypeAtributes* VTypeAtributesParent, FXVerticalFrame* column) :
207     FXHorizontalFrame(column, GUIDesignAuxiliarHorizontalFrame),
208     myVTypeAtributesParent(VTypeAtributesParent) {
209     // create two auxiliar frames
210     FXVerticalFrame* verticalFrameLabelAndComboBox = new FXVerticalFrame(this, GUIDesignAuxiliarVerticalFrame);
211     // create combo for for vehicle shapes
212     new FXLabel(verticalFrameLabelAndComboBox, toString(SUMO_ATTR_GUISHAPE).c_str(), nullptr, GUIDesignLabelAttribute150);
213     myComboBoxShape = new FXComboBox(verticalFrameLabelAndComboBox, GUIDesignComboBoxNCol,
214                                      VTypeAtributesParent, MID_GNE_SET_ATTRIBUTE, GUIDesignComboBox);
215     myComboBoxShapeLabelImage = new FXLabel(this, "", nullptr, GUIDesignLabelTickedIcon180x46);
216     myComboBoxShapeLabelImage->setBackColor(FXRGBA(255, 255, 255, 255));
217     // fill combo Box with all vehicle shapes
218     std::vector<std::string> VShapeStrings = SumoVehicleShapeStrings.getStrings();
219     for (auto i : VShapeStrings) {
220         if (i != SumoVehicleShapeStrings.getString(SVS_UNKNOWN)) {
221             myComboBoxShape->appendItem(i.c_str());
222         }
223     }
224     // only show 10 Shapes
225     myComboBoxShape->setNumVisible(10);
226 }
227 
228 
229 void
setVariable()230 GNEVehicleTypeDialog::VTypeAtributes::VShapeRow::setVariable() {
231     // set color of myComboBoxShape, depending if current value is valid or not
232     if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->isValid(SUMO_ATTR_GUISHAPE, myComboBoxShape->getText().text())) {
233         myComboBoxShape->setTextColor(FXRGB(0, 0, 0));
234         myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_GUISHAPE, myComboBoxShape->getText().text(),
235                 myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
236         setVShapeLabelImage();
237     } else {
238         myComboBoxShape->setTextColor(FXRGB(255, 0, 0));
239         myVTypeAtributesParent->myVehicleTypeDialog->myVehicleTypeValid = false;
240         myVTypeAtributesParent->myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_GUISHAPE;
241     }
242 }
243 
244 
245 void
updateValues()246 GNEVehicleTypeDialog::VTypeAtributes::VShapeRow::updateValues() {
247     myComboBoxShape->setText(myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_GUISHAPE).c_str());
248     setVShapeLabelImage();
249 }
250 
251 
252 void
setVShapeLabelImage()253 GNEVehicleTypeDialog::VTypeAtributes::VShapeRow::setVShapeLabelImage() {
254     // set Icon in label depending of current VClass
255     switch (getVehicleShapeID(myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_GUISHAPE))) {
256         case SVS_UNKNOWN:
257             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_UNKNOWN));
258             break;
259         case SVS_PEDESTRIAN:
260             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_PEDESTRIAN));
261             break;
262         case SVS_BICYCLE:
263             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_BICYCLE));
264             break;
265         case SVS_MOPED:
266             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_MOPED));
267             break;
268         case SVS_MOTORCYCLE:
269             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_MOTORCYCLE));
270             break;
271         case SVS_PASSENGER:
272             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_PASSENGER));
273             break;
274         case SVS_PASSENGER_SEDAN:
275             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_PASSENGER_SEDAN));
276             break;
277         case SVS_PASSENGER_HATCHBACK:
278             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_PASSENGER_HATCHBACK));
279             break;
280         case SVS_PASSENGER_WAGON:
281             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_PASSENGER_WAGON));
282             break;
283         case SVS_PASSENGER_VAN:
284             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_PASSENGER_VAN));
285             break;
286         case SVS_DELIVERY:
287             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_DELIVERY));
288             break;
289         case SVS_TRUCK:
290             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_TRUCK));
291             break;
292         case SVS_TRUCK_SEMITRAILER:
293             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_TRUCK_SEMITRAILER));
294             break;
295         case SVS_TRUCK_1TRAILER:
296             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_TRUCK_1TRAILER));
297             break;
298         case SVS_BUS:
299             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_BUS));
300             break;
301         case SVS_BUS_COACH:
302             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_BUS_COACH));
303             break;
304         case SVS_BUS_FLEXIBLE:
305             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_BUS_FLEXIBLE));
306             break;
307         case SVS_BUS_TROLLEY:
308             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_BUS_TROLLEY));
309             break;
310         case SVS_RAIL:
311             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_RAIL));
312             break;
313         case SVS_RAIL_CAR:
314             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_RAIL_CAR));
315             break;
316         case SVS_RAIL_CARGO:
317             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_RAIL_CARGO));
318             break;
319         case SVS_E_VEHICLE:
320             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_E_VEHICLE));
321             break;
322         case SVS_ANT:
323             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_ANT));
324             break;
325         case SVS_SHIP:
326             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_SHIP));
327             break;
328         case SVS_EMERGENCY:
329         case SVS_FIREBRIGADE:
330             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_EMERGENCY));
331             break;
332         case SVS_POLICE:
333             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_POLICE));
334             break;
335         case SVS_RICKSHAW:
336             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VSHAPE_RICKSHAW));
337             break;
338         default:
339             myComboBoxShapeLabelImage->setIcon(GUIIconSubSys::getIcon(ICON_VCLASS_IGNORING));
340             break;
341     }
342 }
343 
344 // ---------------------------------------------------------------------------
345 // GNEVehicleTypeDialog::VTypeAtributes - methods
346 // ---------------------------------------------------------------------------
347 
VTypeAttributeRow(VTypeAtributes * VTypeAtributesParent,FXVerticalFrame * verticalFrame,SumoXMLAttr attr,int type)348 GNEVehicleTypeDialog::VTypeAtributes::VTypeAttributeRow::VTypeAttributeRow(VTypeAtributes* VTypeAtributesParent, FXVerticalFrame* verticalFrame, SumoXMLAttr attr, int type) :
349     FXHorizontalFrame(verticalFrame, GUIDesignAuxiliarHorizontalFrame),
350     myVTypeAtributesParent(VTypeAtributesParent),
351     myAttr(attr),
352     myComboBox(nullptr) {
353     new FXLabel(this, toString(attr).c_str(), nullptr, GUIDesignLabelAttribute150);
354     if (type == 0) {
355         myTextField = new FXTextField(this, GUIDesignTextFieldNCol, VTypeAtributesParent, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFielWidth180Int);
356     } else if (type == 1) {
357         myTextField = new FXTextField(this, GUIDesignTextFieldNCol, VTypeAtributesParent, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFielWidth180Real);
358     } else {
359         myTextField = new FXTextField(this, GUIDesignTextFieldNCol, VTypeAtributesParent, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFielWidth180);
360     }
361 }
362 
363 
VTypeAttributeRow(VTypeAtributes * VTypeAtributesParent,FXVerticalFrame * verticalFrame,SumoXMLAttr attr,const std::vector<std::string> & values)364 GNEVehicleTypeDialog::VTypeAtributes::VTypeAttributeRow::VTypeAttributeRow(VTypeAtributes* VTypeAtributesParent, FXVerticalFrame* verticalFrame, SumoXMLAttr attr, const  std::vector<std::string>& values) :
365     FXHorizontalFrame(verticalFrame, GUIDesignAuxiliarHorizontalFrame),
366     myVTypeAtributesParent(VTypeAtributesParent),
367     myAttr(attr),
368     myTextField(nullptr) {
369     new FXLabel(this, toString(attr).c_str(), nullptr, GUIDesignLabelAttribute150);
370     myComboBox = new FXComboBox(this, GUIDesignComboBoxNCol, VTypeAtributesParent, MID_GNE_SET_ATTRIBUTE, GUIDesignComboBox);
371     // fill combo Box with values
372     for (auto i : values) {
373         myComboBox->appendItem(i.c_str());
374     }
375     myComboBox->setNumVisible(myComboBox->getNumItems());
376 }
377 
378 
379 void
setVariable()380 GNEVehicleTypeDialog::VTypeAtributes::VTypeAttributeRow::setVariable() {
381     if (myComboBox) {
382         // set color of myComboBox, depending if current value is valid or not
383         if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->isValid(myAttr, myComboBox->getText().text())) {
384             myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->setAttribute(myAttr, myComboBox->getText().text(),
385                     myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
386             // update value after setting it
387             updateValue();
388         } else {
389             myComboBox->setTextColor(FXRGB(255, 0, 0));
390             // mark VType as invalid
391             myVTypeAtributesParent->myVehicleTypeDialog->myVehicleTypeValid = false;
392             myVTypeAtributesParent->myVehicleTypeDialog->myInvalidAttr = myAttr;
393         }
394     } else {
395         // set color of textField, depending if current value is valid or not
396         if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->isValid(myAttr, myTextField->getText().text())) {
397             myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->setAttribute(myAttr, myTextField->getText().text(),
398                     myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
399             // update value after setting it
400             updateValue();
401         } else {
402             myTextField->setTextColor(FXRGB(255, 0, 0));
403             // mark VType as invalid
404             myVTypeAtributesParent->myVehicleTypeDialog->myVehicleTypeValid = false;
405             myVTypeAtributesParent->myVehicleTypeDialog->myInvalidAttr = myAttr;
406         }
407     }
408 }
409 
410 
411 void
updateValue()412 GNEVehicleTypeDialog::VTypeAtributes::VTypeAttributeRow::updateValue() {
413     if (myComboBox) {
414         // set text of myComboBox using current value of VType
415         myComboBox->setText(myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(myAttr).c_str());
416         // set color depending if is a default value
417         if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getTagProperty().getDefaultValue(myAttr) != myComboBox->getText().text()) {
418             myComboBox->setTextColor(FXRGB(0, 0, 0));
419         } else {
420             myComboBox->setTextColor(FXRGB(195, 195, 195));
421         }
422     } else {
423         // set text of myTextField using current value of VType
424         myTextField->setText(myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(myAttr).c_str());
425         // set color depending if is a default value
426         if (myVTypeAtributesParent->myVehicleTypeDialog->myEditedDemandElement->getTagProperty().getDefaultValue(myAttr) != myTextField->getText().text()) {
427             myTextField->setTextColor(FXRGB(0, 0, 0));
428         } else {
429             myTextField->setTextColor(FXRGB(195, 195, 195));
430         }
431     }
432 }
433 
434 // ---------------------------------------------------------------------------
435 // GNEVehicleTypeDialog::VTypeAtributes - methods
436 // ---------------------------------------------------------------------------
437 
VTypeAtributes(GNEVehicleTypeDialog * vehicleTypeDialog,FXHorizontalFrame * column)438 GNEVehicleTypeDialog::VTypeAtributes::VTypeAtributes(GNEVehicleTypeDialog* vehicleTypeDialog, FXHorizontalFrame* column) :
439     FXVerticalFrame(column, GUIDesignAuxiliarVerticalFrame),
440     myVehicleTypeDialog(vehicleTypeDialog) {
441     // create attributes for common attributes
442     FXGroupBox* commonAttributes = new FXGroupBox(this, "Vehicle Type attributes", GUIDesignGroupBoxFrame);
443     // create horizontal frame for columns of attributes
444     FXHorizontalFrame* columnsCommonVTypeAttributes = new FXHorizontalFrame(commonAttributes, GUIDesignAuxiliarHorizontalFrame);
445     // build left attributes
446     buildAttributesA(new FXVerticalFrame(columnsCommonVTypeAttributes, GUIDesignAuxiliarFrame));
447     // build right attributes
448     buildAttributesB(new FXVerticalFrame(columnsCommonVTypeAttributes, GUIDesignAuxiliarFrame));
449     // create attribute for Junction Model Attributes
450     FXGroupBox* JMAttributes = new FXGroupBox(this, "Junction Model attributes", GUIDesignGroupBoxFrame);
451     // create horizontal frame for columns of Junction Model attributes
452     FXHorizontalFrame* columnsJMVTypeAttributes = new FXHorizontalFrame(JMAttributes, GUIDesignAuxiliarHorizontalFrame);
453     // build left attributes
454     buildJunctionModelAttributesA(new FXVerticalFrame(columnsJMVTypeAttributes, GUIDesignAuxiliarFrame));
455     // build right attributes
456     buildJunctionModelAttributesB(new FXVerticalFrame(columnsJMVTypeAttributes, GUIDesignAuxiliarFrame));
457 }
458 
459 
460 void
buildAttributesA(FXVerticalFrame * column)461 GNEVehicleTypeDialog::VTypeAtributes::buildAttributesA(FXVerticalFrame* column) {
462     // 01 Create VClassRow
463     myVClassRow = new VClassRow(this, column);
464 
465     // 02 create FXTextField and Label for vehicleTypeID
466     FXHorizontalFrame* row = new FXHorizontalFrame(column, GUIDesignAuxiliarHorizontalFrame);
467     new FXLabel(row, toString(SUMO_ATTR_ID).c_str(), nullptr, GUIDesignLabelAttribute150);
468     myTextFieldVehicleTypeID = new FXTextField(row, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFielWidth180Real);
469 
470     // 03 create FXTextField and Button for Color
471     row = new FXHorizontalFrame(column, GUIDesignAuxiliarHorizontalFrame);
472     myButtonColor = new FXButton(row, toString(SUMO_ATTR_COLOR).c_str(), nullptr, this, MID_GNE_SET_ATTRIBUTE_DIALOG, GUIDesignButtonRectangular150x23);
473     myTextFieldColor = new FXTextField(row, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFielWidth180);
474 
475     // 04 create FXTextField and Label for Length
476     myLength = new VTypeAttributeRow(this, column, SUMO_ATTR_LENGTH, 1);
477 
478     // 05 create FXTextField and Label for MinGap
479     myMinGap = new VTypeAttributeRow(this, column, SUMO_ATTR_MINGAP, 1);
480 
481     // 06 create FXTextField and Label for MaxSpeed
482     myMaxSpeed = new VTypeAttributeRow(this, column, SUMO_ATTR_MAXSPEED, 1);
483 
484     // 07 create FXTextField and Label for SpeedFactor
485     mySpeedFactor = new VTypeAttributeRow(this, column, SUMO_ATTR_SPEEDFACTOR, 1);
486 
487     // 08 create FXTextField and Label for SpeedDev
488     mySpeedDev = new VTypeAttributeRow(this, column, SUMO_ATTR_SPEEDDEV, 1);
489 
490     // 09 create FXTextField and Label for EmissionClass
491     myEmissionClass = new VTypeAttributeRow(this, column, SUMO_ATTR_EMISSIONCLASS, 1);
492 
493     // 10 create FXTextField and Label for Width
494     myWidth = new VTypeAttributeRow(this, column, SUMO_ATTR_WIDTH, 1);
495 
496     // 11 create FXTextField and Label for Filename
497     myFilename = new VTypeAttributeRow(this, column, SUMO_ATTR_IMGFILE, 3);
498 }
499 
500 
501 void
buildAttributesB(FXVerticalFrame * column)502 GNEVehicleTypeDialog::VTypeAtributes::buildAttributesB(FXVerticalFrame* column) {
503     // 01 Create VShapeRow
504     myVShapeRow = new VShapeRow(this, column);
505 
506     // 02 create VTypeAttributeRow and Label for LaneChangeModel
507     myLaneChangeModel = new VTypeAttributeRow(this, column, SUMO_ATTR_LANE_CHANGE_MODEL, SUMOXMLDefinitions::LaneChangeModels.getStrings());
508 
509     // 03 create VTypeAttributeRow and Label for PersonCapacity
510     myPersonCapacity = new VTypeAttributeRow(this, column, SUMO_ATTR_PERSON_CAPACITY, 0);
511 
512     // 04 create VTypeAttributeRow and Label for ContainerCapacity
513     myContainerCapacity = new VTypeAttributeRow(this, column, SUMO_ATTR_CONTAINER_CAPACITY, 0);
514 
515     // 05 create VTypeAttributeRow and Label for BoardingDuration
516     myBoardingDuration = new VTypeAttributeRow(this, column, SUMO_ATTR_BOARDING_DURATION, 1);
517 
518     // 06 create VTypeAttributeRow and Label for LoadingDuration
519     myLoadingDuration = new VTypeAttributeRow(this, column, SUMO_ATTR_LOADING_DURATION, 1);
520 
521     // 07 create ComboBox and Label for LatAlignment
522     myLatAlignment = new VTypeAttributeRow(this, column, SUMO_ATTR_LATALIGNMENT, SUMOXMLDefinitions::LateralAlignments.getStrings());
523 
524     // 08 create VTypeAttributeRow and Label for MinGapLat
525     myMinGapLat = new VTypeAttributeRow(this, column, SUMO_ATTR_MINGAP_LAT, 1);
526 
527     // 09 create VTypeAttributeRow and Label for MaxSpeedLat
528     myMaxSpeedLat = new VTypeAttributeRow(this, column, SUMO_ATTR_MAXSPEED_LAT, 1);
529 
530     // 10 create VTypeAttributeRow and Label for ActionStepLenght
531     myActionStepLenght = new VTypeAttributeRow(this, column, SUMO_ATTR_ACTIONSTEPLENGTH, 1);
532 }
533 
534 
535 void
buildJunctionModelAttributesA(FXVerticalFrame * column)536 GNEVehicleTypeDialog::VTypeAtributes::buildJunctionModelAttributesA(FXVerticalFrame* column) {
537     // 01 create VTypeAttributeRow and Label for JMCrossingGap
538     myJMCrossingGap = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_CROSSING_GAP, 1);
539 
540     // 02 create VTypeAttributeRow and Label for JMIgnoreKeepclearTime
541     myJMIgnoreKeepclearTime = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_IGNORE_KEEPCLEAR_TIME, 1);
542 
543     // 03 create VTypeAttributeRow and Label for JMDriveAfterRedTime
544     myJMDriveAfterRedTime = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME, 1);
545 
546     // 04 create VTypeAttributeRow and Label for JMDriveRedSpeed
547     myJMDriveRedSpeed = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_DRIVE_RED_SPEED, 2);
548 
549     // 05 create VTypeAttributeRow and Label for JMIgnoreFoeProb
550     myJMIgnoreFoeProb = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_IGNORE_FOE_PROB, 1);
551 }
552 
553 
554 void
buildJunctionModelAttributesB(FXVerticalFrame * column)555 GNEVehicleTypeDialog::VTypeAtributes::buildJunctionModelAttributesB(FXVerticalFrame* column) {
556     // 01 create VTypeAttributeRow and Label for JMIgnoreFoeSpeed
557     myJMIgnoreFoeSpeed = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_IGNORE_FOE_SPEED, 1);
558 
559     // 02 create VTypeAttributeRow and Label for JMSigmaMinor
560     myJMSigmaMinor = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_SIGMA_MINOR, 2);
561 
562     // 03 create VTypeAttributeRow and Label for JMTimeGapMinor
563     myJMTimeGapMinor = new VTypeAttributeRow(this, column, SUMO_ATTR_JM_TIMEGAP_MINOR, 1);
564 
565     // 04 create VTypeAttributeRow and Label for Impatience
566     myJMImpatience = new VTypeAttributeRow(this, column, SUMO_ATTR_IMPATIENCE, 1);
567 }
568 
569 void
updateValues()570 GNEVehicleTypeDialog::VTypeAtributes::updateValues() {
571     //set values of myEditedDemandElement into fields
572     myTextFieldVehicleTypeID->setText(myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_ID).c_str());
573     // set field color
574     myTextFieldColor->setText(myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_COLOR).c_str());
575     // set color depending if is a default value
576     if (myVehicleTypeDialog->myEditedDemandElement->getTagProperty().getDefaultValue(SUMO_ATTR_COLOR) != myTextFieldColor->getText().text()) {
577         myTextFieldColor->setTextColor(FXRGB(0, 0, 0));
578     } else {
579         myTextFieldColor->setTextColor(FXRGB(195, 195, 195));
580     }
581     // set variables of special rows VType and VShape
582     myVClassRow->updateValues();
583     myVShapeRow->updateValues();
584     // update rows
585     myLaneChangeModel->updateValue();
586     myLatAlignment->updateValue();
587     myLength->updateValue();
588     myMinGap->updateValue();
589     myMaxSpeed->updateValue();
590     mySpeedFactor->updateValue();
591     mySpeedDev->updateValue();
592     myEmissionClass->updateValue();
593     myWidth->updateValue();
594     myFilename->updateValue();
595     myPersonCapacity->updateValue();
596     myContainerCapacity->updateValue();
597     myBoardingDuration->updateValue();
598     myLoadingDuration->updateValue();
599     myMinGapLat->updateValue();
600     myMaxSpeedLat->updateValue();
601     // JM Parameters
602     myJMCrossingGap->updateValue();
603     myJMIgnoreKeepclearTime->updateValue();
604     myJMDriveAfterRedTime->updateValue();
605     myJMDriveRedSpeed->updateValue();
606     myJMIgnoreFoeProb->updateValue();
607     myJMIgnoreFoeSpeed->updateValue();
608     myJMSigmaMinor->updateValue();
609     myJMTimeGapMinor->updateValue();
610     myJMImpatience->updateValue();
611 }
612 
613 
614 long
onCmdSetVariable(FXObject *,FXSelector,void *)615 GNEVehicleTypeDialog::VTypeAtributes::onCmdSetVariable(FXObject*, FXSelector, void*) {
616     // At start we assumed, that all values are valid
617     myVehicleTypeDialog->myVehicleTypeValid = true;
618     myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_NOTHING;
619     // set color of myTextFieldVehicleTypeID, depending if current value is valid or not
620     if (myVehicleTypeDialog->myEditedDemandElement->isValid(SUMO_ATTR_ID, myTextFieldVehicleTypeID->getText().text())) {
621         myTextFieldVehicleTypeID->setTextColor(FXRGB(0, 0, 0));
622         myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_ID, myTextFieldVehicleTypeID->getText().text(), myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
623     } else if (myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_ID) == myTextFieldVehicleTypeID->getText().text()) {
624         myTextFieldVehicleTypeID->setTextColor(FXRGB(0, 0, 0));
625         myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_ID, myTextFieldVehicleTypeID->getText().text(), myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
626     } else {
627         myTextFieldVehicleTypeID->setTextColor(FXRGB(255, 0, 0));
628         myVehicleTypeDialog->myVehicleTypeValid = false;
629         myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_ID;
630     }
631     // set color of myTextFieldColor, depending if current value is valid or not
632     if (myVehicleTypeDialog->myEditedDemandElement->isValid(SUMO_ATTR_COLOR, myTextFieldColor->getText().text())) {
633         // set color depending if is a default value
634         if (myVehicleTypeDialog->myEditedDemandElement->getTagProperty().getDefaultValue(SUMO_ATTR_COLOR) != myTextFieldColor->getText().text()) {
635             myTextFieldColor->setTextColor(FXRGB(0, 0, 0));
636         } else {
637             myTextFieldColor->setTextColor(FXRGB(195, 195, 195));
638         }
639         myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_COLOR, myTextFieldColor->getText().text(), myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
640     } else {
641         myTextFieldColor->setTextColor(FXRGB(255, 0, 0));
642         myVehicleTypeDialog->myVehicleTypeValid = false;
643         myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_COLOR;
644     }
645     // set variables of special rows VType and VShape
646     myVClassRow->setVariable();
647     myVShapeRow->setVariable();
648     // set attributes in rows
649     myLaneChangeModel->setVariable();
650     myLatAlignment->setVariable();
651     myLength->setVariable();
652     myMinGap->setVariable();
653     myMaxSpeed->setVariable();
654     mySpeedFactor->setVariable();
655     mySpeedDev->setVariable();
656     myEmissionClass->setVariable();
657     myWidth->setVariable();
658     myFilename->setVariable();
659     myPersonCapacity->setVariable();
660     myContainerCapacity->setVariable();
661     myBoardingDuration->setVariable();
662     myLoadingDuration->setVariable();
663     myMinGapLat->setVariable();
664     myMaxSpeedLat->setVariable();
665     // JM Variables
666     myJMCrossingGap->setVariable();
667     myJMIgnoreKeepclearTime->setVariable();
668     myJMDriveAfterRedTime->setVariable();
669     myJMDriveRedSpeed->setVariable();
670     myJMIgnoreFoeProb->setVariable();
671     myJMIgnoreFoeSpeed->setVariable();
672     myJMSigmaMinor->setVariable();
673     myJMTimeGapMinor->setVariable();
674     myJMImpatience->setVariable();
675     return true;
676 }
677 
678 
679 long
onCmdSetColor(FXObject *,FXSelector,void *)680 GNEVehicleTypeDialog::VTypeAtributes::onCmdSetColor(FXObject*, FXSelector, void*) {
681     // create FXColorDialog
682     FXColorDialog colordialog(this, tr("Color Dialog"));
683     colordialog.setTarget(this);
684     // If previous attribute wasn't correct, set black as default color
685     if (GNEAttributeCarrier::canParse<RGBColor>(myTextFieldColor->getText().text())) {
686         colordialog.setRGBA(MFXUtils::getFXColor(RGBColor::parseColor(myTextFieldColor->getText().text())));
687     } else {
688         colordialog.setRGBA(MFXUtils::getFXColor(RGBColor::BLACK));
689     }
690     // execute dialog to get a new color
691     if (colordialog.execute()) {
692         std::string newValue = toString(MFXUtils::getRGBColor(colordialog.getRGBA()));
693         myTextFieldColor->setText(newValue.c_str());
694         if (myVehicleTypeDialog->myEditedDemandElement->isValid(SUMO_ATTR_COLOR, newValue)) {
695             myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_COLOR, newValue, myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
696             // If previously value was incorrect, change font color to black
697             myTextFieldColor->setTextColor(FXRGB(0, 0, 0));
698             myTextFieldColor->killFocus();
699         }
700     }
701     return 1;
702 }
703 
704 // ---------------------------------------------------------------------------
705 // GNEVehicleTypeDialog::VShapeRow - methods
706 // ---------------------------------------------------------------------------
707 
CarFollowingModelParameters(GNEVehicleTypeDialog * vehicleTypeDialog,FXHorizontalFrame * column)708 GNEVehicleTypeDialog::CarFollowingModelParameters::CarFollowingModelParameters(GNEVehicleTypeDialog* vehicleTypeDialog, FXHorizontalFrame* column) :
709     FXGroupBox(column, "Car Following Model", GUIDesignGroupBoxFrame),
710     myVehicleTypeDialog(vehicleTypeDialog) {
711 
712     // create vertical frame for rows
713     myVerticalFrameRows = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
714 
715     // declare combo box
716     FXHorizontalFrame* row = new FXHorizontalFrame(myVerticalFrameRows, GUIDesignAuxiliarHorizontalFrame);
717     new FXLabel(row, "Algorithm", nullptr, GUIDesignLabelAttribute150);
718     myComboBoxCarFollowModel = new FXComboBox(row, GUIDesignComboBoxNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignComboBox);
719 
720     // fill combo Box with all Car following models
721     std::vector<std::string> CFModels = SUMOXMLDefinitions::CarFollowModels.getStrings();
722     for (auto i : CFModels) {
723         myComboBoxCarFollowModel->appendItem(i.c_str());
724     }
725     myComboBoxCarFollowModel->setNumVisible(10);
726 
727     // 01 create FX and Label for Accel
728     myAccelRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_ACCEL);
729     myRows.push_back(myAccelRow);
730 
731     // 02 create FX and Label for Decel
732     myDecelRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_DECEL);
733     myRows.push_back(myDecelRow);
734 
735     // 03 create FX and Label for Apparent decel
736     myApparentDecelRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_APPARENTDECEL);
737     myRows.push_back(myApparentDecelRow);
738 
739     // 04 create FX and Label for emergency decel
740     myEmergencyDecelRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_EMERGENCYDECEL);
741     myRows.push_back(myEmergencyDecelRow);
742 
743     // 05 create FX and Label for Sigma
744     mySigmaRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_SIGMA);
745     myRows.push_back(mySigmaRow);
746 
747     // 06 create FX and Label for Tau
748     myTauRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TAU);
749     myRows.push_back(myTauRow);
750 
751     // 07 myMinGapFactor FX and Label for MinGapFactor
752     myMinGapFactorRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_COLLISION_MINGAP_FACTOR);
753     myRows.push_back(myMinGapFactorRow);
754 
755     // 08 create FX and Label for K
756     myKRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_K);
757     myRows.push_back(myKRow);
758 
759     // 09 create FX and Label for PHI
760     myPhiRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_KERNER_PHI);
761     myRows.push_back(myPhiRow);
762 
763     // 10 create FX and Label for Deleta
764     myDeltaRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_IDM_DELTA);
765     myRows.push_back(myDeltaRow);
766 
767     // 11 create FX and Label for Stepping
768     mySteppingRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_IDM_STEPPING);
769     myRows.push_back(mySteppingRow);
770 
771     // 12 create FX and Label for Security
772     mySecurityRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_WIEDEMANN_SECURITY);
773     myRows.push_back(mySecurityRow);
774 
775     // 13 create FX and Label for Estimation
776     myEstimationRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_WIEDEMANN_ESTIMATION);
777     myRows.push_back(myEstimationRow);
778 
779     // 14 create FX and Label for TMP1
780     myTmp1Row = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TMP1);
781     myRows.push_back(myTmp1Row);
782 
783     // 15 create FX and Label for TMP2
784     myTmp2Row = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TMP2);
785     myRows.push_back(myTmp2Row);
786 
787     // 16 create FX and Label for TMP3
788     myTmp3Row = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TMP3);
789     myRows.push_back(myTmp3Row);
790 
791     // 17 create FX and Label for TMP4
792     myTmp4Row = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TMP4);
793     myRows.push_back(myTmp4Row);
794 
795     // 18 create FX and Label for TMP5
796     myTmp5Row = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TMP5);
797     myRows.push_back(myTmp5Row);
798 
799     // 19 create FX and Label for Estimation
800     myTrainTypeRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_TRAIN_TYPE);
801     myRows.push_back(myTrainTypeRow);
802 
803     // 20 create FX and Label for Tau Last
804     myTrauLastRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_PWAGNER2009_TAULAST);
805     myRows.push_back(myTrauLastRow);
806 
807     // 21 create FX and Label for Aprob
808     myAprobRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_PWAGNER2009_APPROB);
809     myRows.push_back(myAprobRow);
810 
811     // 22 create FX and Label for Adapt Factor
812     myAdaptFactorRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_IDMM_ADAPT_FACTOR);
813     myRows.push_back(myAdaptFactorRow);
814 
815     // 23 create FX and Label for Adapt Time
816     myAdaptTimeRow = new CarFollowingModelRow(this, myVerticalFrameRows, SUMO_ATTR_CF_IDMM_ADAPT_TIME);
817     myRows.push_back(myAdaptTimeRow);
818 
819     // create myLabelIncompleteAttribute
820     myLabelIncompleteAttribute = new FXLabel(myVerticalFrameRows, "Some attributes wasn't\nimplemented yet", nullptr, GUIDesignLabelAboutInfoCenter);
821     myLabelIncompleteAttribute->hide();
822 
823     // show or hidde ComboBox depending of current selected CFM
824     refreshCFMFields();
825 }
826 
827 
828 void
refreshCFMFields()829 GNEVehicleTypeDialog::CarFollowingModelParameters::refreshCFMFields() {
830     // start hidding all rows
831     for (const auto& i : myRows) {
832         i->hide();
833     }
834     // hide myLabelIncompleteAttribute
835     myLabelIncompleteAttribute->hide();
836     // show textfield depending of current CFM
837     if (SUMOXMLDefinitions::CarFollowModels.hasString(myComboBoxCarFollowModel->getText().text())) {
838         // show textfield depending of selected CFM
839         switch (SUMOXMLDefinitions::CarFollowModels.get(myComboBoxCarFollowModel->getText().text())) {
840             case SUMO_TAG_CF_KRAUSS:
841             case SUMO_TAG_CF_KRAUSS_ORIG1:
842             case SUMO_TAG_CF_KRAUSS_PLUS_SLOPE:
843                 myTauRow->show();
844                 myAccelRow->show();
845                 myDecelRow->show();
846                 myApparentDecelRow->show();
847                 myEmergencyDecelRow->show();
848                 mySigmaRow->show();
849                 break;
850             case SUMO_TAG_CF_KRAUSSX:
851                 myTauRow->show();
852                 myTmp1Row->show();
853                 myTmp2Row->show();
854                 myTmp3Row->show();
855                 myTmp4Row->show();
856                 myTmp5Row->show();
857                 break;
858             case SUMO_TAG_CF_SMART_SK:
859             case SUMO_TAG_CF_DANIEL1:
860                 myTauRow->show();
861                 myAccelRow->show();
862                 myDecelRow->show();
863                 myEmergencyDecelRow->show();
864                 mySigmaRow->show();
865                 myMinGapFactorRow->show();
866                 myTmp1Row->show();
867                 myTmp2Row->show();
868                 myTmp3Row->show();
869                 myTmp4Row->show();
870                 myTmp5Row->show();
871                 break;
872             case SUMO_TAG_CF_PWAGNER2009:
873                 myTauRow->show();
874                 myAccelRow->show();
875                 myDecelRow->show();
876                 myEmergencyDecelRow->show();
877                 mySigmaRow->show();
878                 myMinGapFactorRow->show();
879                 myTrauLastRow->show();
880                 myAprobRow->show();
881                 break;
882             case SUMO_TAG_CF_IDM:
883                 myTauRow->show();
884                 myAccelRow->show();
885                 myDecelRow->show();
886                 myEmergencyDecelRow->show();
887                 mySteppingRow->show();
888                 myMinGapFactorRow->show();
889                 break;
890             case SUMO_TAG_CF_IDMM:
891                 myTauRow->show();
892                 myAccelRow->show();
893                 myDecelRow->show();
894                 myEmergencyDecelRow->show();
895                 mySteppingRow->show();
896                 myMinGapFactorRow->show();
897                 myAdaptFactorRow->show();
898                 myAdaptTimeRow->show();
899                 break;
900             case SUMO_TAG_CF_BKERNER:
901                 myTauRow->show();
902                 myAccelRow->show();
903                 myDecelRow->show();
904                 myEmergencyDecelRow->show();
905                 myKRow->show();
906                 myPhiRow->show();
907                 myMinGapFactorRow->show();
908                 break;
909             case SUMO_TAG_CF_WIEDEMANN:
910                 myTauRow->show();
911                 myAccelRow->show();
912                 myDecelRow->show();
913                 myEmergencyDecelRow->show();
914                 myMinGapFactorRow->show();
915                 mySecurityRow->show();
916                 myEstimationRow->show();
917                 break;
918             case SUMO_TAG_CF_RAIL:
919                 myTauRow->show();
920                 myTrainTypeRow->show();
921                 break;
922             case SUMO_TAG_CF_ACC:
923                 myTauRow->show();
924                 myAccelRow->show();
925                 myDecelRow->show();
926                 myEmergencyDecelRow->show();
927                 myMinGapFactorRow->show();
928                 // show myLabelIncompleteAttribute
929                 myLabelIncompleteAttribute->show();
930                 /**
931                 The follow parameters has to be added:
932                     SUMO_ATTR_SC_GAIN
933                     SUMO_ATTR_GCC_GAIN_SPEED
934                     SUMO_ATTR_GCC_GAIN_SPACE
935                     SUMO_ATTR_GC_GAIN_SPEED
936                     SUMO_ATTR_GC_GAIN_SPACE
937                     SUMO_ATTR_CA_GAIN_SPEED
938                     SUMO_ATTR_CA_GAIN_SPACE
939                 */
940                 break;
941             case SUMO_TAG_CF_CACC:
942                 myTauRow->show();
943                 myAccelRow->show();
944                 myDecelRow->show();
945                 myEmergencyDecelRow->show();
946                 myMinGapFactorRow->show();
947                 // show myLabelIncompleteAttribute
948                 myLabelIncompleteAttribute->show();
949                 /**
950                 The follow parameters has to be added:
951                     SUMO_ATTR_SC_GAIN_CACC
952                     SUMO_ATTR_GCC_GAIN_GAP_CACC
953                     SUMO_ATTR_GCC_GAIN_GAP_DOT_CACC
954                     SUMO_ATTR_GC_GAIN_GAP_CACC
955                     SUMO_ATTR_GC_GAIN_GAP_DOT_CACC
956                     SUMO_ATTR_CA_GAIN_GAP_CACC
957                     SUMO_ATTR_CA_GAIN_GAP_DOT_CACC
958                     SUMO_ATTR_GCC_GAIN_SPEED
959                     SUMO_ATTR_GCC_GAIN_SPACE
960                     SUMO_ATTR_GC_GAIN_SPEED
961                     SUMO_ATTR_GC_GAIN_SPACE
962                     SUMO_ATTR_CA_GAIN_SPEED
963                     SUMO_ATTR_CA_GAIN_SPACE
964                 */
965                 break;
966             case SUMO_TAG_CF_CC:
967                 myTauRow->show();
968                 myAccelRow->show();
969                 myDecelRow->show();
970                 // show myLabelIncompleteAttribute
971                 myLabelIncompleteAttribute->show();
972                 /**
973                 The follow parameters has to be added:
974                     SUMO_ATTR_CF_CC_C1
975                     SUMO_ATTR_CF_CC_CCDECEL
976                     SUMO_ATTR_CF_CC_CONSTSPACING
977                     SUMO_ATTR_CF_CC_KP
978                     SUMO_ATTR_CF_CC_LAMBDA
979                     SUMO_ATTR_CF_CC_OMEGAN
980                     SUMO_ATTR_CF_CC_TAU
981                     SUMO_ATTR_CF_CC_XI
982                     SUMO_ATTR_CF_CC_LANES_COUNT
983                     SUMO_ATTR_CF_CC_CCACCEL
984                     SUMO_ATTR_CF_CC_PLOEG_KP
985                     SUMO_ATTR_CF_CC_PLOEG_KD
986                     SUMO_ATTR_CF_CC_PLOEG_H
987                     SUMO_ATTR_CF_CC_FLATBED_KA
988                     SUMO_ATTR_CF_CC_FLATBED_KV
989                     SUMO_ATTR_CF_CC_FLATBED_KP
990                     SUMO_ATTR_CF_CC_FLATBED_D
991                     SUMO_ATTR_CF_CC_FLATBED_H
992                 */
993                 break;
994             default:
995                 break;
996         }
997     }
998     myVerticalFrameRows->recalc();
999     update();
1000 }
1001 
1002 
1003 void
updateValues()1004 GNEVehicleTypeDialog::CarFollowingModelParameters::updateValues() {
1005     //set values of myEditedDemandElement into fields
1006     if (myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_CAR_FOLLOW_MODEL).empty()) {
1007         myComboBoxCarFollowModel->setCurrentItem(0);
1008     } else {
1009         myComboBoxCarFollowModel->setText(myVehicleTypeDialog->myEditedDemandElement->getAttribute(SUMO_ATTR_CAR_FOLLOW_MODEL).c_str());
1010     }
1011     // refresh fields
1012     refreshCFMFields();
1013     // update value in all Rows
1014     for (const auto& i : myRows) {
1015         i->updateValue();
1016     }
1017 }
1018 
1019 
1020 long
onCmdSetVariable(FXObject *,FXSelector,void *)1021 GNEVehicleTypeDialog::CarFollowingModelParameters::onCmdSetVariable(FXObject*, FXSelector, void*) {
1022     // At start we assumed, that all values are valid
1023     myVehicleTypeDialog->myVehicleTypeValid = true;
1024     myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_NOTHING;
1025     // set color of myTextFieldCarFollowModel, depending if current value is valid or not
1026     if (myVehicleTypeDialog->myEditedDemandElement->isValid(SUMO_ATTR_CAR_FOLLOW_MODEL, myComboBoxCarFollowModel->getText().text())) {
1027         myComboBoxCarFollowModel->setTextColor(FXRGB(0, 0, 0));
1028         myVehicleTypeDialog->myEditedDemandElement->setAttribute(SUMO_ATTR_CAR_FOLLOW_MODEL, myComboBoxCarFollowModel->getText().text(), myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
1029     } else {
1030         myComboBoxCarFollowModel->setTextColor(FXRGB(255, 0, 0));
1031         myVehicleTypeDialog->myVehicleTypeValid = false;
1032         myVehicleTypeDialog->myInvalidAttr = SUMO_ATTR_CAR_FOLLOW_MODEL;
1033     }
1034     // set variable in all Rows
1035     for (const auto& i : myRows) {
1036         i->setVariable();
1037     }
1038     // refresh fields
1039     refreshCFMFields();
1040     return true;
1041 }
1042 
1043 // ---------------------------------------------------------------------------
1044 // GNEVehicleTypeDialog - public methods
1045 // ---------------------------------------------------------------------------
1046 
GNEVehicleTypeDialog(GNEDemandElement * editedVehicleType,bool updatingElement)1047 GNEVehicleTypeDialog::GNEVehicleTypeDialog(GNEDemandElement* editedVehicleType, bool updatingElement) :
1048     GNEDemandElementDialog(editedVehicleType, updatingElement, 1022, 506),
1049     myVehicleTypeValid(true),
1050     myInvalidAttr(SUMO_ATTR_NOTHING) {
1051 
1052     // change default header
1053     changeDemandElementDialogHeader(updatingElement ? "Edit " + myEditedDemandElement->getTagStr() : "Create " + myEditedDemandElement->getTagStr());
1054 
1055     // Create auxiliar frames for values
1056     FXHorizontalFrame* columns = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
1057 
1058     // create vehicle type attributes
1059     myVTypeAtributes = new VTypeAtributes(this, columns);
1060 
1061     // create car following model parameters
1062     myCarFollowingModelParameters = new CarFollowingModelParameters(this, columns);
1063 
1064     // start a undo list for editing local to this additional
1065     initChanges();
1066 
1067     // add element if we aren't updating an existent element
1068     if (myUpdatingElement == false) {
1069         myEditedDemandElement->getViewNet()->getUndoList()->add(new GNEChange_DemandElement(myEditedDemandElement, true), true);
1070     }
1071 
1072     // update values of Vehicle Type common attributes
1073     myVTypeAtributes->updateValues();
1074 
1075     // update values of Car Following Model Parameters
1076     myCarFollowingModelParameters->updateValues();
1077 
1078     // open as modal dialog
1079     openAsModalDialog();
1080 }
1081 
1082 
~GNEVehicleTypeDialog()1083 GNEVehicleTypeDialog::~GNEVehicleTypeDialog() {}
1084 
1085 
1086 long
onCmdAccept(FXObject *,FXSelector,void *)1087 GNEVehicleTypeDialog::onCmdAccept(FXObject*, FXSelector, void*) {
1088     if (myVehicleTypeValid == false) {
1089         // write warning if netedit is running in testing mode
1090         WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
1091         std::string operation1 = myUpdatingElement ? ("updating") : ("creating");
1092         std::string operation2 = myUpdatingElement ? ("updated") : ("created");
1093         std::string tagString = myEditedDemandElement->getTagStr();
1094         // open warning dialogBox
1095         FXMessageBox::warning(getApp(), MBOX_OK,
1096                               ("Error " + operation1 + " " + tagString).c_str(), "%s",
1097                               (tagString + " cannot be " + operation2 +
1098                                " because parameter " + toString(myInvalidAttr) +
1099                                " is invalid.").c_str());
1100         // write warning if netedit is running in testing mode
1101         WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
1102         return 0;
1103     } else {
1104         // accept changes before closing dialog
1105         acceptChanges();
1106         // stop dialgo sucesfully
1107         getApp()->stopModal(this, TRUE);
1108         return 1;
1109     }
1110 }
1111 
1112 
1113 long
onCmdCancel(FXObject *,FXSelector,void *)1114 GNEVehicleTypeDialog::onCmdCancel(FXObject*, FXSelector, void*) {
1115     // cancel changes
1116     cancelChanges();
1117     // Stop Modal
1118     getApp()->stopModal(this, FALSE);
1119     return 1;
1120 }
1121 
1122 
1123 long
onCmdReset(FXObject *,FXSelector,void *)1124 GNEVehicleTypeDialog::onCmdReset(FXObject*, FXSelector, void*) {
1125     // reset changes
1126     resetChanges();
1127     // update values of Vehicle Type common attributes
1128     myVTypeAtributes->updateValues();
1129     // update values of Car Following Model Parameters
1130     myCarFollowingModelParameters->updateValues();
1131     return 1;
1132 }
1133 
1134 // ---------------------------------------------------------------------------
1135 // GNEVehicleTypeDialog - private methods
1136 // ---------------------------------------------------------------------------
1137 
CarFollowingModelRow(CarFollowingModelParameters * carFollowingModelParametersParent,FXVerticalFrame * verticalFrame,SumoXMLAttr attr)1138 GNEVehicleTypeDialog::CarFollowingModelParameters::CarFollowingModelRow::CarFollowingModelRow(CarFollowingModelParameters* carFollowingModelParametersParent, FXVerticalFrame* verticalFrame, SumoXMLAttr attr) :
1139     FXHorizontalFrame(verticalFrame, GUIDesignAuxiliarHorizontalFrame),
1140     myCarFollowingModelParametersParent(carFollowingModelParametersParent),
1141     myAttr(attr) {
1142     myLabel = new FXLabel(this, toString(attr).c_str(), nullptr, GUIDesignLabelAttribute150);
1143     textField = new FXTextField(this, GUIDesignTextFieldNCol, carFollowingModelParametersParent, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFielWidth180Real);
1144 }
1145 
1146 
1147 void
setVariable()1148 GNEVehicleTypeDialog::CarFollowingModelParameters::CarFollowingModelRow::setVariable() {
1149     // set color of textField, depending if current value is valid or not
1150     if (myCarFollowingModelParametersParent->myVehicleTypeDialog->myEditedDemandElement->isValid(myAttr, textField->getText().text())) {
1151         // set color depending if is a default value
1152         if (myCarFollowingModelParametersParent->myVehicleTypeDialog->myEditedDemandElement->getTagProperty().getDefaultValue(myAttr) != textField->getText().text()) {
1153             textField->setTextColor(FXRGB(0, 0, 0));
1154         } else {
1155             textField->setTextColor(FXRGB(195, 195, 195));
1156         }
1157         myCarFollowingModelParametersParent->myVehicleTypeDialog->myEditedDemandElement->setAttribute(myAttr, textField->getText().text(),
1158                 myCarFollowingModelParametersParent->myVehicleTypeDialog->myEditedDemandElement->getViewNet()->getUndoList());
1159         // update value after setting it
1160         updateValue();
1161     } else {
1162         textField->setTextColor(FXRGB(255, 0, 0));
1163         // mark VType as invalid
1164         myCarFollowingModelParametersParent->myVehicleTypeDialog->myVehicleTypeValid = false;
1165         myCarFollowingModelParametersParent->myVehicleTypeDialog->myInvalidAttr = myAttr;
1166     }
1167 }
1168 
1169 
1170 void
updateValue()1171 GNEVehicleTypeDialog::CarFollowingModelParameters::CarFollowingModelRow::updateValue() {
1172     // set text of myTextField using current value of VType
1173     textField->setText(myCarFollowingModelParametersParent->myVehicleTypeDialog->myEditedDemandElement->getAttribute(myAttr).c_str());
1174     // set color depending if is a default value
1175     if (myCarFollowingModelParametersParent->myVehicleTypeDialog->myEditedDemandElement->getTagProperty().getDefaultValue(myAttr) != textField->getText().text()) {
1176         textField->setTextColor(FXRGB(0, 0, 0));
1177     } else {
1178         textField->setTextColor(FXRGB(195, 195, 195));
1179     }
1180 }
1181 
1182 /****************************************************************************/
1183