plvCmds.cc
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:6k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <string>
  2. #include <tk.h>
  3. #include <stdlib.h>
  4. #include "defines.h"
  5. #include "plvGlobals.h"
  6. #include "plvCmds.h"
  7. #include "Timer.h"
  8. #include "plvScene.h"
  9. #include "plvDrawCmds.h"
  10. #include "FileNameUtils.h"
  11. // BUGBUG - shouldn't need this here, but it helps with the compile.
  12. class Scene;
  13. int
  14. PlvParamCmd(ClientData clientData, Tcl_Interp *interp, 
  15. int argc, char *argv[])
  16. {
  17.   if (argc == 1) {
  18.     printf("Command: plv_param [-option value]n");
  19.     printf("  -warn <boolean> (%d)n", Warn);
  20.     printf("  -areanorms <int> (%d)n", UseAreaWeightedNormals);
  21.     printf("  -subsamp <int> (%d)n", SubSampleBase);
  22.     printf("  -numprocs <int> (%d)n", NumProcs);
  23.   }
  24.   else {
  25.     for (int i = 1; i < argc; i++) {
  26.       if (!strcmp(argv[i], "-warn")) {
  27. i++;
  28. if (!strcmp(argv[i], "0") || !strcmp(argv[i], "off")) {
  29.   Warn = FALSE;
  30. else if (!strcmp(argv[i], "1") || !strcmp(argv[i], "on")){
  31.   Warn = TRUE;
  32. }
  33. else {
  34.   interp->result = "bad arg to plv_param -warn";
  35.   return TCL_ERROR;
  36. }
  37.       }
  38.       else if (!strcmp(argv[i], "-areanorms")) {
  39. i++;
  40. UseAreaWeightedNormals = atoi(argv[i]);
  41.       }
  42.       else if (!strcmp(argv[i], "-subsamp")) {
  43. i++;
  44. SubSampleBase = atoi(argv[i]);
  45.       }
  46.       else if (!strcmp(argv[i], "-numprocs")) {
  47. i++;
  48. NumProcs = atoi(argv[i]);
  49.       }
  50.       else {
  51. interp->result = "bad args to plv_param";
  52. return TCL_ERROR;
  53.       }
  54.     }
  55.   }
  56.   return TCL_OK;
  57. }
  58. Tk_RestrictAction
  59. updateWindowFilter (ClientData clientData, XEvent* eventPtr)
  60. {
  61.   Tk_Window parent = (Tk_Window)clientData;
  62.   Window w = ((XAnyEvent*)eventPtr)->window;
  63.   Display* d = ((XAnyEvent*)eventPtr)->display;
  64.   Tk_Window child = Tk_IdToWindow (d, w);
  65.   while (child != NULL) {
  66.     //cerr << "checking " << Tk_PathName (child) << " : " << flush;
  67.     if (child == parent) {
  68.       //cerr << "yup" << endl;
  69.       return TK_PROCESS_EVENT;
  70.     }
  71.     //cerr << "nope" << endl;
  72.     child = Tk_Parent (child);
  73.   }
  74.   return TK_DEFER_EVENT;
  75. }
  76. int
  77. PlvUpdateWindowCmd(ClientData clientData, Tcl_Interp *interp, 
  78.    int argc, char *argv[])
  79. {
  80.   // NOTE, the idea of this was to process all pending events for a given
  81.   // window and no others, but this doesn't work because most events
  82.   // actually take shape as idle events before they do anything, and we
  83.   // can't filter idle events, only window-system events.
  84.   // But it's not entirely useless, because the builtin "update" command
  85.   // only has two options, process everything or process only idle events, 
  86.   // and here we can process idle or window events without file events,
  87.   // meaning clear the pipeline of all existing events including window
  88.   // resizes, etc., without accepting new input (which comes in as file
  89.   // events).
  90.   if (argc < 2) {
  91.     interp->result = "bad args";
  92.     return TCL_ERROR;
  93.   }
  94.   Tk_Window tkwin = Tk_NameToWindow (interp, argv[1],
  95.      Tk_MainWindow (interp));
  96.   if (!tkwin)
  97.     return TCL_ERROR;  // interp->result already set
  98.   // set up message filter, so we can be notified if messages arrive
  99.   Tk_RestrictProc* old_filter_proc;
  100.   ClientData old_filter_data;
  101.   old_filter_proc = Tk_RestrictEvents (updateWindowFilter, tkwin,
  102.        &old_filter_data);
  103.   //Tcl_Eval (interp, argv[2]);
  104.   while (Tk_DoOneEvent (TK_WINDOW_EVENTS | TK_IDLE_EVENTS | TK_DONT_WAIT))
  105.     ;
  106.   // remove message filter
  107.   Tk_RestrictEvents (old_filter_proc, old_filter_data, &old_filter_data);
  108.   return TCL_OK;
  109. }
  110. int
  111. SczGetSystemTickCountCmd (ClientData clientData, Tcl_Interp *interp, 
  112.   int argc, char *argv[])
  113. {
  114.   unsigned int ticks = Timer::get_system_tick_count();
  115.   char buf[20];
  116.   sprintf (buf, "%u", ticks);
  117.   Tcl_SetResult (interp, buf, TCL_VOLATILE);
  118.   return TCL_OK;
  119. }
  120. int SczSessionCmd (ClientData clientData, Tcl_Interp *interp, 
  121.    int argc, char *argv[])
  122. {
  123.   if (argc < 3) {
  124.     interp->result = "bad # args";
  125.     return TCL_ERROR;
  126.   }
  127.   if (!strcmp (argv[1], "load")) {
  128.     if (!theScene->readSessionFile (argv[2])) {
  129.       interp->result = "Session read failed.";
  130.       return TCL_ERROR;
  131.     }
  132.   } else if (!strcmp (argv[1], "save")) {
  133.     if (!theScene->writeSessionFile (argv[2])) {
  134.       interp->result = "Session write failed.";
  135.       return TCL_ERROR;
  136.     }
  137.   } else if (!strcmp (argv[1], "activate")) {
  138.     DisplayableMesh* dm = FindMeshDisplayInfo (argv[2]);
  139.     if (!dm) {
  140.       interp->result = "Scan not in session";
  141.       return TCL_ERROR;
  142.     }
  143.     if (argc != 4) {
  144.       interp->result = "Bad # args";
  145.       return TCL_ERROR;
  146.     }
  147.     bool active = atoi (argv[3]);
  148.     if (!theScene->setScanLoadedStatus (dm, active)) {
  149.       interp->result = "Unload/reload failed";
  150.       return TCL_ERROR;
  151.     }
  152.   } else {
  153.     interp->result = "bad subcommand";
  154.     return TCL_ERROR;
  155.   }
  156.   return TCL_OK;
  157. }
  158. int
  159. SczPseudoGroupCmd(ClientData clientData, Tcl_Interp *interp, 
  160.   int argc, char *argv[])
  161. {
  162.   if (argc < 3) {
  163.     interp->result = "bad # args";
  164.     return TCL_ERROR;
  165.   }
  166.   // first create a directory
  167.   if (portable_mkdir(argv[1], 00775)) {
  168.     cerr << "Could not create directory " << argv[1] << endl;
  169.     return TCL_ERROR;
  170.   }
  171.   // now, get the meshes, create soft links to them into
  172.   // the directory we just created
  173.   // argv[2] is a space separated list of mesh names
  174.   char *start, *end;
  175.   start = argv[2];
  176.   bool done = false;
  177.   while (!done) {
  178.     end = start+1;
  179.     while (*end != ' ' && *end != '') end++;
  180.     if (*end == ' ') *end = '';
  181.     else             done = true;
  182.     // now start points to a null terminated string
  183.     DisplayableMesh* dm = FindMeshDisplayInfo (start);
  184.     if (dm) {
  185.       RigidScan *rs = dm->getMeshData();
  186.       if (rs) {
  187. {
  188.   char buf[256];
  189.   getcwd(buf,256);
  190.   std::string src(buf);
  191.   src += '/'; src += rs->get_name().c_str();
  192.   //cout << src << endl;
  193.   std::string tgt(argv[1]);
  194.   tgt += '/'; tgt += start; tgt += '.';
  195.   tgt += rs->get_nameending().c_str();
  196.   //cout << tgt << endl;
  197.   portable_symlink(src.c_str(), tgt.c_str());
  198. }
  199. {
  200.   char buf[256];
  201.   getcwd(buf,256);
  202.   std::string src(buf);
  203.   src += '/'; src += rs->get_basename().c_str(); src += ".xf";
  204.   //cout << src << endl;
  205.   std::string tgt(argv[1]);
  206.   tgt += '/'; tgt += start; tgt += ".xf";
  207.   //cout << tgt << endl;
  208.   portable_symlink(src.c_str(), tgt.c_str());
  209. }
  210.       }
  211.     }
  212.     //cout << start << endl;
  213.     if (!done) start = end+1;
  214.   }
  215.   return TCL_OK;
  216. }