fileio.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:7k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* ==========================================================================
  2.                                FILEIO_C
  3. =============================================================================
  4.     FUNCTION NAMES
  5.     read_polygon_indices        -- reads the polygon indices file.
  6.     read_polygon_line -- read the face polyline.
  7.     read_muscles -- reads the face muscles. 
  8.     read_expression_vectors  -- reads a vector of expressions.
  9.     add_muscle_to_face  -- add a muscle to the face.
  10.     C SPECIFICATIONS
  11.     read_polygon_indices ( FileName, face ) 
  12.     read_polygon_line ( FileName, face )
  13.     read_muscles ( FileName, face )
  14.     read_expression_vectors ( FileName, face )
  15.     add_muscle_to_face ( m, face )
  16.     DESCRIPTION
  17. This module is responsible for reading the face data files.  
  18. This module comes as is with no warranties. 
  19.     SIDE EFFECTS
  20. Unknown.
  21.    
  22.     HISTORY
  23. Created 16-Dec-94  Keith Waters at DEC's Cambridge Research Lab.
  24. Modified 22-Nov-96 Sing Bing Kang (sbk@crl.dec.com)
  25.    modified function read_expression_vectors() to allocate
  26.    memory to face->expression (done once)
  27. ============================================================================ */
  28. #include <math.h> /* C header for any math functions      */
  29. #include <stdio.h> /* C header for standard I/O                 */
  30. #include <string.h> /* For String compare       */
  31. #include <stdlib.h>
  32. #ifndef _WIN32
  33. #include <sys/types.h>
  34. #include <sys/file.h>
  35. #endif
  36. /* 
  37.  * from /usr/include/sys/types.h
  38.  * Just in case TRUE and FALSE are not defined
  39.  */
  40. #ifndef TRUE
  41. #define TRUE    1
  42. #endif
  43. #ifndef FALSE
  44. #define FALSE   0
  45. #endif
  46. #include "head.h" /* local header for the face data structure  */
  47. #include "memory.h"
  48. void add_muscle_to_face ( MUSCLE  *m , HEAD    *face );
  49. /* ========================================================================= */  
  50. /* read_polygon_indices                                                      */
  51. /* ========================================================================= */  
  52. /*
  53. **   Read in the face data file (x,y,z)
  54. **
  55. */
  56. void
  57. read_polygon_indices ( char *FileName, HEAD *face )
  58.  { 
  59.    FILE *InFile ;
  60.    int i, ii ;
  61.    /* 
  62.     * Check the FileName.
  63.     */
  64.    if (( InFile = fopen ( FileName, "r" )) == 0 ) {
  65.      fprintf ( stderr, "can't open input file: %sn", FileName ) ;
  66.      exit(-1) ;
  67.    }
  68.      
  69.    fscanf ( InFile,"%d", &face->npindices ) ;
  70.    /* 
  71.     * Allocate some memory.
  72.     */
  73.    face->indexlist = ( int * ) malloc ( face->npindices*4 * sizeof ( int )) ; 
  74.    for( i=0, ii=0; i<face->npindices; i++, ii+=4 )
  75.      fscanf(InFile,"%d%d%d%d", 
  76.     &face->indexlist[ii],   &face->indexlist[ii+1], 
  77.     &face->indexlist[ii+2], &face->indexlist[ii+3] ) ;
  78.         
  79.    fclose( InFile ) ;
  80.    
  81.  }
  82. /* ========================================================================= */  
  83. /* read_polygon_line                                                         */
  84. /* ========================================================================= */  
  85. /*
  86. **   Read in the face data file (x,y,z)
  87. **
  88. */
  89. void
  90. read_polygon_line ( char *FileName, HEAD *face )
  91. {
  92.   FILE *InFile ;
  93.   int i, ii ;
  94.    /* 
  95.     * Check the FileName.
  96.     */
  97.    if (( InFile = fopen ( FileName, "r" )) == 0 ) {
  98.      fprintf ( stderr, "can't open input file: %sn", FileName ) ;
  99.      exit(-1) ;
  100.    }
  101.   fscanf ( InFile, "%d", &face->npolylinenodes ) ;
  102.   /*
  103.    * Allocate some memory.
  104.    */
  105.   face->polyline = ( float * ) malloc ( face->npolylinenodes*3 * sizeof ( float )) ; 
  106.   for ( i=0, ii=0; i<face->npolylinenodes; i++, ii+=3 ) {
  107.     
  108.     fscanf ( InFile,"%f%f%f",
  109.     &face->polyline[ii], 
  110.     &face->polyline[ii+1], 
  111.     &face->polyline[ii+2] ) ;
  112.   }
  113.   
  114.   fclose ( InFile ) ;
  115. }
  116. /* =============================================================
  117.    read_muscles ( FileName, face )
  118.    ========================================================== */
  119. /*
  120. ** This function reads in the muscles.
  121. **
  122. */
  123. void
  124. read_muscles ( char *FileName, HEAD *face )
  125. {
  126.   FILE *Infile;
  127.   int i, nm ;
  128.   MUSCLE *m ;
  129.   /* 
  130.    * Open the file to be read.
  131.   */
  132.   if((Infile = fopen(FileName,"r")) == 0) {
  133.       fprintf(stderr,"Opening error on file:%10sn", FileName) ;
  134.       exit(0);
  135.     }
  136.   fscanf ( Infile, "%d", &nm ) ;
  137.   for ( i=0; i < nm; i++ ) {
  138.       m = _new ( MUSCLE ) ;
  139.       fscanf (Infile, "%s %f %f %f %f %f %f %f %f %f %f",
  140.       &(*m->name),
  141.       &m->head[0], &m->head[1], &m->head[2],
  142.       &m->tail[0], &m->tail[1], &m->tail[2],
  143.       &m->fs, &m->fe, &m->zone, &m->clampv ) ;
  144.       m->active = FALSE ;
  145.       m->mstat  = 0.0 ;
  146.       
  147.       if (verbose) {
  148.       fprintf(stderr,"%s: %dn========================nhx: %2.2f hy: %2.2f hz: %2.2fntx: %2.2f ty: %2.2f tz: %2.2fn fall start: %2.2fn fall end: %2.2fn zone: %2.2fn clampv: %2.2f mstat: %2.2fnn",
  149.      m->name, i, 
  150.      m->head[0], 
  151.      m->head[1], 
  152.      m->head[2],
  153.      m->tail[0], 
  154.      m->tail[1],
  155.      m->tail[2],
  156.      m->fs,
  157.      m->fe,
  158.      m->zone,
  159.      m->clampv,
  160.      m->mstat ) ;
  161.       }
  162.       add_muscle_to_face ( m, face ) ;
  163.     }
  164.   fclose(Infile) ;
  165. }
  166. /* ========================================================================= */  
  167. /* read_expression_vectors                                                   */
  168. /* ========================================================================= */  
  169. /* sbk - added allocated var - 11/22/96 */
  170. /*
  171. **   Read in the expression vectors.
  172. */
  173. void
  174. read_expression_vectors ( char *FileName, HEAD *face )
  175. {
  176.   FILE *InFile ;
  177.   int i, k ;
  178.   EXPRESSION *e ;
  179.   static int allocated = 0;
  180.    /* 
  181.     * Check the FileName.
  182.     */
  183.    if (( InFile = fopen ( FileName, "r" )) == 0 ) {
  184. #if 0  /* Silently ignore the lack of expression vectors.  I never got the file. -mjk */
  185.      fprintf ( stderr, "can't open input file: %sn", FileName ) ;
  186. #endif
  187.      face->expression = NULL;
  188.      return;
  189.    }
  190.   fscanf ( InFile, "%d", &face->nexpressions ) ;
  191.   fprintf( stderr, "Number of expressions = %dn", face->nexpressions ) ;
  192.   /*
  193.    * Allocate some memory.
  194.    */
  195.   if (!allocated)
  196.     face->expression = (EXPRESSION  **)malloc( face->nexpressions*
  197.        sizeof(EXPRESSION  *) );
  198.   
  199.   for ( i=0; i<face->nexpressions; i++) {
  200.     if (allocated)
  201.       e = face->expression[i];
  202.     else
  203.       e = face->expression[i] = _new(EXPRESSION) ;
  204.     fscanf ( InFile, "%sn", &(*e->name) ) ;
  205.     
  206.     fprintf ( stderr, "%sn", e->name ) ;
  207.     
  208.     for ( k=0; k < 17; k++) {
  209.       
  210.       fscanf ( InFile,(k==16) ? "%fn" : "%f ",   &e->m[k]) ;
  211.       fprintf (stderr,"%2.2f ", e->m[k] ) ;
  212.     }
  213.     fprintf (stderr, "n") ;
  214.   }
  215.   
  216.   fclose ( InFile ) ;
  217.   allocated = 1;
  218. }
  219. /* =============================================================== 
  220.    add_muscle_to_face ( m, face )
  221.    =============================================================== */
  222. /*
  223. **   adds a muscle to the face muscle list.
  224. **
  225. */
  226. void
  227. add_muscle_to_face ( MUSCLE  *m , HEAD    *face )
  228. {
  229.   int nn ;
  230.   if(face->nmuscles == 0)
  231.       face->muscle = _new_array(MUSCLE *, 50) ;
  232.   else if(face->nmuscles % 50 == 0)
  233.       face->muscle = _resize_array(face->muscle,MUSCLE *,face->nmuscles+50) ;
  234.   nn = face->nmuscles ;
  235.   face->muscle[nn] = m ;
  236.   face->nmuscles++ ;
  237. }