python: add properties to mapnik.Stroke to match xml/svg spec - refs #1427

This commit is contained in:
Dane Springmeyer 2012-08-21 15:59:31 -07:00
parent c8eb8e5775
commit ab5ce64b16
2 changed files with 44 additions and 6 deletions

View file

@ -32,10 +32,9 @@ using namespace mapnik;
namespace { namespace {
using namespace boost::python; using namespace boost::python;
list get_dashes_list(const stroke& stroke) list get_dashes_list(stroke const& stroke)
{ {
list l; list l;
if (stroke.has_dash()) { if (stroke.has_dash()) {
mapnik::dash_array const& dash = stroke.get_dash_array(); mapnik::dash_array const& dash = stroke.get_dash_array();
mapnik::dash_array::const_iterator iter = dash.begin(); mapnik::dash_array::const_iterator iter = dash.begin();
@ -44,9 +43,23 @@ list get_dashes_list(const stroke& stroke)
l.append(make_tuple(iter->first, iter->second)); l.append(make_tuple(iter->first, iter->second));
} }
} }
return l; return l;
} }
void set_dasharray(stroke & stroke, list const& l)
{
for (int i=0; i<len(l); ++i)
{
boost::python::tuple dash = extract<boost::python::tuple>(l[i]);
if (len(dash) == 2)
{
double d1 = extract<double>(dash[0]);
double d2 = extract<double>(dash[1]);
stroke.add_dash(d1,d2);
}
}
}
} }
void export_stroke () void export_stroke ()
@ -99,10 +112,18 @@ void export_stroke ()
&stroke::set_gamma_method, &stroke::set_gamma_method,
"Set/get the gamma correction method of this stroke") "Set/get the gamma correction method of this stroke")
.add_property("line_cap", .add_property("line_cap",
&stroke::get_line_cap,
&stroke::set_line_cap,
"Gets or sets the line cap of this stroke. (alias of linecap)\n")
.add_property("linecap",
&stroke::get_line_cap, &stroke::get_line_cap,
&stroke::set_line_cap, &stroke::set_line_cap,
"Gets or sets the linecap of this stroke.\n") "Gets or sets the linecap of this stroke.\n")
.add_property("line_join", .add_property("line_join",
&stroke::get_line_join,
&stroke::set_line_join,
"Returns the line join mode of this stroke. (alias of linejoin)\n")
.add_property("linejoin",
&stroke::get_line_join, &stroke::get_line_join,
&stroke::set_line_join, &stroke::set_line_join,
"Returns the linejoin mode of this stroke.\n") "Returns the linejoin mode of this stroke.\n")
@ -110,13 +131,20 @@ void export_stroke ()
&stroke::get_miterlimit, &stroke::get_miterlimit,
&stroke::set_miterlimit, &stroke::set_miterlimit,
"Returns the miterlimit mode of this stroke.\n") "Returns the miterlimit mode of this stroke.\n")
// todo consider providing a single get/set property
.def("add_dash",&stroke::add_dash, .def("add_dash",&stroke::add_dash,
(arg("length"),arg("gap")), (arg("length"),arg("gap")),
"Adds a dash segment to the dash patterns of this stroke.\n") "Adds a dash segment to the dash patterns of this stroke.\n")
.def("get_dashes", get_dashes_list, .def("get_dashes", get_dashes_list,
"Returns the list of dash segments for this stroke.\n") "Returns the list of dash segments for this stroke.\n")
.add_property("dasharray",
get_dashes_list,
set_dasharray,
"Gets or sets dasharray string of this stroke. (alternate property to add_dash/get_dashes)\n")
.add_property("dash_offset", .add_property("dash_offset",
&stroke::dash_offset,
&stroke::set_dash_offset,
"Gets or sets dash offset of this stroke. (alias of dashoffet)\n")
.add_property("dashoffset",
&stroke::dash_offset, &stroke::dash_offset,
&stroke::set_dash_offset, &stroke::set_dash_offset,
"Gets or sets dash offset of this stroke.\n") "Gets or sets dash offset of this stroke.\n")

View file

@ -30,6 +30,16 @@ def test_line_symbolizer_stroke_reference():
eq_(l.stroke.opacity,1.0) eq_(l.stroke.opacity,1.0)
assert_almost_equal(l.stroke.width,0.1) assert_almost_equal(l.stroke.width,0.1)
# https://github.com/mapnik/mapnik/issues/1427
def test_stroke_dash_api():
stroke = mapnik.Stroke()
dashes = [(1.0,1.0)]
stroke.dasharray = dashes
eq_(stroke.dasharray, dashes)
stroke.add_dash(.1,.1)
dashes.append((.1,.1))
eq_(stroke.dasharray, dashes)
# https://github.com/mapnik/mapnik/issues/1420 # https://github.com/mapnik/mapnik/issues/1420
def test_text_symbolizer_init(): def test_text_symbolizer_init():
s = mapnik.TextSymbolizer() s = mapnik.TextSymbolizer()