From bfb539f09069829213852d6ffca22bbeb725c67d Mon Sep 17 00:00:00 2001 From: James Turner Date: Thu, 26 Nov 2015 16:48:23 +0000 Subject: [PATCH] Launcher shows polygon/polyline data --- src/GUI/BaseDiagram.cxx | 78 +++++++++++++++++++++++++++++++++++++++++ src/GUI/BaseDiagram.hxx | 4 +++ src/GUI/QtLauncher.cxx | 38 ++++++++++++++++++-- 3 files changed, 117 insertions(+), 3 deletions(-) diff --git a/src/GUI/BaseDiagram.cxx b/src/GUI/BaseDiagram.cxx index 8a1c8e163..8626a67df 100644 --- a/src/GUI/BaseDiagram.cxx +++ b/src/GUI/BaseDiagram.cxx @@ -30,6 +30,7 @@ #include #include #include +#include #include "QtLauncher_fwd.hxx" @@ -112,6 +113,8 @@ void BaseDiagram::paintEvent(QPaintEvent* pe) QTransform t(transform()); p.setTransform(t); + paintCoastlines(&p); + paintNavaids(&p); paintContents(&p); @@ -132,6 +135,81 @@ void BaseDiagram::paintAirplaneIcon(QPainter* painter, const SGGeod& geod, int h painter->drawPixmap(airplaneIconRect, pix); } +void BaseDiagram::paintCoastlines(QPainter* painter) +{ + QTransform xf = painter->transform(); + QTransform invT = xf.inverted(); + + SGGeod topLeft = unproject(invT.map(rect().topLeft()), m_projectionCenter); + SGGeod viewCenter = unproject(invT.map(rect().center()), m_projectionCenter); + SGGeod bottomRight = unproject(invT.map(rect().bottomRight()), m_projectionCenter); + + double drawRangeNm = std::max(SGGeodesy::distanceNm(viewCenter, topLeft), + SGGeodesy::distanceNm(viewCenter, bottomRight)); + + flightgear::PolyLineList lines(flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm, + flightgear::PolyLine::COASTLINE)); + + QPen waterPen(QColor(64, 64, 255), 1); + waterPen.setCosmetic(true); + painter->setPen(waterPen); + flightgear::PolyLineList::const_iterator it; + for (it=lines.begin(); it != lines.end(); ++it) { + paintGeodVec(painter, (*it)->points()); + } + + lines = flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm, + flightgear::PolyLine::URBAN); + for (it=lines.begin(); it != lines.end(); ++it) { + fillClosedGeodVec(painter, QColor(192, 192, 96), (*it)->points()); + } + + lines = flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm, + flightgear::PolyLine::RIVER); + + painter->setPen(waterPen); + for (it=lines.begin(); it != lines.end(); ++it) { + paintGeodVec(painter, (*it)->points()); + } + + + lines = flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm, + flightgear::PolyLine::LAKE); + + for (it=lines.begin(); it != lines.end(); ++it) { + fillClosedGeodVec(painter, QColor(128, 128, 255), + (*it)->points()); + } + + +} + +void BaseDiagram::paintGeodVec(QPainter* painter, const flightgear::SGGeodVec& vec) +{ + QVector projected; + projected.reserve(vec.size()); + flightgear::SGGeodVec::const_iterator it; + for (it=vec.begin(); it != vec.end(); ++it) { + projected.append(project(*it)); + } + + painter->drawPolyline(projected.data(), projected.size()); +} + +void BaseDiagram::fillClosedGeodVec(QPainter* painter, const QColor& color, const flightgear::SGGeodVec& vec) +{ + QVector projected; + projected.reserve(vec.size()); + flightgear::SGGeodVec::const_iterator it; + for (it=vec.begin(); it != vec.end(); ++it) { + projected.append(project(*it)); + } + + painter->setPen(Qt::NoPen); + painter->setBrush(color); + painter->drawPolygon(projected.data(), projected.size()); +} + class MapFilter : public FGPositioned::TypeFilter { public: diff --git a/src/GUI/BaseDiagram.hxx b/src/GUI/BaseDiagram.hxx index 9cbb81102..153c0eda2 100644 --- a/src/GUI/BaseDiagram.hxx +++ b/src/GUI/BaseDiagram.hxx @@ -29,6 +29,7 @@ #include #include +#include #include "QtLauncher_fwd.hxx" @@ -128,6 +129,9 @@ private: void paintNavaid(QPainter *painter, const QTransform& t, const FGPositionedRef &pos); + void paintCoastlines(QPainter *painter); + void paintGeodVec(QPainter *painter, const flightgear::SGGeodVec &vec); + void fillClosedGeodVec(QPainter *painter, const QColor &color, const flightgear::SGGeodVec &vec); }; Q_DECLARE_OPERATORS_FOR_FLAGS(BaseDiagram::IconOptions) diff --git a/src/GUI/QtLauncher.cxx b/src/GUI/QtLauncher.cxx index 7c5478e94..583b2f2e1 100644 --- a/src/GUI/QtLauncher.cxx +++ b/src/GUI/QtLauncher.cxx @@ -64,6 +64,7 @@ #include
#include #include +#include #include
#include
@@ -344,12 +345,41 @@ void initApp(int& argc, char** argv) } } -bool runLauncherDialog() +void loadNaturalEarthFile(const std::string& aFileName, + flightgear::PolyLine::Type aType, + bool areClosed) { - sglog().setLogLevels( SG_ALL, SG_INFO ); + SGPath path(globals->get_fg_root()); + path.append( "Geodata" ); + path.append(aFileName); + flightgear::PolyLineList lines; + flightgear::SHPParser::parsePolyLines(path, aType, lines, areClosed); + flightgear::PolyLineList::iterator it; + for (it=lines.begin(); it != lines.end(); ++it) { + (*it)->addToSpatialIndex(); + } +} + +void loadNaturalEarthData() +{ + SGTimeStamp st; + st.stamp(); + + loadNaturalEarthFile("ne_10m_coastline.shp", flightgear::PolyLine::COASTLINE, false); + loadNaturalEarthFile("ne_10m_rivers_lake_centerlines.shp", flightgear::PolyLine::RIVER, false); + loadNaturalEarthFile("ne_10m_lakes.shp", flightgear::PolyLine::LAKE, true); - initQtResources(); // can't be called inside a namespaceb + qDebug() << "load basic data took" << st.elapsedMSec(); + + st.stamp(); + loadNaturalEarthFile("ne_10m_urban_areas.shp", flightgear::PolyLine::URBAN, true); + + qDebug() << "loading urban areas took:" << st.elapsedMSec(); +} + +bool runLauncherDialog() +{ // startup the nav-cache now. This pre-empts normal startup of // the cache, but no harm done. (Providing scenery paths are consistent) @@ -364,6 +394,8 @@ bool runLauncherDialog() // will happen as normal http->init(); + loadNaturalEarthData(); + // setup scenery paths now, especially TerraSync path for airport // parking locations (after they're downloaded) -- 2.39.5