| 125 | } |
| 126 | |
| 127 | static PyObject *vec2py(const meep::vec &v, bool newobj = false) { |
| 128 | SWIG_PYTHON_THREAD_SCOPED_BLOCK; |
| 129 | // Return value: New reference |
| 130 | double x = 0, y = 0, z = 0; |
| 131 | |
| 132 | switch (v.dim) { |
| 133 | case meep::D1: z = v.z(); break; |
| 134 | case meep::D2: |
| 135 | x = v.x(); |
| 136 | y = v.y(); |
| 137 | break; |
| 138 | case meep::D3: |
| 139 | x = v.x(); |
| 140 | y = v.y(); |
| 141 | z = v.z(); |
| 142 | break; |
| 143 | case meep::Dcyl: |
| 144 | x = v.r(); |
| 145 | z = v.z(); |
| 146 | break; |
| 147 | } |
| 148 | |
| 149 | if (newobj) { |
| 150 | PyObject *v3_class = py_vector3_object(); |
| 151 | PyObject *args = Py_BuildValue("(d,d,d)", x, y, z); |
| 152 | PyObject *res = PyObject_Call(v3_class, args, NULL); |
| 153 | |
| 154 | Py_DECREF(args); |
| 155 | |
| 156 | return res; |
| 157 | } |
| 158 | else { |
| 159 | if (py_callback_v3 == NULL) { |
| 160 | PyObject *v3_class = py_vector3_object(); |
| 161 | PyObject *args = PyTuple_New(0); |
| 162 | py_callback_v3 = PyObject_Call(v3_class, args, NULL); |
| 163 | |
| 164 | Py_DECREF(args); |
| 165 | } |
| 166 | |
| 167 | PyObject *pyx = PyFloat_FromDouble(x); |
| 168 | PyObject *pyy = PyFloat_FromDouble(y); |
| 169 | PyObject *pyz = PyFloat_FromDouble(z); |
| 170 | |
| 171 | PyObject_SetAttrString(py_callback_v3, "x", pyx); |
| 172 | PyObject_SetAttrString(py_callback_v3, "y", pyy); |
| 173 | PyObject_SetAttrString(py_callback_v3, "z", pyz); |
| 174 | |
| 175 | Py_DECREF(pyx); |
| 176 | Py_DECREF(pyy); |
| 177 | Py_DECREF(pyz); |
| 178 | |
| 179 | Py_INCREF(py_callback_v3); |
| 180 | return py_callback_v3; |
| 181 | }; |
| 182 | } |
| 183 | |
| 184 | static void py_user_material_func_wrap(vector3 x, void *user_data, medium_struct *medium) { |
no test coverage detected