diff --git a/modules/img/base/pymod/export_image_handle.cc b/modules/img/base/pymod/export_image_handle.cc index 3d3a84af72b65bef8707e0e0f7347a08fc85070f..bbfdd713cbe3801926cce461acc478cf0ff99788 100644 --- a/modules/img/base/pymod/export_image_handle.cc +++ b/modules/img/base/pymod/export_image_handle.cc @@ -66,6 +66,11 @@ inline ImageHandle NAME3 (const PARAM1 & p1, const PARAM2 & p2,DataType t, DataD return CreateImage(p1,p2,t,d); \ } +inline ImageHandle create_im_int(int width, int height, int depth) +{ + return CreateImage(img::Size(width, height, depth)); +} + M_CREATE_IMAGE(c1b,c2b,c3b,Size,Point); M_CREATE_IMAGE(c1c,c2c,c3c,Point,Point); M_CREATE_IMAGE(c1d,c2d,c3d,Point,Size); @@ -85,6 +90,74 @@ inline ImageHandle g2a(const Data& d,const Extent& e) inline ImageHandle ih_copy1(ImageHandle& h) {return h.Copy();} inline ImageHandle ih_copy2(ImageHandle& h, bool cc) {return h.Copy(cc);} +img::Point tuple_to_point(size_t dim, tuple t) +{ + size_t tuple_len=len(t); + if (tuple_len!=dim) { + throw std::runtime_error("length of tuple and image dimension must match"); + } + img::Point p; + for (size_t i=0; i<tuple_len; ++i) { + p[i]=extract<int>(t[i]); + } + return p; +} + +object ih_get_item(ConstImageHandle ih, img::Point p) +{ + if (ih.GetType()==img::REAL) { + return object(ih.GetReal(p)); + } else { + return object(ih.GetComplex(p)); + } +} +object ih_get_item_a(ConstImageHandle ih, tuple t) +{ + img::Point p=tuple_to_point(ih.GetSize().GetDim(), t); + return ih_get_item(ih, p); +} + +object ih_get_item_c(ConstImageHandle ih, int x) +{ + if (ih.GetSize().GetDim()!=1) { + throw std::runtime_error("Can't address point of multi-dimensional image with scalar"); + } + return ih_get_item(ih, img::Point(x, 0, 0)); +} +object ih_get_item_b(ConstImageHandle ih, img::Point p) +{ + return ih_get_item(ih, p); +} + +void ih_set_item(ImageHandle ih, img::Point p, object value) +{ + if (ih.GetType()==img::REAL) { + ih.SetReal(p, extract<Real>(value)); + } else { + ih.SetComplex(p, extract<Complex>(value)); + } +} + +void ih_set_item_a(ImageHandle ih, tuple t, object value) +{ + img::Point p=tuple_to_point(ih.GetSize().GetDim(), t); + ih_set_item(ih, p, value); +} + +void ih_set_item_b(ImageHandle ih, img::Point p, object value) +{ + ih_set_item(ih, p, value); +} + +void ih_set_item_c(ImageHandle ih, int x, object value) +{ + if (ih.GetSize().GetDim()!=1) { + throw std::runtime_error("Can't address point of multi-dimensional image with scalar"); + } + ih_set_item(ih, img::Point(x, 0, 0), value); +} + + } // anon ns void export_ImageHandle() @@ -141,6 +214,12 @@ void export_ImageHandle() .def("__iter__",&WrapExtentIterator::Create3) .def(self == self) .def(self != self) + .def("__getitem__", ih_get_item_a) + .def("__getitem__", ih_get_item_b) + .def("__getitem__", ih_get_item_c) + .def("__setitem__", ih_set_item_a) + .def("__setitem__", ih_set_item_b) + .def("__setitem__", ih_set_item_c) .def(self += self) .def(self + self) .def(self -= self) @@ -182,6 +261,8 @@ void export_ImageHandle() ; def("CreateImage",c0); + def("CreateImage", create_im_int, (arg("width"), + arg("height")=0, arg("depth")=0)); def("CreateImage",c1a); def("CreateImage",c2a); def("CreateImage",c3a); @@ -229,7 +310,10 @@ void export_ConstImageHandle() .def(self * Real()) .def(Real() * self) .def(self / Real()) - .def(self + Complex()) + .def("__getitem__", ih_get_item_a) + .def("__getitem__", ih_get_item_b) + .def("__getitem__", ih_get_item_c) + .def(self + Complex()) .def(Complex() + self) .def(self - Complex()) .def(Complex() - self)