Skip to content

Commit

Permalink
Updated GNEViewNetHelper::ObjectsUnderCursor. Refs #13894
Browse files Browse the repository at this point in the history
  • Loading branch information
palvarezlopez committed Dec 19, 2023
1 parent 320eea3 commit 6e46cb5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 92 deletions.
122 changes: 37 additions & 85 deletions src/netedit/GNEViewNetHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,6 @@ GNEViewNetHelper::ObjectsUnderCursor::updateObjectUnderCursor() {
// clear elements
myEdgeObjects.clearElements();
myLaneObjects.clearElements();
// sort GUIGLObjects
sortGUIGlObjects(filterDuplicatedObjects());
// process GUIGLObjects using myEdgeObjects.GUIGlObjects and myLaneObjects.GUIGlObjects
processGUIGlObjects();
}
Expand Down Expand Up @@ -740,59 +738,8 @@ GNEViewNetHelper::ObjectsUnderCursor::ObjectsContainer::clearElements() {
}


std::vector<const GUIGlObject*>
GNEViewNetHelper::ObjectsUnderCursor::filterDuplicatedObjects() const {
// declare vector for filter objects
std::vector<const GUIGlObject*> filteredGUIGlObjects;
// iterate over GUIGlObjects
for (const auto& GLObject : gPostDrawing.getElementsUnderCursor()) {
// find GLObject in filteredGUIGlObjects
const auto it = std::find(filteredGUIGlObjects.begin(), filteredGUIGlObjects.end(), GLObject);
if (it == filteredGUIGlObjects.end()) {
filteredGUIGlObjects.push_back(GLObject);
}
}
return filteredGUIGlObjects;
}


void
GNEViewNetHelper::ObjectsUnderCursor::sortGUIGlObjects(const std::vector<const GUIGlObject*>& GUIGlObjects) {
// clear containers
filteredEdgeGLObjects.clear();
filteredLaneGLObjects.clear();
// declare a map to save GUIGlObjects sorted by GLO_TYPE
std::map<double, std::vector<const GUIGlObject*> > mySortedGUIGlObjects;
// iterate over set
for (const auto& GLObject : GUIGlObjects) {
// try to parse shape
auto shape = dynamic_cast<const Shape*>(GLObject);
if (shape) {
mySortedGUIGlObjects[shape->getShapeLayer()].push_back(GLObject);
} else {
mySortedGUIGlObjects[GLObject->getType()].push_back(GLObject);
}
}
// move sorted GUIGlObjects into myGUIGlObjectLanes using a reverse iterator
for (std::map<double, std::vector<const GUIGlObject*> >::reverse_iterator i = mySortedGUIGlObjects.rbegin(); i != mySortedGUIGlObjects.rend(); i++) {
for (const auto& GlObject : i->second) {
// avoid GLO_NETWORKELEMENT
if (GlObject->getType() != GLO_NETWORKELEMENT) {
// add it in GUIGlObject splitting by edge/lanes
if (GlObject->getType() == GLO_LANE) {
filteredLaneGLObjects.push_back(GlObject);
} else {
filteredEdgeGLObjects.push_back(GlObject);
filteredLaneGLObjects.push_back(GlObject);
}
}
}
}
}


void
GNEViewNetHelper::ObjectsUnderCursor::updateNetworkElements(ObjectsContainer& container, const GUIGlObject* glObject) {
GNEViewNetHelper::ObjectsUnderCursor::updateNetworkElements(ObjectsContainer& container, const GUIGlObject* glObject, const bool edges) {
// get front AC
const auto frontGLObject = myViewNet->getFrontGLObject();
// cast specific network element
Expand All @@ -819,39 +766,44 @@ GNEViewNetHelper::ObjectsUnderCursor::updateNetworkElements(ObjectsContainer& co
case GLO_EDGE: {
// get edge
auto edge = myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(glObject);
// check front element
if (glObject == frontGLObject) {
// insert at front
container.edges.insert(container.edges.begin(), edge);
container.networkElements.insert(container.networkElements.begin(), edge);
container.attributeCarriers.insert(container.attributeCarriers.begin(), edge);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edge);
} else {
// insert at back
container.edges.push_back(edge);
container.networkElements.push_back(edge);
container.attributeCarriers.push_back(edge);
container.GUIGlObjects.push_back(edge);
// check if we're keeping edges or lanes
if (edges && (std::find(container.edges.begin(), container.edges.end(), edge) == container.edges.end())) {
// check front element
if (glObject == frontGLObject) {
// insert at front
container.edges.insert(container.edges.begin(), edge);
container.networkElements.insert(container.networkElements.begin(), edge);
container.attributeCarriers.insert(container.attributeCarriers.begin(), edge);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edge);
} else {
// insert at back
container.edges.push_back(edge);
container.networkElements.push_back(edge);
container.attributeCarriers.push_back(edge);
container.GUIGlObjects.push_back(edge);
}
}
break;
}
case GLO_LANE: {
// get lane
auto lane = myViewNet->getNet()->getAttributeCarriers()->retrieveLane(glObject);
// check front element
if (glObject == frontGLObject) {
// insert at front
container.lanes.insert(container.lanes.begin(), lane);
container.networkElements.insert(container.networkElements.begin(), lane);
container.attributeCarriers.insert(container.attributeCarriers.begin(), lane);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), lane);
} else {
// insert at back
container.lanes.push_back(lane);
container.networkElements.push_back(lane);
container.attributeCarriers.push_back(lane);
container.GUIGlObjects.push_back(lane);

// check if we're keeping edges or lanes
if (!edges && (std::find(container.lanes.begin(), container.lanes.end(), lane) == container.lanes.end())) {
// check front element
if (glObject == frontGLObject) {
// insert at front
container.lanes.insert(container.lanes.begin(), lane);
container.networkElements.insert(container.networkElements.begin(), lane);
container.attributeCarriers.insert(container.attributeCarriers.begin(), lane);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), lane);
} else {
// insert at back
container.lanes.push_back(lane);
container.networkElements.push_back(lane);
container.attributeCarriers.push_back(lane);
container.GUIGlObjects.push_back(lane);
}
}
/*
// special case for lanes
Expand Down Expand Up @@ -1100,19 +1052,19 @@ GNEViewNetHelper::ObjectsUnderCursor::updateGenericDataElements(ObjectsContainer
void
GNEViewNetHelper::ObjectsUnderCursor::processGUIGlObjects() {
// iterate over filtered edge objects
for (const auto& glObject : filteredEdgeGLObjects) {
for (const auto& glObject : gPostDrawing.getElementsUnderCursor()) {
// update all elements by categories
updateNetworkElements(myEdgeObjects, glObject);
updateNetworkElements(myEdgeObjects, glObject, true);
updateAdditionalElements(myEdgeObjects, glObject);
updateShapeElements(myEdgeObjects, glObject);
updateTAZElements(myEdgeObjects, glObject);
updateDemandElements(myEdgeObjects, glObject);
updateGenericDataElements(myEdgeObjects, glObject);
}
// iterate over filtered lane objects
for (const auto& glObject : filteredLaneGLObjects) {
for (const auto& glObject : gPostDrawing.getElementsUnderCursor()) {
// update all elements by categories
updateNetworkElements(myLaneObjects, glObject);
updateNetworkElements(myLaneObjects, glObject, false);
updateAdditionalElements(myLaneObjects, glObject);
updateShapeElements(myLaneObjects, glObject);
updateTAZElements(myLaneObjects, glObject);
Expand Down
8 changes: 1 addition & 7 deletions src/netedit/GNEViewNetHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -405,14 +405,8 @@ struct GNEViewNetHelper {
bool mySwapLane2edge;

private:
/// @brief filter duplicated objects
std::vector<const GUIGlObject*> filterDuplicatedObjects() const;

/// @brief sort by altitude and update GUIGlObjects
void sortGUIGlObjects(const std::vector<const GUIGlObject*>& GUIGlObjects);

/// @brief update network elements
void updateNetworkElements(ObjectsContainer& container, const GUIGlObject* glObject);
void updateNetworkElements(ObjectsContainer& container, const GUIGlObject* glObject, const bool edges);

/// @brief update additional elements
void updateAdditionalElements(ObjectsContainer& container, const GUIGlObject* glObject);
Expand Down

0 comments on commit 6e46cb5

Please sign in to comment.