|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r60870 - sandbox/geometry/libs/geometry/example
From: barend.gehrels_at_[hidden]
Date: 2010-03-27 08:21:30
Author: barendgehrels
Date: 2010-03-27 08:21:29 EDT (Sat, 27 Mar 2010)
New Revision: 60870
URL: http://svn.boost.org/trac/boost/changeset/60870
Log:
Updated x04_wxwidgets_world_mapper
Text files modified:
sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.cpp | 234 +++++++++++++++++++++++++++++----------
sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.vcproj | 3
2 files changed, 177 insertions(+), 60 deletions(-)
Modified: sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.cpp
==============================================================================
--- sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.cpp (original)
+++ sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.cpp 2010-03-27 08:21:29 EDT (Sat, 27 Mar 2010)
@@ -7,37 +7,53 @@
//
// wxWidgets World Mapper example
+
+// #define EXAMPLE_WX_USE_GRAPHICS_CONTEXT 1
+
+// For Boost/uBLAS:
+#define _SCL_SECURE_NO_WARNINGS 1
+
#include <fstream>
+#include <sstream>
#include <boost/foreach.hpp>
+#include <boost/shared_ptr.hpp>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/multi/multi.hpp>
#include <boost/geometry/geometries/cartesian2d.hpp>
+#include <boost/geometry/extensions/algorithms/selected.hpp>
#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
#include <boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp>
+
// wxWidgets, if these headers are NOT found, adapt include path (and lib path)
+
#include "wx/wx.h"
#include "wx/math.h"
#include "wx/stockitem.h"
+#ifdef EXAMPLE_WX_USE_GRAPHICS_CONTEXT
+#include "wx/graphics.h"
+#endif
+
+
// Adapt wxWidgets points to Boost.Geometry points such that they can be used
// in e.g. transformations (see below)
BOOST_GEOMETRY_REGISTER_POINT_2D(wxPoint, int, cs::cartesian, x, y)
BOOST_GEOMETRY_REGISTER_POINT_2D(wxRealPoint, double, cs::cartesian, x, y)
-typedef boost::geometry::multi_polygon<boost::geometry::polygon_2d> multi_type;
+typedef boost::geometry::multi_polygon<boost::geometry::polygon_2d> country_type;
// ----------------------------------------------------------------------------
// Read an ASCII file containing WKT's
// ----------------------------------------------------------------------------
template <typename Geometry, typename Box>
-void read_wkt(std::string const& filename, std::vector<Geometry>& geometries, Box& box)
+void read_wkt(std::string const& filename, std::vector<Geometry>& geometries, Box& m_box)
{
std::ifstream cpp_file(filename.c_str());
if (cpp_file.is_open())
@@ -52,7 +68,7 @@
Geometry geometry;
boost::geometry::read_wkt(line, geometry);
geometries.push_back(geometry);
- boost::geometry::combine(box, boost::geometry::make_envelope<Box>(geometry));
+ boost::geometry::combine(m_box, boost::geometry::make_envelope<Box>(geometry));
}
}
}
@@ -60,12 +76,6 @@
-// ----------------------------------------------------------------------------
-class HelloWorldApp: public wxApp
-{
-public:
- bool OnInit();
-};
// ----------------------------------------------------------------------------
@@ -86,47 +96,74 @@
{
public:
HelloWorldCanvas(wxFrame *frame);
- void DrawCountries(wxDC& dc);
private:
+ void DrawCountries(wxDC& dc);
+ void DrawCountry(wxDC& dc, country_type const& country);
+
void OnPaint(wxPaintEvent& );
+ void OnMouseMove(wxMouseEvent&);
+
+ typedef boost::geometry::strategy::transform::map_transformer
+ <
+ boost::geometry::point_2d, wxPoint,
+ true, true
+ > map_transformer_type;
+
+ typedef boost::geometry::strategy::transform::inverse_transformer
+ <
+ wxPoint, boost::geometry::point_2d
+ > inverse_transformer_type;
+
+ boost::shared_ptr<map_transformer_type> m_map_transformer;
+ boost::shared_ptr<inverse_transformer_type> m_inverse_transformer;
- boost::geometry::box_2d box;
- std::vector<multi_type> countries;
+ boost::geometry::box_2d m_box;
+ std::vector<country_type> m_countries;
+ int m_focus;
+ wxBrush m_orange;
+ wxFrame* m_owner;
DECLARE_EVENT_TABLE()
};
+
// ----------------------------------------------------------------------------
-bool HelloWorldApp::OnInit()
+class HelloWorldApp: public wxApp
{
- // Create the main frame window
- HelloWorldFrame *frame = new HelloWorldFrame(NULL, _T("Boost.Geometry for wxWidgets - Hello World!"), wxDefaultPosition, wxSize(640, 480));
+public:
+ bool OnInit()
+ {
+ // Create the main frame window
+ HelloWorldFrame *frame = new HelloWorldFrame(NULL, _T("Boost.Geometry for wxWidgets - Hello World!"), wxDefaultPosition, wxSize(640, 480));
- wxMenu *file_menu = new wxMenu;
- file_menu->Append(wxID_EXIT, wxGetStockLabel(wxID_EXIT));
- wxMenuBar* menuBar = new wxMenuBar;
- menuBar->Append(file_menu, _T("&File"));
- frame->SetMenuBar(menuBar);
+ wxMenu *file_menu = new wxMenu;
+ file_menu->Append(wxID_EXIT, wxGetStockLabel(wxID_EXIT));
+ wxMenuBar* menuBar = new wxMenuBar;
+ menuBar->Append(file_menu, _T("&File"));
+ frame->SetMenuBar(menuBar);
- int width, height;
- frame->GetClientSize(&width, &height);
+ int width, height;
+ frame->GetClientSize(&width, &height);
- (void) new HelloWorldCanvas(frame);
+ (void) new HelloWorldCanvas(frame);
- // Show the frame
- frame->Show(true);
+ // Show the frame
+ frame->Show(true);
+
+ return true;
+ }
+};
- return true;
-}
// ----------------------------------------------------------------------------
-HelloWorldFrame::HelloWorldFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
- wxFrame(frame, wxID_ANY, title, pos, size, wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE )
+HelloWorldFrame::HelloWorldFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size)
+ : wxFrame(frame, wxID_ANY, title, pos, size, wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE )
{
+ CreateStatusBar(2);
}
@@ -149,76 +186,155 @@
// ----------------------------------------------------------------------------
HelloWorldCanvas::HelloWorldCanvas(wxFrame *frame)
: wxWindow(frame, wxID_ANY)
+ , m_owner(frame)
+ , m_focus(-1)
{
- boost::geometry::assign_inverse(box);
- read_wkt("data/world.wkt", countries, box);
+ boost::geometry::assign_inverse(m_box);
+ read_wkt("data/world.wkt", m_countries, m_box);
+ m_orange = wxBrush(wxColour(255, 128, 0), wxSOLID);
+}
+
+
+
+void HelloWorldCanvas::OnMouseMove(wxMouseEvent &event)
+{
+ namespace bg = boost::geometry;
+
+ if (m_inverse_transformer)
+ {
+ // Boiler-plate wxWidgets code
+ wxClientDC dc(this);
+ PrepareDC(dc);
+ m_owner->PrepareDC(dc);
+
+ // Transform the point to Lon/Lat
+ bg::point_2d point;
+ bg::transform(event.GetPosition(), point, *m_inverse_transformer);
+
+ // Determine selected object
+ int i = 0;
+ int previous_focus = m_focus;
+ m_focus = -1;
+ BOOST_FOREACH(country_type const& country, m_countries)
+ {
+ if (bg::selected(country, point, 0))
+ {
+ m_focus = i;
+ }
+ i++;
+ }
+
+ // On change:
+ if (m_focus != previous_focus)
+ {
+ // Undraw old focus
+ if (previous_focus >= 0)
+ {
+ dc.SetBrush(*wxWHITE_BRUSH);
+ DrawCountry(dc, m_countries[previous_focus]);
+ }
+ // Draw new focus
+ if (m_focus >= 0)
+ {
+ dc.SetBrush(m_orange);
+ DrawCountry(dc, m_countries[m_focus]);
+ }
+ }
+
+ // Create a string and set it in the status text
+ std::ostringstream out;
+ out << "Position: " << point.x() << ", " << point.y() << " " << m_focus << " " << previous_focus;
+ m_owner->SetStatusText(out.str().c_str());
+ }
}
+
void HelloWorldCanvas::OnPaint(wxPaintEvent& )
{
+#if defined(EXAMPLE_WX_USE_GRAPHICS_CONTEXT)
+ wxPaintDC pdc(this);
+ wxGCDC gdc(pdc);
+ wxDC& dc = (wxDC&) gdc;
+#else
wxPaintDC dc(this);
+#endif
+
PrepareDC(dc);
static bool running = false;
if (! running)
{
running = true;
+
+ // Update the transformers
+ wxSize sz = dc.GetSize();
+ m_map_transformer.reset(new map_transformer_type(m_box, sz.x, sz.y));
+ m_inverse_transformer.reset(new inverse_transformer_type(*m_map_transformer));
+
DrawCountries(dc);
+
running = false;
}
}
+
void HelloWorldCanvas::DrawCountries(wxDC& dc)
{
+ namespace bg = boost::geometry;
+
dc.SetBackground(*wxLIGHT_GREY_BRUSH);
dc.Clear();
- namespace bg = boost::geometry;
+ BOOST_FOREACH(country_type const& country, m_countries)
+ {
+ DrawCountry(dc, country);
+ }
+ if (m_focus != -1)
+ {
+ dc.SetBrush(m_orange);
+ DrawCountry(dc, m_countries[-1]);
+ }
+}
- wxSize sz = GetClientSize();
- boost::geometry::strategy::transform::map_transformer
- <
- bg::point_2d,
- wxPoint, true, true
- > matrix(box, sz.x, sz.y);
- BOOST_FOREACH(multi_type const& country, countries)
+void HelloWorldCanvas::DrawCountry(wxDC& dc, country_type const& country)
+{
+ namespace bg = boost::geometry;
+
+ BOOST_FOREACH(bg::polygon_2d const& poly, country)
{
- BOOST_FOREACH(bg::polygon_2d const& poly, country)
+ bg::linear_ring<wxPoint> wx_ring;
+ // Use only outer, holes are (for the moment) ignored
+ bg::transform(poly.outer(), wx_ring, *m_map_transformer);
+
+ // Todo: avoid converting (use pointer-compatible container)
+ wxPoint* points = new wxPoint[boost::size(wx_ring)];
+ int n = 0;
+ BOOST_FOREACH(wxPoint const& p, wx_ring)
{
- bg::linear_ring<wxPoint> wx_ring;
- // Use only outer, holes are (for the moment) ignored
- bg::transform(poly.outer(), wx_ring, matrix);
-
- // Todo: avoid converting (use pointer-compatible container)
- wxPoint* points = new wxPoint[boost::size(wx_ring)];
- int n = 0;
- BOOST_FOREACH(wxPoint const& p, wx_ring)
- {
- points[n++] = p;
- }
- // end todo
+ points[n++] = p;
+ }
+ // end todo
- dc.DrawPolygon(n, points);
+ dc.DrawPolygon(n, points);
- delete[] points;
- }
+ delete[] points;
}
}
-
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(HelloWorldFrame, wxFrame)
- EVT_CLOSE(HelloWorldFrame::OnCloseWindow)
- EVT_MENU(wxID_EXIT, HelloWorldFrame::OnExit)
+ EVT_CLOSE(HelloWorldFrame::OnCloseWindow)
+ EVT_MENU(wxID_EXIT, HelloWorldFrame::OnExit)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(HelloWorldCanvas, wxWindow)
- EVT_PAINT(HelloWorldCanvas::OnPaint)
+ EVT_PAINT(HelloWorldCanvas::OnPaint)
+ EVT_MOTION(HelloWorldCanvas::OnMouseMove)
END_EVENT_TABLE()
Modified: sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.vcproj
==============================================================================
--- sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.vcproj (original)
+++ sandbox/geometry/libs/geometry/example/x04_wxwidgets_world_mapper.vcproj 2010-03-27 08:21:29 EDT (Sat, 27 Mar 2010)
@@ -45,7 +45,7 @@
AdditionalIncludeDirectories=""c:\software\libraries\wxWidgets-2.8.10\lib\vc_lib\mswd";"c:\software\libraries\wxWidgets-2.8.10\include";..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH"
MinimalRebuild="true"
- RuntimeLibrary="1"
+ RuntimeLibrary="3"
RuntimeTypeInfo="true"
WarningLevel="3"
SuppressStartupBanner="true"
@@ -69,6 +69,7 @@
LinkIncremental="2"
SuppressStartupBanner="true"
AdditionalLibraryDirectories="c:\software\libraries\wxWidgets-2.8.10\lib\vc_lib"
+ IgnoreDefaultLibraryNames=""
GenerateDebugInformation="true"
SubSystem="2"
RandomizedBaseAddress="1"
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk