37 const std::vector<GNEEdge*>& childEdges,
38 const std::vector<GNELane*>& childLanes,
39 const std::vector<GNEShape*>& childShapes,
40 const std::vector<GNEAdditional*>& childAdditionals,
41 const std::vector<GNEDemandElement*>& childDemandElements) :
42 myChildConnections(this),
43 myChildEdges(childEdges),
44 myChildLanes(childLanes),
45 myChildShapes(childShapes),
46 myChildAdditionals(childAdditionals),
47 myChildDemandElements(childDemandElements),
51 for (
const auto& tag : listOfTags) {
63 if (childConnection.lane == lane) {
64 return childConnection.pos;
74 if (childConnection.lane == lane) {
75 return childConnection.rot;
97 if (additional ==
nullptr) {
130 const std::vector<GNEAdditional*>&
140 std::vector<GNEAdditional*> sortedEntryExits;
144 sortedEntryExits.push_back(additional);
150 sortedEntryExits.push_back(additional);
157 throw ProcessError(
"Some child additional were lost during sorting");
161 std::vector<GNEAdditional*> sortedTAZSourceSink;
165 sortedTAZSourceSink.push_back(additional);
171 sortedTAZSourceSink.push_back(additional);
178 throw ProcessError(
"Some child additional were lost during sorting");
182 std::vector<std::pair<std::pair<double, double>,
GNEAdditional*> > sortedChildren;
185 sortedChildren.push_back(std::make_pair(std::make_pair(0., 0.), additional));
187 if (additional->getTagProperty().hasAttribute(
SUMO_ATTR_TIME) && GNEAttributeCarrier::canParse<double>(additional->getAttribute(
SUMO_ATTR_TIME))) {
189 }
else if (additional->getTagProperty().hasAttribute(
SUMO_ATTR_BEGIN) && GNEAttributeCarrier::canParse<double>(additional->getAttribute(
SUMO_ATTR_BEGIN))) {
190 sortedChildren.back().first.first = additional->getAttributeDouble(
SUMO_ATTR_BEGIN);
193 if (additional->getTagProperty().hasAttribute(
SUMO_ATTR_END) && GNEAttributeCarrier::canParse<double>(additional->getAttribute(
SUMO_ATTR_END))) {
194 sortedChildren.back().first.second = additional->getAttributeDouble(
SUMO_ATTR_END);
196 sortedChildren.back().first.second = sortedChildren.back().first.first;
200 std::sort(sortedChildren.begin(), sortedChildren.end());
204 for (
auto i : sortedChildren) {
208 throw ProcessError(
"Some child additional were lost during sorting");
217 std::vector<std::pair<std::pair<double, double>,
GNEAdditional*> > sortedChildren;
220 sortedChildren.push_back(std::make_pair(std::make_pair(0., 0.), additional));
222 if (additional->getTagProperty().hasAttribute(
SUMO_ATTR_TIME) && GNEAttributeCarrier::canParse<double>(additional->getAttribute(
SUMO_ATTR_TIME))) {
224 }
else if (additional->getTagProperty().hasAttribute(
SUMO_ATTR_BEGIN) && GNEAttributeCarrier::canParse<double>(additional->getAttribute(
SUMO_ATTR_BEGIN))) {
225 sortedChildren.back().first.first = additional->getAttributeDouble(
SUMO_ATTR_BEGIN);
228 if (additional->getTagProperty().hasAttribute(
SUMO_ATTR_END) && GNEAttributeCarrier::canParse<double>(additional->getAttribute(
SUMO_ATTR_END))) {
229 sortedChildren.back().first.second = additional->getAttributeDouble(
SUMO_ATTR_END);
231 sortedChildren.back().first.second = sortedChildren.back().first.first;
235 std::sort(sortedChildren.begin(), sortedChildren.end());
238 if (sortedChildren.size() <= 1) {
242 for (
int i = 0; i < (int)sortedChildren.size() - 1; i++) {
243 if (sortedChildren.at(i).first.second > sortedChildren.at(i + 1).first.first) {
250 throw ProcessError(
"Some child additional were lost during sorting");
258 if (demandElement ==
nullptr) {
295 const std::vector<GNEDemandElement*>&
301 const std::set<GNEDemandElement*>&
352 if (edge ==
nullptr) {
363 if (edge ==
nullptr) {
375 const std::vector<GNEEdge*>&
384 if (lane ==
nullptr) {
397 if (lane ==
nullptr) {
407 const std::vector<GNELane*>&
416 if (shape ==
nullptr) {
431 if (shape ==
nullptr) {
443 const std::vector<GNEShape*>&
465 edge->removeParentAdditional(elementChild);
471 edge->addParentAdditional(elementChild);
482 lane->removeParentAdditional(elementChild);
488 lane->addParentAdditional(elementChild);
519 connectionPositions.clear();
520 symbolsPositionAndRotation.clear();
522 for (
const auto& edge : myHierarchicalElement->myChildEdges) {
523 for (
const auto& lane : edge->getLanes()) {
527 if (lane->getLaneShape().length() - 6 > 0) {
528 pos = lane->getLaneShape().positionAtOffset(lane->getLaneShape().length() - 6);
529 rot = lane->getLaneShape().rotationDegreeAtOffset(lane->getLaneShape().length() - 6);
531 pos = lane->getLaneShape().positionAtOffset(lane->getLaneShape().length());
532 rot = lane->getLaneShape().rotationDegreeAtOffset(lane->getLaneShape().length());
538 for (
const auto& lane : myHierarchicalElement->myChildLanes) {
542 if (lane->getLaneShape().length() - 6 > 0) {
543 pos = lane->getLaneShape().positionAtOffset(lane->getLaneShape().length() - 6);
544 rot = lane->getLaneShape().rotationDegreeAtOffset(lane->getLaneShape().length() - 6);
546 pos = lane->getLaneShape().positionAtOffset(lane->getLaneShape().length());
547 rot = lane->getLaneShape().rotationDegreeAtOffset(lane->getLaneShape().length());
552 for (
const auto& additional : myHierarchicalElement->myChildAdditionals) {
554 if (additional->getPositionInView() != myHierarchicalElement->getPositionInView()) {
555 std::vector<Position> posConnection;
556 double A = std::abs(additional->getPositionInView().x() - myHierarchicalElement->getPositionInView().x());
557 double B = std::abs(additional->getPositionInView().y() - myHierarchicalElement->getPositionInView().y());
559 posConnection.push_back(additional->getPositionInView());
560 if (myHierarchicalElement->getPositionInView().x() > additional->getPositionInView().x()) {
561 if (myHierarchicalElement->getPositionInView().y() > additional->getPositionInView().y()) {
562 posConnection.push_back(
Position(additional->getPositionInView().x() + A, additional->getPositionInView().y()));
564 posConnection.push_back(
Position(additional->getPositionInView().x(), additional->getPositionInView().y() - B));
567 if (myHierarchicalElement->getPositionInView().y() > additional->getPositionInView().y()) {
568 posConnection.push_back(
Position(additional->getPositionInView().x(), additional->getPositionInView().y() + B));
570 posConnection.push_back(
Position(additional->getPositionInView().x() - A, additional->getPositionInView().y()));
573 posConnection.push_back(myHierarchicalElement->getPositionInView());
574 connectionPositions.push_back(posConnection);
578 for (
const auto& symbol : symbolsPositionAndRotation) {
579 std::vector<Position> posConnection;
580 double A = std::abs(symbol.pos.x() - myHierarchicalElement->getPositionInView().x());
581 double B = std::abs(symbol.pos.y() - myHierarchicalElement->getPositionInView().y());
583 posConnection.push_back(symbol.pos);
584 if (myHierarchicalElement->getPositionInView().x() > symbol.pos.x()) {
585 if (myHierarchicalElement->getPositionInView().y() > symbol.pos.y()) {
586 posConnection.push_back(
Position(symbol.pos.x() + A, symbol.pos.y()));
588 posConnection.push_back(
Position(symbol.pos.x(), symbol.pos.y() - B));
591 if (myHierarchicalElement->getPositionInView().y() > symbol.pos.y()) {
592 posConnection.push_back(
Position(symbol.pos.x(), symbol.pos.y() + B));
594 posConnection.push_back(
Position(symbol.pos.x() - A, symbol.pos.y()));
597 posConnection.push_back(myHierarchicalElement->getPositionInView());
598 connectionPositions.push_back(posConnection);
608 for (
const auto& connection : connectionPositions) {
612 glTranslated(0, 0, parentType - 0.01);
616 for (
auto position = connection.begin(); (position + 1) != connection.end(); position++) {