00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #include <string.h>
00023 
00024 #if defined(ARCH_AIX4)
00025 #include <strings.h>
00026 #endif
00027 
00028 #include "tcl.h"
00029 #include "TclCommands.h"
00030 #include "VMDApp.h"
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 int tcl_colorinfo_categories(Tcl_Interp *interp, VMDApp *app, 
00061                              int argc, const char *[]) {
00062   if (argc != 0) {
00063     Tcl_SetResult(interp, (char *) "colorinfo: categories takes no parameters", TCL_STATIC);
00064     return TCL_ERROR;
00065   }
00066   
00067   int num = app->num_color_categories(); 
00068   for (int i=0; i<num; i++) {
00069     Tcl_AppendElement(interp, (char *) app->color_category(i));
00070   }
00071   return TCL_OK;
00072 }
00073 
00074 
00075 
00076 
00077 int tcl_colorinfo_category(Tcl_Interp *interp, VMDApp *app, 
00078                            int argc, const char *argv[])
00079 {
00080   if (argc != 1 && argc !=2) {
00081     Tcl_SetResult(interp, (char *) "colorinfo: category takes one parameter (for a list) or two for a mapping", TCL_STATIC);
00082     return TCL_ERROR;
00083   }
00084 
00085   
00086   if (argc == 1) { 
00087     for (int i=0; i<app->num_color_category_items(argv[0]); i++) {
00088       Tcl_AppendElement(interp, (char *) app->color_category_item(argv[0], i));
00089     }
00090     return TCL_OK;
00091   }
00092   
00093   const char *mapping = app->color_mapping(argv[0], argv[1]);
00094   if (!mapping) {
00095     Tcl_SetResult(interp, (char *) "colorinfo: category: couldn't find category element", TCL_STATIC);
00096     return TCL_ERROR;
00097   }
00098   
00099   
00100   Tcl_AppendElement(interp, (char *) mapping);
00101   return TCL_OK;
00102 }
00103 
00104 int tcl_colorinfo_num(Tcl_Interp *interp, VMDApp *app, int argc, const char *[]) {
00105   if (argc != 0) {
00106     Tcl_SetResult(interp, (char *) "colorinfo: numcolors takes no parameters", TCL_STATIC);
00107     return TCL_ERROR;
00108   }
00109 
00110   char tmpstring[64];
00111   sprintf(tmpstring, "%d", app->num_regular_colors());
00112   Tcl_SetResult(interp, tmpstring, TCL_VOLATILE);
00113   return TCL_OK;
00114 }
00115 
00116 
00117 int tcl_colorinfo_max(Tcl_Interp *interp, VMDApp *app, int argc, const char *[]) {
00118   if (argc != 0) {
00119     Tcl_SetResult(interp, (char *) "colorinfo: maxcolor takes no parameters", TCL_STATIC);
00120     return TCL_ERROR;
00121   }
00122 
00123   char tmpstring[64];
00124   sprintf(tmpstring, "%d", app->num_colors());
00125   Tcl_SetResult(interp, tmpstring, TCL_VOLATILE);
00126   return TCL_OK;
00127 }
00128 
00129 
00130 int tcl_colorinfo_colors(Tcl_Interp *interp, VMDApp *app, 
00131                          int argc, const char *[]) {
00132   if (argc != 0) {
00133     Tcl_SetResult(interp, (char *) "colorinfo: colors takes no parameters", TCL_STATIC);
00134     return TCL_ERROR;
00135   }
00136   for (int i=0; i<app->num_regular_colors(); i++) {
00137     Tcl_AppendElement(interp, (char *) app->color_name(i));
00138   }
00139   return TCL_OK;
00140 }
00141 
00143 int tcl_colorinfo_rgb(Tcl_Interp *interp, VMDApp *app, 
00144                       int argc, const char *argv[]) {
00145   if (argc != 1) {
00146     Tcl_SetResult(interp, (char *) "colorinfo: color takes one color name or index", TCL_STATIC);
00147     return TCL_ERROR;
00148   }
00149   float value[3];
00150   if (!app->color_value(argv[0], value, value+1, value+2)) {
00151     
00152     int id;
00153     if (Tcl_GetInt(interp, argv[0], &id) != TCL_OK ||
00154         !app->color_name(id) || 
00155         !app->color_value(app->color_name(id), value, value+1, value+2)) {
00156       Tcl_SetResult(interp, (char *) "colorinfo: color: couldn't find color name or index", TCL_STATIC);
00157     return TCL_ERROR;
00158     }
00159   }
00160   Tcl_Obj *tcl_result = Tcl_NewListObj(0,NULL);
00161   for (int i=0; i<3; i++)
00162     Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewDoubleObj(value[i]));
00163   Tcl_SetObjResult(interp, tcl_result);
00164   return TCL_OK;
00165 }
00166 
00168 int tcl_colorinfo_index(Tcl_Interp *interp, VMDApp *app, 
00169                         int argc, const char *argv[]) {
00170   if (argc != 1) {
00171     Tcl_SetResult(interp, (char *) "colorinfo: index takes one color name or index", TCL_STATIC);
00172     return TCL_ERROR;
00173   }
00174   
00175   int id = app->color_index(argv[0]); 
00176   if (id < 0) {
00177     Tcl_SetResult(interp, (char *) "colorinfo: index: couldn't find color name or index", TCL_STATIC);
00178     return TCL_ERROR;
00179   }
00180 
00181   char tmpstring[64];
00182   sprintf(tmpstring, "%d", id);
00183   Tcl_SetResult(interp, tmpstring, TCL_VOLATILE);
00184   return TCL_OK;
00185 }
00187 int tcl_colorinfo_scale(Tcl_Interp *interp, VMDApp *app, 
00188                         int argc, const char *argv[])
00189 {
00190   if (argc != 1) {
00191     Tcl_SetResult(interp, (char *) "colorinfo: scale takes method|methods|midpoint|min|max", TCL_STATIC);
00192     return TCL_ERROR;
00193   }
00194   if (!strcmp(argv[0], "method")) {
00195     Tcl_SetResult(interp, (char *) app->colorscale_method_name(app->colorscale_method_current()), TCL_VOLATILE);
00196     return TCL_OK;
00197   }
00198   if (!strcmp(argv[0], "methods")) {
00199     for (int i=0; i<app->num_colorscale_methods(); i++) {
00200       Tcl_AppendElement(interp, (char *)app->colorscale_method_name(i));
00201     }
00202     return TCL_OK;
00203   }
00204   float mid, min, max;
00205   int rev, posterize;
00206   app->colorscale_params(&mid, &min, &max, &rev, &posterize);
00207   if (!strcmp(argv[0], "midpoint")) {
00208     Tcl_SetObjResult(interp, Tcl_NewDoubleObj(mid));
00209     return TCL_OK;
00210   }
00211   if (!strcmp(argv[0], "min")) {
00212     Tcl_SetObjResult(interp, Tcl_NewDoubleObj(min));
00213     return TCL_OK;
00214   }
00215   if (!strcmp(argv[0], "max")) {
00216     Tcl_SetObjResult(interp, Tcl_NewDoubleObj(max));
00217     return TCL_OK;
00218   }
00219   if (!strcmp(argv[0], "reverse")) {
00220     Tcl_SetObjResult(interp, Tcl_NewIntObj(rev));
00221     return TCL_OK;
00222   }
00223   if (!strcmp(argv[0], "posterize")) {
00224     Tcl_SetObjResult(interp, Tcl_NewIntObj(rev));
00225     return TCL_OK;
00226   }
00227   Tcl_AppendResult(interp, "colorinfo: scale called with incorrect ",
00228                    "parameter '", argv[0], "'", NULL);
00229   return TCL_ERROR;
00230 }
00231 
00233 int tcl_colorinfo(ClientData cd, Tcl_Interp *interp, int argc, const char *argv[])
00234 {
00235   if (argc < 2) {
00236     Tcl_SetResult(interp, 
00237       (char *)
00238       "colorinfo categories\n"
00239       "colorinfo category <category>\n"
00240       "colorinfo category <category> <element>\n"
00241       "colorinfo [num|max|colors]\n"
00242       "colorinfo [index|rgb] <name|value>\n"
00243       "colorinfo scale [method|methods|midpoint|min|max]",
00244       TCL_STATIC);
00245     return TCL_ERROR;
00246   }
00247 
00248   VMDApp *app = (VMDApp *)cd;
00249 
00250   if (!strcmp(argv[1], "categories")) {
00251     return tcl_colorinfo_categories(interp, app, argc-2, argv+2);
00252   }
00253   if (!strcmp(argv[1], "category")) {
00254     return tcl_colorinfo_category(interp, app, argc-2, argv+2);
00255   }
00256   if (!strcmp(argv[1], "num")) {
00257     return tcl_colorinfo_num(interp, app, argc-2, argv+2);
00258   }
00259   if (!strcmp(argv[1], "max")) {
00260     return tcl_colorinfo_max(interp, app, argc-2, argv+2);
00261   }
00262   if (!strcmp(argv[1], "colors")) {
00263     return tcl_colorinfo_colors(interp, app, argc-2, argv+2);
00264   }
00265   if (!strcmp(argv[1], "index")) {
00266     return tcl_colorinfo_index(interp, app, argc-2, argv+2);
00267   }
00268   if (!strcmp(argv[1], "rgb")) {
00269     return tcl_colorinfo_rgb(interp, app, argc-2, argv+2);
00270   }
00271   
00272   if (!strcmp(argv[1], "scale")) {
00273     return tcl_colorinfo_scale(interp, app, argc-2, argv+2);
00274   }
00275 
00276   Tcl_AppendResult(interp, "colorinfo: couldn't understand first parameter: ",
00277                    argv[1], NULL);
00278   return TCL_ERROR;
00279 }
00280