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