Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

py_color.C

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr
00003  *cr            (C) Copyright 1995-2011 The Board of Trustees of the
00004  *cr                        University of Illinois
00005  *cr                         All Rights Reserved
00006  *cr
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  * RCS INFORMATION:
00011  *
00012  *      $RCSfile: py_color.C,v $
00013  *      $Author: johns $        $Locker:  $             $State: Exp $
00014  *      $Revision: 1.18 $       $Date: 2010/12/16 04:08:56 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  *  Python color control interface.
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  

Generated on Thu May 24 01:51:25 2012 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002