1 %{
2 static void
convert_SbVec4d_array(PyObject * input,double temp[4])3 convert_SbVec4d_array(PyObject * input, double temp[4])
4 {
5 if (PySequence_Check(input) && (PySequence_Size(input) == 4) &&
6 PyNumber_Check(PySequence_GetItem(input, 0)) &&
7 PyNumber_Check(PySequence_GetItem(input, 1)) &&
8 PyNumber_Check(PySequence_GetItem(input, 2)) &&
9 PyNumber_Check(PySequence_GetItem(input, 3))) {
10 temp[0] = PyFloat_AsDouble(PySequence_GetItem(input, 0));
11 temp[1] = PyFloat_AsDouble(PySequence_GetItem(input, 1));
12 temp[2] = PyFloat_AsDouble(PySequence_GetItem(input, 2));
13 temp[3] = PyFloat_AsDouble(PySequence_GetItem(input, 3));
14 } else {
15 PyErr_SetString(PyExc_TypeError, "expected a sequence with 4 floats");
16 PyErr_Print();
17 }
18 }
19 %}
20
21 %typemap(in) double v[4] (double temp[4]) {
22 convert_SbVec4d_array($input, temp);
23 $1 = temp;
24 }
25
26 %typemap(typecheck) double v[4] {
27 $1 = PySequence_Check($input) ? 1 : 0 ;
28 }
29
30 %ignore SbVec2d::__imul__;
31
32 /* for some strange reason the %apply directive below doesn't work
33 * for this class on getValue(f,f,f,f)...
34 * created this typemap for getValue(void) instead as a workaround.
35 */
36 %typemap(out) double * {
37 $result = Py_BuildValue("(ffff)",
38 (double)(*($1)),
39 (double)(*($1+1)),
40 (double)(*($1+2)),
41 (double)(*($1+3)));
42 }
43
44 /* add operator overloading methods instead of the global functions */
45 %extend SbVec4d {
__add__(const SbVec4d & u)46 SbVec4d __add__(const SbVec4d &u) { return *self + u; }
__sub__(const SbVec4d & u)47 SbVec4d __sub__(const SbVec4d &u) { return *self - u; }
__mul__(const double d)48 SbVec4d __mul__(const double d) { return *self * d; }
__mul__(const SbDPMatrix & m)49 SbVec4d __mul__(const SbDPMatrix &m) { SbVec4d res; m.multVecMatrix(*self,res); return res; }
__rmul__(const double d)50 SbVec4d __rmul__(const double d) { return *self * d; }
__div__(const double d)51 SbVec4d __div__(const double d) { return *self / d; }
__truediv__(const double d)52 SbVec4d __truediv__(const double d) { return *self / d; }
__eq__(const SbVec4d & u)53 int __eq__(const SbVec4d &u ) { return *self == u; }
__nq__(const SbVec4d & u)54 int __nq__(const SbVec4d &u) { return *self != u; }
55 // swig - add a method for wrapping c++ operator[] access
__getitem__(int i)56 double __getitem__(int i) { return (self->getValue())[i]; }
__setitem__(int i,double value)57 void __setitem__(int i, double value) { (*self)[i] = value; }
58
59 %pythoncode %{
60 def __iter__(self):
61 for i in range(4):
62 yield self[i]
63
64 def __len__(self):
65 return 4
66 %}
67 }
68
69 %apply double *OUTPUT { double& x, double& y, double& z, double& w };
70
71 %ignore SbVec4d::getValue(double& x, double& y, double& z, double& w) const;
72