00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "py_commands.h"
00022 #include "VMDApp.h"
00023
00024 static char categories_doc[] =
00025 "categories() -> list\n"
00026 "Return list of available color categories";
00027 static PyObject *categories(PyObject *self, PyObject *args) {
00028 if (!PyArg_ParseTuple(args, (char *)""))
00029 return NULL;
00030
00031 VMDApp *app = get_vmdapp();
00032 int num = app->num_color_categories();
00033 PyObject *newlist = PyList_New(num);
00034 for (int i=0; i<num; i++) {
00035 PyList_SET_ITEM(newlist, i,
00036 PyString_FromString(app->color_category(i))
00037 );
00038 }
00039 return newlist;
00040 }
00041
00042 static char get_colormap_doc[] =
00043 "get_colormap(name) -> dictionary\n"
00044 "Return dictionary of name/color pairs in the given category";
00045 static PyObject *get_colormap(PyObject *self, PyObject *args) {
00046 char *name;
00047 if (!PyArg_ParseTuple(args, (char *)"s", &name))
00048 return NULL;
00049
00050 VMDApp *app = get_vmdapp();
00051 int num_names = app->num_color_category_items(name);
00052 PyObject *newdict = PyDict_New();
00053 for (int i=0; i<num_names; i++) {
00054 const char *key = app->color_category_item(name, i);
00055 const char *value = app->color_mapping(name, key);
00056 PyDict_SetItemString(newdict, (char *)key, PyString_FromString(value));
00057 }
00058 return newdict;
00059 }
00060
00061 static char set_colormap_doc[] =
00062 "set_colormap(name, dict) -> None\n"
00063 "Update name/color pairs in given color category.";
00064 static PyObject *set_colormap(PyObject *self, PyObject *args) {
00065 char *name;
00066 PyObject *newdict;
00067
00068 if (!PyArg_ParseTuple(args, (char *)"sO!", &name, &PyDict_Type, &newdict))
00069 return NULL;
00070
00071 VMDApp *app = get_vmdapp();
00072 PyObject *keys = PyDict_Keys(newdict);
00073 PyObject *vals = PyDict_Values(newdict);
00074 int error = 0;
00075 for (int i=0; i<PyList_Size(keys); i++) {
00076 char *keyname = PyString_AsString(PyList_GET_ITEM(keys, i));
00077 if (PyErr_Occurred()) {
00078 error = 1;
00079 break;
00080 }
00081 char *valname = PyString_AsString(PyList_GET_ITEM(vals, i));
00082 if (PyErr_Occurred()) {
00083 error = 1;
00084 break;
00085 }
00086 if (!app->color_changename(name, keyname, valname)) {
00087 PyErr_SetString(PyExc_ValueError,
00088 (char *)"Invalid color category or item specified");
00089 return NULL;
00090 }
00091 }
00092 Py_DECREF(keys);
00093 Py_DECREF(vals);
00094 if (error)
00095 return NULL;
00096
00097 Py_INCREF(Py_None);
00098 return Py_None;
00099 }
00100
00101 static char get_colors_doc[] =
00102 "get_colors() -> dictionary\n"
00103 "Returns dictionary of name/rgb pairs. rgb is a 3-tuple.";
00104 static PyObject *get_colors(PyObject *self, PyObject *args) {
00105 if (!PyArg_ParseTuple(args, (char *)""))
00106 return NULL;
00107
00108 VMDApp *app = get_vmdapp();
00109 PyObject *newdict = PyDict_New();
00110 for (int i=0; i<app->num_regular_colors(); i++) {
00111 float col[3];
00112 const char *name = app->color_name(i);
00113 if (!app->color_value(name, col, col+1, col+2)) {
00114 PyErr_SetString(PyExc_ValueError, (char *)
00115 "Unable to get color definition");
00116 return NULL;
00117 }
00118 PyObject *newtuple = PyTuple_New(3);
00119 for (int j=0; j<3; j++)
00120 PyTuple_SET_ITEM(newtuple, j, PyFloat_FromDouble(col[j]));
00121 PyDict_SetItemString(newdict, (char *)name, newtuple);
00122 }
00123 return newdict;
00124 }
00125
00126 static char set_colors_doc[] =
00127 "set_colors(dict) -> None\n"
00128 "Set colors using given dicionary of name/rgb pairs";
00129 static PyObject *set_colors(PyObject *self, PyObject *args) {
00130 PyObject *newdict;
00131 if (!PyArg_ParseTuple(args, (char *)"O!", &PyDict_Type, &newdict))
00132 return NULL;
00133
00134 VMDApp *app = get_vmdapp();
00135 PyObject *keys = PyDict_Keys(newdict);
00136 PyObject *vals = PyDict_Values(newdict);
00137 int error = 0;
00138 for (int i=0; i<PyList_Size(keys); i++) {
00139 char *keyname = PyString_AsString(PyList_GET_ITEM(keys, i));
00140 if (PyErr_Occurred()) {
00141 error = 1;
00142 break;
00143 }
00144 if (app->color_index(keyname) < 0) {
00145 PyErr_SetString(PyExc_ValueError, (char *)"Unknown color");
00146 error = 1;
00147 break;
00148 }
00149 PyObject *newtuple = PyList_GET_ITEM(vals, i);
00150 if (!PyTuple_Check(newtuple) || PyTuple_Size(newtuple) != 3) {
00151 PyErr_SetString(PyExc_ValueError, (char *)"color definition must be 3-tuple of floats");
00152 error = 1;
00153 break;
00154 }
00155 float rgb[3];
00156 for (int j=0; j<3; j++)
00157 rgb[j] = (float)PyFloat_AsDouble(PyTuple_GET_ITEM(newtuple, j));
00158 if (PyErr_Occurred()) {
00159 error = 1;
00160 break;
00161 }
00162 app->color_changevalue(keyname, rgb[0], rgb[1], rgb[2]);
00163 }
00164 Py_DECREF(keys);
00165 Py_DECREF(vals);
00166 if (error)
00167 return NULL;
00168
00169 Py_INCREF(Py_None);
00170 return Py_None;
00171 }
00172
00173 static char scale_method_doc[] =
00174 "scale_method() -> string\n"
00175 "Return current colorscale method name";
00176 static PyObject *scale_method(PyObject *self, PyObject *args) {
00177 if (!PyArg_ParseTuple(args, (char *)""))
00178 return NULL;
00179
00180 VMDApp *app = get_vmdapp();
00181 const char *method =
00182 app->colorscale_method_name(app->colorscale_method_current());
00183 return PyString_FromString(method);
00184 }
00185
00186 static char scale_methods_doc[] =
00187 "scale_methods() -> list\n"
00188 "Return list of available colorscale methods";
00189 static PyObject *scale_methods(PyObject *self, PyObject *args) {
00190 if (!PyArg_ParseTuple(args, (char *)""))
00191 return NULL;
00192
00193 VMDApp *app = get_vmdapp();
00194 int num = app->num_colorscale_methods();
00195 PyObject *newlist = PyList_New(num);
00196 for (int i=0; i<num; i++) {
00197 PyList_SET_ITEM(newlist, i,
00198 PyString_FromString(app->colorscale_method_name(i))
00199 );
00200 }
00201 return newlist;
00202 }
00203
00204 static char scale_midpoint_doc[] =
00205 "scale_midpoint() -> float\n"
00206 "Return current colorscale midpoint value";
00207 static PyObject *scale_midpoint(PyObject *self, PyObject *args) {
00208 if (!PyArg_ParseTuple(args, (char *)""))
00209 return NULL;
00210
00211 float mid, min, max;
00212 get_vmdapp()->colorscale_info(&mid, &min, &max);
00213 return PyFloat_FromDouble(mid);
00214 }
00215
00216 static char scale_min_doc[] =
00217 "scale_min() -> float\n"
00218 "Return current colorscale midpoint min";
00219 static PyObject *scale_min(PyObject *self, PyObject *args) {
00220 if (!PyArg_ParseTuple(args, (char *)""))
00221 return NULL;
00222
00223 float mid, min, max;
00224 get_vmdapp()->colorscale_info(&mid, &min, &max);
00225 return PyFloat_FromDouble(min);
00226 }
00227
00228 static char scale_max_doc[] =
00229 "scale_max() -> float\n"
00230 "Return current colorscale midpoint max";
00231 static PyObject *scale_max(PyObject *self, PyObject *args) {
00232 if (!PyArg_ParseTuple(args, (char *)""))
00233 return NULL;
00234
00235 float mid, min, max;
00236 get_vmdapp()->colorscale_info(&mid, &min, &max);
00237 return PyFloat_FromDouble(max);
00238 }
00239
00240 static char set_scale_doc[] =
00241 "set_scale(method, midpoint, min, max) -> None\n"
00242 "Set colorscale parameters";
00243 static PyObject *set_scale(PyObject *self, PyObject *args, PyObject *keywds) {
00244 static char *kwlist[] = {
00245 (char *)"method", (char *)"midpoint", (char *)"min", (char *)"max", NULL
00246 };
00247
00248 char *method = NULL;
00249 float midpoint = -1, min = -1, max = -1;
00250 VMDApp *app = get_vmdapp();
00251 app->colorscale_info(&midpoint, &min, &max);
00252
00253 if (!PyArg_ParseTupleAndKeywords(args, keywds, (char *)"|sfff", kwlist,
00254 &method, &midpoint, &min, &max))
00255 return NULL;
00256
00257 if (method) {
00258 int ind = app->colorscale_method_index(method);
00259 if (ind < 0) {
00260 PyErr_SetString(PyExc_ValueError, (char *)"Invalid color scale method");
00261 return NULL;
00262 }
00263 app->colorscale_setmethod(ind);
00264 }
00265 app->colorscale_setvalues(midpoint, min, max);
00266 Py_INCREF(Py_None);
00267 return Py_None;
00268 }
00269
00270 static PyMethodDef ColorMethods[] = {
00271 {(char *)"categories", (vmdPyMethod)categories, METH_VARARGS, categories_doc},
00272 {(char *)"get_colormap", (vmdPyMethod)get_colormap, METH_VARARGS, get_colormap_doc},
00273 {(char *)"set_colormap", (vmdPyMethod)set_colormap, METH_VARARGS, set_colormap_doc},
00274 {(char *)"get_colors", (vmdPyMethod)get_colors, METH_VARARGS, get_colors_doc},
00275 {(char *)"set_colors", (vmdPyMethod)set_colors, METH_VARARGS, set_colors_doc},
00276 {(char *)"scale_method", (vmdPyMethod)scale_method, METH_VARARGS, scale_method_doc},
00277 {(char *)"scale_methods", (vmdPyMethod)scale_methods, METH_VARARGS, scale_methods_doc},
00278 {(char *)"scale_midpoint", (vmdPyMethod)scale_midpoint, METH_VARARGS, scale_midpoint_doc},
00279 {(char *)"scale_min", (vmdPyMethod)scale_min, METH_VARARGS, scale_min_doc},
00280 {(char *)"scale_max", (vmdPyMethod)scale_max, METH_VARARGS, scale_max_doc},
00281 {(char *)"set_scale", (PyCFunction)set_scale, METH_VARARGS | METH_KEYWORDS, set_scale_doc},
00282 {NULL, NULL}
00283 };
00284
00285 void initcolor() {
00286 (void) Py_InitModule((char *)"color", ColorMethods);
00287 }
00288