; pro vec_event, ev @pltdat.h common veccom, wtxt_vfile,scalebase,wdrw_vlen,wlab_vlen,hdeg,wbut_pltvec,$ wbgp_vecclr, wtxt_vmag ; widget_control,ev.id,get_uvalue=uval case uval of "DONE": begin widget_control,/destroy,ev.top vec.ivec = 0 return end "TXT_VFILE": begin widget_control,ev.id,get_value=value files = findfile(value(0),count=nfiles) if nfiles eq 0 then begin print,'>>> Could not find file ',value(0) return endif if nfiles gt 1 then begin print,'The following files were found: ' for i=0,nfiles-1 do print,files(i) endif else begin vecfile = files(0) print,'Vector file =',vecfile print,' (Press "READ VECTOR DATA" to read this file)' endelse return end "VREAD": begin widget_control,wtxt_vfile,get_value=value files = findfile(value(0),count=nfiles) if nfiles eq 0 then begin print,'>>> Could not find file ',value(0) return endif if nfiles gt 1 then begin print,'The following files were found: ' for i=0,nfiles-1 do print,files(i) endif else begin vecfile = files(0) print,'Will read file ',vecfile rdvfile,vecfile widget_control,scalebase,/map widget_control,wbut_pltvec,sensitive=1 vec.ivec = 2 if vec.vmag ne 0. then begin vec.vmag = 0. widget_control,wtxt_vmag,set_value=string(vec.vmag) print,'Note: reset vector magnitude to 0. (will determine from max)' endif endelse return end "TXT_UFR": begin widget_control,ev.id,get_value=value uframe = 0 istat = readstr(value(0),uframe,'Frame number for U data') if istat lt 0 then begin widget_control,ev.id,set_value=string(format="(i4)",vec.uvframes(0)) return endif if uframe le 0 then begin print,'>>> Bad uframe (must be > 0)' widget_control,ev.id,set_value=string(format="(i4)",vec.uvframes(0)) return endif vec.uvframes(0) = uframe print,'Will read U data from frame ',vec.uvframes(0) return end "TXT_VFR": begin widget_control,ev.id,get_value=value vframe = 0 istat = readstr(value(0),vframe,'Frame number for V data') if istat lt 0 then begin widget_control,ev.id,set_value=string(format="(i4)",vec.uvframes(1)) return endif if vframe le 0 then begin print,'>>> Bad vframe (must be > 0)' widget_control,ev.id,set_value=string(format="(i4)",vec.uvframes(1)) return endif vec.uvframes(1) = vframe print,'Will read V data from frame ',vec.uvframes(1) return end "TXT_VMAG": begin widget_control,ev.id,get_value=value vmag = 0. istat = readstr(value(0),vmag,'magnitude of scale vector') if istat lt 0 then begin widget_control,ev.id,set_value=string(format="(f5.1)",vec.vmag) return endif if vmag lt 0. then begin print,'>>> Bad scale arrow magnitude (must be >= 0.)' widget_control,ev.id,set_value=string(format="(f5.1)",vec.vmag) return endif if vmag eq 0. then print,'Will determine scale magnitude based on ',$ 'maximum magnitude...' vec.vmag = vmag print,'Set magnitude of scale arrow to ',vec.vmag return end "SL_VLEN": begin vec.vlen = float(ev.value)/100. widget_control,get_value=window,wdrw_vlen wset,window & erase devlen = vec.vlen*float(Wwidth) alen = convert_coord([devlen],[0.],/device,/to_normal) mkarrow,.5-.5*alen(0),.5, .5+.5*alen(0),.5,theta=hdeg,color=white widget_control,wlab_vlen,$ set_value=string(format="('Length of scale arrow: ',f6.4)",vec.vlen) print,'Set scale arrow length to ',vec.vlen,' of width of main window' widget_control,wdraw,get_value=window wset,window return end "BGP_CLR": begin case ev.value of 0: begin vec.vclr = black print,'Will make BLACK vector arrows (vec.vclr=',vec.vclr,')' return end 1: begin vec.vclr = white print,'Will make WHITE vector arrows (vec.vclr=',vec.vclr,')' return end else: endcase end "PLTVEC": begin ; plot vectors alone widget_control,/hourglass erase vec.ivec = 1 vec.vclr = white widget_control,wbgp_vecclr,set_value=1,bad_id=badid case map.proj of "GLOBAL CYLINDRICAL EQUIDISTANT": begin xll = .15 & yll = .48 xur = .95 & yur = yll+.5*(xur-xll) pltce_vec,[xll,yll,xur,yur],/backgnd end "POLAR STEREOGRAPHIC": begin xur = .87 & yur = .89 xll = .13 & yll = .15 pltst_vec,[xll,yll,xur,yur],/backgnd end "SATELLITE VIEW": print,'Sat view projection not yet available' "MOLLWEIDE": print,'Mollweide projection not yet available' else: print,'Unknown map projection: ',proj endcase if writecgm then wrcgm,'map' if psdev.writeps then wrps,'map' return end else: print,'Unknown user value (vec) = ',uval endcase return end ; ;------------------------------------------------------------------- ; pro popup_vec @pltdat.h common veccom, wtxt_vfile,scalebase,wdrw_vlen,wlab_vlen,hdeg,wbut_pltvec,$ wbgp_vecclr, wtxt_vmag ; vecbase = widget_base(title='VECTOR PLOTTING',/column) ; ; Text fields for file and frame numbers: ; base = widget_base(vecbase,/frame,/column) wlab_vfile = widget_label(base,value="ASCII FILE CONTAINING VECTOR DATA") wtxt_vfile = widget_text(base,/editable,value=vecfile,xsize=47,$ uvalue="TXT_VFILE") base0 = widget_base(base,column=2) wlab_ufr = widget_label(base0,value="FRAME NUMBER FOR U DATA") wtxt_ufr = widget_text(base0,/editable,value=string(vec.uvframes(0)),$ uvalue="TXT_UFR") wlab_vfr = widget_label(base0,value="FRAME NUMBER FOR V DATA") wtxt_vfr = widget_text(base0,/editable,value=string(vec.uvframes(1)),$ uvalue="TXT_VFR") wbut_rd = widget_button(base,value="READ VECTOR DATA",uvalue="VREAD") ; ; Vector scaling is accomplished with use provided arrow length ; corresponding to a magnitude (e.g., a 500 m/s arrow will be of length n) ; vec.vmag = magnitude of scale arrow (float) ; vec.vlen = length of scale arrow (int) ; wvlenwidth = 80. ; this is apparently only a "hint" hdeg = 50. scalebase = widget_base(vecbase,/frame,/column,map=0) wlab_vscale0 = widget_label(scalebase,ysize=15,$ value="Magnitude of scale arrow (m/s):") wlab_vscale1 = widget_label(scalebase,ysize=15,$ value="(0. means program will choose a magnitude)") vmagstr = string(format="(f5.1)",vec.vmag) wtxt_vmag = widget_text(scalebase,/editable,/no_newline,ysize=1,$ value=vmagstr,uvalue="TXT_VMAG") widget_control,wtxt_vmag,set_text_select=strlen(vmagstr) wdrw_vlen = widget_draw(scalebase,xsize=wvlenwidth,ysize=40) wsl_vlen = widget_slider(scalebase,minimum=0,maximum=25,value=$ fix(vec.vlen*100.),uvalue="SL_VLEN") wlab_vlen = widget_label(scalebase,value=$ string(format="('Length of scale arrow: ',f6.4)",vec.vlen)) ; ; Arrow color (currently just black or white): ; if imcon eq 1 or vec.ivec eq 1 then vec.vclr = white else vec.vclr = black ival = 0 & if vec.vclr eq white then ival = 1 base = widget_base(scalebase) wbgp_vecclr = cw_bgroup(base,/exclusive,/row,set_value=ival,uvalue="BGP_CLR",$ ["BLACK ARROWS","WHITE ARROWS"]) ; ; Controls: ; base = widget_base(vecbase,/frame,row=1) quit = widget_button(base,value="DONE",uvalue="DONE") wbut_pltvec = widget_button(base,value="PLOT VECTORS ALONE",uvalue="PLTVEC") widget_control,wbut_pltvec,sensitive=0 ; ; ; Realize vecbase. If mapbase exists (it should), position vecbase ; at bottom of mapbase, otherwise position vecbase to left of appbase ; like other subbases: ; widget_control,vecbase,/realize offxy = offset(appbase,vecbase) widget_control,vecbase,tlb_set_xoffset=offxy(0),tlb_set_yoffset=offxy(1) ; ; Draw scale arrow: ; widget_control,get_value=window,wdrw_vlen wset,window & erase devlen = vec.vlen*float(Wwidth) alen = convert_coord([devlen],[0.],/device,/to_normal) mkarrow,.5-.5*alen(0),.5, .5+.5*alen(0),.5,theta=hdeg,color=white widget_control,wlab_vlen,$ set_value=string(format="('Length of scale arrow: ',f6.4)",vec.vlen) widget_control,wdraw,get_value=window wset,window xmanager,'vec',vecbase return end