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

3D图形编程

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <vector.h>
  3. #include <ctype.h>
  4. #include <fstream.h>
  5. #include "plvImageCmds.h"
  6. #include "plvGlobals.h"
  7. #include "plvMeshCmds.h"
  8. #include "plvPlyCmds.h"
  9. #include "plvScene.h"
  10. #include "ply++.h"
  11. #include "RangeGrid.h"
  12. #include "DisplayMesh.h"
  13. #include "ScanFactory.h"
  14. #include "GroupUI.h"
  15. #include "GroupScan.h"
  16. int
  17. PlvIsRangeGridCmd(ClientData clientData, Tcl_Interp *interp, 
  18.   int argc, char *argv[])
  19. {
  20.   if (is_range_grid_file(argv[1]))
  21.     interp->result = "1";
  22.   else
  23.     interp->result = "0";
  24.   
  25.   return TCL_OK;
  26. }
  27. int
  28. PlvReadFileCmd(ClientData clientData, Tcl_Interp *interp, 
  29.       int argc, char *argv[])
  30. {
  31.   if (argc < 2) {
  32.     interp->result = "No filename specified in PlvReadFileCmd!";
  33.     return TCL_ERROR;
  34.   }
  35.   RigidScan* scan = CreateScanFromFile (argv[1]);
  36.   if (scan != NULL) {
  37.     DisplayableMesh* dm = theScene->addMeshSet(scan);
  38.     Tcl_SetResult(interp, (char*)dm->getName(), TCL_VOLATILE);
  39.     return TCL_OK;
  40.   } else {
  41.     interp->result = "The given scan or set could not be loaded.";
  42.     return TCL_ERROR;
  43.   }
  44. }
  45. int
  46. PlvReadGroupMembersCmd(ClientData clientData, Tcl_Interp *interp, 
  47.        int argc, char *argv[])
  48. {
  49.   if (argc < 2) {
  50.     interp->result = "No filename specified in PlvReadGroupMembersCmd!";
  51.     return TCL_ERROR;
  52.   }
  53.   char buf[1000];
  54.   ifstream fin (argv[1]);
  55.   crope names = crope("");
  56.   
  57.   while (!fin.fail()) {
  58.     fin.getline(buf, 1000);
  59.     names += crope(buf) + crope(" ");
  60.   }
  61.   if (!strcmp(names.c_str(), "")) {
  62.     interp->result = "Cannot load group";
  63.     return TCL_ERROR;
  64.   }
  65.   interp->result = strdup(names.c_str());
  66.   return TCL_OK;
  67. }
  68. int 
  69. PlvGetNextGroupNameCmd(ClientData clientData, Tcl_Interp *interp, 
  70.        int argc, char *argv[])
  71. {
  72.   interp->result = getNextUnusedGroupName();
  73.   return TCL_OK;
  74. }
  75. int
  76. PlvSynthesizeObjectCmd(ClientData clientData, Tcl_Interp *interp, 
  77.        int argc, char *argv[])
  78. {
  79.   if (argc < 2) {
  80.     interp->result = "Bad arguments to PlvSynthesizeObjectCmd";
  81.     return TCL_ERROR;
  82.   }
  83.   float size = atoi (argv[1]);
  84.   if (size <= 0) {
  85.     interp->result = "Bad size to PlvSynthesizeObjectCmd";
  86.     return TCL_ERROR;
  87.   }
  88.   RigidScan* scan = CreateScanFromThinAir (size);
  89.   DisplayableMesh* dm = theScene->addMeshSet (scan);
  90.   Tcl_SetResult(interp, (char*)dm->getName(), TCL_VOLATILE);
  91.   return TCL_OK;
  92. }
  93. int 
  94. PlvSaveCurrentGroup (ClientData clientData, Tcl_Interp *interp, 
  95.        int argc, char *argv[])
  96. {
  97.   if (argc < 3) {
  98.     interp->result = "Bad args to PlvSaveCurrentGroup";
  99.     return TCL_ERROR;
  100.   }
  101.   
  102.   // basename now contains name of the group
  103.   DisplayableMesh* meshDisp = FindMeshDisplayInfo (argv[1]); 
  104.   RigidScan *scan = meshDisp->getMeshData();
  105.   if (argc < 3) { // no name given
  106.     if (scan->write())
  107.       return TCL_OK;
  108.     
  109.   } else {
  110.     //printf ("Attempting named write(%s)n", argv[2]);
  111.     if (scan->write (argv[2]))
  112.       return TCL_OK;
  113.     interp->result = "Unable to write Group.";
  114.   }
  115.   return TCL_ERROR;
  116. }
  117. int
  118. PlvWriteScanCmd(ClientData clientData, Tcl_Interp *interp, 
  119.        int argc, char *argv[])
  120. {
  121.   if (argc < 2) {
  122.     interp->result = "Bad args to PlvWriteScanCmd";
  123.     return TCL_ERROR;
  124.   }
  125.   DisplayableMesh* meshDisp = FindMeshDisplayInfo (argv[1]);    
  126.   if (!meshDisp) {
  127.     interp->result = "Missing scan in PlvWriteScanCmd";
  128.     return TCL_ERROR;
  129.   }
  130.   RigidScan* meshSet = meshDisp->getMeshData();
  131.   if (argc < 3) { // no name given
  132.     //printf ("Attempting write()n");
  133.     if (meshSet->write())
  134.       return TCL_OK;
  135.     interp->result = "unnamed";
  136.   } else {
  137.     //printf ("Attempting named write(%s)n", argv[2]);
  138.     if (meshSet->write (argv[2]))
  139.       return TCL_OK;
  140.     interp->result = "Unable to write scan.";
  141.   }
  142.   return TCL_ERROR;
  143. #if 0
  144.   int numMeshNames = atoi(argv[2]);    
  145.   int useColorNotTexture = EQSTR(argv[argc-1], "-tex_as_color") ||
  146.     EQSTR(argv[argc-2], "-tex_as_color");
  147.   int writeNormals = EQSTR(argv[argc-1], "-norm") ||
  148.     EQSTR(argv[argc-2], "-norm");
  149.   int numMeshes = MIN(numMeshNames, meshSet->num_resolutions());
  150.   for (int i = 0; i < numMeshes; i++) {
  151.     meshSet->getMesh(i)->writePlyFile(argv[i+3], 
  152.       useColorNotTexture, 
  153.       writeNormals);
  154.   }
  155. #endif
  156. }
  157. int PlvWriteMetaDataCmd(ClientData clientData, Tcl_Interp *interp, 
  158. int argc, char *argv[])
  159. {
  160.   if (argc < 3) {
  161.     interp->result = "Bad args to PlvWriteMetaDataCmd";
  162.     return TCL_ERROR;
  163.   }
  164.   DisplayableMesh* meshDisp = FindMeshDisplayInfo (argv[1]);    
  165.   if (!meshDisp) {
  166.     interp->result = "Missing scan in PlvWriteMetaDataCmd";
  167.     return TCL_ERROR;
  168.   }
  169.   RigidScan::MetaData data;
  170.   if (!strcmp (argv[2], "xform")) {
  171.     data = RigidScan::md_xform;
  172.   } else {
  173.     interp->result = "Unrecognized metadata type";
  174.     return TCL_ERROR;
  175.   }
  176.   RigidScan* scan = meshDisp->getMeshData();
  177.   if (!scan->write_metadata (data)) {
  178.     interp->result = "Scan was unable to write metadata";
  179.     return TCL_ERROR;
  180.   }
  181.   return TCL_OK;
  182. }
  183. int PlvWriteResolutionMeshCmd(ClientData clientData, Tcl_Interp *interp, 
  184.       int argc, char *argv[])
  185. {
  186.   if (argc < 4) {
  187.     interp->result = "Bad args to PlvWriteResolutionMeshCmd";
  188.     return TCL_ERROR;
  189.   }
  190.   DisplayableMesh* meshDisp = FindMeshDisplayInfo (argv[1]);    
  191.   if (!meshDisp) {
  192.     interp->result = "Missing scan in PlvWriteResolutionMeshCmd";
  193.     return TCL_ERROR;
  194.   }
  195.   RigidScan* scan = meshDisp->getMeshData();
  196.   bool success = false;
  197.   if (argc > 4 && !strcmp (argv[4], "flatten")) {
  198.     success = scan->write_resolution_mesh (atoi (argv[2]), argv[3],
  199.    scan->getXform());
  200.   } else if (argc > 4 && !strncmp (argv[4], "matrix", 6)) {
  201.     Xform<float> mat;
  202.     if (!matrixFromString (argv[4] + 7, mat)) {
  203.       interp->result = "Bad matrix!";
  204.       return TCL_ERROR;
  205.     }
  206.     success = scan->write_resolution_mesh (atoi (argv[2]), argv[3], mat);
  207.   } else {
  208.     success = scan->write_resolution_mesh (atoi (argv[2]), argv[3]);
  209.   }
  210.   if (!success) {
  211.     interp->result = "Write failed";
  212.     return TCL_ERROR;
  213.   }
  214.   return TCL_OK;
  215. }
  216. int PlvIsScanModifiedCmd(ClientData clientData, Tcl_Interp *interp, 
  217.  int argc, char *argv[])
  218. {
  219.   if (argc != 2) {
  220.     interp->result = "Bad args to PlvIsScanModifiedCmd";
  221.     return TCL_ERROR;
  222.   }
  223.   DisplayableMesh* meshDisp = FindMeshDisplayInfo (argv[1]);    
  224.   if (!meshDisp) {
  225.     interp->result = "Missing scan in PlvIsScanModifiedCmd";
  226.     return TCL_ERROR;
  227.   }
  228.   RigidScan* scan = meshDisp->getMeshData();
  229.   interp->result = scan->is_modified() ? "1" : "0";
  230.   return TCL_OK;
  231. }
  232. int PlvGetScanFilenameCmd(ClientData clientData, Tcl_Interp *interp,
  233.   int argc, char* argv[])
  234. {
  235.   if (argc != 2) {
  236.     interp->result = "Bad args to PlvGetScanFilenameCmd";
  237.     return TCL_ERROR;
  238.   }
  239.   DisplayableMesh* meshDisp = FindMeshDisplayInfo (argv[1]);    
  240.   if (!meshDisp) {
  241.     interp->result = "Missing scan in PlvGetScanFilenameCmd";
  242.     return TCL_ERROR;
  243.   }
  244.   RigidScan* scan = meshDisp->getMeshData();
  245.   interp->result = (char*)scan->get_name().c_str();
  246.   return TCL_OK;
  247. }
  248. bool
  249. matrixFromString (char* str, Xform<float>& xf)
  250. {
  251.   float mat[16];
  252.   char* entry = str;
  253.   for (int i = 0; i < 16; i++) {
  254.     // seek to next digit
  255.     while (entry && *entry && !isdigit(*entry)
  256.    && *entry != '-' && *entry != '.')
  257.       ++entry;
  258.     if (!entry || !*entry) {
  259.       return false;
  260.     }
  261.     
  262.     // extract value
  263.     mat[i] = atof (entry);
  264.     // and skip past
  265.     entry = strchr (entry, ' ');
  266.   }
  267.   
  268.   xf = Xform<float> (mat);
  269.   return true;
  270. }