;+ ; Project : SOHO - CDS ; ; Name : TEMPLATE ; ; Purpose : View of SOHO-CDS SFDU Product Template and Description ; ; Explanation : Produces an SFDU template picture for the SOHO-CDS data ; archive. ; ; Use : TEMPLATE, INSTRUMENT ; ; Inputs : None. ; ; Opt. Inputs : INSTRUMENT: The name of the SOHO instrument for which the ; registration packet template is drawn. Note that ; there must exist a file that contains the registration ; information, i.e., for 'CDS', a file "template.cds" ; would have to exist in the current directory, likewise ; for 'SUMER', the file "template.sumer" must exist. ; ; Outputs : None. ; ; Opt. Outputs: None. ; ; Keywords : OUTPUT: 'PS': The output is a standard postscript file ; ; 'EPS': The output is an encapsulated postscript file. ; The default is to make both a PS and an EPS ; file. ; ; ADATE: If set, then the date printed will be the inputted ; date instead of the operating system date. Note that ; the inputted date should be of the form: 20-Nov-1995. ; ; ERRMSG: If defined and passed, then any error messages will ; be returned to the user in this parameter rather than ; being handled by the IDL MESSAGE utility. If no ; errors are encountered, then a null string is ; returned. In order to use this feature, the string ; ERRMSG must be defined first, e.g., ; ; ERRMSG = '' ; TEMPLATE, 'cds', OUTPUT='EPS', ERRMSG=ERRMSG ; IF ERRMSG(0) NE '' THEN ... ; ; Calls : DATATYPE, VALID_NUM ; ; Common : None. ; ; Restrictions: None. ; ; Side effects: ERRMSG can either be a scalar or a 2 element array string. ; ; Category : Data Handling, I/O, FITS, SFDU, Generic ; ; Prev. Hist. : None. ; ; Written : Donald G. Luttermoser, GSFC/ARC, 15 November 1995 ; ; Modified : Version 1, Donald G. Luttermoser, GSFC/ARC, 15 November 1995 ; Initial program. ; ; Version : Version 1, 15 November 1995. ; ;- ; PRO TEMPLATE, INSTRUMENT, OUTPUT=OUTPUT, ADATE=ADATE, ERRMSG=ERRMSG ; ON_ERROR, 2 ; Return to caller if error is encountered. MESSAGE = '' ; Set to non-null string if error is encountered. PASS = 0 ; PASS = 0: Plot to terminal; PASS > 0: to hardcopy. XOFFSET = 0. ; Offset the template this many units in the x direction. XCOMOFF = 1. ; Offset for comments and arrows from boxes. ; ; Text parameters. ; AFONT = [-1, 0] TXTSCL = [0.8, 1.0] SUPPTEXT = ['0etc.', '0"end of file #1"', '1FITS File (#2)', $ '1FITS File (#3)', '1etc.'] ; ; Check input. ; IF N_PARAMS() GT 1 THEN BEGIN MESSAGE = 'Syntax: TEMPLATE, INSTRUMENT' GOTO, HANDLE_ERROR ENDIF ; IF N_PARAMS() EQ 1 THEN BEGIN IF DATATYPE(INSTRUMENT, 1) NE 'String' THEN BEGIN MESSAGE = 'INSTRUMENT must be a string (e.g., "CDS", "SUMER").' GOTO, HANDLE_ERROR ENDIF ENDIF ELSE BEGIN INSTRUMENT = 'UNKNOWN' READ, 'Enter the SOHO instrument name for the template: ', INSTRUMENT PRINT, ' ' ENDELSE INSTRUMENT = STRUPCASE(INSTRUMENT) ; HARDCOPY = ['PS', 'EPS'] IF KEYWORD_SET(OUTPUT) $ THEN HCOPY = WHERE(HARDCOPY EQ STRTRIM(STRUPCASE(OUTPUT),2)) > 0 $ ELSE HCOPY = 2 ; Default is for TEMPLATE to produce both types. ; ; Define internal parameters. ; ASK = 'Y' ATEXT = 'Readin text' & BTEXT = ATEXT TERM = STRUPCASE(!D.NAME) ; ; Get today's date. ; IF KEYWORD_SET(ADATE) THEN BEGIN TDATE = '!17'+STRTRIM(ADATE,2) ENDIF ELSE BEGIN ADATE = SYSTIME() DATLEN = STRLEN(ADATE) BLK1 = STRPOS(ADATE, ' ') BLK2 = STRPOS(ADATE, ' ', BLK1+1) BLK3 = STRPOS(ADATE, ' ', BLK2+1) ADAY = STRMID(ADATE, BLK2+1, BLK3-BLK2-1) AMONTH = STRMID(ADATE, BLK1+1, BLK2-BLK1-1) AYEAR = STRMID(ADATE, DATLEN-4, 4) TDATE = '!17'+ADAY+'-'+AMONTH+'-'+AYEAR ENDELSE ; ; Arrowheads. ; UARR = FLTARR(2,4) & DARR = UARR & RARR = UARR & LARR = UARR UARR(0,*) = [0., -2.5, 2.5, 0.] & UARR(1,*) = [0., -5., -5., 0.] DARR(0,*) = [0., -2.5, 2.5, 0.] & DARR(1,*) = [0., 5., 5., 0.] RARR(0,*) = [0., -5., -5., 0.] & RARR(1,*) = [0., 2.5, -2.5, 0.] LARR(0,*) = [0., 5., 5., 0.] & LARR(1,*) = [0., 2.5, -2.5, 0.] SCARR = 0.7 UARR = UARR*SCARR & DARR = DARR*SCARR RARR = RARR*SCARR & LARR = LARR*SCARR ; ; Read in the box text data. Note that the input filename must be in the form ; "template.instrument" where "instrument" is one of the SOHO instruments, ; i.e., cds, sumer, etc. ; FILENAME = 'template.' + STRLOWCASE(STRTRIM(INSTRUMENT, 2)) ; ; Get various attributes about the template. ; NB = 0 & IDMAX = 0 & TXMAX = 0 & CMMAX = 0 & TALKCNT = 0 & NSTCK = 0 OPENR, URD, FILENAME, /GET_LUN WHILE NOT EOF(URD) DO BEGIN READF, URD, ATEXT & ATEXT = STRTRIM(ATEXT, 2) LENTEXT = STRLEN(ATEXT) ; ; Find number of main template regions. ; IF STRPOS(ATEXT, '* ') EQ 0 THEN BEGIN EPOS = STRPOS(ATEXT, '*', 2) NB = FIX(STRMID(ATEXT, 1, EPOS-1)) ENDIF ; ; Find maximum number of boxes per main region. ; IDPOS = STRPOS(STRUPCASE(ATEXT), ' ID=') IF IDPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', IDPOS+4) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', IDPOS+4) IF EPOS EQ -1 THEN BEGIN FREE_LUN, URD MESSAGE = ['Unable to find delimiter ' + $ 'marker for "ID" entry.', ATEXT] GOTO, HANDLE_ERROR ENDIF IDMAX = MAX([IDMAX, FIX(STRMID(ATEXT, IDPOS+4, $ EPOS-IDPOS-4))]) ENDIF ; ; Find maximum number of "Text" entries. ; TXPOS = STRPOS(STRUPCASE(ATEXT), 'TEXT=') IF TXPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', TXPOS+5) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', TXPOS+5) IF EPOS EQ -1 THEN BEGIN FREE_LUN, URD MESSAGE = ['Unable to find delimiter ' + $ 'marker for "Text" entry.', ATEXT] GOTO, HANDLE_ERROR ENDIF TXCNT = 0 FOR I = TXPOS+5, EPOS-1 DO IF STRMID(ATEXT, I, 1) $ EQ '|' THEN TXCNT = TXCNT + 1 TXMAX = MAX([TXMAX, TXCNT+1]) ENDIF ; ; Find maximum number of "Comm" entries. ; CMPOS = STRPOS(STRUPCASE(ATEXT), 'COMM=') IF CMPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', CMPOS+5) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', CMPOS+5) IF EPOS EQ -1 THEN BEGIN FREE_LUN, URD MESSAGE = ['Unable to find delimiter ' + $ 'marker for "Comm" entry.', ATEXT] GOTO, HANDLE_ERROR ENDIF CMCNT = 0 FOR I = CMPOS+5, EPOS-1 DO IF STRMID(ATEXT, I, 1) $ EQ '|' THEN CMCNT = CMCNT + 1 CMMAX = MAX([CMMAX, CMCNT+1]) ENDIF ; ; Will any regions be stacked on top of each other? ; Form: Stack: [1, 2], [3, 4] or ; Stack: 2, 3 ; IF STRPOS(STRUPCASE(ATEXT), "STACK:") EQ 0 THEN BEGIN FOR I = 6, LENTEXT-1 DO IF STRMID(ATEXT, I, 1) EQ '[' $ THEN NSTCK = NSTCK + 1 IF NSTCK EQ 0 THEN BEGIN FOR I = 6, LENTEXT-1 DO BEGIN ACK = STRMID(ATEXT, I, 1) IF VALID_NUM(ACK, /INTEGER) EQ 1 $ THEN NSTCK = NSTCK + 1 ENDFOR NSTCK = NSTCK/2 ENDIF ENDIF ENDWHILE FREE_LUN, URD ; ; Set up storage arrays. ; TMAIN = STRARR(NB) & TITLE = STRARR(NB, IDMAX) TEXT = STRARR(NB, IDMAX, TXMAX) & COMM = STRARR(NB, IDMAX, CMMAX) TYPE = INTARR(NB, IDMAX) TYPE(*,*) = -1 IF NSTCK NE 0 THEN STACK = INTARR(2, NSTCK) ; OPENR, URD, FILENAME, /GET_LUN ; ; Read in the next line from the input file. ; NEXTLINE: READF, URD, ATEXT & ATEXT = STRTRIM(ATEXT,2) CONTLINE: LENTEXT = STRLEN(ATEXT) ; ; Which main region is this? ; IF STRPOS(ATEXT, '* ') EQ 0 THEN BEGIN EPOS = STRPOS(ATEXT, '*', 2) IB = FIX(STRMID(ATEXT, 1, EPOS-1)) - 1 TMAIN(IB) = STRTRIM(STRMID(ATEXT, EPOS+1, LENTEXT-EPOS-1), 2) ENDIF ELSE BEGIN ; ; Is the line continued on the next line? ; IF (STRPOS(ATEXT, '**') NE 0) AND $ (STRPOS(STRUPCASE(ATEXT), 'STACK:') NE 0) AND $ (STRPOS(STRUPCASE(ATEXT), 'TALK:') NE 0) THEN BEGIN IF STRMID(ATEXT, LENTEXT-1, 1) NE '.' THEN BEGIN READF, URD, BTEXT & BTEXT = STRTRIM(BTEXT,2) ATEXT = ATEXT + ' ' + BTEXT GOTO, CONTLINE ENDIF ENDIF ENDELSE ; ; Find box ID number for this main region. ; IDPOS = STRPOS(STRUPCASE(ATEXT), ' ID=') IF IDPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', IDPOS+4) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', IDPOS+4) ID = FIX(STRMID(ATEXT, IDPOS+4, EPOS-IDPOS-4)) - 1 ENDIF ; ; Find title for this box. ; TIPOS = STRPOS(STRUPCASE(ATEXT), 'TITLE=') IF TIPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', TIPOS+6) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', TIPOS+6) TITLE(IB,ID) = STRTRIM(STRMID(ATEXT, TIPOS+6, EPOS-TIPOS-6), 2) ENDIF ; ; Find type for this box (TYPE=0: top box; TYPE=1: 1 indent box; TYPE=2: 2 ; indent box). ; TYPOS = STRPOS(STRUPCASE(ATEXT), 'TYPE=') IF TYPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', TYPOS+5) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', TYPOS+5) TYPE(IB, ID) = FIX(STRMID(ATEXT, TYPOS+5, EPOS-TYPOS-5)) ENDIF ; ; Find "Text" entries for this box. ; TXPOS = STRPOS(STRUPCASE(ATEXT), 'TEXT=') IF TXPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', TXPOS+5) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', TXPOS+5) C1POS = STRPOS(ATEXT, '[', TXPOS+5) ; ; "[]" markers not needed for single "Text" entries. ; IF C1POS EQ -1 THEN BEGIN C1POS = TXPOS + 4 C2POS = EPOS ENDIF ELSE C2POS = STRPOS(ATEXT, ']', C1POS+1) IF (C2POS LT C1POS) OR (C2POS GT EPOS) THEN BEGIN FREE_LUN, URD MESSAGE = ['Error with the "]" delimiter marker ' + $ 'for "Text" entry.', ATEXT] GOTO, HANDLE_ERROR ENDIF TXCNT = 0 & STR1 = C1POS+1 FOR I = C1POS+1, C2POS-1 DO BEGIN IF STRMID(ATEXT, I, 1) EQ '|' THEN BEGIN STR2 = I - 1 IF STR2-STR1 LE 0 THEN $ TEXT(IB, ID, TXCNT) = '' ELSE $ TEXT(IB, ID, TXCNT) = STRTRIM( $ STRMID(ATEXT, STR1, STR2-STR1+1), 2) STR1 = I + 1 TXCNT = TXCNT + 1 ENDIF STR2 = C2POS-1 IF STR2-STR1 LE 0 THEN TEXT(IB, ID, TXCNT) = '' $ ELSE TEXT(IB, ID, TXCNT) = STRTRIM( $ STRMID(ATEXT, STR1, STR2-STR1+1), 2) ENDFOR ENDIF ; ; Find "Comm" entries for this box. ; CMPOS = STRPOS(STRUPCASE(ATEXT), 'COMM=') IF CMPOS GT -1 THEN BEGIN EPOS = STRPOS(ATEXT, ';', CMPOS+5) IF EPOS EQ -1 THEN EPOS = STRPOS(ATEXT, '.', CMPOS+5) C1POS = STRPOS(ATEXT, '[', CMPOS+5) ; ; "[]" markers not needed for single "Text" entries. ; IF C1POS EQ -1 THEN BEGIN C1POS = CMPOS + 4 C2POS = EPOS ENDIF ELSE C2POS = STRPOS(ATEXT, ']', C1POS+1) IF (C2POS LT C1POS) OR (C2POS GT EPOS) THEN BEGIN FREE_LUN, URD MESSAGE = ['Error with the "]" delimiter marker ' + $ 'for "Comm" entry.', ATEXT] GOTO, HANDLE_ERROR ENDIF CMCNT = 0 & STR1 = C1POS+1 FOR I = C1POS+1, C2POS-1 DO BEGIN IF STRMID(ATEXT, I, 1) EQ '|' THEN BEGIN STR2 = I - 1 IF STR2-STR1 LE 0 THEN $ COMM(IB, ID, CMCNT) = '' ELSE $ COMM(IB, ID, CMCNT) = STRTRIM( $ STRMID(ATEXT, STR1, STR2-STR1+1), 2) STR1 = I + 1 CMCNT = CMCNT + 1 ENDIF STR2 = C2POS-1 IF STR2-STR1 LE 0 THEN COMM(IB, ID, CMCNT) = '' $ ELSE COMM(IB, ID, CMCNT) = STRTRIM( $ STRMID(ATEXT, STR1, STR2-STR1+1), 2) ; Check to see if inserted "beginning" spaces have been input "\ ". IF STRPOS(COMM(IB, ID, CMCNT), '\ ') EQ 0 THEN BEGIN CLEN = STRLEN(COMM(IB, ID, CMCNT)) COMM(IB, ID, CMCNT) = $ STRMID(COMM(IB, ID, CMCNT), 1, CLEN-1) ENDIF ENDFOR ENDIF ; ; Find the stack information. ; STACKPOS = STRPOS(STRUPCASE(ATEXT), 'STACK:') IF STACKPOS EQ 0 THEN $ ASTACK = STRTRIM(STRMID(ATEXT, 6, LENTEXT-6), 2) ; ; Find the talk information. ; TALKPOS = STRPOS(STRUPCASE(ATEXT), 'TALK:') IF TALKPOS EQ 0 THEN $ TALK = ' '+STRTRIM(STRMID(ATEXT, 5, LENTEXT-5), 2)+',' $ ELSE GOTO, NEXTLINE FREE_LUN, URD ; ; Isolate talk paths. ; IPATH = 0 & COMMA = 0 NEXTTALK: COMMA = STRPOS(TALK, ',', COMMA+1) IF COMMA NE -1 THEN BEGIN IPATH = IPATH + 1 GOTO, NEXTTALK ENDIF IF IPATH EQ 0 THEN BEGIN IF STRLEN(TALK) GT 1 THEN IPATH = 1 ENDIF IF IPATH GT 0 THEN BEGIN TALKPATH = INTARR(2, 2, IPATH) & TALKBACK = STRARR(IPATH) ; COMMA = 0 & IP = -1 WHILE IP LT IPATH DO BEGIN IP = IP + 1 COMOLD = COMMA COMMA = STRPOS(TALK, ',', COMMA+1) IF COMMA NE -1 THEN BEGIN BOTHPOS = STRPOS(TALK, '<>', COMOLD) DOT1POS = STRPOS(TALK, '.', COMOLD) DOT2POS = STRPOS(TALK, '.', DOT1POS+1) IF BOTHPOS EQ -1 THEN BEGIN LTPOS = STRPOS(TALK, '<', COMOLD) IF LTPOS EQ -1 THEN BEGIN GTPOS = STRPOS(TALK, '>', COMOLD) IF GTPOS EQ -1 THEN BEGIN PRINT, 'Unknown path descriptor!' RETURN ENDIF ELSE BEGIN TALKPATH(0, 0, IP) = FIX(STRMID(TALK, $ COMOLD+1, DOT1POS-COMOLD-1)) TALKPATH(0, 1, IP) = FIX(STRMID(TALK, $ DOT1POS+1, GTPOS-DOT1POS-1)) TALKPATH(1, 0, IP) = FIX(STRMID(TALK, $ GTPOS+1, DOT2POS-GTPOS-1)) TALKPATH(1, 1, IP) = FIX(STRMID(TALK, $ DOT2POS+1, COMMA-DOT2POS-1)) TALKBACK(IP) = 0 ENDELSE ENDIF ELSE BEGIN TALKPATH(1, 0, IP) = FIX(STRMID(TALK, $ COMOLD+1, DOT1POS-COMOLD-1)) TALKPATH(1, 1, IP) = FIX(STRMID(TALK, $ DOT1POS+1, LTPOS-DOT1POS-1)) TALKPATH(0, 0, IP) = FIX(STRMID(TALK, $ LTPOS+1, DOT2POS-LTPOS-1)) TALKPATH(0, 1, IP) = FIX(STRMID(TALK, $ DOT2POS+1, COMMA-DOT2POS-1)) TALKBACK(IP) = 0 ENDELSE ENDIF ELSE BEGIN TALKPATH(0, 0, IP) = FIX(STRMID(TALK, COMOLD+1, $ DOT1POS-COMOLD-1)) TALKPATH(0, 1, IP) = FIX(STRMID(TALK, DOT1POS+1, $ BOTHPOS-DOT1POS-1)) TALKPATH(1, 0, IP) = FIX(STRMID(TALK, BOTHPOS+2, $ DOT2POS-BOTHPOS-2)) TALKPATH(1, 1, IP) = FIX(STRMID(TALK, DOT2POS+1, $ COMMA-DOT2POS-1)) TALKBACK(IP) = 1 ENDELSE ENDIF ENDWHILE ENDIF ; ; Isolate the stacks. Assumes there are no more than 9 main regions. ; IF NSTCK GT 0 THEN BEGIN LSTACK = STRLEN(ASTACK) COMMA = 0 & ISTCK = 0 & ICOL = 0 FOR I = 0, LSTACK-1 DO BEGIN ACK = STRMID(ASTACK, I, 1) IF VALID_NUM(ACK, /INTEGER) EQ 1 THEN BEGIN STACK(ICOL, ISTCK) = FIX(ACK) ICOL = ICOL + 1 IF ICOL GT 1 THEN BEGIN ICOL = 0 ISTCK = ISTCK + 1 ENDIF IF ISTCK GT NSTCK THEN BEGIN MESSAGE = 'Error in determining the ' + $ '"stack" information.' GOTO, HANDLE_ERROR ENDIF ENDIF ENDFOR ENDIF ; ; Open window. ; IF TERM EQ 'X' THEN BEGIN WINDOW, 0, TITLE='SFDU Product Template for the SOHO - '+INSTRUMENT, $ XSIZE=850, YSIZE=567 PLOT, [0.,100.], [0.,100.], XSTYLE=1+4+8, YSTYLE=1+4+8, $ BACKGROUND=255, /NODATA COL = 0 ENDIF ELSE BEGIN PLOT, [0.,100.], [0.,100.], XSTYLE=1+4+8, YSTYLE=1+4+8, /NODATA COL = 255 ENDELSE ; MTITLE = '!17View of the SOHO-'+INSTRUMENT+' SFDU Product Template and ' + $ 'Descriptions' ; XDEV = !D.X_SIZE & YDEV = !D.Y_SIZE XDWTH = XDEV / (NB - ISTCK) & HXDWTH = XDWTH/2 ; ; Position of main title lines. ; XTIT = INTARR(NB) & YTIT = XTIT & REGION = 0 ; ; QTOPS = 0: Boxes start at bottom of region (stacked). ; = 1: Boxes start at top of region (stacked). ; = 2: Boxes start at top of region (isolated). ; QTOPS = INTARR(NB) & QTOPS(*) = 2 IF NSTCK GT 0 THEN FOR I=0,NSTCK-1 DO QTOPS(STACK(0,I)-1) = 1 IF NSTCK GT 0 THEN FOR I=0,NSTCK-1 DO QTOPS(STACK(1,I)-1) = 0 FOR I = 0, NB-1 DO BEGIN XTIT(I) = REGION*XDWTH + FIX(0.4*XDWTH) IF QTOPS(I) GE 1 THEN BEGIN YTIT(I) = YDEV - 0.15*YDEV IF QTOPS(I) EQ 2 THEN REGION = REGION + 1 ENDIF ELSE BEGIN YTIT(I) = YDEV/2 - 0.075*YDEV REGION = REGION + 1 ENDELSE ENDFOR FOR I = 0, NB-1 DO BEGIN DEV2DAT = CONVERT_COORD([XTIT(I), YTIT(I)], /DEVICE, /TO_DATA) XTIT(I) = DEV2DAT(0) & YTIT(I) = DEV2DAT(1) ENDFOR XTIT = XTIT + XOFFSET ; Offset picture with respect to title. ; XBSIZE = 70./REGION & XBIND = 10./REGION & YBSTEP = 5. ; ; Store each box vertices. ; XBVERT = FLTARR(4, NB, IDMAX) & YBVERT = XBVERT ; ; Plot the template. ; PLOTIT: XYOUTS, 50., 100., MTITLE, FONT=AFONT(PASS<1), ALIGN=0.5, COLOR=COL, $ SIZE=1.3*TXTSCL(PASS<1) XYOUTS, 50., 96., TDATE, FONT=AFONT(PASS<1), ALIGN=0.5, COLOR=COL, $ SIZE=0.9*TXTSCL(PASS<1) ; ; Add SFDU File boxes. Note that region 1 is always the SFDU template. ; FOR I = 0, NB-1 DO BEGIN ; ; Plot main titles. ; MTLEN = STRLEN(TMAIN(I)) XBOFF = 0.4*MTLEN IF I EQ 0 THEN XBTOFF = 0.08*MTLEN ELSE XBTOFF = 0. ; Fudge fix. XYOUTS, XTIT(I), YTIT(I), '!17'+TMAIN(I), COLOR=COL, $ ALIGN=0.5, FONT=AFONT(PASS<1), SIZE=1.0*TXTSCL(PASS<1) ; ; Plot box titles. ; YCURR = YTIT(I) NTITLE = WHERE(TYPE(I, *) NE -1) IF NTITLE(0) EQ -1 THEN BEGIN MESSAGE = 'Error in plotting box titles, Region: ' + $ STRTRIM(STRING(I+1),2) GOTO, HANDLE_ERROR ENDIF NTITLE = N_ELEMENTS(NTITLE) FOR J = 0, NTITLE-1 DO BEGIN YCURR = YCURR - YBSTEP XYOUTS, XTIT(I)+TYPE(I,J)*XBIND-XBTOFF, YCURR, $ '!5'+TITLE(I,J), COLOR=COL, ALIGN=0.5, $ FONT=AFONT(PASS<1), SIZE=0.9*TXTSCL(PASS<1) ; Left, Right, Top, & Bottom of box. XL = XTIT(I)+(TYPE(I,J)-1)*XBIND XR = XTIT(I)+(TYPE(I,J)-1)*XBIND+XBSIZE YT = YCURR+0.5*YBSTEP YB = YCURR-0.3*YBSTEP ; Outer boundary of box. XBOXO = [XL, XL, XR, XR] - XBOFF YBOXO = [YB, YT, YT, YB] ; Inner boundary of box. XBOXI = [XR, XL] - XBOFF YBOXI = [YB, YB] ; Draw the box. OPLOT, XBOXO, YBOXO, THICK=4, COLOR=COL, /NOCLIP OPLOT, XBOXI, YBOXI, THICK=2, COLOR=COL, /NOCLIP ; Store box top vertices for PATH plots. XBVERT(0, I, J) = XBOXO(1) ; Left top vertex (X) YBVERT(0, I, J) = YBOXO(1) ; Left top vertex (Y) XBVERT(1, I, J) = XBOXO(2) ; Right top vertex (X) YBVERT(1, I, J) = YBOXO(2) ; Right top vertex (Y) ; ; Plot box text. ; NTEXT = WHERE(TEXT(I, J, *) NE '') IF NTEXT(0) EQ -1 THEN BEGIN MESSAGE = 'Error in plotting box text, Region: ' + $ STRTRIM(STRING(I+1),2) + ', Box: ' + $ STRTRIM(STRING(J+1),2) GOTO, HANDLE_ERROR ENDIF NTEXT = N_ELEMENTS(NTEXT) YT = YB YB = YT-0.5*YBSTEP*(NTEXT+1) YCURR = YCURR - 0.5*YBSTEP YCURRCOMM = YCURR ; Hold current Y position for Comms. FOR K = 0, NTEXT-1 DO BEGIN YCURR = YCURR - 0.5*YBSTEP XYOUTS, XTIT(I)+TYPE(I,J)*XBIND-XBTOFF, YCURR, $ '!5'+TEXT(I,J,K), COLOR=COL, ALIGN=0.5, $ FONT=AFONT(PASS<1), SIZE=0.9*TXTSCL(PASS<1) ENDFOR ; Outer boundary of box (no need to draw inner boundary). XBOXO = [XR, XR, XL, XL] - XBOFF YBOXO = [YT, YB, YB, YT] ; Draw the box. OPLOT, XBOXO, YBOXO, THICK=4, COLOR=COL, /NOCLIP ; Store box bottom vertices for PATH plots. XBVERT(2, I, J) = XBOXO(1) ; Right bottom vertex (X) YBVERT(2, I, J) = YBOXO(1) ; Right bottom vertex (Y) XBVERT(3, I, J) = XBOXO(2) ; Left bottom vertex (X) YBVERT(3, I, J) = YBOXO(2) ; Left bottom vertex (Y) ; YCURR = YCURR - 0.2*YBSTEP IF J LT IDMAX-1 THEN BEGIN IF TYPE(I,J) NE TYPE(I,J+1) THEN $ YCURR = YCURR - 0.2*YBSTEP ENDIF ; ; Plot box comments (comments need not exist for a box). ; NCOMM = WHERE(COMM(I, J, *) NE '') IF NCOMM(0) NE -1 THEN BEGIN XCOMM = XBOXO(0) + XCOMOFF FOR K = 0, CMMAX-1 DO BEGIN YCURRCOMM = YCURRCOMM - 0.5*YBSTEP IF COMM(I,J,K) NE '' THEN XYOUTS, XCOMM, $ YCURRCOMM, '!6'+COMM(I,J,K), $ COLOR=COL, FONT=AFONT(PASS<1), $ SIZE=0.9*TXTSCL(PASS<1) ENDFOR ENDIF ENDFOR ; ; Add supplemental text to region 1 (SFDU File). ; IF I EQ 0 THEN BEGIN YCURR = YCURR - YBSTEP FOR M = 0, N_ELEMENTS(SUPPTEXT)-1 DO BEGIN QTYP = FIX(STRMID(SUPPTEXT(M), 0, 1)) QLEN = STRLEN(SUPPTEXT(M)) QTEX = STRMID(SUPPTEXT(M), 1, QLEN-1) IF QTYP EQ 0 THEN BEGIN XYOUTS, XTIT(I)+TYPE(I,NTITLE-1)*XBIND-XBTOFF,$ YCURR, '!17'+QTEX, COLOR=COL, $ ALIGN=0.5, FONT=AFONT(PASS<1), $ SIZE=1.1*TXTSCL(PASS<1) ENDIF ELSE BEGIN XYOUTS, XTIT(I)-9., YCURR, '!17'+QTEX, $ COLOR=COL, FONT= AFONT(PASS<1), $ SIZE=1.1*TXTSCL(PASS<1) ENDELSE YCURR = YCURR - 0.6*YBSTEP IF M LT N_ELEMENTS(SUPPTEXT)-2 THEN BEGIN QTYP2 = FIX(STRMID(SUPPTEXT(M+1), 0, 1)) IF QTYP2 NE QTYP THEN YCURR = YCURR-0.6*YBSTEP ENDIF ENDFOR ENDIF ; ENDFOR PRINT, ' ' ; ; Draw the talk line and arrowhead. ; IF IPATH GT 0 THEN BEGIN FOR I = 0, IPATH-1 DO BEGIN IFR_MAIN = TALKPATH(0, 0, I) - 1 IFR_SUB = TALKPATH(0, 1, I) - 1 ITO_MAIN = TALKPATH(1, 0, I) - 1 ITO_SUB = TALKPATH(1, 1, I) - 1 XPATH = [XBVERT(2, IFR_MAIN, IFR_SUB) + XCOMOFF, $ XBVERT(3, ITO_MAIN, ITO_SUB) - XCOMOFF] ; Ignore Y position of "TO" box. YPATH = [(YBVERT(1, IFR_MAIN, IFR_SUB) + $ YBVERT(2, IFR_MAIN, IFR_SUB))/2., $ (YBVERT(1, IFR_MAIN, IFR_SUB) + $ YBVERT(2, IFR_MAIN, IFR_SUB))/2.] OPLOT, XPATH, YPATH, THICK=3, LINE=2, COLOR=COL, /NOCLIP POLYFILL, RARR(0,*)+XPATH(1)+0.5*XCOMOFF, RARR(1,*)+YPATH(1),$ COLOR=COL IF TALKBACK(I) EQ 1 THEN POLYFILL, LARR(0,*)+XPATH(0)-$ 0.5*XCOMOFF, LARR(1,*)+YPATH(0), COLOR=COL ENDFOR ENDIF ; IF PASS EQ 0 THEN BEGIN PRINT, ' ' READ, 'Do you wish to make a hard copy of this template (Y/N)? [Y] ',$ ASK PRINT, ' ' ENDIF ELSE BEGIN ; ; Close postscript file. ; PRINT, 'Template is now stored in file: template.' + STRLOWCASE(OUT) PRINT, ' ' DEVICE, /CLOSE IF PASS EQ 2 THEN ASK = 'N' ELSE ASK = 'Y' ENDELSE ; IF STRUPCASE(ASK) NE 'N' THEN BEGIN ; ; Set the postscript fonts. ; PASS = PASS + 1 SET_PLOT, 'PS' IF HCOPY(0) NE 2 THEN $ OUT = HARDCOPY(HCOPY) $ ELSE BEGIN IF PASS EQ 1 THEN OUT = HARDCOPY(0) ELSE OUT = HARDCOPY(1) ENDELSE IF OUT EQ 'EPS' THEN $ DEVICE, /ENCAPSULATE, /LANDSCAPE, FILENAME='template.eps' $ ELSE DEVICE, ENCAPSULATE=0, /LANDSCAPE, FILENAME='template.ps' DEVICE, /SCHOOLBOOK, /BOLD, FONT_INDEX=17 DEVICE, /TIMES, /BOLD, FONT_INDEX=6 DEVICE, /COURIER, /BOLD, FONT_INDEX=5 ; IF (HCOPY EQ 2) AND (PASS LE 2) THEN GOTO, PLOTIT IF PASS EQ 1 THEN GOTO, PLOTIT ENDIF ; SET_PLOT, TERM ; IF MESSAGE(0) NE '' THEN GOTO, HANDLE_ERROR IF N_ELEMENTS(ERRMSG) GT 0 THEN ERRMSG=MESSAGE RETURN ; ; Error handling portion of the procedure. ; HANDLE_ERROR: ; IF N_ELEMENTS(ERRMSG) EQ 0 THEN BEGIN IF N_ELEMENTS(MESSAGE) EQ 1 THEN MESSAGE, MESSAGE ELSE BEGIN PRINT, '>>>>>>> '+MESSAGE(1) MESSAGE, MESSAGE(0) ENDELSE ENDIF ERRMSG = MESSAGE RETURN ; END