void
SUMOVTypeParameter::write(OutputDevice& dev) const {
    if (onlyReferenced) {
        return;
    }
    dev.openTag(SUMO_TAG_VTYPE);
    dev.writeAttr(SUMO_ATTR_ID, id);
    if (wasSet(VTYPEPARS_LENGTH_SET)) {
        dev.writeAttr(SUMO_ATTR_LENGTH, length);
    }
    if (wasSet(VTYPEPARS_MINGAP_SET)) {
        dev.writeAttr(SUMO_ATTR_MINGAP, minGap);
    }
    if (wasSet(VTYPEPARS_MAXSPEED_SET)) {
        dev.writeAttr(SUMO_ATTR_MAXSPEED, maxSpeed);
    }
    if (wasSet(VTYPEPARS_PROBABILITY_SET)) {
        dev.writeAttr(SUMO_ATTR_PROB, defaultProbability);
    }
    if (wasSet(VTYPEPARS_SPEEDFACTOR_SET)) {
        dev.writeAttr(SUMO_ATTR_SPEEDFACTOR, speedFactor);
    }
    if (wasSet(VTYPEPARS_SPEEDDEVIATION_SET)) {
        dev.writeAttr(SUMO_ATTR_SPEEDDEV, speedDev);
    }
    if (wasSet(VTYPEPARS_VEHICLECLASS_SET)) {
        dev.writeAttr(SUMO_ATTR_VCLASS, toString(vehicleClass));
    }
    if (wasSet(VTYPEPARS_EMISSIONCLASS_SET)) {
        dev.writeAttr(SUMO_ATTR_EMISSIONCLASS, getVehicleEmissionTypeName(emissionClass));
    }
    if (wasSet(VTYPEPARS_SHAPE_SET)) {
        dev.writeAttr(SUMO_ATTR_GUISHAPE, getVehicleShapeName(shape));
    }
    if (wasSet(VTYPEPARS_WIDTH_SET)) {
        dev.writeAttr(SUMO_ATTR_WIDTH, width);
    }
    if (wasSet(VTYPEPARS_HEIGHT_SET)) {
        dev.writeAttr(SUMO_ATTR_HEIGHT, height);
    }
    if (wasSet(VTYPEPARS_COLOR_SET)) {
        dev.writeAttr(SUMO_ATTR_COLOR, color);
    }
    if (wasSet(VTYPEPARS_OSGFILE_SET)) {
        dev.writeAttr(SUMO_ATTR_OSGFILE, osgFile);
    }
    if (wasSet(VTYPEPARS_IMGFILE_SET)) {
        dev.writeAttr(SUMO_ATTR_IMGFILE, imgFile);
    }

    if (cfParameter.size() != 0) {
        dev.openTag(cfModel);
        std::vector<SumoXMLAttr> attrs;
        for (CFParams::const_iterator i = cfParameter.begin(); i != cfParameter.end(); ++i) {
            attrs.push_back(i->first);
        }
        std::sort(attrs.begin(), attrs.end());
        for (std::vector<SumoXMLAttr>::const_iterator i = attrs.begin(); i != attrs.end(); ++i) {
            dev.writeAttr(*i, cfParameter.find(*i)->second);
        }
        dev.closeTag();
        dev.closeTag();
    } else {
        dev.closeTag();
    }
}
void
SUMOVTypeParameter::write(OutputDevice &dev) const throw(IOError) {
    if (onlyReferenced) {
        return;
    }
    dev << "   <vtype id=\"" << id << '"';
    if (wasSet(VTYPEPARS_LENGTH_SET)) {
        dev << " length=\"" << length << '"';
    }
    if (wasSet(VTYPEPARS_MAXSPEED_SET)) {
        dev << " maxspeed=\"" << maxSpeed << '"';
    }
    if (wasSet(VTYPEPARS_PROBABILITY_SET)) {
        dev << " probability=\"" << defaultProbability << '"';
    }
    if (wasSet(VTYPEPARS_SPEEDFACTOR_SET)) {
        dev << " speedFactor=\"" << speedFactor << '"';
    }
    if (wasSet(VTYPEPARS_SPEEDDEVIATION_SET)) {
        dev << " speedDev=\"" << speedDev << '"';
    }
    if (wasSet(VTYPEPARS_VEHICLECLASS_SET)) {
        dev << " vclass=\"" << getVehicleClassName(vehicleClass) << '"';
    }
    if (wasSet(VTYPEPARS_EMISSIONCLASS_SET)) {
        dev << " emissionClass=\"" << getVehicleEmissionTypeName(emissionClass) << '"';
    }
    if (wasSet(VTYPEPARS_SHAPE_SET)) {
        dev << " guiShape=\"" << getVehicleShapeName(shape) << '"';
    }
    if (wasSet(VTYPEPARS_OFFSET_SET)) {
        dev << " guiOffset=\"" << offset << '"';
    }
    if (wasSet(VTYPEPARS_WIDTH_SET)) {
        dev << " guiWidth=\"" << width << '"';
    }
    if (wasSet(VTYPEPARS_COLOR_SET)) {
        dev << " color=\"" << color << '"';
    }

    if (cfParameter.size()!=0) {
        dev << ">\n";
        dev << "      <";
        switch (cfModel) {
        case SUMO_TAG_CF_IDM:
            dev << CF_MODEL_IDM;
            break;
        case SUMO_TAG_CF_KRAUSS_ORIG1:
            dev << CF_MODEL_KRAUSS_ORIG1;
            break;
        case SUMO_TAG_CF_PWAGNER2009:
            dev << CF_MODEL_PWAGNER2009;
            break;
        case SUMO_TAG_CF_BKERNER:
            dev << CF_MODEL_BKERNER;
            break;
        case SUMO_TAG_CF_IITBNN:
            dev << CF_MODEL_IITBNN;
            break;
        case SUMO_TAG_CF_KRAUSS:
        default:
            dev << CF_MODEL_KRAUSS;
            break;
        }
        std::vector<std::string> names;
        for (std::map<std::string, SUMOReal>::const_iterator i=cfParameter.begin(); i!=cfParameter.end(); ++i) {
            names.push_back((*i).first);
        }
        std::sort(names.begin(), names.end());
        for (std::vector<std::string>::const_iterator i=names.begin(); i!=names.end(); ++i) {
            dev << ' ' << (*i) << "=\"" << cfParameter.find(*i)->second << '"';
        }
        dev << "/>\n";
        dev << "   </vtype>\n";
    } else {
        dev << "/>\n";
    }
}