00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <stdlib.h>
00025 #include <tcl.h>
00026 #include "JString.h"
00027 #include "config.h"
00028 #include "UIObject.h"
00029 #include "CommandQueue.h"
00030 #include "Displayable.h"
00031 #include "DispCmds.h"
00032 #include "Matrix4.h"
00033 #include "MoleculeList.h"
00034 #include "Command.h"
00035 #include "P_Tracker.h"
00036 #include "P_Buttons.h"
00037 #include "P_Feedback.h"
00038 #include "P_Tool.h"
00039 #include "P_CmdTool.h"
00040 #include "VMDApp.h"
00041
00042 int text_cmd_tool(ClientData cd, Tcl_Interp *interp, int argc,
00043 const char *argv[]) {
00044
00045 VMDApp *app = (VMDApp *)cd;
00046 CommandQueue *cmdQueue = app->commandQueue;
00047
00048 char buf[400];
00049
00050 if(argc<2) {
00051 Tcl_SetResult(interp,
00052 (char *)
00053 "tool create <type> [<name> [<name> ...]]\n"
00054 "tool change <type> [<toolid>]\n"
00055 "tool scale <scale> [<toolid>]\n"
00056 "tool scaleforce <scale> [<toolid>]\n"
00057 "tool offset <x> <y> <z> [<toolid>]\n"
00058 "tool delete [<toolid>]\n"
00059 #if 0
00060 "tool info [<toolid>]\n"
00061 #endif
00062 "tool rep <toolid> <mol id> <rep id>\n"
00063 "tool adddevice <name> [<toolid>]\n"
00064 "tool removedevice <name> [<toolid>]\n"
00065 "tool callback on/off",
00066 TCL_STATIC);
00067 return TCL_ERROR;
00068 }
00069
00070
00071 if(!strupncmp(argv[1], "create", CMDLEN) && argc>=3) {
00072 if (!app->tool_create(argv[2], argc-3, argv+3)) {
00073 Tcl_AppendResult(interp, "Failed to create new tool.", NULL);
00074 return TCL_ERROR;
00075 }
00076 return TCL_OK;
00077 }
00078
00079
00080 if(!strupncmp(argv[1], "change", CMDLEN) && (argc==4 || argc==3)) {
00081 int i=0;
00082
00083 if(argc==4) {
00084 if (Tcl_GetInt(interp, argv[3], &i) != TCL_OK)
00085 return TCL_ERROR;
00086 }
00087 if (!app->tool_change_type(i, argv[2])) {
00088 Tcl_AppendResult(interp, "Unable to change tool type.", NULL);
00089 return TCL_ERROR;
00090 }
00091 return TCL_OK;
00092 }
00093
00094
00095 if(!strupncmp(argv[1], "scale", CMDLEN) && (argc==3 || argc==4)) {
00096 int i=0;
00097 double dscale=0.0;
00098 float scale=0.0f;
00099 if(argc==4) {
00100 if (Tcl_GetInt(interp, argv[3], &i) != TCL_OK)
00101 return TCL_ERROR;
00102 }
00103 if (Tcl_GetDouble(interp, argv[2], &dscale) != TCL_OK)
00104 return TCL_ERROR;
00105 scale = (float)dscale;
00106 if (app->tool_set_position_scale(i, scale)) {
00107 return TCL_OK;
00108 }
00109 Tcl_AppendResult(interp, "Unable to set position scale", NULL);
00110 return TCL_ERROR;
00111 }
00112
00113
00114 if(!strupncmp(argv[1], "scaleforce", CMDLEN) && (argc==3 || argc==4)) {
00115 int i=0;
00116 double dscale=0;
00117 float scale=0;
00118 if(argc==4) {
00119 if (Tcl_GetInt(interp, argv[3], &i) != TCL_OK)
00120 return TCL_ERROR;
00121 }
00122 if (Tcl_GetDouble(interp, argv[2], &dscale) != TCL_OK)
00123 return TCL_ERROR;
00124 scale = (float)dscale;
00125 if (app->tool_set_force_scale(i, scale))
00126 return TCL_OK;
00127 Tcl_AppendResult(interp, "Unable to set force scale", NULL);
00128 return TCL_ERROR;
00129 }
00130
00131
00132 if(!strupncmp(argv[1], "scalespring", CMDLEN) && (argc==3 || argc==4)) {
00133 int i=0;
00134 double dscale=0;
00135 float scale=0;
00136 if(argc==4) {
00137 if (Tcl_GetInt(interp, argv[3], &i) != TCL_OK)
00138 return TCL_ERROR;
00139 }
00140 if (Tcl_GetDouble(interp, argv[2], &dscale) != TCL_OK)
00141 return TCL_ERROR;
00142 scale = (float)dscale;
00143 if (app->tool_set_spring_scale(i, scale))
00144 return TCL_OK;
00145 Tcl_AppendResult(interp, "Unable to set spring scale", NULL);
00146 return TCL_ERROR;
00147 }
00148
00149
00150 if(!strupncmp(argv[1], "offset", CMDLEN) && (argc==5 || argc==6)) {
00151 int i=0,j;
00152 double d_offset[3];
00153 float offset[3];
00154 if(argc==6) {
00155 if (Tcl_GetInt(interp, argv[5], &i) != TCL_OK)
00156 return TCL_ERROR;
00157 }
00158
00159 if (Tcl_GetDouble(interp, argv[2], &d_offset[0]) != TCL_OK)
00160 return TCL_ERROR;
00161 if (Tcl_GetDouble(interp, argv[3], &d_offset[1]) != TCL_OK)
00162 return TCL_ERROR;
00163 if (Tcl_GetDouble(interp, argv[4], &d_offset[2]) != TCL_OK)
00164 return TCL_ERROR;
00165 for(j=0;j<3;j++) offset[j] = (float)d_offset[j];
00166 cmdQueue->runcommand(new CmdToolOffset(offset,i));
00167
00168 sprintf(buf,"Setting offset of tool %i.", i);
00169 Tcl_AppendResult(interp, buf, NULL);
00170 return TCL_OK;
00171
00172 }
00173
00174
00175 if(!strupncmp(argv[1], "delete", CMDLEN) && (argc==3 || argc==2)) {
00176 int i=0;
00177
00178 if(argc==3) {
00179 if (Tcl_GetInt(interp, argv[2], &i) != TCL_OK)
00180 return TCL_ERROR;
00181 }
00182 cmdQueue->runcommand(new CmdToolDelete(i));
00183 sprintf(buf,"Deleting tool %i.\n",i);
00184 Tcl_AppendResult(interp, buf, NULL);
00185 return TCL_OK;
00186 }
00187
00188 #if 0 // XXX
00189
00190 if(!strupncmp(argv[1], "info", CMDLEN) && (argc==3 || argc==2)) {
00191 int i=0;
00192 Tool *tool;
00193
00194 if (argc==3) {
00195 if (Tcl_GetInt(interp, argv[2], &i) != TCL_OK)
00196 return TCL_ERROR;
00197 }
00198 tool = vmdGlobal.uiVR->gettool(i);
00199 if (tool==NULL) {
00200 Tcl_AppendResult(interp, "No such tool.", NULL);
00201 return TCL_ERROR;
00202 }
00203
00204 sprintf(buf,"Info for tool %i (%s)\n",i,tool->type_name());
00205 Tcl_AppendResult(interp,buf, NULL);
00206
00207 const float *pos = tool->position();
00208 const Matrix4 *rot = tool->orientation();
00209 if (pos==NULL) {
00210 Tcl_AppendResult(interp, "Tool has no position!", NULL);
00211 return TCL_ERROR;
00212 }
00213
00214 sprintf(buf, "Postion: %.2f %.2f %.2f\n"
00215 "Orientation: %.2f %.2f %.2f\n"
00216 " %.2f %.2f %.2f\n"
00217 " %.2f %.2f %.2f\n",
00218 pos[0],pos[1],pos[2],
00219 rot->mat[4*0+0],rot->mat[4*0+1],rot->mat[4*0+2],
00220 rot->mat[4*1+0],rot->mat[4*1+1],rot->mat[4*1+2],
00221 rot->mat[4*2+0],rot->mat[4*2+1],rot->mat[4*2+2]);
00222 Tcl_AppendResult(interp,buf, NULL);
00223
00224 int j=0;
00225 char *devices[5];
00226 const float *offset;
00227 float scale;
00228
00229 offset = tool->getoffset();
00230 if (offset==NULL) {
00231 Tcl_AppendResult(interp, "tool info:\n", "NULL Offset...?\n", NULL);
00232 return TCL_ERROR;
00233 }
00234
00235 scale = tool->getscale();
00236
00237 tool->getdevices(devices);
00238 JString buf2;
00239 while(devices[j]!=NULL) {
00240 buf2 += devices[j++];
00241 buf2 += " ";
00242 }
00243
00244 sprintf(buf,"Scale: %.2f\n"
00245 "Offset: %.2f %.2f %.2f\n"
00246 "USL: %s\n", scale, offset[0],
00247 offset[1], offset[2], (const char *)buf2);
00248 Tcl_AppendResult(interp,buf, NULL);
00249 return TCL_OK;
00250 }
00251 #endif
00252
00253
00254 if(!strupncmp(argv[1], "rep", CMDLEN)) {
00255 if (argc != 3 && argc != 5) {
00256 Tcl_AppendResult(interp, "tool rep usage:\n",
00257 "Usage: tool rep toolnum [molid repnum]", NULL);
00258 return TCL_ERROR;
00259 }
00260 int toolnum, molid, repnum;
00261 toolnum = atoi(argv[2]);
00262 if (argc == 5) {
00263 molid = atoi(argv[3]);
00264 repnum = atoi(argv[4]);
00265 } else {
00266 molid = repnum = -1;
00267 }
00268 cmdQueue->runcommand(new CmdToolRep(toolnum, molid, repnum));
00269 return TCL_OK;
00270 }
00271
00272
00273 if(!strupncmp(argv[1], "adddevice", CMDLEN) &&
00274 (argc == 3 || argc == 4)) {
00275 int i=0;
00276
00277 if(argc==4) {
00278 if (Tcl_GetInt(interp, argv[3], &i) != TCL_OK)
00279 return TCL_ERROR;
00280 }
00281 cmdQueue->runcommand(new CmdToolAddDevice(argv[2],i));
00282 return TCL_OK;
00283 }
00284
00285
00286 if(!strupncmp(argv[1], "removedevice", CMDLEN) &&
00287 (argc == 3 || argc == 4)) {
00288 int i=0;
00289
00290 if(argc==4) {
00291 if (Tcl_GetInt(interp, argv[3], &i) != TCL_OK)
00292 return TCL_ERROR;
00293 }
00294 cmdQueue->runcommand(new CmdToolDeleteDevice(argv[2],i));
00295 return TCL_OK;
00296 }
00297
00298
00299 if(!strupncmp(argv[1], "callback", CMDLEN)) {
00300 if(argc==3) {
00301 int on=-1;
00302 if (Tcl_GetBoolean(interp, argv[2], &on) != TCL_OK)
00303 return TCL_ERROR;
00304 if (on!=-1) {
00305 cmdQueue->runcommand(new CmdToolCallback(on));
00306 return TCL_OK;
00307 }
00308 }
00309 Tcl_AppendResult(interp," tool callback usage:\n",
00310 "Usage: tool callback on/off [<toolid>]",NULL);
00311 return TCL_ERROR;
00312 }
00313
00314 return TCL_ERROR;
00315 }
00316