2006-03-31 12:32:02 +02:00
|
|
|
/*****************************************************************************
|
2011-11-14 04:54:32 +01:00
|
|
|
*
|
2006-03-31 12:32:02 +02:00
|
|
|
* This file is part of Mapnik (c++ mapping toolkit)
|
2006-02-01 00:09:52 +01:00
|
|
|
*
|
2006-03-31 12:32:02 +02:00
|
|
|
* Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
|
2006-02-01 00:09:52 +01:00
|
|
|
*
|
2006-03-31 12:32:02 +02:00
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
2006-02-01 00:09:52 +01:00
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2006-03-31 12:32:02 +02:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
2006-02-01 00:09:52 +01:00
|
|
|
*
|
2006-03-31 12:32:02 +02:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*
|
|
|
|
*****************************************************************************/
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2014-08-12 19:44:11 +02:00
|
|
|
#include <mapnik/config.hpp>
|
|
|
|
|
2013-10-24 00:42:01 +02:00
|
|
|
#include "boost_std_shared_shim.hpp"
|
|
|
|
|
2009-09-26 19:15:22 +02:00
|
|
|
// boost
|
2006-02-01 00:09:52 +01:00
|
|
|
#include <boost/python.hpp>
|
2009-09-26 19:15:22 +02:00
|
|
|
|
|
|
|
// mapnik
|
2009-12-16 21:02:06 +01:00
|
|
|
#include <mapnik/box2d.hpp>
|
2010-11-15 04:21:43 +01:00
|
|
|
#include <mapnik/value_error.hpp>
|
2006-02-01 00:09:52 +01:00
|
|
|
|
|
|
|
using mapnik::coord;
|
2009-12-16 21:02:06 +01:00
|
|
|
using mapnik::box2d;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
|
|
|
struct envelope_pickle_suite : boost::python::pickle_suite
|
|
|
|
{
|
|
|
|
static boost::python::tuple
|
2009-12-16 21:02:06 +01:00
|
|
|
getinitargs(const box2d<double>& e)
|
2006-02-01 00:09:52 +01:00
|
|
|
{
|
|
|
|
using namespace boost::python;
|
|
|
|
return boost::python::make_tuple(e.minx(),e.miny(),e.maxx(),e.maxy());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-11-15 04:21:43 +01:00
|
|
|
box2d<double> from_string(std::string const& s)
|
|
|
|
{
|
|
|
|
box2d<double> bbox;
|
|
|
|
bool success = bbox.from_string(s);
|
|
|
|
if (success)
|
|
|
|
{
|
|
|
|
return bbox;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << "Could not parse bbox from string: '" << s << "'";
|
|
|
|
throw mapnik::value_error(ss.str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-02-01 00:09:52 +01:00
|
|
|
//define overloads here
|
2009-12-16 21:02:06 +01:00
|
|
|
void (box2d<double>::*width_p1)(double) = &box2d<double>::width;
|
|
|
|
double (box2d<double>::*width_p2)() const = &box2d<double>::width;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2009-12-16 21:02:06 +01:00
|
|
|
void (box2d<double>::*height_p1)(double) = &box2d<double>::height;
|
|
|
|
double (box2d<double>::*height_p2)() const = &box2d<double>::height;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2009-12-16 21:02:06 +01:00
|
|
|
void (box2d<double>::*expand_to_include_p1)(double,double) = &box2d<double>::expand_to_include;
|
|
|
|
void (box2d<double>::*expand_to_include_p2)(coord<double,2> const& ) = &box2d<double>::expand_to_include;
|
|
|
|
void (box2d<double>::*expand_to_include_p3)(box2d<double> const& ) = &box2d<double>::expand_to_include;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2009-12-16 21:02:06 +01:00
|
|
|
bool (box2d<double>::*contains_p1)(double,double) const = &box2d<double>::contains;
|
|
|
|
bool (box2d<double>::*contains_p2)(coord<double,2> const&) const = &box2d<double>::contains;
|
|
|
|
bool (box2d<double>::*contains_p3)(box2d<double> const&) const = &box2d<double>::contains;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2007-10-21 11:51:03 +02:00
|
|
|
//intersects
|
2009-12-16 21:02:06 +01:00
|
|
|
bool (box2d<double>::*intersects_p1)(double,double) const = &box2d<double>::intersects;
|
|
|
|
bool (box2d<double>::*intersects_p2)(coord<double,2> const&) const = &box2d<double>::intersects;
|
|
|
|
bool (box2d<double>::*intersects_p3)(box2d<double> const&) const = &box2d<double>::intersects;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2007-10-21 11:51:03 +02:00
|
|
|
// intersect
|
2009-12-16 21:02:06 +01:00
|
|
|
box2d<double> (box2d<double>::*intersect)(box2d<double> const&) const = &box2d<double>::intersect;
|
2006-02-01 00:09:52 +01:00
|
|
|
|
2010-08-19 23:35:27 +02:00
|
|
|
// re_center
|
|
|
|
void (box2d<double>::*re_center_p1)(double,double) = &box2d<double>::re_center;
|
|
|
|
void (box2d<double>::*re_center_p2)(coord<double,2> const& ) = &box2d<double>::re_center;
|
|
|
|
|
2011-04-13 21:19:23 +02:00
|
|
|
// clip
|
|
|
|
void (box2d<double>::*clip)(box2d<double> const&) = &box2d<double>::clip;
|
|
|
|
|
2012-12-11 22:56:25 +01:00
|
|
|
// pad
|
|
|
|
void (box2d<double>::*pad)(double) = &box2d<double>::pad;
|
|
|
|
|
2011-12-20 17:17:20 +01:00
|
|
|
// deepcopy
|
|
|
|
box2d<double> box2d_deepcopy(box2d<double> & obj, boost::python::dict memo)
|
|
|
|
{
|
|
|
|
// FIXME::ignore memo for now
|
|
|
|
box2d<double> result(obj);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2006-02-01 00:09:52 +01:00
|
|
|
void export_envelope()
|
|
|
|
{
|
|
|
|
using namespace boost::python;
|
2009-12-16 21:02:06 +01:00
|
|
|
class_<box2d<double> >("Box2d",
|
2010-06-02 13:03:30 +02:00
|
|
|
// class docstring is in mapnik/__init__.py, class _Coord
|
|
|
|
init<double,double,double,double>(
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("minx"),arg("miny"),arg("maxx"),arg("maxy")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Constructs a new envelope from the coordinates\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
"of its lower left and upper right corner points.\n"))
|
2010-08-19 23:35:27 +02:00
|
|
|
.def(init<>("Equivalent to Box2d(0, 0, -1, -1).\n"))
|
2009-09-27 03:31:30 +02:00
|
|
|
.def(init<const coord<double,2>&, const coord<double,2>&>(
|
2010-06-02 13:03:30 +02:00
|
|
|
(arg("ll"),arg("ur")),
|
2010-08-19 23:35:27 +02:00
|
|
|
"Equivalent to Box2d(ll.x, ll.y, ur.x, ur.y).\n"))
|
2010-11-15 04:21:43 +01:00
|
|
|
.def("from_string",from_string)
|
|
|
|
.staticmethod("from_string")
|
2011-11-14 04:54:32 +01:00
|
|
|
.add_property("minx", &box2d<double>::minx,
|
2009-09-26 19:15:22 +02:00
|
|
|
"X coordinate for the lower left corner")
|
2011-11-14 04:54:32 +01:00
|
|
|
.add_property("miny", &box2d<double>::miny,
|
2009-09-26 19:15:22 +02:00
|
|
|
"Y coordinate for the lower left corner")
|
2009-12-16 21:02:06 +01:00
|
|
|
.add_property("maxx", &box2d<double>::maxx,
|
2009-09-26 19:15:22 +02:00
|
|
|
"X coordinate for the upper right corner")
|
2011-11-14 04:54:32 +01:00
|
|
|
.add_property("maxy", &box2d<double>::maxy,
|
2009-09-26 19:15:22 +02:00
|
|
|
"Y coordinate for the upper right corner")
|
2009-12-16 21:02:06 +01:00
|
|
|
.def("center", &box2d<double>::center,
|
2009-09-26 19:15:22 +02:00
|
|
|
"Returns the coordinates of the center of the bounding box.\n"
|
|
|
|
"\n"
|
|
|
|
"Example:\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e.center()\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
"Coord(50, 50)\n")
|
2010-08-19 23:35:27 +02:00
|
|
|
.def("center", re_center_p1,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("x"), arg("y")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Moves the envelope so that the given coordinates become its new center.\n"
|
|
|
|
"The width and the height are preserved.\n"
|
|
|
|
"\n "
|
|
|
|
"Example:\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e.center(60, 60)\n"
|
|
|
|
">>> e.center()\n"
|
|
|
|
"Coord(60.0,60.0)\n"
|
|
|
|
">>> (e.width(), e.height())\n"
|
|
|
|
"(100.0, 100.0)\n"
|
|
|
|
">>> e\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
"Box2d(10.0, 10.0, 110.0, 110.0)\n"
|
|
|
|
)
|
|
|
|
.def("center", re_center_p2,
|
|
|
|
(arg("Coord")),
|
|
|
|
"Moves the envelope so that the given coordinates become its new center.\n"
|
|
|
|
"The width and the height are preserved.\n"
|
|
|
|
"\n "
|
|
|
|
"Example:\n"
|
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
|
|
|
">>> e.center(Coord60, 60)\n"
|
|
|
|
">>> e.center()\n"
|
|
|
|
"Coord(60.0,60.0)\n"
|
|
|
|
">>> (e.width(), e.height())\n"
|
|
|
|
"(100.0, 100.0)\n"
|
|
|
|
">>> e\n"
|
|
|
|
"Box2d(10.0, 10.0, 110.0, 110.0)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2011-04-13 21:19:23 +02:00
|
|
|
.def("clip", clip,
|
|
|
|
(arg("other")),
|
|
|
|
"Clip the envelope based on the bounds of another envelope.\n"
|
|
|
|
"\n "
|
|
|
|
"Example:\n"
|
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
2012-12-11 22:56:25 +01:00
|
|
|
">>> c = Box2d(-50, -50, 50, 50)\n"
|
|
|
|
">>> e.clip(c)\n"
|
2011-04-13 21:19:23 +02:00
|
|
|
">>> e\n"
|
2012-12-11 22:56:25 +01:00
|
|
|
"Box2d(0.0,0.0,50.0,50.0\n"
|
|
|
|
)
|
|
|
|
.def("pad", pad,
|
|
|
|
(arg("padding")),
|
|
|
|
"Pad the envelope based on a padding value.\n"
|
|
|
|
"\n "
|
|
|
|
"Example:\n"
|
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
|
|
|
">>> e.pad(10)\n"
|
|
|
|
">>> e\n"
|
|
|
|
"Box2d(-10.0,-10.0,110.0,110.0\n"
|
2011-04-13 21:19:23 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("width", width_p1,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("new_width")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Sets the width to new_width of the envelope preserving its center.\n"
|
|
|
|
"\n "
|
|
|
|
"Example:\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e.width(120)\n"
|
|
|
|
">>> e.center()\n"
|
|
|
|
"Coord(50.0,50.0)\n"
|
|
|
|
">>> e\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
"Box2d(-10.0, 0.0, 110.0, 100.0)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("width", width_p2,
|
2009-09-27 03:31:30 +02:00
|
|
|
"Returns the width of this envelope.\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("height", height_p1,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("new_height")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Sets the height to new_height of the envelope preserving its center.\n"
|
|
|
|
"\n "
|
|
|
|
"Example:\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e.height(120)\n"
|
|
|
|
">>> e.center()\n"
|
|
|
|
"Coord(50.0,50.0)\n"
|
|
|
|
">>> e\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
"Box2d(0.0, -10.0, 100.0, 110.0)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("height", height_p2,
|
2009-09-27 03:31:30 +02:00
|
|
|
"Returns the height of this envelope.\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("expand_to_include",expand_to_include_p1,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("x"),arg("y")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Expands this envelope to include the point given by x and y.\n"
|
|
|
|
"\n"
|
|
|
|
"Example:\n",
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e = Box2d(0, 0, 100, 100)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e.expand_to_include(110, 110)\n"
|
|
|
|
">>> e\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
"Box2d(0.0, 00.0, 110.0, 110.0)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("expand_to_include",expand_to_include_p2,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("p")),
|
|
|
|
"Equivalent to expand_to_include(p.x, p.y)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("expand_to_include",expand_to_include_p3,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("other")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Equivalent to:\n"
|
|
|
|
" expand_to_include(other.minx, other.miny)\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
" expand_to_include(other.maxx, other.maxy)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("contains",contains_p1,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("x"),arg("y")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Returns True iff this envelope contains the point\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
"given by x and y.\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("contains",contains_p2,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("p")),
|
|
|
|
"Equivalent to contains(p.x, p.y)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("contains",contains_p3,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("other")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Equivalent to:\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
" contains(other.minx, other.miny) and contains(other.maxx, other.maxy)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("intersects",intersects_p1,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("x"),arg("y")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Returns True iff this envelope intersects the point\n"
|
|
|
|
"given by x and y.\n"
|
|
|
|
"\n"
|
|
|
|
"Note: For points, intersection is equivalent\n"
|
|
|
|
"to containment, i.e. the following holds:\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
" e.contains(x, y) == e.intersects(x, y)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("intersects",intersects_p2,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("p")),
|
|
|
|
"Equivalent to contains(p.x, p.y)\n")
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("intersects",intersects_p3,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("other")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Returns True iff this envelope intersects the other envelope,\n"
|
|
|
|
"This relationship is symmetric."
|
|
|
|
"\n"
|
|
|
|
"Example:\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e1 = Box2d(0, 0, 100, 100)\n"
|
|
|
|
">>> e2 = Box2d(50, 50, 150, 150)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e1.intersects(e2)\n"
|
|
|
|
"True\n"
|
|
|
|
">>> e1.contains(e2)\n"
|
2009-09-27 03:31:30 +02:00
|
|
|
"False\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2009-09-26 19:15:22 +02:00
|
|
|
.def("intersect",intersect,
|
2009-09-27 03:31:30 +02:00
|
|
|
(arg("other")),
|
2009-09-26 19:15:22 +02:00
|
|
|
"Returns the overlap of this envelope and the other envelope\n"
|
|
|
|
"as a new envelope.\n"
|
|
|
|
"\n"
|
|
|
|
"Example:\n"
|
2010-08-19 23:35:27 +02:00
|
|
|
">>> e1 = Box2d(0, 0, 100, 100)\n"
|
|
|
|
">>> e2 = Box2d(50, 50, 150, 150)\n"
|
2009-09-26 19:15:22 +02:00
|
|
|
">>> e1.intersect(e2)\n"
|
2011-11-14 04:54:32 +01:00
|
|
|
"Box2d(50.0, 50.0, 100.0, 100.0)\n"
|
2010-06-02 13:03:30 +02:00
|
|
|
)
|
2006-10-16 15:44:52 +02:00
|
|
|
.def(self == self) // __eq__
|
2011-06-07 21:27:15 +02:00
|
|
|
.def(self != self) // __neq__
|
2006-10-16 15:44:52 +02:00
|
|
|
.def(self + self) // __add__
|
|
|
|
.def(self * float()) // __mult__
|
2011-11-14 04:54:32 +01:00
|
|
|
.def(float() * self)
|
2006-10-16 15:44:52 +02:00
|
|
|
.def(self / float()) // __div__
|
2010-09-16 16:41:29 +02:00
|
|
|
.def("__getitem__",&box2d<double>::operator[])
|
2011-09-13 15:23:15 +02:00
|
|
|
.def("valid",&box2d<double>::valid)
|
2006-02-01 00:09:52 +01:00
|
|
|
.def_pickle(envelope_pickle_suite())
|
2011-12-20 17:17:20 +01:00
|
|
|
.def("__deepcopy__", &box2d_deepcopy)
|
2006-02-01 00:09:52 +01:00
|
|
|
;
|
2012-02-02 02:30:26 +01:00
|
|
|
|
2006-02-01 00:09:52 +01:00
|
|
|
}
|