扩展车辆

本文档简要描述了如何扩展车辆类。我们将以扩展车辆的载客能力为例进行说明。

基础知识#

主要的车辆参数存储在 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);
}