C
C Program PTSWRL to convert points into Virtual Reality Modeling
C Language
C
C Version: 5.30
C Date: 1999, June 10
C
C Coded by: Vaclav Bucha
C Department of Geophysics, Charles University Prague,
C Ke Karlovu 3, 121 16 Praha 2, Czech Republic,
C E-mail: bucha@seis.karlov.mff.cuni.cz
C
C References:
C
C VRML (Virtual Reality Modeling Language) version 1.0C
C
C VRML97 (Virtual Reality Modeling Language ISO/IEC 14772)
C
C.......................................................................
C
C
C Description of the data files:
C
C Input data read from the * external unit:
C The data are read in by the list directed input (free format)
C using a single READ statement.
C (1) 'SEP',/
C 'SEP'...String in apostrophes containing the name of the input
C SEP parameter file with the input data.
C Description of file SEP
C No default, obligatory parameter.
C
C
C Data file 'SEP' has the form of the SEP (Stanford Exploration Project)
C parameter file:
C All the data are specified in the form of PARAMETER=VALUE, e.g.
C N1=50, with PARAMETER directly preceding = without intervening
C spaces and with VALUE directly following = without intervening
C spaces. The PARAMETER=VALUE couple must be delimited by a space
C or comma from both sides.
C The PARAMETER string is not case-sensitive.
C PARAMETER= followed by a space resets the default parameter value.
C All other text in the input files is ignored. The file thus may
C contain unused data or comments without leading comment character.
C Everything between comment character # and the end of the
C respective line is ignored, too.
C The PARAMETER=VALUE couples may be specified in any order.
C The last appearance takes precedence.
C Data specifying input files:
C PTS='string'... Name of the file with the points.
C Description of file PTS
C Default: PTS='pts.out'
C COLORS='string'... Name of the file containing the data describing
C the colour map.
C Description of file COLORS
C Default: COLORS='hsv.dat'
C Input/output file:
C WRL='string'... Name of the file to be copied to the beginning
C of the output file. The default name of the output file
C is equal to WRL. If the filename is blank, output file
C starts from a scratch. It is recommended to specify WRL
C rather than to use the default name.
C Default: WRL='out.wrl'
C WRLOUT='string'... Name of the output file if different from WRL.
C Default: WRLOUT=WRL
C Data specifying the form of the output file:
C VRML='string'... Virtual reality scene description language.
C VRML='VRML1': VRML (Virtual Reality Modeling Language)
C version 1.0.
C VRML='VRML2': VRML97 according to ISO/IEC 14772 standard.
C Default: VRML='VRML2' (recommended)
C Optional data to shift the points:
C SHIFT1=real, SHIFT2=real, SHIFT3=real... All points will be shifted
C by vector (SHIFT1,SHIFT2,SHIFT3). The shift may be
C applied to the points situated at a surface to make them
C visible.
C SHIFT1=0., SHIFT2=0., SHIFT3=0.
C Data specifying the values to be scaled in colours:
C KOLPTS=integer... If zero, all points will have the same colour
C given by parameters R, G, B. If positive, the
C values in KOLPTS-th column of input file PTS will be
C colour coded at each point.
C Default: KOLPTS=0
C Data specifying the colour scale:
C VADD=real, VMUL=real, VPER=real, VREF=real, CREF=real, CREF1=real,
C CREF2=real, CREF3=real, etc... Refer to file
C colors.for.
C R=real, G=real, B=real... Float numbers between 0 and 1 specifying
C the colour of the points if KOLPTS=0.
C Defaults: R=1, G=1, B=1 (white)
C
C
C Input file PTS with the points:
C (1) None to several strings terminated by / (a slash)
C (2) For each point data:
C (2.1) 'NAME',X1,X2,X3,V1,...,VN,/
C 'NAME'... Name of the point. Not considered. May be blank.
C X1,X2,X3... Coordinates of the point
C V1,...,VN...Optional values which may be used to control the
C colour of the line.
C /... Values must be terminated by a slash.
C (3) / or end of file.
C
C=======================================================================
C
C Common block /RAMC/:
INCLUDE 'ram.inc'
C ram.inc
C
INTEGER IRAM(MRAM)
EQUIVALENCE (IRAM,RAM)
C
C.......................................................................
C
C External functions and subroutines:
EXTERNAL LENGTH,RSEP1,RSEP3T,RSEP3I,ERROR,FORM2,COLOR1,COLOR2
INTEGER LENGTH
C
C Filenames and parameters:
CHARACTER*80 FSEP,FPTS,FCOLS,FIN,FOUT
INTEGER LU1,LU2,IUNDEF
REAL UNDEF
PARAMETER (LU1=1,LU2=2,IUNDEF=-999999,UNDEF=-999999.)
C
C Other variables:
CHARACTER*46 FORMAT
CHARACTER*5 VRML
CHARACTER*255 TEXT
INTEGER KOLPTS,KQ,NQ
INTEGER MVRTX,NVRTX,I
REAL SHIFT1,SHIFT2,SHIFT3,RED,GREEN,BLUE
REAL OUTMIN(8),OUTMAX(8),R,G,B
C TEXT... Also used to copy lines from input WRL to output WRL file.
C
C.......................................................................
C
C Reading main input data:
WRITE(*,'(A)') '+PTSWRL: Enter input filename: '
FSEP=' '
READ (*,*) FSEP
IF(FSEP.EQ.' ') THEN
C PTSWRL-02
CALL ERROR('PTSWRL-02: No input file specified')
C Input file in the form of the SEP (Stanford Exploration Project)
C parameter or history file must be specified.
C There is no default filename.
END IF
WRITE(*,'(A)') '+PTSWRL: Working... '
C
C Reading input and output filenames:
CALL RSEP1(LU1,FSEP)
CALL RSEP3T('PTS' ,FPTS ,'pts.out')
CALL RSEP3T('COLORS',FCOLS,'hsv.dat')
CALL RSEP3T('WRL' ,FIN ,'out.wrl' )
CALL RSEP3T('WRLOUT',FOUT ,FIN )
CALL RSEP3T('VRML' ,VRML ,'VRML2' )
CALL LOWER(VRML)
C
C Beginning of the output file:
OPEN(LU2,FILE=FOUT)
CALL WRL1(LU1,LU2,FIN,FOUT,VRML)
C
C Determining the colour map:
CALL RSEP3I('KOLPTS',KOLPTS,0)
CALL RSEP3R('R' ,RED ,1.00)
CALL RSEP3R('G' ,GREEN ,1.00)
CALL RSEP3R('B' ,BLUE ,1.00)
MVRTX=MRAM/2
IF(KOLPTS.GT.0) THEN
CALL COLOR1(LU1,MRAM-MVRTX,IRAM(MVRTX+1),RAM(MVRTX+1),1,0.,0.)
IF (VRML.EQ.'pov') THEN
C ***
END IF
END IF
C
C Writing the prolog for the points:
IF (VRML.EQ.'vrml1') THEN
IF(KOLPTS.LE.0) THEN
WRITE(LU2,'(A)')
* 'DEF PointMaterial Material {'
WRITE(LU2,'(A,3(1X,F4.2))')
* ' emissiveColor',RED,GREEN,BLUE
WRITE(LU2,'(A)')
* '}'
* ,' '
END IF
ELSE IF (VRML.EQ.'vrml2') THEN
WRITE(LU2,'(A)')
* 'Shape {'
* ,' appearance DEF PointAppearance Appearance {'
* ,' material Material {'
IF(KOLPTS.LE.0) THEN
WRITE(LU2,'(A,3(1X,F4.2))')
* ' emissiveColor',RED,GREEN,BLUE
END IF
WRITE(LU2,'(A)')
* ' }'
* ,' }'
* ,'}'
* ,' '
C ELSE IF (VRML.EQ.'pov') THEN
C ***
ELSE
C PTSWRL-03
CALL ERROR('PTSWRL-03: No valid string in VRML')
C Valid string specifying the form of the output file is:
C VRML='VRML1' or 'VRML2'. Default and recommended
C value is 'VRML2'.
END IF
C
C Optional shift:
CALL RSEP3R('SHIFT1',SHIFT1,0.00)
CALL RSEP3R('SHIFT2',SHIFT2,0.00)
CALL RSEP3R('SHIFT3',SHIFT3,0.00)
C
C Reading points:
KQ=MAX0(3,KOLPTS)
C Values to be displayed will be shifted to the 4th column
IF(KOLPTS.EQ.0) THEN
NQ=3
ELSE
NQ=4
END IF
OPEN(LU1,FILE=FPTS,STATUS='OLD')
READ(LU1,*) (TEXT,I=1,20)
C Writing the point:
IF (VRML.EQ.'vrml1') THEN
WRITE(LU2,'(A)')
* 'Separator {'
IF(KOLPTS.GT.0) THEN
WRITE(LU2,'(A)')
* 'MaterialBinding { value PER_VERTEX }'
ELSE
WRITE(LU2,'(A)')
* 'MaterialBinding { value OVERALL }'
* ,'USE PointMaterial'
END IF
WRITE(LU2,'(A)')
* 'Coordinate3 { point ['
ELSE IF (VRML.EQ.'vrml2') THEN
WRITE(LU2,'(A)')
* 'Point {'
* ,'appearance USE PointAppearance'
* ,'point ['
END IF
C Loop over points:
NVRTX=0
C Reading the points
70 CONTINUE
IF(NVRTX+KQ.GT.MVRTX) THEN
C PTSWRL-01
CALL ERROR('PTSWRL-01: Too small array RAM')
END IF
IF(KOLPTS.GT.3) THEN
RAM(NVRTX+KOLPTS)=0.
END IF
TEXT='$'
READ(LU1,*,END=80) TEXT,(RAM(I),I=NVRTX+1,NVRTX+KQ)
IF(TEXT.EQ.'$') THEN
GO TO 80
END IF
C Relocating the values to be displayed to the 4th column
IF(KOLPTS.GT.0) THEN
RAM(NVRTX+4)=RAM(NVRTX+KOLPTS)
END IF
C Shifting the point
RAM(NVRTX+1)=RAM(NVRTX+1)+SHIFT1
RAM(NVRTX+2)=RAM(NVRTX+2)+SHIFT2
RAM(NVRTX+3)=RAM(NVRTX+3)+SHIFT3
IF(NVRTX.EQ.0) THEN
DO 11 I=1,NQ
OUTMIN(I)=RAM(NVRTX+I)
OUTMAX(I)=RAM(NVRTX+I)
11 CONTINUE
ELSE
DO 12 I=1,NQ
OUTMIN(I)=AMIN1(OUTMIN(I),RAM(NVRTX+I))
OUTMAX(I)=AMAX1(OUTMAX(I),RAM(NVRTX+I))
12 CONTINUE
END IF
NVRTX=NVRTX+NQ
GO TO 70
80 CONTINUE
C
C Writing the points:
IF (VRML.EQ.'vrml1'.OR.VRML.EQ.'vrml2') THEN
FORMAT='('
CALL FORM2(3,OUTMIN(1),OUTMAX(1),FORMAT(2:25))
DO 81 I=1,NVRTX,NQ
WRITE(LU2,FORMAT) RAM(I),' ',RAM(I+1),' ',RAM(I+2),','
81 CONTINUE
ELSE IF (VRML.EQ.'pov') THEN
C Writing the vertices with values:
C ***
END IF
C Writing the trailor for the line:
IF (VRML.EQ.'vrml1') THEN
WRITE(LU2,'(A)') '] }'
ELSE IF (VRML.EQ.'vrml2') THEN
WRITE(LU2,'(A)') ']'
END IF
C
C Writing the colours of the points:
IF(KOLPTS.GT.0) THEN
IF (VRML.EQ.'vrml1') THEN
WRITE(LU2,'(A)') 'Material { emissiveColor ['
ELSE IF (VRML.EQ.'vrml2') THEN
WRITE(LU2,'(A)') 'color Color { color ['
END IF
IF (VRML.EQ.'vrml1'.OR.VRML.EQ.'vrml2') THEN
DO 83 I=NQ,NVRTX,NQ
CALL COLOR2(MRAM-MVRTX,IRAM(MVRTX+1),RAM(MVRTX+1),
* 1,RAM(I),R,G,B)
WRITE(LU2,'(3(F4.2,A))') R,' ',G,' ',B,','
83 CONTINUE
END IF
IF (VRML.EQ.'vrml1') THEN
WRITE(LU2,'(A)') '] }'
ELSE IF (VRML.EQ.'vrml2') THEN
WRITE(LU2,'(A)') '] }'
END IF
END IF
C
C Writing the trailor for the line:
IF (VRML.EQ.'vrml1') THEN
WRITE(LU2,'(A)') 'PointSet { }'
WRITE(LU2,'(A)') '}'
ELSE IF (VRML.EQ.'vrml2') THEN
WRITE(LU2,'(A)') '}'
END IF
C
90 CONTINUE
CLOSE(LU1)
CLOSE(LU2)
WRITE(*,'(A)') '+PTSWRL: Done. '
STOP
END
C
C=======================================================================
C
INCLUDE 'error.for'
C error.for
INCLUDE 'sep.for'
C sep.for
INCLUDE 'length.for'
C length.for
INCLUDE 'forms.for'
C forms.for
INCLUDE 'colors.for'
C colors.for
INCLUDE 'wrl.for'
C wrl.for
C
C=======================================================================
C