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