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>
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>
72 .def(
"__init__", make_constructor(&Factory<Scalar>::vec2_default))
73 .def(
"__init__", make_constructor(&Factory<Scalar>::vec2_user_defined))
76 template<
class Scalar>
79 .def(
"__init__", make_constructor(&Factory<Scalar>::vec3_default))
80 .def(
"__init__", make_constructor(&Factory<Scalar>::vec3_user_defined))
81 #if (_MSC_VER >= 1900 || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
82 .def(
"__mod__", &Factory<Scalar>::Vector3::template
operator%<Scalar>)
84 def(
"cross", &Factory<Scalar>::Vector3::template
operator%<Scalar>);
86 .def(
"__mod__", &Factory<Scalar>::Vector3::operator%)
88 def(
"cross", &Factory<Scalar>::Vector3::operator%);
91 template<
class Scalar>
94 .def(
"__init__", make_constructor(&Factory<Scalar>::vec4_default))
95 .def(
"__init__", make_constructor(&Factory<Scalar>::vec4_user_defined))
112 template<
class Scalar,
int N>
116 Scalar (Vector::*min_void)()
const = &Vector::min;
117 Scalar (Vector::*max_void)()
const = &Vector::max;
119 Vector (Vector::*max_vector)(
const Vector&)
const = &Vector::max;
120 Vector (Vector::*min_vector)(
const Vector&)
const = &Vector::min;
122 class_<Vector> classVector = class_<Vector>(_name);
125 .def(
"__setitem__", &set_item<Vector, Scalar>)
126 .def(
"__getitem__", &get_item<Vector, Scalar>)
129 .def(
self *= Scalar())
130 .def(
self /= Scalar())
131 .def(
self * Scalar())
132 .def(Scalar() *
self)
133 .def(
self / Scalar())
144 .def(
"vectorize", &Vector::vectorize, return_internal_reference<>())
147 #if (_MSC_VER >= 1900 || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
148 .def(
"dot", &Vector::template
operator|<Scalar>)
149 .def(
"norm", &Vector::template norm<Scalar>)
150 .def(
"length", &Vector::template length<Scalar>)
151 .def(
"sqrnorm", &Vector::template sqrnorm<Scalar>)
152 .def(
"normalize", &Vector::template normalize<Scalar>, return_internal_reference<>())
153 .def(
"normalized", &Vector::template normalized<Scalar>)
154 .def(
"normalize_cond", &Vector::template normalize_cond<Scalar>, return_internal_reference<>())
156 .def(
"dot", &Vector::operator|)
157 .def(
"norm", &Vector::norm)
158 .def(
"length", &Vector::length)
159 .def(
"sqrnorm", &Vector::sqrnorm)
160 .def(
"normalize", &Vector::normalize, return_internal_reference<>())
161 .def(
"normalized", &Vector::normalized)
162 .def(
"normalize_cond", &Vector::normalize_cond, return_internal_reference<>())
165 .def(
"l1_norm", &Vector::l1_norm)
166 .def(
"l8_norm", &Vector::l8_norm)
168 .def(
"max", max_void)
169 .def(
"max_abs", &Vector::max_abs)
170 .def(
"min", min_void)
171 .def(
"min_abs", &Vector::min_abs)
172 .def(
"mean", &Vector::mean)
173 .def(
"mean_abs", &Vector::mean_abs)
174 .def(
"minimize", &Vector::minimize, return_internal_reference<>())
175 .def(
"minimized", &Vector::minimized)
176 .def(
"maximize", &Vector::maximize, return_internal_reference<>())
177 .def(
"maximized", &Vector::maximized)
178 .def(
"min", min_vector)
179 .def(
"max", max_vector)
181 .def(
"size", &Vector::size)
182 .staticmethod(
"size")
183 .def(
"vectorized", &Vector::vectorized)
184 .staticmethod(
"vectorized")
187 defInitMod<Scalar>(classVector);
void expose_vec(const char *_name)
ACG::Vec3d Vector
Standard Type for 3d Vector used for scripting.
ACG::Vec4d Vector4
Standard Type for 4d Vector used for scripting.