subroutine getdis include 'screen.inc' integer*2 mxdist parameter (mxdist=11) character*14 prdist(mxdist) integer*2 mxarea parameter (mxarea=mxdist+1) character*17 prarea(mxarea) character*11 label(2) integer*2 idist(2),odist(2),nrdist(mxdist),iarea,nrarea(mxarea), 1 lablen(2) real dsconv(mxdist,mxdist),arconv(mxdist,mxarea) character*80 outlin(2) logical yesno external yesno c mxdist - number of distance units stored in prdist c prdist - array to hold distance units names data idist/0,0/,odist/0,0/ data prdist/'kilometers','meters','centimeters','feet','yards', 1 'miles','nautical miles','rods','inches','other','other'/ data nrdist/10,6,11,4,5,5,14,4,6,5,5/ data prarea/'kilometers**2','meters**2','centimeters**2', 1 'feet**2','yards**2','miles**2','nautical miles**2','rods**2', 2 'inches**2','acres','hectares','other'/ data nrarea/13,9,14,7,8,8,17,7,9,5,8,5/ data label/'DISTANCE','LINE LENGTH'/ data lablen/8,11/ data outlin/' ',' '/ c c set up distance and line length unit conversion table c do 1 i=1,mxdist do 2 j=1,mxdist 2 dsconv(i,j)=0. 1 dsconv(i,i)=1. dsconv(1,2)=1000. dsconv(1,3)=100000. dsconv(1,4)=3280.8 dsconv(1,5)=1093.61 dsconv(1,6)=0.6214 dsconv(1,7)=0.5468 dsconv(1,8)=184.73 dsconv(1,9)=39370. do 3 i=3,9 3 dsconv(2,i)=dsconv(1,i)*0.001 do 4 i=4,9 4 dsconv(3,i)=dsconv(1,i)*0.00001 dsconv(4,5)=1./3. dsconv(4,6)=1./5280. dsconv(4,7)=1./6000. dsconv(4,8)=1./16.5 dsconv(4,9)=12. dsconv(5,6)=1./1760. dsconv(5,7)=1./2000. dsconv(5,8)=1./5.5 dsconv(5,9)=36. dsconv(6,7)=6000./5280. dsconv(6,8)=320. dsconv(6,9)=5280.*12. dsconv(7,8)=(6000./5280.)*320. dsconv(7,9)=6000.*12. dsconv(8,9)=5.5*36. c opposite side of diagonal is reciprical of upper part do 5 i=1,8 do 5 j=i+1,9 5 dsconv(j,i)=1./dsconv(i,j) c c set up distance to area conversion table c do 6 i=1,mxarea do 6 j=1,mxarea 6 arconv(i,j)=0. do 7 i=1,mxdist do 7 j=1,mxdist if (dsconv(i,j).gt.0.) arconv(i,j)=1./dsconv(i,j) 7 continue do 9 i=1,mxdist 9 arconv(i,i)=1. arconv(1,10)=0.1/sqrt(2.4710538) arconv(1,11)=0.1 arconv(4,10)=sqrt(43560.) arconv(4,11)=arconv(4,10)*2.4710538 do 8 j=10,11 arconv(2,j)=arconv(1,j)*1000. arconv(3,j)=arconv(1,j)*100000. arconv(5,j)=arconv(4,j)/3. arconv(6,j)=arconv(4,j)/5280. arconv(7,j)=arconv(4,j)/6000. arconv(8,j)=arconv(4,j)/16.5 8 arconv(9,j)=arconv(4,j)*12. c c select input and output distance units (itime=1) c or line length units (itime=2) c 10 irow=1 icol=1 call cls do 40 itime=1,2 if (itime.eq.1) then line= 1 'Select one of the following units for distances to objects.' else line='Select one of the following units for line length.' endif irow=irow+2 call scrlin line='Use the up and down arrows to position cursor, and' irow=irow+1 call scrlin line='select correct unit with carriage return.' irow=irow+1 call scrlin irow=irow+1 icol=15 c generate list of units do 14 i=1,mxdist call putcur(irow+i-1,icol,ivpage,ierror) 14 call wchars(ivpage,'- '//prdist(i),16,icolor,ibckgd,0,ierror) 15 icode=1 irowt=irow+mxdist/2+1 icol=45 call putcur(irowt,icol,ivpage,ierror) line='Select current units' call wchars(ivpage,line,20,icolor,ibckgd,1,ierror) icol=15 call putcur(irow,icol,ivpage,ierror) 16 call inkey(line,keycde,nchar) if (keycde.eq.0) then continue c up arrow else if (keycde.eq.72) then call getcur(ivpage,irowt,icol,ierror) irowt=irowt-1 if (irowt.lt.irow) irowt=irow+mxdist-1 call putcur(irowt,icol,ivpage,ierror) c down arrow else if (keycde.eq.80) then call getcur(ivpage,irowt,icol,ierror) irowt=irowt+1 if (irowt.gt.irow+mxdist-1) irowt=irow call putcur(irowt,icol,ivpage,ierror) c carriage return, meaning this distance is selected. else if (keycde.eq.28) then call getcur(ivpage,irowt,icol,ierror) i=irowt-irow+1 if (prdist(i).eq.'other') then call putcur(irowt,30,ivpage,ierror) line='What are the units? ' call wchars(ivpage,line,20,icolor,ibckgd,0,ierror) call getbuf(prdist(i),nchar,14,iatt) nrdist(i)=index(prdist(i),' ')-1 if (nrdist(i).le.0) nrdist(i)=14 call putcur(irowt,17,ivpage,ierror) call wchars(ivpage,prdist(i),14,icolor,ibckgd,0,ierror) call putcur(irowt,30,ivpage,ierror) line=' ' call wchars(ivpage,line,50,icolor,ibckgd,0,ierror) endif if (icode.eq.1) then if (idist(itime).ne.0) then call putcur(irow+idist(itime)-1,8,ivpage,ierror) line=' ' nchar=6 call wchars(ivpage,line,nchar,icolor,ibckgd,0,ierror) endif idist(itime)=i line='input' line(6:6)=char(26) nchar=6 call putcur(irowt,8,ivpage,ierror) call wchars(ivpage,line,nchar,icolor,ibckgd,1,ierror) go to 17 else if (odist(itime).ne.0) then call putcur(irow+odist(itime)-1,18+nrdist(odist(itime)), 1 ivpage,ierror) line=' ' nchar=14 call wchars(ivpage,line,nchar,icolor,ibckgd,0,ierror) endif odist(itime)=i line=' converted to' line(1:1)=char(27) nchar=13 call putcur(irowt,18+nrdist(odist(itime)),ivpage,ierror) call wchars(ivpage,line,nchar,icolor,ibckgd,1,ierror) go to 18 endif endif go to 16 17 continue icol=1 call putcur(irow+mxdist,icol,ivpage,ierror) line='Now select units to convert to from above list.' nchar=47 call wchars(ivpage,line,nchar,icolor,ibckgd,0,ierror) icode=2 irowt=irow+mxdist/2+1 icol=45 call putcur(irowt,icol,ivpage,ierror) line='Select units to convert to' call wchars(ivpage,line,26,icolor,ibckgd,1,ierror) icol=15 call putcur(irow,icol,ivpage,ierror) go to 16 18 continue irowt=irow+mxdist/2+1 icol=45 call putcur(irowt,icol,ivpage,ierror) call scroll(1,0,irowt,45,irowt,80,7,ierror) jrow=irow icol=1 irow=jrow+mxdist+1 if (itime.eq.1) then line='You have specified input data are '//prdist(idist(itime)) else line='You have specified line lengths are ' 1 //prdist(idist(itime)) endif call scrlin irow=irow+1 line='and to convert to '//prdist(odist(itime)) call scrlin irow=irow+1 line='Is this correct?' if (.not. yesno(0)) then irow=jrow go to 15 endif irow=jrow c get conversion for units not in conversion table if (dsconv(idist(itime),odist(itime)).eq.0.) then call scroll(0,0,irow+mxdist+3,1,irow+mxdist+5,80,7,ierror) irowt=irow+mxdist+4 icol=15 call putcur(irowt,icol,ivpage,ierror) line='What is the conversion factor to use? ' call wchars(ivpage,line,38,icolor,ibckgd,0,ierror) call getbuf(line,nchar,14,iatt) read(line,'(f14.0)') dsconv(idist(itime),odist(itime)) dsconv(odist(itime),idist(itime))=1. 1 /dsconv(idist(itime),odist(itime)) endif write(unit=outlin(itime),fmt='(a1,a,a,a,a,a1,a,a1,a1,1x,g14.8)') 1 '*',label(itime)(1:lablen(itime)),' is in ', 2 prdist(idist(itime))(1:nrdist(idist(itime))), 3 ' converted to ','.', 4 prdist(odist(itime))(1:nrdist(odist(itime))),'.','*', 5 dsconv(idist(itime),odist(itime)) irow=irow-3 icol=1 call scroll(1,0,irow,1,25,80,7,ierror) call putcur(irow,icol,ivpage,ierror) write(line,fmt='(a,a,a,a,a)') 1 label(itime)(1:lablen(itime)),' is in ', 2 prdist(idist(itime))(1:nrdist(idist(itime))),' converted to ', 3 prdist(odist(itime))(1:nrdist(odist(itime))) call wchars(ivpage,line,70,icolor,ibckgd,0,ierror) irow=irow+1 write(line,fmt='(a,g14.8)') 'with the conversion factor ', 1 dsconv(idist(itime),odist(itime)) call putcur(irow,icol,ivpage,ierror) call wchars(ivpage,line,70,icolor,ibckgd,0,ierror) 40 continue irow=irow+3 call putcur(irow,1,ivpage,ierror) call wchars(ivpage,'Now select units for area:',26, 1 icolor,ibckgd,0,ierror) irow=irow+1 icol=15 do 50 i=1,mxarea irowt=irow+i call putcur(irowt,icol,ivpage,ierror) call wchars(ivpage,'- '//prarea(i)(1:nrarea(i)),nrarea(i)+2, 1 icolor,ibckgd,0,ierror) 50 continue irow=irow+1 call putcur(irow,icol,ivpage,ierror) 60 call inkey(line,keycde,nchar) if (keycde.eq.0) then continue c up arrow else if (keycde.eq.72) then call getcur(ivpage,irowt,icol,ierror) irowt=irowt-1 if (irowt.lt.irow) irowt=irow+mxarea-1 call putcur(irowt,icol,ivpage,ierror) c down arrow else if (keycde.eq.80) then call getcur(ivpage,irowt,icol,ierror) irowt=irowt+1 if (irowt.gt.irow+mxarea-1) irowt=irow call putcur(irowt,icol,ivpage,ierror) c carriage return, meaning this area is selected. else if (keycde.eq.28) then call getcur(ivpage,irowt,icol,ierror) iarea=irowt-irow+1 if (prarea(iarea).eq.'other') then call putcur(irowt,35,ivpage,ierror) line='What are the units? ' call wchars(ivpage,line,20,icolor,ibckgd,0,ierror) call getbuf(prarea(iarea),nchar,14,iatt) nrarea(iarea)=index(prarea(iarea),' ')-1 if (nrarea(iarea).le.0) nrarea(iarea)=14 call putcur(irowt,17,ivpage,ierror) call wchars(ivpage,prarea(iarea),17,icolor,ibckgd,0,ierror) call putcur(irowt,30,ivpage,ierror) line=' ' call wchars(ivpage,line,50,icolor,ibckgd,0,ierror) endif go to 70 endif go to 60 c get conversion for units not in conversion table 70 if (arconv(odist(1),iarea).eq.0. .or. 1 arconv(odist(2),iarea).eq.0.) then call scroll(0,0,irow+mxarea+3,1,irow+mxarea+5,80,7,ierror) irowt=24 icol=15 call putcur(irowt,icol,ivpage,ierror) line='What is the conversion factor to use? ' call wchars(ivpage,line,38,icolor,ibckgd,0,ierror) call getbuf(line,nchar,14,iatt) read(line,'(f14.0)') areacv else areacv=arconv(odist(1),iarea)*arconv(odist(2),iarea) endif irow=irow-3 icol=1 call scroll(1,0,irow,1,25,80,7,ierror) line='Area converted to '//prarea(iarea)(1:nrarea(iarea)) call scrlin irow=irow+1 write(line,fmt='(a,g14.8)') 'with the conversion factor ',areacv call scrlin irow=irow+2 line='Are these units OK, and ready to proceed?' if (.not. yesno(0)) go to 10 do 80 itime=1,2 80 write(unit=iout,fmt='(a)') outlin(itime) write(unit=iout,fmt='(a1,a,a1,a,a1,a1,1x,g14.8)') 1 '*','AREA converted to ','.', 2 prarea(iarea)(1:nrarea(iarea)),'.','*',areacv c save units in common for use in getting numeric values disunt=prdist(idist(1)) ndisut=nrdist(idist(1)) linunt=prdist(idist(2)) nlinut=nrdist(idist(2)) araunt=prarea(iarea) naraut=nrarea(iarea) return end