diff --git a/map/framework.cpp b/map/framework.cpp index 829cc0bc17..8c68e3f977 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -99,6 +99,7 @@ #include "base/math.hpp" #include "base/scope_guard.hpp" #include "base/stl_helpers.hpp" +#include "base/string_utils.hpp" #include "base/timer.hpp" #include "std/algorithm.hpp" @@ -2996,6 +2997,39 @@ bool Framework::ParseEditorDebugCommand(search::SearchParams const & params) osm::Editor::Instance().ClearAllLocalEdits(); return true; } + + static std::string const kFindFeatureDebugKey = "?fid "; + if (params.m_query.find(kFindFeatureDebugKey) == 0) + { + // Format: ?fidindex. + auto fidStr = params.m_query.substr(kFindFeatureDebugKey.size()); + bool const canSearch = !fidStr.empty() && fidStr.back() == ' '; + strings::Trim(fidStr); + uint32_t index = 0; + if (canSearch && strings::to_uint(fidStr, index)) + { + bool isShown = false; + auto const features = FindFeaturesByIndex(index); + for (auto const & fid : features) + { + FeaturesLoaderGuard guard(m_model.GetDataSource(), fid.m_mwmId); + auto ft = guard.GetFeatureByIndex(fid.m_index); + if (!ft) + continue; + + // Show the first feature on the map. + if (!isShown) + { + ShowFeatureByMercator(feature::GetCenter(*ft)); + isShown = true; + } + + // Log found features. + LOG(LINFO, ("Feature found:", fid, MercatorBounds::ToLatLon(feature::GetCenter(*ft)))); + } + } + return true; + } return false; } @@ -3643,6 +3677,33 @@ MwmSet::MwmId Framework::GetMwmIdByName(string const & name) const return m_model.GetDataSource().GetMwmIdByCountryFile(platform::CountryFile(name)); } +vector Framework::FindFeaturesByIndex(uint32_t featureIndex) const +{ + vector result; + auto mwms = GetMwmsByRect(m_currentModelView.ClipRect(), false /* rough */); + set s(mwms.begin(), mwms.end()); + + vector> maps; + m_storage.GetLocalMaps(maps); + for (auto const & localFile : maps) + { + auto mwmId = GetMwmIdByName(localFile->GetCountryName()); + if (s.find(mwmId) != s.end()) + continue; + + if (mwmId.IsAlive()) + mwms.push_back(move(mwmId)); + } + + for (auto const & mwmId : mwms) + { + FeaturesLoaderGuard const guard(m_model.GetDataSource(), mwmId); + if (featureIndex < guard.GetNumFeatures() && guard.GetFeatureByIndex(featureIndex)) + result.emplace_back(mwmId, featureIndex); + } + return result; +} + void Framework::ReadFeatures(function const & reader, vector const & features) { diff --git a/map/framework.hpp b/map/framework.hpp index 8aa2f01d70..0bbd5bbe33 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -427,6 +427,9 @@ public: vector GetMwmsByRect(m2::RectD const & rect, bool rough) const; MwmSet::MwmId GetMwmIdByName(string const & name) const; + // Use only for debug purposes! + vector FindFeaturesByIndex(uint32_t featureIndex) const; + void ReadFeatures(function const & reader, vector const & features);