38 const std::vector<GNEEdge*>& edgeChildren,
39 const std::vector<GNELane*>& laneChildren,
40 const std::vector<GNEShape*>& shapeChildren,
41 const std::vector<GNEAdditional*>& additionalChildren,
42 const std::vector<GNEDemandElement*>& demandElementChildren) :
43 myChildConnections(this),
44 myEdgeChildren(edgeChildren),
45 myLaneChildren(laneChildren),
46 myShapeChildren(shapeChildren),
47 myAdditionalChildren(additionalChildren),
48 myDemandElementChildren(demandElementChildren),
52 for (
const auto& i : listOfTags) {
98 if (additional ==
nullptr) {
131 const std::vector<GNEAdditional*>&
141 std::vector<GNEAdditional*> sortedEntryExits;
145 sortedEntryExits.push_back(i);
151 sortedEntryExits.push_back(i);
158 throw ProcessError(
"Some additional children were lost during sorting");
162 std::vector<GNEAdditional*> sortedTAZSourceSink;
166 sortedTAZSourceSink.push_back(i);
172 sortedTAZSourceSink.push_back(i);
179 throw ProcessError(
"Some additional children were lost during sorting");
183 std::vector<std::pair<std::pair<double, double>,
GNEAdditional*> > sortedChildren;
186 sortedChildren.push_back(std::make_pair(std::make_pair(0., 0.), i));
189 sortedChildren.back().first.first = GNEAttributeCarrier::parse<double>(i->getAttribute(
SUMO_ATTR_TIME));
191 sortedChildren.back().first.first = GNEAttributeCarrier::parse<double>(i->getAttribute(
SUMO_ATTR_BEGIN));
194 if (i->getTagProperty().hasAttribute(
SUMO_ATTR_END) && GNEAttributeCarrier::canParse<double>(i->getAttribute(
SUMO_ATTR_END))) {
195 sortedChildren.back().first.second = GNEAttributeCarrier::parse<double>(i->getAttribute(
SUMO_ATTR_END));
197 sortedChildren.back().first.second = sortedChildren.back().first.first;
201 std::sort(sortedChildren.begin(), sortedChildren.end());
205 for (
auto i : sortedChildren) {
209 throw ProcessError(
"Some additional children were lost during sorting");
218 std::vector<std::pair<std::pair<double, double>,
GNEAdditional*> > sortedChildren;
221 sortedChildren.push_back(std::make_pair(std::make_pair(0., 0.), i));
224 sortedChildren.back().first.first = GNEAttributeCarrier::parse<double>(i->getAttribute(
SUMO_ATTR_TIME));
226 sortedChildren.back().first.first = GNEAttributeCarrier::parse<double>(i->getAttribute(
SUMO_ATTR_BEGIN));
229 if (i->getTagProperty().hasAttribute(
SUMO_ATTR_END) && GNEAttributeCarrier::canParse<double>(i->getAttribute(
SUMO_ATTR_END))) {
230 sortedChildren.back().first.second = GNEAttributeCarrier::parse<double>(i->getAttribute(
SUMO_ATTR_END));
232 sortedChildren.back().first.second = sortedChildren.back().first.first;
236 std::sort(sortedChildren.begin(), sortedChildren.end());
239 if (sortedChildren.size() <= 1) {
243 for (
int i = 0; i < (int)sortedChildren.size() - 1; i++) {
244 if (sortedChildren.at(i).first.second > sortedChildren.at(i + 1).first.first) {
251 throw ProcessError(
"Some additional children were lost during sorting");
259 if (demandElement ==
nullptr) {
296 const std::vector<GNEDemandElement*>&
302 const std::set<GNEDemandElement*>&
353 if (edge ==
nullptr) {
364 if (edge ==
nullptr) {
376 const std::vector<GNEEdge*>&
385 if (lane ==
nullptr) {
398 if (lane ==
nullptr) {
408 const std::vector<GNELane*>&
417 if (shape ==
nullptr) {
432 if (shape ==
nullptr) {
444 const std::vector<GNEShape*>&
466 i->removeAdditionalParent(elementChild);
472 i->addAdditionalParent(elementChild);
483 i->removeAdditionalParent(elementChild);
489 i->addAdditionalParent(elementChild);
520 connectionPositions.clear();
521 symbolsPositionAndRotation.clear();
523 for (
const auto& i : myHierarchicalElement->myEdgeChildren) {
524 for (
auto j : i->getLanes()) {
528 if (j->getGeometry().shape.length() - 6 > 0) {
529 pos = j->getGeometry().shape.positionAtOffset(j->getGeometry().shape.length() - 6);
530 rot = j->getGeometry().shape.rotationDegreeAtOffset(j->getGeometry().shape.length() - 6);
532 pos = j->getGeometry().shape.positionAtOffset(j->getGeometry().shape.length());
533 rot = j->getGeometry().shape.rotationDegreeAtOffset(j->getGeometry().shape.length());
539 for (
const auto& i : myHierarchicalElement->myLaneChildren) {
543 if (i->getGeometry().shape.length() - 6 > 0) {
544 pos = i->getGeometry().shape.positionAtOffset(i->getGeometry().shape.length() - 6);
545 rot = i->getGeometry().shape.rotationDegreeAtOffset(i->getGeometry().shape.length() - 6);
547 pos = i->getGeometry().shape.positionAtOffset(i->getGeometry().shape.length());
548 rot = i->getGeometry().shape.rotationDegreeAtOffset(i->getGeometry().shape.length());
553 for (
const auto& i : myHierarchicalElement->myAdditionalChildren) {
555 if (i->getPositionInView() != myHierarchicalElement->getPositionInView()) {
556 std::vector<Position> posConnection;
557 double A = std::abs(i->getPositionInView().x() - myHierarchicalElement->getPositionInView().x());
558 double B = std::abs(i->getPositionInView().y() - myHierarchicalElement->getPositionInView().y());
560 posConnection.push_back(i->getPositionInView());
561 if (myHierarchicalElement->getPositionInView().x() > i->getPositionInView().x()) {
562 if (myHierarchicalElement->getPositionInView().y() > i->getPositionInView().y()) {
563 posConnection.push_back(
Position(i->getPositionInView().x() + A, i->getPositionInView().y()));
565 posConnection.push_back(
Position(i->getPositionInView().x(), i->getPositionInView().y() - B));
568 if (myHierarchicalElement->getPositionInView().y() > i->getPositionInView().y()) {
569 posConnection.push_back(
Position(i->getPositionInView().x(), i->getPositionInView().y() + B));
571 posConnection.push_back(
Position(i->getPositionInView().x() - A, i->getPositionInView().y()));
574 posConnection.push_back(myHierarchicalElement->getPositionInView());
575 connectionPositions.push_back(posConnection);
579 for (
const auto& i : symbolsPositionAndRotation) {
580 std::vector<Position> posConnection;
581 double A = std::abs(i.pos.x() - myHierarchicalElement->getPositionInView().x());
582 double B = std::abs(i.pos.y() - myHierarchicalElement->getPositionInView().y());
584 posConnection.push_back(i.pos);
585 if (myHierarchicalElement->getPositionInView().x() > i.pos.x()) {
586 if (myHierarchicalElement->getPositionInView().y() > i.pos.y()) {
587 posConnection.push_back(
Position(i.pos.x() + A, i.pos.y()));
589 posConnection.push_back(
Position(i.pos.x(), i.pos.y() - B));
592 if (myHierarchicalElement->getPositionInView().y() > i.pos.y()) {
593 posConnection.push_back(
Position(i.pos.x(), i.pos.y() + B));
595 posConnection.push_back(
Position(i.pos.x() - A, i.pos.y()));
598 posConnection.push_back(myHierarchicalElement->getPositionInView());
599 connectionPositions.push_back(posConnection);
609 for (
const auto& i : connectionPositions) {
613 glTranslated(0, 0, parentType - 0.01);
617 for (
auto j = i.begin(); (j + 1) != i.end(); j++) {