本文档简要描述了如何扩展车辆类。我们将以扩展车辆的载客能力为例进行说明。
基础知识#
主要的车辆参数存储在 src/utils/vehicle/SUMOVehicleParameter 中。首先,我们在类(.h)中扩展两个参数:
/// @brief 车辆容量(人数)
unsigned int personCapacity;
/// @brief 车辆内的人数
unsigned int personNumber;
我们还需要在构造函数(.cpp)中为它们分配默认值:
... personCapacity(0), personNumber(0), ...
我们的车辆现在拥有了这些属性,我们可以在模拟中以及路由模块中使用它们。
输入/输出 (I/O)#
车辆解析器会存储信息是否被给定,以便在必要时回写。我们必须定义常量(位集)来描述该值是否被给定(.h):
const int VEHPARS_PERSON_CAPACITY_SET = 2 << 14;
const int VEHPARS_PERSONS_NUMBER_SET = 2 << 15;
写入车辆#
我们将存储在 void SUMOVehicleParameter::writeAs(...) const 中的车辆写入方法扩展以包含新属性:
if (wasSet(VEHPARS_PERSON_CAPACITY_SET)) {
dev.writeAttr(SUMO_ATTR_PERSON_CAPACITY, personCapacity);
}
if (wasSet(VEHPARS_PERSON_NUMBER_SET)) {
dev.writeAttr(SUMO_ATTR_PERSON_NUMBER, personNumber);
}
您可能已经注意到,我们为两个 XML 属性使用了枚举,这里是:"SUMO_ATTR_PERSON_CAPACITY" 和 "SUMO_ATTR_PERSON_NUMBER"。
它们必须在 src/utils/xml/SUMOXMLDefinitions 中定义。在 SUMOXMLDefinitions.h 中,我们必须扩展 SumoXMLAttr:
SUMO_ATTR_PERSON_CAPACITY,
SUMO_ATTR_PERSON_NUMBER,
在 SUMOXMLDefinitions.cpp 中,我们也必须扩展 SumoXMLAttr:
{ "personCapacity", SUMO_ATTR_PERSON_CAPACITY },
{ "personNumber", SUMO_ATTR_PERSON_NUMBER },
给定的字符串稍后将用作 XML 属性。
加载#
然后我们扩展车辆解析方法。它位于 src/utils/xml/SUMOVehicleParserHelper 中。我们必须在 void SUMOVehicleParserHelper::parseCommonAttributes(...) 中添加对新属性的解析。
// 解析人数
if (attrs.hasAttribute(SUMO_ATTR_PERSON_NUMBER)) {
ret->setParameter |= VEHPARS_PERSON_NUMBER_SET;
ret->personNumber = attrs.getIntReporting(SUMO_ATTR_PERSON_NUMBER, 0, ok);
}
// 解析车辆容量
if (attrs.hasAttribute(SUMO_ATTR_PERSON_CAPACITY)) {
ret->setParameter |= VEHPARS_PERSON_CAPACITY_SET;
ret->personCapacity = attrs.getIntReporting(SUMO_ATTR_PERSON_CAPACITY, 0, ok);
}
