1 #ifndef OPENMESH_PYTHON_VECTOR_HH
2 #define OPENMESH_PYTHON_VECTOR_HH
9 template <
class Vector,
class Scalar>
10 void set_item(Vector& _vec,
int _index, Scalar _value) {
12 _index += _vec.size();
15 if ((
size_t)_index < _vec.size()) {
16 _vec[_index] = _value;
19 PyErr_SetString(PyExc_IndexError,
"Index out of range.");
20 throw_error_already_set();
24 template <
class Vector,
class Scalar>
25 Scalar get_item(Vector& _vec,
int _index) {
27 _index += _vec.size();
30 if ((
size_t)_index < _vec.size()) {
34 PyErr_SetString(PyExc_IndexError,
"Index out of range.");
35 throw_error_already_set();
42 template<
class Scalar>
44 typedef OpenMesh::VectorT<Scalar, 2> Vector2;
45 typedef OpenMesh::VectorT<Scalar, 3> Vector3;
46 typedef OpenMesh::VectorT<Scalar, 4> Vector4;
48 static Vector2 *vec2_default() {
49 return new Vector2(Scalar(), Scalar());
51 static Vector2 *vec2_user_defined(
const Scalar& _v0,
const Scalar& _v1) {
52 return new Vector2(_v0, _v1);
54 static Vector3 *vec3_default() {
55 return new Vector3(Scalar(), Scalar(), Scalar());
57 static Vector3 *vec3_user_defined(
const Scalar& _v0,
const Scalar& _v1,
const Scalar& _v2) {
58 return new Vector3(_v0, _v1, _v2);
60 static Vector4 *vec4_default() {
61 return new Vector4(Scalar(), Scalar(), Scalar(), Scalar());
63 static Vector4 *vec4_user_defined(
const Scalar& _v0,
const Scalar& _v1,
const Scalar& _v2,
const Scalar& _v3) {
64 return new Vector4(_v0, _v1, _v2, _v3);
69 template<
class Scalar,
int N>
70 void defInitMod(class_< OpenMesh::VectorT<Scalar, N> > &classVector);
72 template<
class Scalar>
73 void defInitMod(class_< OpenMesh::VectorT<Scalar, 2> > &classVector) {
75 .def(
"__init__", make_constructor(&Factory<Scalar>::vec2_default))
76 .def(
"__init__", make_constructor(&Factory<Scalar>::vec2_user_defined))
79 typedef OpenMesh::VectorT<Scalar, 2> Vector;
80 def(
"dot", &Vector::operator|);
82 template<
class Scalar>
83 void defInitMod(class_< OpenMesh::VectorT<Scalar, 3> > &classVector) {
85 .def(
"__init__", make_constructor(&Factory<Scalar>::vec3_default))
86 .def(
"__init__", make_constructor(&Factory<Scalar>::vec3_user_defined))
87 .def(
"__mod__", &Factory<Scalar>::Vector3::operator%)
90 def(
"cross", &Factory<Scalar>::Vector3::operator%);
92 typedef OpenMesh::VectorT<Scalar, 3> Vector;
93 def(
"dot", &Vector::operator|);
95 template<
class Scalar>
96 void defInitMod(class_< OpenMesh::VectorT<Scalar, 4> > &classVector) {
98 .def(
"__init__", make_constructor(&Factory<Scalar>::vec4_default))
99 .def(
"__init__", make_constructor(&Factory<Scalar>::vec4_user_defined))
102 typedef OpenMesh::VectorT<Scalar, 4> Vector;
103 def(
"dot", &Vector::operator|);
119 template<
class Scalar,
int N>
121 typedef OpenMesh::VectorT<Scalar, N> Vector;
123 Scalar (Vector::*min_void)()
const = &Vector::min;
124 Scalar (Vector::*max_void)()
const = &Vector::max;
126 Vector (Vector::*max_vector)(
const Vector&)
const = &Vector::max;
127 Vector (Vector::*min_vector)(
const Vector&)
const = &Vector::min;
129 class_<Vector> classVector = class_<Vector>(_name);
132 .def(
"__setitem__", &set_item<Vector, Scalar>)
133 .def(
"__getitem__", &get_item<Vector, Scalar>)
136 .def(
self *= Scalar())
137 .def(
self /= Scalar())
138 .def(
self * Scalar())
139 .def(Scalar() *
self)
140 .def(
self / Scalar())
151 .def(
"vectorize", &Vector::vectorize, return_internal_reference<>())
154 .def(
"norm", &Vector::norm)
155 .def(
"length", &Vector::length)
156 .def(
"sqrnorm", &Vector::sqrnorm)
157 .def(
"normalize", &Vector::normalize, return_internal_reference<>())
158 .def(
"normalized", &Vector::normalized)
159 .def(
"normalize_cond", &Vector::normalize_cond, return_internal_reference<>())
161 .def(
"l1_norm", &Vector::l1_norm)
162 .def(
"l8_norm", &Vector::l8_norm)
164 .def(
"max", max_void)
165 .def(
"max_abs", &Vector::max_abs)
166 .def(
"min", min_void)
167 .def(
"min_abs", &Vector::min_abs)
168 .def(
"mean", &Vector::mean)
169 .def(
"mean_abs", &Vector::mean_abs)
170 .def(
"minimize", &Vector::minimize, return_internal_reference<>())
171 .def(
"minimized", &Vector::minimized)
172 .def(
"maximize", &Vector::maximize, return_internal_reference<>())
173 .def(
"maximized", &Vector::maximized)
174 .def(
"min", min_vector)
175 .def(
"max", max_vector)
177 .def(
"size", &Vector::size)
178 .staticmethod(
"size")
179 .def(
"vectorized", &Vector::vectorized)
180 .staticmethod(
"vectorized")
183 typedef OpenMesh::VectorT<Scalar, 2> Vector2;
184 typedef OpenMesh::VectorT<Scalar, 3> Vector3;
185 typedef OpenMesh::VectorT<Scalar, 4> Vector4;
188 static Vector2 *vec2_default() {
189 return new Vector2(Scalar(), Scalar());
191 static Vector2 *vec2_user_defined(
const Scalar& _v0,
const Scalar& _v1) {
192 return new Vector2(_v0, _v1);
194 static Vector3 *vec3_default() {
195 return new Vector3(Scalar(), Scalar(), Scalar());
197 static Vector3 *vec3_user_defined(
const Scalar& _v0,
const Scalar& _v1,
const Scalar& _v2) {
198 return new Vector3(_v0, _v1, _v2);
200 static Vector4 *vec4_default() {
201 return new Vector4(Scalar(), Scalar(), Scalar(), Scalar());
203 static Vector4 *vec4_user_defined(
const Scalar& _v0,
const Scalar& _v1,
const Scalar& _v2,
const Scalar& _v3) {
204 return new Vector4(_v0, _v1, _v2, _v3);
210 .def(
"__init__", make_constructor(&Factory::vec2_default))
211 .def(
"__init__", make_constructor(&Factory::vec2_user_defined))
217 .def(
"__init__", make_constructor(&Factory::vec3_default))
218 .def(
"__init__", make_constructor(&Factory::vec3_user_defined))
219 .def(
"__mod__", &Vector3::operator%)
222 def(
"cross", &Vector3::operator%);
227 .def(
"__init__", make_constructor(&Factory::vec4_default))
228 .def(
"__init__", make_constructor(&Factory::vec4_user_defined))
232 def(
"dot", &Vector::operator|);
void expose_vec(const char *_name)
Expose a vector type to Python.
Definition: Vector.hh:120
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:64