69 myAllowUndoRedo(allowUndoRedo),
70 myOverwrite(overwrite) {
80 const std::string& laneID,
const double startPos,
const double endPos,
const std::string& name,
81 const std::vector<std::string>& lines,
const int personCapacity,
const double parkingLength,
92 if (lane ==
nullptr) {
96 }
else if (personCapacity < 0) {
98 }
else if (parkingLength < 0) {
103 parkingLength, color, friendlyPosition, parameters);
113 busStop->
incRef(
"buildBusStop");
124 const std::string& laneID,
const double startPos,
const double endPos,
const std::string& name,
125 const std::vector<std::string>& lines,
const int personCapacity,
const double parkingLength,
136 if (lane ==
nullptr) {
140 }
else if (personCapacity < 0) {
142 }
else if (parkingLength < 0) {
147 parkingLength, color, friendlyPosition, parameters);
157 trainStop->
incRef(
"buildTrainStop");
168 const std::string& pos,
const double length,
const bool friendlyPos,
const Parameterised::Map& parameters) {
175 if (busStop ==
nullptr) {
179 bool validPos =
true;
180 double posDouble = 0;
182 if (GNEAttributeCarrier::canParse<double>(pos)) {
183 posDouble = GNEAttributeCarrier::parse<double>(pos);
185 }
else if (pos ==
"random" || pos ==
"doors" || pos ==
"carriage") {
187 }
else if (pos.empty()) {
194 if (lane ==
nullptr) {
196 }
else if (busStop ==
nullptr) {
198 }
else if (!validPos) {
200 }
else if ((length != -1) && (length < 0)) {
205 WRITE_WARNING(
TLF(
"Could not build access in netedit; The lane '%' doesn't support pedestrians", lane->
getID()));
219 access->
incRef(
"buildAccess");
227 const double startPos,
const double endPos,
const std::string& name,
const std::vector<std::string>& lines,
const int containerCapacity,
238 if (lane ==
nullptr) {
242 }
else if (containerCapacity < 0) {
244 }
else if (parkingLength < 0) {
249 color, friendlyPosition, parameters);
259 containerStop->
incRef(
"buildContainerStop");
270 const std::string& laneID,
const double startPos,
const double endPos,
const std::string& name,
const double chargingPower,
271 const double efficiency,
const bool chargeInTransit,
const SUMOTime chargeDelay,
const std::string& chargeType,
282 if (lane ==
nullptr) {
286 }
else if (chargingPower < 0) {
288 }
else if (chargeDelay < 0) {
293 chargeDelay, chargeType, waitingTime, friendlyPosition, parameters);
303 chargingStation->
incRef(
"buildChargingStation");
315 const double startPos,
const double endPos,
const std::string& departPos,
const std::string& name,
316 const std::vector<std::string>& badges,
const bool friendlyPosition,
const int roadSideCapacity,
const bool onRoad,
317 const double width,
const double length,
const double angle,
const bool lefthand,
const Parameterised::Map& parameters) {
327 const double departPosDouble = GNEAttributeCarrier::canParse<double>(departPos) ? GNEAttributeCarrier::parse<double>(departPos) : 0;
329 if (lane ==
nullptr) {
333 }
else if (roadSideCapacity < 0) {
335 }
else if (width < 0) {
337 }
else if (length < 0) {
340 writeError(
TLF(
"Could not build parking area with ID '%' in netedit; Invalid departPos over lane.",
id));
344 name, badges, friendlyPosition, roadSideCapacity, onRoad,
355 parkingArea->
incRef(
"buildParkingArea");
366 const std::string& name,
const std::string& width,
const std::string& length,
const std::string& angle,
const double slope,
369 if (!width.empty() && !GNEAttributeCarrier::canParse<double>(width)) {
370 writeError(
TL(
"Could not build parking space in netedit; attribute width cannot be parse to float."));
371 }
else if (!length.empty() && !GNEAttributeCarrier::canParse<double>(length)) {
372 writeError(
TL(
"Could not build parking space in netedit; attribute length cannot be parse to float."));
373 }
else if (!angle.empty() && !GNEAttributeCarrier::canParse<double>(angle)) {
374 writeError(
TL(
"Could not build parking space in netedit; attribute angle cannot be parse to float."));
381 const double widthDouble = width.empty() ? 0 : GNEAttributeCarrier::parse<double>(width);
382 const double lengthDouble = length.empty() ? 0 : GNEAttributeCarrier::parse<double>(length);
384 if (parkingArea ==
nullptr) {
386 }
else if (widthDouble < 0) {
388 }
else if (lengthDouble < 0) {
392 GNEAdditional* parkingSpace =
new GNEParkingSpace(
myNet, parkingArea,
Position(x, y, z), width, length, angle, slope, name, parameters);
402 parkingSpace->
incRef(
"buildParkingSpace");
413 const double position,
const SUMOTime period,
const std::string& file,
const std::vector<std::string>& vehicleTypes,
414 const std::vector<std::string>& nextEdges,
const std::string& detectPersons,
const std::string& name,
425 if (lane ==
nullptr) {
429 }
else if (period < 0) {
438 nextEdges, detectPersons, name, friendlyPos, parameters);
448 detectorE1->
incRef(
"buildDetectorE1");
459 const double pos,
const double length,
const SUMOTime period,
const std::string& trafficLight,
const std::string& filename,
460 const std::vector<std::string>& vehicleTypes,
const std::vector<std::string>& nextEdges,
const std::string& detectPersons,
461 const std::string& name,
const SUMOTime timeThreshold,
const double speedThreshold,
const double jamThreshold,
472 if (lane ==
nullptr) {
476 }
else if (length < 0) {
478 }
else if ((period != -1) && (period < 0)) {
482 writeError(
TLF(
"Could not build lane area detector with ID '%' in netedit; invalid traffic light ID.",
id));
483 }
else if (timeThreshold < 0) {
485 }
else if (speedThreshold < 0) {
487 }
else if (jamThreshold < 0) {
489 }
else if (timeThreshold < 0) {
491 }
else if (speedThreshold < 0) {
493 }
else if (jamThreshold < 0) {
502 vehicleTypes, nextEdges, detectPersons, name, timeThreshold,
503 speedThreshold, jamThreshold, friendlyPos, show, parameters);
513 detectorE2->
incRef(
"buildDetectorE2");
524 const double pos,
const double endPos,
const SUMOTime period,
const std::string& trafficLight,
const std::string& filename,
525 const std::vector<std::string>& vehicleTypes,
const std::vector<std::string>& nextEdges,
const std::string& detectPersons,
526 const std::string& name,
const SUMOTime timeThreshold,
const double speedThreshold,
const double jamThreshold,
537 if (lanes.size() > 0) {
540 writeError(
TLF(
"Could not build lane area detector with ID '%' in netedit; Lanes aren't consecutives.",
id));
542 pos, lanes.front()->getParentEdge()->getNBEdge()->getFinalLength(),
543 endPos, lanes.back()->getParentEdge()->getNBEdge()->getFinalLength(), friendlyPos)) {
545 }
else if ((period != -1) && (period < 0)) {
549 writeError(
TLF(
"Could not build lane area detector with ID '%' in netedit; invalid traffic light ID.",
id));
550 }
else if (timeThreshold < 0) {
552 }
else if (speedThreshold < 0) {
554 }
else if (jamThreshold < 0) {
563 vehicleTypes, nextEdges, detectPersons, name, timeThreshold,
564 speedThreshold, jamThreshold, friendlyPos, show, parameters);
573 for (
const auto& lane : lanes) {
574 lane->addChildElement(detectorE2);
576 detectorE2->
incRef(
"buildDetectorE2Multilane");
590 const std::string& filename,
const std::vector<std::string>& vehicleTypes,
const std::vector<std::string>& nextEdges,
591 const std::string& detectPersons,
const std::string& name,
const SUMOTime timeThreshold,
const double speedThreshold,
592 const bool openEntry,
const bool expectedArrival,
const Parameterised::Map& parameters) {
596 }
else if (period < 0) {
598 }
else if (timeThreshold < 0) {
600 }
else if (speedThreshold < 0) {
611 name, timeThreshold, speedThreshold, openEntry, expectedArrival, parameters);
620 E3->incRef(
"buildDetectorE3");
636 if (lane ==
nullptr) {
638 }
else if (
E3 ==
nullptr) {
656 E3->addChildElement(entry);
657 entry->
incRef(
"buildDetectorEntry");
671 if (lane ==
nullptr) {
673 }
else if (
E3 ==
nullptr) {
691 E3->addChildElement(exit);
692 exit->
incRef(
"buildDetectorExit");
700 const std::string& filename,
const std::vector<std::string>& vehicleTypes,
const std::vector<std::string>& nextEdges,
701 const std::string& detectPersons,
const std::string& name,
const bool friendlyPos,
const Parameterised::Map& parameters) {
711 if (lane ==
nullptr) {
720 detectPersons, name, friendlyPos, parameters);
730 detectorE1Instant->
incRef(
"buildDetectorE1Instant");
741 const std::string& name,
const std::string& outfile,
const SUMOTime period,
const std::string& routeprobeID,
const double jamThreshold,
const std::vector<std::string>& vTypes,
752 }
else if ((routeprobeID.size() > 0) && (routeProbe ==
nullptr)) {
754 }
else if (lane ==
nullptr) {
762 }
else if (period < 0) {
764 }
else if (jamThreshold < 0) {
769 new GNECalibrator(
id,
myNet, lane, pos, period, name, outfile, jamThreshold, vTypes, parameters) :
770 new GNECalibrator(
id,
myNet, lane, pos, period, name, outfile, routeProbe, jamThreshold, vTypes, parameters);
787 calibrator->
incRef(
"buildCalibrator");
796 const std::string& name,
const std::string& outfile,
const SUMOTime period,
const std::string& routeprobeID,
const double jamThreshold,
const std::vector<std::string>& vTypes,
807 }
else if ((routeprobeID.size() > 0) && (routeProbe ==
nullptr)) {
809 }
else if (edge ==
nullptr) {
816 }
else if (period < 0) {
818 }
else if (jamThreshold < 0) {
823 new GNECalibrator(
id,
myNet, edge, pos, period, name, outfile, jamThreshold, vTypes, parameters) :
824 new GNECalibrator(
id,
myNet, edge, pos, period, name, outfile, routeProbe, jamThreshold, vTypes, parameters);
841 calibrator->
incRef(
"buildCalibrator");
857 if (vType ==
nullptr) {
859 }
else if (route ==
nullptr) {
861 }
else if (calibrator ==
nullptr) {
876 flow->
incRef(
"buildCalibratorFlow");
884 const std::vector<std::string>& edgeIDs,
const double prob,
const std::string& name,
885 const bool off,
const bool optional,
const SUMOTime timeThreshold,
890 }
else if (prob < 0) {
892 }
else if (timeThreshold < 0) {
902 if (edges.size() > 0) {
906 if (edges.size() > 0) {
907 PositionVector laneShape = edges.front()->getLanes().front()->getLaneShape();
913 rerouter =
new GNERerouter(
id,
myNet,
Position(0, 0), name, prob, off, optional, timeThreshold, vTypes, parameters);
916 rerouter =
new GNERerouter(
id,
myNet, pos, name, prob, off, optional, timeThreshold, vTypes, parameters);
919 std::vector<GNEAdditional*> rerouterSymbols;
920 for (
const auto& edge : edges) {
929 for (
const auto& rerouterSymbol : rerouterSymbols) {
935 rerouter->
incRef(
"buildRerouter");
937 for (
const auto& rerouterSymbol : rerouterSymbols) {
941 for (
int i = 0; i < (int)edges.size(); i++) {
942 edges.at(i)->addChildElement(rerouterSymbols.at(i));
957 if (rerouter ==
nullptr) {
959 }
else if (begin < 0) {
961 }
else if (end < 0) {
963 }
else if (end < begin) {
964 writeError(
TLF(
"Could not build interval with ID '%' in netedit; begin is greater than end.", rerouter->
getID()));
978 rerouterInterval->
incRef(
"buildRerouterInterval");
994 if (lane ==
nullptr) {
996 }
else if (rerouterInterval ==
nullptr) {
1009 closingLaneReroute->
incRef(
"buildClosingLaneReroute");
1022 if (edge ==
nullptr) {
1024 }
else if (rerouterInterval ==
nullptr) {
1037 closingLaneReroute->
incRef(
"buildClosingLaneReroute");
1049 if (edge ==
nullptr) {
1051 }
else if (rerouterInterval ==
nullptr) {
1064 destProbReroute->
incRef(
"builDestProbReroute");
1077 if (parkingArea ==
nullptr) {
1079 }
else if (rerouterInterval ==
nullptr) {
1092 parkingAreaReroute->
incRef(
"builParkingAreaReroute");
1105 if (route ==
nullptr) {
1107 }
else if (rerouterInterval ==
nullptr) {
1120 routeProbReroute->
incRef(
"buildRouteProbReroute");
1138 if (edge ==
nullptr) {
1140 }
else if (period < 0) {
1142 }
else if (begin < 0) {
1162 routeProbe->
incRef(
"buildRouteProbe");
1173 const std::vector<std::string>& laneIDs,
const std::string& name,
const std::vector<std::string>& vTypes,
const Parameterised::Map& parameters) {
1183 if (lanes.size() > 0) {
1191 std::vector<GNEAdditional*> VSSSymbols;
1192 for (
const auto& lane : lanes) {
1200 for (
const auto& VSSSymbol : VSSSymbols) {
1206 variableSpeedSign->
incRef(
"buildVariableSpeedSign");
1208 for (
const auto& VSSSymbol : VSSSymbols) {
1212 for (
int i = 0; i < (int)lanes.size(); i++) {
1213 lanes.at(i)->addChildElement(VSSSymbols.at(i));
1229 if (VSS ==
nullptr) {
1231 }
else if (time < 0) {
1244 variableSpeedSignStep->
incRef(
"buildVariableSpeedSignStep");
1262 if (edge ==
nullptr) {
1264 }
else if (beginTime < 0) {
1266 }
else if (endTime < 0) {
1268 }
else if (endTime < beginTime) {
1269 writeError(
TLF(
"Could not build Vaporizer with ID '%' in netedit; begin is greater than end.", edge->
getID()));
1286 vaporizer->
incRef(
"buildVaporizer");
1297 const Position& center,
const bool fill,
const RGBColor& color,
const std::vector<std::string>& edgeIDs,
1303 if (TAZShape.size() == 0) {
1306 for (
const auto& edge : edges) {
1307 TAZBoundary.
add(edge->getCenteringBoundary());
1314 if (sourceSinkEdge) {
1320 TAZShape = TAZBoundary.
getShape(
true);
1327 }
else if (TAZShape.size() == 0) {
1328 writeError(
TLF(
"Could not build TAZ with ID '%' in netedit; Invalid Shape.",
id));
1343 for (
const auto& edge : edges) {
1354 TAZ->incRef(
"buildTAZ");
1355 for (
const auto& edge : edges) {
1358 TAZSource->
incRef(
"buildTAZ");
1359 TAZ->addChildElement(TAZSource);
1362 TAZSink->
incRef(
"buildTAZ");
1363 TAZ->addChildElement(TAZSink);
1369 TAZ->updateGeometry();
1383 if (
TAZ ==
nullptr) {
1385 }
else if (edge ==
nullptr) {
1389 for (
const auto& TAZElement :
TAZ->getChildAdditionals()) {
1391 TAZSink = TAZElement;
1395 if (TAZSink ==
nullptr) {
1406 TAZ->addChildElement(TAZSink);
1407 TAZSink->
incRef(
"buildTAZSource");
1413 for (
const auto& TAZElement :
TAZ->getChildAdditionals()) {
1415 TAZSource = TAZElement;
1419 if (TAZSource ==
nullptr) {
1430 TAZ->addChildElement(TAZSource);
1431 TAZSource->
incRef(
"buildTAZSource");
1454 if (
TAZ ==
nullptr) {
1456 }
else if (edge ==
nullptr) {
1462 for (
const auto& TAZElement :
TAZ->getChildAdditionals()) {
1464 TAZSource = TAZElement;
1468 if (TAZSource ==
nullptr) {
1479 TAZ->addChildElement(TAZSource);
1480 TAZSource->
incRef(
"buildTAZSink");
1485 for (
const auto& TAZElement :
TAZ->getChildAdditionals()) {
1487 TAZSink = TAZElement;
1491 if (TAZSink ==
nullptr) {
1502 TAZ->addChildElement(TAZSink);
1503 TAZSink->
incRef(
"buildTAZSink");
1521 const double voltage,
const double currentLimit,
const Parameterised::Map& parameters) {
1525 }
else if (voltage < 0) {
1527 }
else if (currentLimit < 0) {
1542 tractionSubstation->
incRef(
"buildTractionSubstation");
1552 const std::vector<std::string>& laneIDs,
const double startPos,
const double endPos,
const bool friendlyPos,
1553 const std::vector<std::string>& forbiddenInnerLanes,
const Parameterised::Map& parameters) {
1565 if (lanes.size() > 0) {
1568 writeError(
TLF(
"Could not build overhead wire with ID '%' in netedit; Lanes aren't consecutives.",
id));
1570 startPos, lanes.front()->getParentEdge()->getNBEdge()->getFinalLength(),
1571 endPos, lanes.back()->getParentEdge()->getNBEdge()->getFinalLength(), friendlyPos)) {
1573 }
else if (tractionSubstation ==
nullptr) {
1586 for (
const auto& lane : lanes) {
1587 lane->addChildElement(overheadWire);
1589 overheadWire->
incRef(
"buildOverheadWire");
1603 const std::string& ,
const std::string& ,
const std::string& ,
1611 const RGBColor& color,
double layer,
double angle,
const std::string& imgFile,
bool relativePath,
const PositionVector& shape,
bool geo,
bool fill,
1614 if (type ==
"jupedsim.walkable_area") {
1616 }
else if (type ==
"jupedsim.obstacle") {
1622 }
else if (lineWidth < 0) {
1628 GNEPoly* poly =
new GNEPoly(
myNet,
id, type, shape, geo, fill, lineWidth, color, layer, angle, imgFile, relativePath, name, parameters);
1638 poly->
incRef(
"addPolygon");
1646 const RGBColor& color,
const double x,
const double y,
const std::string& icon,
double layer,
double angle,
1647 const std::string& imgFile,
bool relativePath,
double width,
double height,
const std::string& name,
1652 }
else if (width < 0) {
1654 }
else if (height < 0) {
1662 GNEPOI*
POI =
new GNEPOI(
myNet,
id, type, color, x, y,
false, icon, layer, angle, imgFile, relativePath, width, height, name, parameters);
1672 POI->incRef(
"addPOI");
1682 const RGBColor& color,
const std::string& laneID,
double posOverLane,
const bool friendlyPos,
double posLat,
1683 const std::string& icon,
double layer,
double angle,
const std::string& imgFile,
bool relativePath,
double width,
1688 }
else if (width < 0) {
1690 }
else if (height < 0) {
1700 if (lane ==
nullptr) {
1706 GNEAdditional* POILane =
new GNEPOI(
myNet,
id, type, color, lane, posOverLane, friendlyPos, posLat, icon, layer,
1707 angle, imgFile, relativePath, width, height, name, parameters);
1718 POILane->
incRef(
"buildPOILane");
1729 const RGBColor& color,
const double lon,
const double lat,
const std::string& icon,
double layer,
1730 double angle,
const std::string& imgFile,
bool relativePath,
double width,
double height,
1735 }
else if (width < 0) {
1737 }
else if (height < 0) {
1742 writeError(
TLF(
"Could not build POI with ID '%' in netedit",
id) + std::string(
"; ") +
TL(
"Network requires a geo projection."));
1747 GNEPOI*
POIGEO =
new GNEPOI(
myNet,
id, type, color, lon, lat,
true, icon, layer, angle, imgFile, relativePath, width, height, name, parameters);
1757 POIGEO->incRef(
"buildPOIGeo");
1787 walkableArea->
incRef(
"addWalkableArea");
1815 obstacle->
incRef(
"addObstacle");
1825 for (
const auto& lane : edge->
getLanes()) {
1838 std::vector<std::pair<SUMOTime, SUMOTime>> sortedIntervals;
1841 if (!rerouterChild->getTagProperty().isSymbol()) {
1849 sortedIntervals.push_back(std::make_pair(newBegin, newEnd));
1851 std::sort(sortedIntervals.begin(), sortedIntervals.end());
1853 for (
int i = 0; i < (int)sortedIntervals.size() - 1; i++) {
1854 if (sortedIntervals.at(i).second > sortedIntervals.at(i + 1).first) {
1872 if ((pos < 0) || (pos > laneLength)) {
1876 if ((pos + length) > laneLength) {
1895 if (pos >= laneLength) {
1896 pos = (laneLength - POSITION_EPS);
1899 if ((length < 0) || ((pos + length) > laneLength)) {
1900 length = POSITION_EPS;
1923 if ((to - from) < POSITION_EPS) {
1926 if ((from < 0) || (from > laneLength)) {
1929 if ((to < 0) || (to > laneLength)) {
1950 }
else if (from > laneLength) {
1959 }
else if (to > laneLength) {
1963 if ((to - from) < POSITION_EPS) {
1964 if (to >= POSITION_EPS) {
1965 from = to - POSITION_EPS;
1994 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TL(
"ID contains invalid characters."));
2000 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TL(
"Invalid position over lane."));
2006 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TL(
"Declared twice."));
2012 std::string first, second;
2013 if (
id.size() > 0) {
2014 first =
TLF(
"Could not build % '%' in netedit",
toString(tag),
id);
2016 first =
TLF(
"Could not build % in netedit",
toString(tag));
2018 if (parentID.size() > 0) {
2019 second =
TLF(
"% '%' doesn't exist.",
toString(parent), parentID);
2021 second =
TLF(
"% doesn't exist.",
toString(parent));
2023 writeError(first + std::string(
"; ") + second);
2029 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TLF(
"Attribute % cannot be negative.",
toString(attribute)));
2035 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TL(
"List of VTypes isn't valid."));
2041 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TL(
"Filename is invalid."));
2047 writeError(
TLF(
"Could not build % with ID '%' in netedit",
toString(tag),
id) + std::string(
"; ") +
TL(
"List of lanes isn't valid."));
2053 for (
const auto& vTypeID : vTypeIDs) {
2095 std::vector<GNEEdge*>
2097 std::vector<GNEEdge*> edges;
2098 for (
const auto& edgeID : edgeIDs) {
2101 if (edge ==
nullptr) {
2106 edges.push_back(edge);
2113 std::vector<GNELane*>
2115 std::vector<GNELane*> lanes;
2116 for (
const auto& laneID : laneIDs) {
2119 if (lane ==
nullptr) {
2124 lanes.push_back(lane);
2133 for (
const auto& tag : tags) {
2170 myAllowUndoRedo(false),
2171 myOverwrite(false) {
2189 centerAfterCreation(false) {
#define WRITE_WARNING(msg)
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const std::string DEFAULT_VTYPE_ID
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_TRACTION_SUBSTATION
A traction substation.
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_CLOSING_REROUTE
reroute of type closing
@ SUMO_TAG_REROUTER
A rerouter.
@ GNE_TAG_MULTI_LANE_AREA_DETECTOR
an e2 detector over multiple lanes (placed here due create Additional Frame)
@ SUMO_TAG_ROUTEPROBE
a routeprobe detector
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_ACCESS
An access point for a train stop.
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_PARKING_AREA_REROUTE
entry for an alternative parking zone
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_POI
begin/end of the description of a Point of interest
@ SUMO_TAG_STEP
trigger: a step description
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_ROUTE_PROB_REROUTE
probability of route of a reroute
@ GNE_TAG_CALIBRATOR_LANE
A calibrator placed over lane.
@ SUMO_TAG_DET_ENTRY
an e3 entry point
@ SUMO_TAG_PARKING_SPACE
A parking space for a single vehicle within a parking area.
@ SUMO_TAG_ROUTE
begin/end of the description of a route
@ SUMO_TAG_POLY
begin/end of the description of a polygon
@ SUMO_TAG_OVERHEAD_WIRE_SECTION
An overhead wire section.
@ SUMO_TAG_SINK
Sink(s) specification.
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_TAG_SOURCE
a source
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_INSTANT_INDUCTION_LOOP
An instantenous induction loop.
@ SUMO_TAG_DEST_PROB_REROUTE
probability of destination of a reroute
@ GNE_TAG_JPS_OBSTACLE
polygon used for draw juPedSim obstacles
@ SUMO_TAG_DET_EXIT
an e3 exit point
@ SUMO_TAG_VAPORIZER
vaporizer of vehicles
@ SUMO_TAG_LANE_AREA_DETECTOR
alternative tag for e2 detector
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ SUMO_TAG_CLOSING_LANE_REROUTE
lane of a reroute of type closing
@ SUMO_TAG_INDUCTION_LOOP
alternative tag for e1 detector
@ GNE_TAG_JPS_WALKABLEAREA
polygon used for draw juPedSim walkable areas
@ SUMO_TAG_CALIBRATOR
A calibrator placed over edge.
@ SUMO_TAG_ENTRY_EXIT_DETECTOR
alternative tag for e3 detector
@ SUMO_TAG_VSS
A variable speed sign.
@ SUMO_TAG_EDGE
begin/end of the description of an edge
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ GNE_ATTR_CENTER_AFTER_CREATION
flag to center camera after element creation
@ SUMO_ATTR_JAM_DIST_THRESHOLD
@ SUMO_ATTR_PARKING_LENGTH
@ SUMO_ATTR_VOLTAGE
voltage of the traction substation [V]
@ GNE_ATTR_SELECTED
element is selected
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_HALTING_TIME_THRESHOLD
@ SUMO_ATTR_CONTAINER_CAPACITY
@ SUMO_ATTR_HALTING_SPEED_THRESHOLD
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ROADSIDE_CAPACITY
@ SUMO_ATTR_CURRENTLIMIT
current limit of the traction substation [A]
@ SUMO_ATTR_CHARGINGPOWER
@ SUMO_ATTR_PERSON_CAPACITY
@ SUMO_ATTR_CHARGEDELAY
Delay in the charge of charging stations (different of waiting time)
const double INVALID_DOUBLE
invalid double
const double SUMO_const_laneWidth
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void writeError(const std::string &error)
write error and enable error creating element
A class that stores a 2D geometrical boundary.
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
PositionVector getShape(const bool closeShape) const
get position vector (shape) based on this boundary
SUMOTime getTimeAttribute(const SumoXMLAttr attr) const
get time attribute
bool hasStringAttribute(const SumoXMLAttr attr) const
has function
SumoBaseObject * getParentSumoBaseObject() const
get pointer to mySumoBaseObjectParent SumoBaseObject (if is null, then is the root)
bool hasTimeAttribute(const SumoXMLAttr attr) const
check if current SumoBaseObject has the given time attribute
SumoXMLTag getTag() const
get XML myTag
const std::string & getStringAttribute(const SumoXMLAttr attr) const
get string attribute
const std::vector< SumoBaseObject * > & getSumoBaseObjectChildren() const
get SumoBaseObject children
void buildPolygon(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &type, const RGBColor &color, const double layer, const double angle, const std::string &imgFile, const bool relativePath, const PositionVector &shape, const bool geo, const bool fill, const double lineWidth, const std::string &name, const Parameterised::Map ¶meters)
Builds a polygon using the given values.
void buildVariableSpeedSign(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const Position &pos, const std::vector< std::string > &laneIDs, const std::string &name, const std::vector< std::string > &vTypes, const Parameterised::Map ¶meters)
Builds a VariableSpeedSign (lane speed additional)
void buildDetectorE3(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const Position &pos, const SUMOTime period, const std::string &filename, const std::vector< std::string > &vehicleTypes, const std::vector< std::string > &nextEdges, const std::string &detectPersons, const std::string &name, const SUMOTime timeThreshold, const double speedThreshold, const bool openEntry, const bool expectedArrival, const Parameterised::Map ¶meters)
Builds a multi entry exit detector (E3)
~GNEAdditionalHandler()
Destructor.
void buildEdgeCalibrator(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &edgeID, const double pos, const std::string &name, const std::string &outfile, const SUMOTime period, const std::string &routeprobe, const double jamThreshold, const std::vector< std::string > &vTypes, const Parameterised::Map ¶meters)
builds a microscopic calibrator over an edge
GNEAdditional * getRerouterIntervalParent(const CommonXMLStructure::SumoBaseObject *sumoBaseObject) const
get rerouter interval parent
void writeInvalidID(const SumoXMLTag tag, const std::string &id)
write invalid id
static void fixLaneDoublePosition(double &from, double &to, const double laneLengt)
fix the given positions over lane
void buildOverheadWire(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &substationId, const std::vector< std::string > &laneIDs, const double startPos, const double endPos, const bool friendlyPos, const std::vector< std::string > &forbiddenInnerLanes, const Parameterised::Map ¶meters)
build overhead wire
void buildE1Detector(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double position, const SUMOTime period, const std::string &file, const std::vector< std::string > &vehicleTypes, const std::vector< std::string > &nextEdges, const std::string &detectPersons, const std::string &name, const bool friendlyPos, const Parameterised::Map ¶meters)
Builds a induction loop detector (E1)
void buildSingleLaneDetectorE2(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double pos, const double length, const SUMOTime period, const std::string &trafficLight, const std::string &filename, const std::vector< std::string > &vehicleTypes, const std::vector< std::string > &nextEdges, const std::string &detectPersons, const std::string &name, const SUMOTime timeThreshold, const double speedThreshold, const double jamThreshold, const bool friendlyPos, const bool show, const Parameterised::Map ¶meters)
Builds a single-lane Area Detector (E2)
void buildPOI(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &type, const RGBColor &color, const double x, const double y, const std::string &icon, const double layer, const double angle, const std::string &imgFile, bool relativePath, const double width, const double height, const std::string &name, const Parameterised::Map ¶meters)
Builds a POI using the given values.
static bool accessCanBeCreated(GNEAdditional *busStopParent, GNEEdge *edge)
check if a GNEAccess can be created in a certain Edge
void buildLaneCalibrator(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double pos, const std::string &name, const std::string &outfile, const SUMOTime period, const std::string &routeprobe, const double jamThreshold, const std::vector< std::string > &vTypes, const Parameterised::Map ¶meters)
builds a microscopic calibrator over a lane
void buildTAZSink(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &edgeID, const double arrivalWeight)
Builds a TAZSink (Traffic Assignment Zone)
void buildAccess(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &laneID, const std::string &pos, const double length, const bool friendlyPos, const Parameterised::Map ¶meters)
Builds an Access.
void buildVariableSpeedSignStep(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOTime time, const std::string &speed)
Builds a VariableSpeedSign Step.
bool checkDuplicatedID(const std::vector< SumoXMLTag > tags, const std::string &id)
check if given ID correspond to a duplicated additionals
GNEAdditional * getAdditionalParent(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, SumoXMLTag tag) const
get additional parent
void writeErrorInvalidNegativeValue(const SumoXMLTag tag, const std::string &id, const SumoXMLAttr attribute)
write error "invalid negative element"
void buildTractionSubstation(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const Position &pos, const double voltage, const double currentLimit, const Parameterised::Map ¶meters)
build traction substation
std::vector< GNELane * > parseLanes(const SumoXMLTag tag, const std::vector< std::string > &laneIDs)
parse lanes
void writeErrorDuplicated(const SumoXMLTag tag, const std::string &id)
write error "duplicated additional"
void buildRerouterInterval(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOTime begin, const SUMOTime end)
builds a rerouter interval
void buildCalibratorFlow(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const SUMOVehicleParameter &vehicleParameter)
builds a calibrator flow
void buildPOILane(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &type, const RGBColor &color, const std::string &laneID, const double posOverLane, const bool friendlyPos, const double posLat, const std::string &icon, const double layer, const double angle, const std::string &imgFile, const bool relativePath, const double width, const double height, const std::string &name, const Parameterised::Map ¶meters)
Builds a POI over lane using the given values.
void overwriteAdditional()
remove overwritten additional
void buildTAZ(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const PositionVector &shape, const Position ¢er, const bool fill, const RGBColor &color, const std::vector< std::string > &edgeIDs, const std::string &name, const Parameterised::Map ¶meters)
Builds a TAZ (Traffic Assignment Zone)
void buildClosingLaneReroute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &closedLane, SVCPermissions permissions)
builds a closing lane reroute
void buildParkingSpace(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const double x, const double y, const double z, const std::string &name, const std::string &width, const std::string &length, const std::string &angle, const double slope, const Parameterised::Map ¶meters)
Builds a Parking Space.
void writeErrorInvalidVTypes(const SumoXMLTag tag, const std::string &id)
write error "invalid list of vehicle types"
void buildClosingReroute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &closedEdgeID, SVCPermissions permissions)
builds a closing edge reroute
void writeErrorInvalidPosition(const SumoXMLTag tag, const std::string &id)
write error "invalid position"
static void fixMultiLanePosition(double fromPos, const double fromLaneLength, double toPos, const double tolaneLength)
fix the given positions over two lanes
void buildDestProbReroute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &newEdgeDestinationID, const double probability)
builds a dest prob reroute
bool checkListOfVehicleTypes(const std::vector< std::string > &vTypeIDs) const
check list of IDs
const bool myAllowUndoRedo
allow undo/redo
static bool checkLaneDoublePosition(double from, const double to, const double laneLength, const bool friendlyPos)
check if the given positions over a lane is valid
void buildJpsObstacle(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const PositionVector &shape, bool geo, const std::string &name, const Parameterised::Map ¶meters)
Builds a JuPedSim obstacle using the given values.
void buildParkingAreaReroute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &newParkignAreaID, const double probability, const bool visible)
builds a parking area reroute
static bool checkLanePosition(double pos, const double length, const double laneLength, const bool friendlyPos)
check if the given position over a lane is valid
void buildRouteProbe(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &edgeID, const SUMOTime period, const std::string &name, const std::string &file, const SUMOTime begin, const Parameterised::Map ¶meters)
builds a Route probe
void buildBusStop(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double startPos, const double endPos, const std::string &name, const std::vector< std::string > &lines, const int personCapacity, const double parkingLength, const RGBColor &color, const bool friendlyPosition, const Parameterised::Map ¶meters)
Builds a bus stop.
GNEAdditionalHandler()
invalidate default constructo
void writeErrorInvalidFilename(const SumoXMLTag tag, const std::string &id)
write error "invalid filename"
void buildTrainStop(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double startPos, const double endPos, const std::string &name, const std::vector< std::string > &lines, const int personCapacity, const double parkingLength, const RGBColor &color, const bool friendlyPosition, const Parameterised::Map ¶meters)
Builds a train stop.
void buildParkingArea(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double startPos, const double endPos, const std::string &departPos, const std::string &name, const std::vector< std::string > &badges, const bool friendlyPosition, const int roadSideCapacity, const bool onRoad, const double width, const double length, const double angle, const bool lefthand, const Parameterised::Map ¶meters)
Builds a Parking Area.
void writeErrorInvalidLanes(const SumoXMLTag tag, const std::string &id)
write error "invalid list of lanes"
void buildJpsWalkableArea(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const PositionVector &shape, bool geo, const std::string &name, const Parameterised::Map ¶meters)
Builds a JuPedSim walkable area using the given values.
void buildPOIGeo(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &type, const RGBColor &color, const double lon, const double lat, const std::string &icon, const double layer, const double angle, const std::string &imgFile, bool relativePath, const double width, const double height, const std::string &name, const Parameterised::Map ¶meters)
Builds a POI in GEO coordinaten using the given values.
static bool checkOverlappingRerouterIntervals(GNEAdditional *rerouter, const SUMOTime newBegin, const SUMOTime newEnd)
check if an overlapping is produced in rerouter if a interval with certain begin and end is inserted
static void fixLanePosition(double &pos, double &length, const double laneLength)
fix given position over lane
GNENet * myNet
pointer to GNENet
void buildMultiLaneDetectorE2(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::vector< std::string > &laneIDs, const double pos, const double endPos, const SUMOTime period, const std::string &trafficLight, const std::string &filename, const std::vector< std::string > &vehicleTypes, const std::vector< std::string > &nextEdges, const std::string &detectPersons, const std::string &name, const SUMOTime timeThreshold, const double speedThreshold, const double jamThreshold, const bool friendlyPos, const bool show, const Parameterised::Map ¶meters)
Builds a multi-lane Area Detector (E2)
void buildRouteProbReroute(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &newRouteID, const double probability)
builds a route prob reroute
void buildTAZSource(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &edgeID, const double departWeight)
Builds a TAZSource (Traffic Assignment Zone)
void buildDetectorE1Instant(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double pos, const std::string &filename, const std::vector< std::string > &vehicleTypes, const std::vector< std::string > &nextEdges, const std::string &detectPersons, const std::string &name, const bool friendlyPos, const Parameterised::Map ¶meters)
Builds a Instant Induction Loop Detector (E1Instant)
void writeErrorInvalidParent(const SumoXMLTag tag, const std::string &id, const SumoXMLTag parent, const std::string &parentID)
write error "invalid parent element"
void buildChargingStation(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double startPos, const double endPos, const std::string &name, const double chargingPower, const double efficiency, const bool chargeInTransit, const SUMOTime chargeDelay, const std::string &chargeType, const SUMOTime waitingTime, const bool friendlyPosition, const std::string &parkingAreaID, const Parameterised::Map ¶meters)
Builds a charging Station.
std::vector< GNEEdge * > parseEdges(const SumoXMLTag tag, const std::vector< std::string > &edgeIDs)
parse edges
void buildVaporizer(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &edgeID, const SUMOTime from, const SUMOTime endTime, const std::string &name, const Parameterised::Map ¶meters)
Builds a vaporizer (lane speed additional)
void buildContainerStop(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &laneID, const double startPos, const double endPos, const std::string &name, const std::vector< std::string > &lines, const int containerCapacity, const double parkingLength, const RGBColor &color, const bool friendlyPosition, const Parameterised::Map ¶meters)
Builds a container stop.
GNEAdditional * myAdditionalToOverwrite
additional to overwrite (using undor-redo
void buildRerouter(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const Position &pos, const std::vector< std::string > &edgeIDs, const double prob, const std::string &name, const bool off, const bool optional, const SUMOTime timeThreshold, const std::vector< std::string > &vTypes, const Parameterised::Map ¶meters)
builds a rerouter
void buildDetectorEntry(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &laneID, const double pos, const bool friendlyPos, const Parameterised::Map ¶meters)
Builds a entry detector (E3)
void buildDetectorExit(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &laneID, const double pos, const bool friendlyPos, const Parameterised::Map ¶meters)
Builds a exit detector (E3)
void buildOverheadWireClamp(const CommonXMLStructure::SumoBaseObject *sumoBaseObject, const std::string &id, const std::string &overheadWireIDStartClamp, const std::string &laneIDStartClamp, const std::string &overheadWireIDEndClamp, const std::string &laneIDEndClamp, const Parameterised::Map ¶meters)
build overhead wire clamp
const bool myOverwrite
check if overwrite
static bool checkMultiLanePosition(double fromPos, const double fromLaneLength, const double toPos, const double tolaneLength, const bool friendlyPos)
check if the given positions over two lanes are valid
An Element which don't belong to GNENet but has influence in the simulation.
virtual void updateGeometry()=0
update pre-computed geometry information
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
method for setting the attribute and letting the object perform additional changes
static bool areLaneConsecutives(const std::vector< GNELane * > &lanes)
check if the given lanes are consecutive
virtual Position getPositionInView() const =0
Returns position of additional in view.
const std::string getID() const
get ID (all Attribute Carriers have one)
static GNEBusStop * buildTrainStop(GNENet *net)
default constructor
static GNEBusStop * buildBusStop(GNENet *net)
default constructor
A lane area vehicles can halt at (netedit-version)
A road/street connecting two junctions (netedit-version)
NBEdge * getNBEdge() const
returns the internal NBEdge
const std::vector< GNELane * > & getLanes() const
returns a reference to the lane vector
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
void addChildElement(T *element)
add child element
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
bool allowPedestrians() const
check if current lane allow pedestrians
GNEEdge * getParentEdge() const
get parent edge
GNELane * retrieveLane(const std::string &id, bool hardFail=true, bool checkVolatileChange=false) const
get lane by id
GNEAdditional * retrieveAdditional(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named additional.
GNEAdditional * retrieveRerouterInterval(const std::string &rerouterID, const SUMOTime begin, const SUMOTime end) const
Returns the rerouter interval defined by given begin and end.
void insertAdditional(GNEAdditional *additional)
Insert a additional element in container.
GNEEdge * retrieveEdge(const std::string &id, bool hardFail=true) const
get edge by id
GNEDemandElement * retrieveDemandElement(SumoXMLTag type, const std::string &id, bool hardFail=true) const
Returns the named demand element.
A NBNetBuilder extended by visualisation and editing capabilities.
void deleteAdditional(GNEAdditional *additional, GNEUndoList *undoList)
remove additional
void disableUpdateGeometry()
disable update geometry of elements after inserting or removing an element in net
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
GNEViewNet * getViewNet() const
get view net
void enableUpdateGeometry()
A lane area vehicles can park at (netedit-version)
vehicle space used by GNEParkingAreas
void incRef(const std::string &debugMsg="")
Increase reference.
Representation of a RouteProbe in netedit.
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
Representation of a vaporizer in netedit.
GNEUndoList * getUndoList() const
get the undoList object
virtual void centerTo(GUIGlID id, bool applyZoom, double zoomDist=20)
centers to the chosen artifact
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
double getFinalLength() const
get length that will be assigned to the lanes in the final network
static const std::vector< SumoXMLTag > POIs
POIs namespace.
static const std::vector< SumoXMLTag > polygons
polygon namespace
C++ TraCI client API implementation.
std::map< std::string, std::string > Map
parameters map
A point in 2D or 3D with translation and scaling methods.
static const Position INVALID
used to indicate that a position is valid
double length2D() const
Returns the length.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
Position getCentroid() const
Returns the centroid (closes the polygon if unclosed)
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
Structure representing possible vehicle parameter.
std::string vtypeid
The vehicle's type id.
std::string routeid
The vehicle's route id.
static bool isValidTypeID(const std::string &value)
whether the given string is a valid id for an edge or vehicle type
static bool isValidFilename(const std::string &value)
whether the given string is a valid attribute for a filename (for example, a name)
static bool isValidAdditionalID(const std::string &value)
whether the given string is a valid id for an additional object
static bool isValidDetectorID(const std::string &value)
whether the given string is a valid id for an detector
static bool isValidListOfTypeID(const std::string &value)
whether the given string is a valid list of ids for an edge or vehicle type (empty aren't allowed)
static bool isValidNetID(const std::string &value)
whether the given string is a valid id for a network element
struct for Netedit parameters
const bool centerAfterCreation
center view after creation
~NeteditParameters()
destructor
NeteditParameters()
default constructor