home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / GRAPHICS / PLOT / SURFUTI3.ZIP / PREREAD.INC < prev    next >
Encoding:
Text File  |  1991-09-29  |  10.4 KB  |  298 lines

  1. procedure OPENFILE (Filename: text80; var Infile: text);
  2. { Open a file with error checking. Prompt for new one if file not found }
  3.  
  4. var Flnm: string[80];
  5.     Fileread: boolean;
  6.  
  7. begin
  8.   Flnm := Filename;
  9.   Fileread := FALSE;
  10.   while (NOT Fileread) do begin
  11.     assign (Infile, Flnm);
  12.     {$I-}
  13.     reset (Infile);
  14.     {$I+}
  15.     if (ioresult <> 0) then begin
  16.       writeln ('Error: file ',Flnm,' does not exist.');
  17.       write ('Enter new file name (or <enter> to exit): ');
  18.       readln (Flnm);
  19.       if (Flnm = '') then
  20.         halt;
  21.     end else
  22.       Fileread := TRUE;
  23.   end;
  24. end;   { procedure Openfile }
  25.  
  26. procedure READFILE (Filename: text80);
  27. { procedure will read the input data from the file passed }
  28.  
  29. var
  30.   Version: integer;       { used for multiple version input flag(only 3 now) }
  31.   j: integer;             { counter for looping and reading into arrays}
  32.   RInfile: text;          { file to read}
  33.   Realvar: vartype;       { temporary array for storage of line input }
  34.   Num: integer;           { number of inputted values on the line }
  35.   Comment: text80;        { comment at end of line }
  36.   Line_num: integer;      { line number in input file }
  37.   Nvread: integer;        { #vertices read so far in this surface }
  38.   Vert: integer;          { vertex # }
  39.   Cmmd: integer;          { script command number }
  40.   Mat: integer;           { material # }
  41.   Node: integer;          { node # }
  42.   Surf: integer;          { surface # }
  43.   Nvert: integer;         { # vertices in surface }
  44.   Flpurpose: string[127]; { title for plot }
  45.   RNnodes: integer;       { READFILE temp for Nnodes }
  46.   RNsurf: integer;        { READFILE temp for Nsurf }
  47.   RMaxvert: integer;      { READFILE temp for Maxvert }
  48.   RNmatl: integer;        { READFILE temp for Nmatl }
  49.   RNscript: integer;      { READFILE temp for Nscript }
  50.   RNsides: integer;       { READFILE temp for Nsides }
  51.   Oldnmatl: integer;      { previous Nmatl }
  52.   Oldnnodes: integer;     { previous Nnodes }
  53.   Mat1, Mat2: integer;    { range of matl numbers in this file }
  54.  
  55. begin {procedure READFILE}
  56. {$ifdef BIGMEM}
  57. with ptra^ do with ptrb^ do with ptrc^ do
  58. begin
  59. {$endif}
  60.  
  61.   openfile (Filename, RInfile);
  62.  
  63.   writeln ('Reading data from file ',Filename);
  64.  
  65.   readln (RInfile, Flpurpose);
  66.   Line_num := 2;
  67.   Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  68.   if (Num <> 1) then begin
  69.     writeln ('Bad input: Reading version number.');
  70.     close (RInfile);
  71.     close (Infile);
  72.     halt;
  73.   end;
  74.   Version := round(Realvar[1]);
  75.   if (Version = 1) then begin
  76.     Line_num := Line_num + 1;
  77.     Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  78.     if (Num <> 4) then begin
  79.       writeln ('Bad input: Reading #nodes, #surfaces, Maxvert and #materials',
  80.           ' (line ',Line_num,')');
  81.       close (RInfile);
  82.       close (Infile);
  83.       halt;
  84.     end;
  85.     RNnodes := round(Realvar[1]);
  86.     RNsurf := round(Realvar[2]);
  87.     RMaxvert := round(Realvar[3]);
  88.     RNmatl := round(Realvar[4]);
  89.     RNscript := 0;
  90.     RNsides := 1;
  91.   end else if (Version = 2) then begin
  92.     Line_num := Line_num + 1;
  93.     Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  94.     if (Num <> 6) then begin
  95.       writeln ('Bad input: Reading #matl, #nodes, #surf, #script, Maxvert,',
  96.           ' #sides (line ',Line_num,')');
  97.       close (RInfile);
  98.       close (Infile);
  99.       halt;
  100.     end;
  101.     RNmatl := round(Realvar[1]);
  102.     RNnodes := round(Realvar[2]);
  103.     RNsurf := round(Realvar[3]);
  104.     RNscript := round(Realvar[4]);
  105.     RMaxvert := round(Realvar[5]);
  106.     RNsides := round(Realvar[6]);
  107.   end else if (Version = 3) or (Version = 4) then begin
  108.     Line_num := Line_num + 1;
  109.     Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  110.     if (Num <> 5) then begin
  111.       writeln ('Bad input: Reading #matl, #nodes, #surf, Maxvert,',
  112.           ' #sides (line ',Line_num,')');
  113.       close (RInfile);
  114.       close (Infile);
  115.       halt;
  116.     end;
  117.     RNmatl := round(Realvar[1]);
  118.     RNnodes := round(Realvar[2]);
  119.     RNsurf := round(Realvar[3]);
  120.     RMaxvert := round(Realvar[4]);
  121.     RNsides := round(Realvar[5]);
  122.   end else begin
  123.     writeln('Wrong data input version number specified');
  124.     close (RInfile);
  125.     close (Infile);
  126.     halt;
  127.   end;
  128.  
  129.   if (RMaxvert > Maxvert) then begin
  130.     writeln ('Error in file ',Filename,': Maxvert (',RMaxvert,
  131.          ') exceeds previous Maxvert (',Maxvert,')');
  132.     close (RInfile);
  133.     close (Infile);
  134.     halt;
  135.   end;
  136.  
  137.   Oldnmatl := Nmatl;
  138.   if (Matl_reuse) then begin
  139.     { Re-use material numbers across data files }
  140.     if (RNmatl > Nmatl) then
  141.       Nmatl := RNmatl;
  142.     Mat1 := 1;
  143.     Mat2 := RNmatl;
  144.   end else begin
  145.     { Generate unique material numbers for each data file }
  146.     Mat1 := Nmatl + 1;
  147.     Mat2 := Nmatl + RNmatl;
  148.     Nmatl := Mat2;
  149.   end;
  150.     
  151.     if (RNnodes+Nnodes<=MAXNODES) and (RNsurf+Nsurf<=Realmaxsurf) and
  152.        (Nmatl<=MAXMATL) and (Maxvert*(RNsurf+Nsurf)<=MAXCONNECT) and
  153.        (RNsides<=2) and (RNnodes>0) and (RNsurf>0) and (RNmatl>0) then begin
  154.  
  155.       for Mat := Mat1 to Mat2 do begin
  156.         Line_num := Line_num + 1;
  157.         Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  158.         if (Version <= 2) then begin
  159.           if (Num <> 3) then begin
  160.             writeln ('Bad input: Reading data for material #',Mat,' (line ',
  161.                 Line_num,')');
  162.             close (RInfile);
  163.             close (Infile);
  164.             halt;
  165.           end;
  166.           R1[Mat] := Realvar[1];
  167.           R2[Mat] := Realvar[2];
  168.           R3[Mat] := 0.0;
  169.           Color[Mat] := round(Realvar[3]);
  170.           Ambient[Mat] := 0.1;
  171.         end else if (Version = 3) then begin
  172.           if (Num <> 4) then begin
  173.             writeln ('Bad input: Reading data for material #',Mat,' (line ',
  174.                 Line_num,')');
  175.             close (RInfile);
  176.             close (Infile);
  177.             halt;
  178.           end;
  179.           R1[Mat] := Realvar[1];
  180.           R2[Mat] := Realvar[2];
  181.           R3[Mat] := Realvar[3];
  182.           Color[Mat] := round(Realvar[4]);
  183.           Ambient[Mat] := 0.1;
  184.         end else begin
  185.           if (Num <> 5) then begin
  186.             writeln ('Bad input: Reading data for material #',Mat,' (line ',
  187.                 Line_num,')');
  188.             close (RInfile);
  189.             close (Infile);
  190.             halt;
  191.           end;
  192.           R1[Mat] := Realvar[1];
  193.           R2[Mat] := Realvar[2];
  194.           R3[Mat] := Realvar[3];
  195.           Color[Mat] := round(Realvar[4]);
  196.           Ambient[Mat] := Realvar[5];
  197.         end; { if Version }
  198.       end;  {for Mat}
  199.  
  200.       Oldnnodes := Nnodes;
  201.       for Node := Nnodes+1 to RNnodes+Nnodes do begin
  202.         Line_num := Line_num + 1;
  203.         Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  204.         if (Num <> 3) then begin
  205.           writeln ('Bad input: Reading data for node #',Node,' (line ',
  206.               Line_num,')');
  207.           close (RInfile);
  208.           close (Infile);
  209.           halt;
  210.         end;
  211.         World[Node][1] := Realvar[1];
  212.         World[Node][2] := Realvar[2];
  213.         World[Node][3] := Realvar[3];
  214.       end; {for Node}
  215.       Nnodes := Nnodes + RNnodes;
  216.  
  217.       for Surf := Nsurf+1 to RNsurf+Nsurf do begin
  218.         Line_num := Line_num + 1;
  219.         Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  220.         if (Num < 5) then begin
  221.           writeln ('Bad input: Reading data for surface #',Surf,' (line ',
  222.               Line_num,')');
  223.           if (Num > 2) then
  224.             writeln ('Must have at least 3 nodes on a surface!');
  225.           close (RInfile);
  226.           close (Infile);
  227.           halt;
  228.         end;
  229.         Nvert := round(Realvar[1]);
  230. { Offset the material number to match the material data that was read in }
  231.         Matl[Surf] := round(Realvar[2]) + Mat1 - 1;
  232.         if (Nvert<3) or (Nvert>Maxvert) or (Nvert<Num-2)
  233.             then begin
  234.           writeln ('Error in surface ',Surf,'(line ',Line_num,'): ');
  235.           if (Nvert < 3) then
  236.             writeln ('Must have at least 3 nodes per surface')
  237.           else if (Nvert > Maxvert) then
  238.             writeln ('#vertices exceeds Maxvert')
  239.           else
  240.             writeln ('#vertices specified does not match #arguments');
  241.           close (RInfile);
  242.           close (Infile);
  243.           halt;
  244.         end; { if Nvert... }
  245.         Nvread := Num - 2;
  246.         for Vert := 1 to Nvread do
  247. { Offset the node number to match the node data that was read in }
  248.           Connect[(Surf-1)*Maxvert+Vert] := round(Realvar[Vert+2]) + Oldnnodes;
  249.         while (Nvread < Nvert) do begin
  250.           Line_num := Line_num + 1;
  251.           Num := inreal (RInfile, Realvar, Comment, Line_num, FALSE);
  252.           if (Num < 1) or (Nvread + Num > Nvert) then begin
  253.             writeln ('Error in surface ',Surf,'(line ',Line_num,'): ');
  254.             if (Num = 0) then
  255.               writeln ('No data read.')
  256.             else if (Nvread + Num > Nvert) then
  257.               writeln ('Too many vertices read.');
  258.             close (RInfile);
  259.             close (Infile);
  260.             halt;
  261.           end; { if Num... }
  262.           Vert := Nvread + 1;
  263.           for j := 1 to Num do begin
  264.             Connect[(Surf-1)*Maxvert+Vert] := round(Realvar[j]) + Oldnnodes;
  265.             Vert := Vert + 1;
  266.           end;
  267.           Nvread := Nvread + Num;
  268.         end; { while }
  269.         if (Nvert < Maxvert) then
  270.           Connect[(Surf-1)*Maxvert+Nvert+1] := 0;
  271.       end; { for Surf }
  272.       Nsurf := Nsurf + RNsurf;
  273.     end else begin
  274.       writeln ('Error in read file ',Filename);
  275.       if (RNnodes+Nnodes>MAXNODES) or (RNnodes<1) then
  276.         writeln('Nnodes (',RNnodes,') must be between 1 and ',MAXNODES-Nnodes);
  277.       if (RNsurf+Nsurf>Realmaxsurf) or (RNsurf<1) then
  278.         writeln('Nsurf (',RNsurf,') must be between 1 and ',Realmaxsurf-Nsurf);
  279.       if (Nmatl>MAXMATL) or (RNmatl<1) then
  280.         writeln('Nmatl (',RNmatl,') must be between 1 and ',MAXMATL);
  281.       if Maxvert*(RNsurf+Nsurf)>MAXCONNECT then begin
  282.         writeln('Number of surfaces or max number of vertices too large!');
  283.         writeln('Maxvert (',Maxvert,') * Nsurf (',RNsurf,
  284.             ') must be smaller than ',MAXCONNECT-Maxvert*Nsurf);
  285.       end;
  286.       if (RNsides<1) or (RNsides>2) then
  287.         writeln('Nsides (',RNsides,') must be either 1 or 2');
  288.       close (RInfile);
  289.       close (Infile);
  290.       halt;
  291.     end; { if RNnodes... }
  292.  
  293.     close (RInfile);
  294. {$ifdef BIGMEM}
  295. end; {with}
  296. {$endif}
  297. end; { procedure READFILE }
  298.