static PyObject *set_colorid(PyObject *self, PyObject *args) { int colorid; float rgb[3]; if (!PyArg_ParseTuple(args, (char *)"i(fff)", &colorid, &rgb[0], &rgb[1], &rgb[2])) { return NULL; } VMDApp *app = get_vmdapp(); if (colorid >= app->num_regular_colors() || colorid < 0) { PyErr_SetString(PyExc_ValueError, (char *) "color index out of range"); return NULL; } const char *name = app->color_name(colorid); app->color_changevalue(name, rgb[0], rgb[1], rgb[2]); //We declare that we are returning a pyobject, so lets actually return one! Py_INCREF(Py_None); return Py_None; }
static PyObject *set_colors(PyObject *self, PyObject *args) { PyObject *newdict; if (!PyArg_ParseTuple(args, (char *)"O!", &PyDict_Type, &newdict)) return NULL; VMDApp *app = get_vmdapp(); PyObject *keys = PyDict_Keys(newdict); PyObject *vals = PyDict_Values(newdict); int error = 0; for (int i=0; i<PyList_Size(keys); i++) { char *keyname = PyString_AsString(PyList_GET_ITEM(keys, i)); if (PyErr_Occurred()) { error = 1; break; } if (app->color_index(keyname) < 0) { PyErr_SetString(PyExc_ValueError, (char *)"Unknown color"); error = 1; break; } PyObject *newtuple = PyList_GET_ITEM(vals, i); if (!PyTuple_Check(newtuple) || PyTuple_Size(newtuple) != 3) { PyErr_SetString(PyExc_ValueError, (char *)"color definition must be 3-tuple of floats"); error = 1; break; } float rgb[3]; for (int j=0; j<3; j++) rgb[j] = (float)PyFloat_AsDouble(PyTuple_GET_ITEM(newtuple, j)); if (PyErr_Occurred()) { error = 1; break; } app->color_changevalue(keyname, rgb[0], rgb[1], rgb[2]); } Py_DECREF(keys); Py_DECREF(vals); if (error) return NULL; Py_INCREF(Py_None); return Py_None; }