66 myNetworkElementType(networkElementType),
67 myFrameParent(frameParent) {
76 switch (myNetworkElementType) {
77 case NetworkElementType::EDGE:
79 "-Click over an edge to select\n-ESC to clear selection",
83 case NetworkElementType::LANE:
85 "-Click over a lane to select\n-ESC to clear selection",
100 std::vector<std::string>
103 std::vector<std::string> solution;
105 solution.reserve(myList->getNumItems());
107 for (
int i = 0; i < myList->getNumItems(); i++) {
108 solution.push_back(myList->getItem(i)->getText().text());
116 if (myFrameParent->shown() && shown()) {
118 for (
int i = 0; i < myList->getNumItems(); i++) {
119 if (myList->getItem(i)->getText().text() == networkElement->
getID()) {
131 myList->clearItems();
152 for (
int i = 0; i < myList->getNumItems(); i++) {
153 if (myList->getItem(i)->getText().text() == networkElement->
getID()) {
155 myList->removeItem(i);
157 myFrameParent->getViewNet()->update();
162 myList->appendItem(networkElement->
getID().c_str(), networkElement->
getIcon());
164 myFrameParent->getViewNet()->update();
172 myList->clearItems();
174 myFrameParent->getViewNet()->update();
181 myList->clearItems();
183 switch (myNetworkElementType) {
184 case NetworkElementType::EDGE:
185 for (
const auto &edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
186 if (edge.second->isAttributeCarrierSelected()) {
187 myList->appendItem(edge.first.c_str(), edge.second->getIcon());
191 case NetworkElementType::LANE:
192 for (
const auto &lane : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getLanes()) {
193 if (lane->isAttributeCarrierSelected()) {
194 myList->appendItem(lane->getID().c_str(), lane->getIcon());
215 myFrameParent(nullptr),
224 FXGroupBoxModule(frameParent->getContentFrame(),
"Consecutive lane selector"),
225 myFrameParent(frameParent) {
253 myFinishCreationButton->disable();
254 myAbortCreationButton->disable();
255 myRemoveLastInsertedElement->disable();
274 const std::vector<std::pair<GNELane*, double> >&
280 const std::vector<std::string>
282 std::vector<std::string> laneIDs;
283 for (
const auto& lane : myLanePath) {
284 laneIDs.push_back(lane.first->getID());
293 if (lane ==
nullptr) {
297 if ((myLanePath.size() > 0) && (myLanePath.back().first == lane)) {
313 const Position mousePos = myFrameParent->getViewNet()->snapToActiveGrid(myFrameParent->getViewNet()->getPositionInformation());
317 myLanePath.push_back(std::make_pair(lane, offset));
319 myAbortCreationButton->enable();
321 myFinishCreationButton->enable();
323 myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->disableUndoRedo(
"route creation");
325 if (myLanePath.size() > 1) {
326 myRemoveLastInsertedElement->enable();
328 myRemoveLastInsertedElement->disable();
331 updateInfoRouteLabel();
340 return (myShowCandidateLanes->getCheck() == TRUE);
347 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
348 for (
const auto& lane : edge.second->getLanes()) {
349 lane->resetCandidateFlags();
353 if (myLanePath.size() > 0 && (myShowCandidateLanes->getCheck() == TRUE)) {
355 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
356 for (
const auto& lane : edge.second->getLanes()) {
357 lane->setConflictedCandidate(
true);
361 for (
const auto& lane : myLanePath) {
363 lane.first->setConflictedCandidate(
false);
364 if (lane == myLanePath.back()) {
365 lane.first->setSourceCandidate(
true);
367 lane.first->setTargetCandidate(
true);
371 const GNEEdge* edge = myLanePath.back().first->getParentEdge();
375 if (connection->getLaneFrom() == myLanePath.back().first) {
377 connection->getLaneTo()->setPossibleCandidate(
true);
382 myFrameParent->getViewNet()->updateViewNet();
389 if (myLanePath.size() > 0) {
391 const double lineWidth = 0.35;
392 const double lineWidthin = 0.25;
394 std::vector<PositionVector> shapes;
396 if (myLanePath.size() > 1) {
398 for (
int i = 0; i < (int)myLanePath.size(); i++) {
400 const GNELane* lane = myLanePath.at(i).first;
404 if ((i + 1) < (int)myLanePath.size()) {
406 const GNELane* nextLane = myLanePath.at(i + 1).first;
415 shapes.front() = shapes.front().splitAt(myLanePath.front().second).second;
416 shapes.back() = shapes.back().splitAt(myLanePath.back().second).first;
423 for (
const auto &shape : shapes) {
431 glTranslated(0, 0, 0.1);
442 const Position firstPosition = myLanePath.front().first->getLaneShape().positionAtOffset2D(myLanePath.front().second);
443 const Position secondPosition = myLanePath.back().first->getLaneShape().positionAtOffset2D(myLanePath.back().second);
456 if (myLanePath.size() > 0) {
458 myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->enableUndoRedo();
462 myFinishCreationButton->disable();
463 myAbortCreationButton->disable();
464 myRemoveLastInsertedElement->disable();
466 updateInfoRouteLabel();
470 myFrameParent->getViewNet()->updateViewNet();
477 if (myLanePath.size() > 1) {
479 myLanePath.back().first->resetCandidateFlags();
481 myLanePath.pop_back();
483 if ((myLanePath.size() > 0) && myLanePath.back().first->isSourceCandidate()) {
484 myLanePath.back().first->setSourceCandidate(
false);
485 myLanePath.back().first->setTargetCandidate(
true);
488 if (myLanePath.size() > 1) {
489 myRemoveLastInsertedElement->enable();
491 myRemoveLastInsertedElement->disable();
494 updateInfoRouteLabel();
498 myFrameParent->getViewNet()->updateViewNet();
505 myFrameParent->createPath();
538 if (myLanePath.size() > 0) {
541 for (
const auto& lane : myLanePath) {
542 length += lane.first->getParentEdge()->getNBEdge()->getLength();
545 std::ostringstream information;
547 <<
"- Selected lanes: " <<
toString(myLanePath.size()) <<
"\n"
548 <<
"- Length: " <<
toString(length);
550 myInfoRouteLabel->setText(information.str().c_str());
552 myInfoRouteLabel->setText(
"No lanes selected");
560 for (
const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
561 for (
const auto& lane : edge.second->getLanes()) {
562 lane->resetCandidateFlags();
568 updateInfoRouteLabel();