;+------------------------------------------------------------- ; NAME: ; mdsw ; PURPOSE: ; Interactively plot MDS signals with Crosshairs and many options ; CATEGORY: ; MDSplus, Plotting, Widget Example, Printing Plots, Crosshairs ; CALLING SEQUENCE: ; mdsw ; mdsw, xsize=800, ysize=600 ; KEWORDS: ; XSIZE - initial horizontal size of graphics window ; YSIZE - initial vertical size of graphics window ; shot - MDSplus shot number, i.e, ID ; tree - tree to open. Defaults to NSTX ; COMMON BLOCKS: ; none ; EXAMPLE: ; IDL> mdsw,tree='engineering',shot=130000,charsize=2, Az=140, $ ; signal='\engineering::ppsum' ; NOTES: ; Your display may have to be set to 256 colors to see the crosshairs. ; LIMITATIONS: ; Some of the MDSplus signals in the list may not have any data. ; You need IDL version 5, or greater to run this application. ; MODIFICATION HISTORY: ; 16-Mar-2009 Option to not display scalars in Signal list ; 19-Jan-2008 Added option to change Az & Ax on surface plots ; 16-Jan-2009 added zAxisW calls for RGA data ; 17-Oct-05 Add Save to Tek option. ; 08-Mar-02 Fixed screen dump cabability for 24-bit color, and some minor things. ; 05-Oct-01 Improved restoring settings. Allowed for "Next Shot" to be missing. ; 18-May-01 Use Vcomp for "visual compression" if more points than resolution ; 07-May-01 Added Reload color table. Better behavior when copying plots that ; don't fill the screen. ; 08-Mar-01 Bug fixed on Reference Shots with signals of different length. ; 02-Feb-01 Use Label sub-node as title, if available. Access to ; nodes, even if not tags. Display text nodes. ; Display Signal List initially. Plot 2-D data. ; 30-Nov-00 Allow "Save Settings" to include Signal List & !X, !Y, !P. ; (old settings files won't work). ; Axis selection with middle mouse button just redraws last plot. ; 20-Nov-00 Rearranged menus (added Appearance Menu); better plot spacing. ; 13-Nov-00 Added "Assume same x-label" & "Assume same x-axis" options ; 30-Oct-00 Added widget for !P settings, so can specify symbols, etc. ; 26-Oct-00 Fixed "Copy Plot to Tek" to return to X color table afterwards. ; 18-Oct-00 Added "Edit Selected Signal" option in Signal Menu. ; TDI expressions included in name will be displayed. Added button ; to show treenames in list. ; 10-Oct-00 Added "Label Every Other tick options" & better tick labels ; Made postscript output a little better for grid of plots ; 03-Oct-00 Add "Always Include 0 on Y-axis" (not default) and ; "Draw dashes at y=0" (now default) options. ; 28-Sep-00 Allow yaxisw to control Y-axis range, ; in some situations, at least. ; 20-Sep-00 Just label "No Data" if data not found. Put < & > on Signal Menu ; 07-Oct-99 Redraw whole screen when mouse used. Alphabetize signal list. ; Default to "Only zoom X" ; 19-Aug-99 Allow overlays of data with different dimensions ; 23-Jun-99 Added Reference shot. Added "Plot all on one page" option. ; 12-Apr-99 Added Tek output option [BD] ; 29-Mar-99 Added X & Y Style editing. [BD] ; 15-Mar-99 Add "Get Next Good Shot" buttons [BD] ; 08-Mar-99 Add overlays and legends. [BD] ; 26-Feb-99 Multiplot option and x-only zooming [BD] ; 11-Feb-99 Added a pick list for MDS signals ; 26-Jan-99 Modified for using MDS at PPPL by Bill Davis ; ; GA Crosshair routines originally written by John Ferron. ;-------------------------------------------------------------- function restore_info, filename, currInfo ; this routine has some kludgy assumptions, like widget ID's in the ; main structure end in 'id' ; ; old save files will work, even if the info structure was added to, but ; not if substructures are changed significantly, and possibly not if ; structure elements were removed or renamed in newer versions saveids_in_struct, currInfo ; widget IDs can't be restored newInfo = currInfo restore, file=filename OldTags=tag_names(info) nOldTags = N_ELEMENTS(OldTags) currTags=tag_names(currInfo) nCurrTags = N_ELEMENTS(currTags) ; assign structure elements based on tag names for i = 0, nOldTags-1 do begin iCurr = where( currTags EQ OldTags[i], count ) if count eq 0 then print, '***Old tag not found' $ else begin ;;;print, ' old & new index=', i, icurr ;;;print, 'changing ', newInfo.(iCurr[0]), ' to ', info.(i) IF SIZE( newInfo.(iCurr[0]), /type ) NE 8 then begin newInfo.(iCurr[0]) = info.(i) endif else begin ; can't assign one structure to another, so ... nparts = N_TAGS( info.(i) ) if nparts EQ N_TAGS( newInfo.(iCurr[0]) ) then begin ; assuming sub-structure hasn't changed order, etc. for j=0,nparts-1 do begin newInfo.(iCurr[0]).(j) = info.(i).(j) endfor endif endelse endelse endfor restoreids_in_struct, newInfo ; restore the widget IDs for this invocation dum = where(OldTags eq 'SLIST', nfound) if nfound le 0 then return, newInfo ; wasn't a current file if n_elements( bangX ) GT 0 then begin !x = bangX !y = bangY !p = bangP endif return, newInfo end ;-------------------------------------------------------------- PRO OPLOT_REf, signals, info, isig Get_RefSignal, signals, info, isig, $ ; Inputs xRefSignal, yRefSignal ; Outputs oVplot, xRefSignal, yRefSignal, color=MK_COLOR('green') END ;-------------------------------------------------------------- PRO GET_REFSIGNAL, signals, info, isig, $ ; Inputs xRefSignal, yRefSignal ; Outputs ; logic here is complicated because you don't want to read reference signals, ; if they have already been read. Also, can't use 2-D arrays, so have to have ; pointers into one big array (since signals may be of different length). ; ; all the data is concatenated into arrays allYdata and allXdata. The starting ; index of each signal is in the array allStarts. nPtsPer is the # of points ; in each signal. COMMON Local_OPLOT_REf, save_signals, save_shot, allYdata, allXdata, allStarts, $ nPtsPer IF N_ELEMENTS( save_shot ) EQ 0 THEN BEGIN save_shot = -999 save_signals ='' ENDIF WIDGET_CONTROL, info.refShotID, GET_VALUE=ref_shot_num IF NOT ARRAY_EQ(save_signals,signals) OR (save_shot NE ref_shot_num) THEN BEGIN ;;; IF STRUPCASE(info.MDStree) EQ 'NSTX' THEN BEGIN ;;; stat = OpenMDSshot( info.MDStree, ref_shot_num, $ ;;; SERVER=info.server ) ; make sure is open mdsopen, info.MDStree, ref_shot_num, stat=stat ; make sure is open IF info.debug THEN PRINT, ' >>in GET_REFSIGNAL, stat from OpenMDSshot=', $ strtrim(stat,2) , ' for shot ', strtrim(ref_shot_num,2) ;;; endif allStarts = 0 null= TEMPORARY(allStarts) ; get rid of allStarts FOR jsig = 0, N_ELEMENTS( signals )-1 DO BEGIN ; open signal's tree, if not open IF STRUPCASE(info.MDStree) NE 'NSTX' THEN BEGIN dummy = LeafName( signals(jsig), TREE=sigTree ) IF nwords(sigTree) GT 0 THEN BEGIN ;;; stat = OpenMDSshot( sigTree, ref_shot_num, SERVER=info.server ) mdsopen, sigTree, ref_shot_num, stat=stat ENDIF ENDIF ; make sure we have fetched the signal name for this shot cYdata = MDSGetSig( signals(jsig), XAXIS=cXdata, STAT=readStat ) IF info.debug THEN PRINT, ' >>in GET_REFSIGNAL, status from MDSGetSig=', readStat IF info.debug EQ 3 THEN PRINT, ' >> max=', max(cYdata) IF ( readStat ) THEN BEGIN ; x & y should be the same, but sometimes they aren't! IF N_ELEMENTS(cYdata) NE N_ELEMENTS(cXdata) THEN BEGIN npts = N_ELEMENTS(cYdata) < N_ELEMENTS(cXdata) cXdata = cXdata[0:npts-1] cYdata = cYdata[0:npts-1] ENDIF IF N_ELEMENTS( allStarts) eq 0 THEN BEGIN ; first successful read save_signals = signals ; (should make this work when 1st signal not there) allYdata = cYdata allXdata = cXdata allStarts = [0] nPtsPer = [N_ELEMENTS(cYdata)] ENDIF ELSE BEGIN ; concatenate data and add to pointer array for later access allYdata = [allYdata, cYdata] allXdata = [allXdata, cXdata] allStarts = [allStarts, allStarts(N_ELEMENTS(allStarts)-1) + $ nPtsPer[ N_ELEMENTS(nPtsPer)-1 ] ] nPtsPer = [nPtsPer, N_ELEMENTS(cYdata)] ENDELSE ENDIF ELSE BEGIN IF N_ELEMENTS( allStarts) eq 0 THEN BEGIN ; first read attempt save_signals = signals ; (should make this work when 1st signal not there) allYdata = [0,0] allXdata = [0,5] allStarts = [0] nPtsPer = [2] ENDIF ELSE BEGIN ; concatenate data and add to pointer array for later access allYdata = [allYdata, 0,0] allXdata = [allXdata,0,5 ] allStarts = [allStarts, allStarts(N_ELEMENTS(allStarts)-1) + $ nPtsPer[ N_ELEMENTS(nPtsPer)-1 ] ] nPtsPer = [nPtsPer, 2] ENDELSE ENDELSE ENDFOR allStarts = [allStarts, N_ELEMENTS(allYdata)] save_signals = signals save_shot = ref_shot_num ENDIF xRefSignal = allXdata[ allStarts[isig] : allStarts[isig+1]-1 ] yRefSignal = allYdata[ allStarts[isig] : allStarts[isig+1]-1 ] END ;-------------------------------------------------------------- PRO TekPlot ; can be called interactively to send plots to 'Tek' device ; if no 'TEK' device is supported (like for most X setups), garbage will ; spew out in the window from IDL was started. COMMON common_forInteractive, baseID_save setup_tek WIDGET_CONTROL, baseID_save, GET_UVALUE=info, /NO_COPY !P.MULTI[0] = 0 ; add 5/01 for non-filled pages nPlots = info.NsigsOnPage signals = info.lastNsigs(0:nPlots-1) shots = info.lastNshots(0:nPlots-1) PlotSomething, signals, info, /MovePlotWindow, $ NOSETYRANGE=info.lastNoSetY, $ /LabelLast, SHOTS=shots WIDGET_CONTROL, baseID_save, SET_UVALUE=info, /NO_COPY ; store back in base unsetup_tek ;;;CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set ! varibles in ch_ routines END ;-------------------------------------------------------------- FUNCTION getYrange, signals, info, isig, refShot ; get yrange, accounting for overlays, if any, and reference shot, if any sigNames = signals(isig: ((isig+info.nOverLays) < (N_ELEMENTS(signals)-1))) ;;;;; IF info.nOverLays LE 0 AND refShot LE 0 THEN BEGIN if not info.includeZero then RETURN, [0,0] ENDIF ;;;;; IF N_ELEMENTS( sigNames ) LE 1 AND refShot LE 0 THEN BEGIN if not info.includeZero then RETURN, [0,0] ENDIF data = MDSGetSig( sigNames[0],xaxis=xaxis ) if !x.range[0] EQ !x.range[1] then begin i1 = 0 i2 = n_elements(data)-1 endif else begin i1 = NEARESTI( xaxis, !x.range[0] ) i2 = NEARESTI( xaxis, !x.range[1] ) endelse range = [ MIN( data[i1:i2] ), MAX( data[i1:i2] ) ] IF n_elements( sigNames ) GT info.nOverLays then begin FOR i=1, info.nOverLays DO BEGIN signame = sigNames( i ) data = MDSGetSig( signame, xaxis=xaxis ) if !x.range[0] EQ !x.range[1] then begin i1 = 0 i2 = n_elements(data)-1 endif else begin i1 = NEARESTI( xaxis, !x.range[0] ) i2 = NEARESTI( xaxis, !x.range[1] ) endelse range[0] = MIN( [ data[i1:i2], range[0] ] ) range[1] = MAX( [ data[i1:i2], range[1] ] ) ENDFOR endif IF refShot GT 0 THEN BEGIN Get_RefSignal, signals, info, isig, $ ; Inputs xAxis, data ; Outputs if !x.range[0] EQ !x.range[1] then begin i1 = 0 i2 = n_elements(data)-1 endif else begin i1 = NEARESTI( xaxis, !x.range[0] ) i2 = NEARESTI( xaxis, !x.range[1] ) endelse range[0] = MIN( [ data[i1:i2], range[0] ] ) range[1] = MAX( [ data[i1:i2], range[1] ] ) ENDIF if info.includeZero then begin if range[1] lt 0 then range[1] = 0 if range[0] gt 0 then range[0] = 0 endif RETURN, range END ;-------------------------------------------------------------- PRO ErasePlot,info ; use this routine when bookkeeping info needs updating. You ; can just use "erase" if plots are being resized or sent to a printer. WSET, info.wid ; set the proper graphics window erase, color=!p.background info.nOnLastPlot = 0 info.nBoxesOnPage = 0 info.nSigsOnPage = 0 ;;;info.timeOfPlot = SYSTIME(1) !P.MULTI[0] = 0 END ;-------------------------------------------------------------- PRO PlotSomething, signals, info, MOVEPLOTWINDOW=MovePlotWindow, $ NOSETYRANGE=NoSetYrange, LABELLAST=LabelLast, $ SHOTS=shots, ONSCREEN=onScreen ; This routine has become messy to handle multiple plots in a box and multiple ; boxes on a page. ; Variable meanings from info structure: ; ; nBoxesOnPage - number currently on page ; nSigsOnPage - number currently on page (i.e., different from above ; when there are overlays) ; lastNSigs - names of last n signals on the page ; nOverLays - number requested from menu ; nOnLastPlot - # traces on last plot (to see if reached nOverLays) ; !P.Multi - [0] holds a count-down of plots before erase ; ; KEYWORDS: ; NOSETYRANGE - means user chose y-range (as with the mouse), so don't ; set the y-range here ; OnScreen - just replot what is on screen IF info.debug EQ 3 THEN BEGIN PRINT, ' ' PRINT,'Entering PlotSomething:' PRINT,' !p.multi=', !p.multi PRINT,' info.NBOXES=',info.NBOXES PRINT,' info.NBOXESONPAGE=', info.NBOXESONPAGE PRINT,' info.NonLASTPLOT=', info.NonLASTPLOT PRINT,' info.NOVERLAYS=', info.NOVERLAYS PRINT,' info.NSIGSONPAGE=', info.NSIGSONPAGE PRINT,' info.SIGNAL_NAME=', info.SIGNAL_NAME IF info.NSIGSONPAGE GT 0 THEN $ PRINT,' info.LASTNSIGS=', info.LASTNSIGS(0:info.NSIGSONPAGE-1) ENDIF SameXLabel = info.SameXaxes IF info.debug EQ 15 THEN PRINT,'PlotSomething called with SameXLabel= ', $ SameXLabel IF !D.NAME NE 'PS' THEN BEGIN ; set desired x-window IF ( (!D.NAME EQ 'X') OR (!D.NAME EQ 'MAC') ) THEN BEGIN IF N_ELEMENTS( movePlotWindow ) GT 0 THEN BEGIN ; copy to another window IF info.nOverLays EQ info.nOnLastPlot-1 THEN BEGIN ; don't do for overlay IF info.nBoxes EQ info.nBoxesOnPage THEN BEGIN ; if ready for new window, make one info.PlotSaveWindow = ((info.PlotSaveWindow+1) MOD 30) > 4 WINDOW, info.PlotSaveWindow, $ ; make a new window XSIZE = info.drawXsize, YSIZE = info.drawYsize, RETAIN=2 ENDIF ENDIF WSET, info.PlotSaveWindow ENDIF ELSE BEGIN WSET, info.wid ; set the proper graphics window ENDELSE ENDIF ENDIF IF N_ELEMENTS( NoSetYrange ) GT 0 THEN BEGIN IF NOT NoSetYrange THEN setYrange = 1 ELSE setYrange = 0 ENDIF ELSE setYrange = 1 ; with overlays, there will be a legend, so no plot title IF info.nOverLays GT 0 THEN !Y.OMARGIN[1] = 2 else !Y.OMARGIN[1] = 3 if info.everyotherXticklabel then xtfmt='labeleveryothertick' $ ELSE xtfmt='betterticklabels' if info.everyotherYticklabel then ytfmt='labeleveryothertick' $ ELSE ytfmt='betterticklabels' nPlotsVertical = !p.multi[2] if (nPlotsVertical ge 4) then yminor = 2 else yminor = 0 ; 0 gets default WIDGET_CONTROL, info.treeID, GET_VALUE=tree ; in case not hit REMCHAR, tree, ':' ; in case user had unecessary characters REMCHAR, tree, '\' info.MDStree = tree ;;;stop WIDGET_CONTROL, info.refShotID, GET_VALUE=refshot ; do here, so you make sure shot is open(?) IF refShot GT 0 THEN BEGIN Get_RefSignal, signals, info, 0, $ ; Inputs xRefSignal, yRefSignal ; Outputs ENDIF if NOT POSITIVE_VALUE( shots ) then begin WIDGET_CONTROL, info.shotID, GET_VALUE=namedVar ; in case not hit info.shot_num = LONG(namedVar) ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open mdsopen, info.MDStree, info.shot_num, stat=stat IF info.debug THEN PRINT, ' >>in PlotSomething, stat from OpenMDSshot=', $ strtrim(stat,2) , ' for shot ', strtrim(info.shot_num) endif if nwords(shots) eq 1 then begin if shots[0] gt 0 and N_ELEMENTS( signals ) gt 1 then $ shots = replicate(shots, N_ELEMENTS(signals) ) endif FOR isig = 0, N_ELEMENTS( signals )-1 DO BEGIN ; make sure we have fetched the signal name for this shot info.signal_name = signals(isig) ; open signal's tree, if not open IF STRUPCASE(info.MDStree) NE 'NSTX' OR nwords(shots) gt 1 THEN BEGIN if positive_value(shots) then info.shot_num = shots[isig] if STRUPCASE(info.MDStree) EQ 'NSTX' then begin ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open MDSOPEN, info.MDStree, info.shot_num, stat=stat if not stat then print, ' Could not open tree '+info.MDStree+' for '+ $ ' shot '+strtrim(info.shot_num) IF info.debug THEN PRINT, ' >>in PlotSomething, stat from OpenMDSshot=', $ strtrim(stat,2) , ' for shot ', strtrim(info.shot_num) endif else begin dummy = LeafName( info.signal_name, TREE=sigTree ) IF nwords(sigTree) GT 0 THEN BEGIN ;;; stat = OpenMDSshot( sigTree, info.shot_num, SERVER=info.server ) MDSOPEN, sigTree, info.shot_num, stat=stat if not stat then print, ' Could not open tree '+sigTree+' for '+ $ ' shot '+strtrim(info.shot_num) IF info.debug THEN PRINT, ' >>in PlotSomething, stat from OpenMDSshot=', $ strtrim(stat,2) , ' for shot ', strtrim(info.shot_num) ENDIF endelse ENDIF cYdata = MDSGetSig( info.signal_name, SIGUNITS=yUnits, XAXIS=cXdata, $ XUNITS=xUnits, STAT=readStat ) IF info.debug THEN PRINT, ' >>status from MDSGetSig for sig ', $ info.signal_name,' =', STRTRIM(readStat) IF info.debug EQ 3 THEN PRINT, ' >> max=', max(cYdata) IF ( readStat ) AND N_ELEMENTS( cYdata ) EQ 1 THEN BEGIN dum=DIALOG_MESSAGE( info.signal_name + ' contains only the value: ' + $ STRTRIM( cYdata,2), /INFO ) RETURN ENDIF IF ( readStat ) AND N_ELEMENTS( cYdata ) GE 2 THEN BEGIN if NWORDS( xunits ) EQ 0 THEN xUnits='Seconds' ; assume !!! IF NWORDS(!x.title) NE 0 THEN xUnits=!x.title ; overridden in xaxisw IF NWORDS(!y.title) NE 0 THEN yUnits=!y.title ; overridden in yaxisw if info.SameXtitle AND ( (!P.MULTI[0]-1) MOD !P.MULTI[2] ) NE 0 $ THEN xUnits = '' sigName = TrimTagNames(info.signal_name, /treeOnly) ; don't plot tree::, etc. IF info.JustUseLeafName then signame = LEAFNAME( signame ) IF info.nOverLays EQ 0 THEN BEGIN ; use LABEL sub-node for title, if one exists pTitle = getMDSlabel( info.signal_name, STAT=stat, /QUIET ) if info.shotInLabel then begin pTitle = pTitle + ' ' + STRTRIM(info.shot_num,2) IF refShot GT 0 THEN BEGIN pTitle = pTitle + ' (' + STRTRIM(refShot,2) + ')' ENDIF endif pTitle = STRTRIM(pTitle,2) + ' ' ; pad so doesn't clip on the right ENDIF ELSE BEGIN pTitle = '' ENDELSE IF (info.nOverLays EQ info.nOnLastPlot-1) OR (info.nOnLastPlot EQ 0) THEN BEGIN ; see if need to pause to see next plot IF !D.NAME NE 'PS' THEN BEGIN IF info.nSigsOnPage GT 1 THEN BEGIN IF info.nBoxes EQ info.nBoxesOnPage THEN BEGIN ; if new window, see if should pause ; assume user wants at least 1.0 second per plot IF (SYSTIME(1) - info.timeOfPlot) LT 0.2 THEN BEGIN result = DIALOG_MESSAGE('Continue?', /CANCEL, $ DIALOG_PARENT=info.xID ) IF result NE 'OK' THEN BEGIN ; should have a cancel to return RETURN ENDIF ENDIF ENDIF ENDIF ENDIF IF !P.MULTI[0] EQ 0 THEN info.nSigsOnPage=1 $ ELSE info.nSigsOnPage=info.nSigsOnPage+1 if info.nSigsOnPage ge n_elements( info.lastNsigs ) then begin dum = DIALOG_MESSAGE([' ***Too many signals, list truncated ***', $ ' (see programmer) '], /ERROR) return endif info.lastNsigs( info.nSigsOnPage-1 ) = info.signal_name info.lastNshots( info.nSigsOnPage-1 ) = info.shot_num info.nOnLastPlot = 1 YLOG = !Y.TYPE & XLOG = !X.TYPE & ZLOG = !Z.TYPE IF setYrange THEN BEGIN IF info.axisOnRight THEN !Y.RANGE=[0,0] $ ELSE !Y.RANGE = getYrange( signals, info, isig, refShot ) ENDIF ELSE IF info.includeZero THEN $ !Y.RANGE = getYrange( signals, info, isig, refShot ) IF SameXLabel THEN BEGIN IF info.debug THEN PRINT, '!p.multi=',!P.MULTI IF ( (!P.MULTI[0]-1) MOD !P.MULTI[2] ) EQ 0 THEN BEGIN ; bottom of column plot0check, cXdata, cYdata, YLOG=YLOG, XLOG=XLOG, ZLOG=ZLOG, $ line=info.lines[0], color=info.colors[0], $ YTITLE=yUnits, TITLE=ptitle, XTITLE=xUnits, $ yTickFormat=ytfmt, xTickFormat=xtfmt, $ sigName=info.signal_name, surface=info.SurfacePlots, $ ystyle=(!y.style or 8*info.axisOnRight), yminor=yminor ENDIF ELSE BEGIN ;suppress x-axis labels plot0check, cXdata, cYdata, YLOG=YLOG, XLOG=XLOG, ZLOG=ZLOG, $ line=info.lines[0], color=info.colors[0], $ YTITLE=yUnits, TITLE=ptitle, $ XTICKNAME=REPLICATE(' ',30), $ yTickFormat=ytfmt, $ sigName=info.signal_name, surface=info.SurfacePlots, $ ystyle=(!y.style or 8*info.axisOnRight), yminor=yminor ENDELSE ENDIF ELSE BEGIN ;;; if info.SurfacePlots then pTitle = strtrim(pTitle,2)+' '+strtrim(info.shot_num,2) plot0check, cXdata, cYdata, YLOG=YLOG, XLOG=XLOG,ZLOG=ZLOG, $ Az=info.Az, Ax=info.Ax, $ line=info.lines[0], color=info.colors[0], $ YTITLE=yUnits, XTITLE=xUnits, TITLE=pTitle, $ yTickFormat=ytfmt, xTickFormat=xtfmt, $ sigName=info.signal_name, surface=info.SurfacePlots, $ ystyle=(!y.style or 8*info.axisOnRight), yminor=yminor ENDELSE if info.drawDashes and not info.SurfacePlots then $ oplot, !x.crange, [0,0], line=2 ENDIF ELSE BEGIN info.nSigsOnPage = info.nSigsOnPage + 1 info.lastNsigs( info.nSigsOnPage-1 ) = info.signal_name info.lastNshots( info.nSigsOnPage-1 ) = info.shot_num info.nOnLastPlot = info.nOnLastPlot + 1 ith = info.nOnLastPlot-1 IF (info.axisOnRight EQ 0) OR (ith GT 1) THEN BEGIN OVPLOT, cXdata, cYdata, line=info.lines(ith), color=info.colors(ith) IF (info.nOnLastPlot GE info.nOverLays+1) THEN BEGIN ; all overlays here initSig = info.nSigsOnPage-info.nOverLays-1 n = info.nSigsOnPage-initSig labels = STRARR( n ) for il = 0, n-1 do begin signal = info.lastNsigs( initSig+il ) labels[il] = getMDSlabel( signal, status=status, /quiet) if NOT status then begin ; just got the signal name back IF info.JustUseLeafName then labels[il] = LEAFNAME( signal ) endif if info.shotInLabel or $ info.lastNshots( initSig+il ) NE $ info.lastNshots( (initSig+il-1)>0 ) then begin labels[il] = labels[il] + ' ' + $ STRTRIM( info.lastNshots( initSig+il ), 2 ) endif endfor ;;;print,'legend 1' ;;;stop LEGEND, strtrim(labels,2), color=info.colors(0:n-1), $ lines=info.lines(0:n-1), $ /right, /top, CharSize = .8, $ spacing=1, BOX=0 ;;; stop ;;; CharSize = 1.6 - (0.8*( (!P.MULTI[1]-1) > 0 ) < 1), $ ENDIF ENDIF ELSE BEGIN ; make axis on right & overplot COMMON rightAxis, rtTitle, rtymin, rtymax, rtlinestyle, $ yminID, ymaxID, yautoID, ytitleID ib = info.nBoxesOnPage-1 IF N_ELEMENTS(rtymin) GT ib AND N_ELEMENTS(rtymax) GT ib THEN BEGIN if ABS( rtymin[ib]-rtymax[ib]) GT 0.00001 THEN yrange=[rtymin[ib], rtymax[ib]] $ else yrange=[0,0] ; =!y.range ENDIF else yrange=[0,0] ; =!y.range? if N_ELEMENTS(rttitle) GT ib THEN begin if NWORDS(rtTitle[ib]) GT 0 then yUnits=rttitle[ib] endif if N_ELEMENTS(rtlinestyle) GT ib THEN linestyle=rtlinestyle[ib] !p.multi[0] = !p.multi[0] + 1 ;;; if !d.name ne 'TEK' then $ ;;; AXIS, YAXIS=1, YRANGE=!y.crange, color=!p.background, ystyle=1 ; erase VPLOT, cXdata, cYdata, line=linestyle, /noerase, $ ystyle=(!y.style OR 4), color=info.colors[ith], $ xstyle=5, xrange=!x.crange, yrange=yrange, $ yTickFormat=ytfmt, xTickFormat=xtfmt, yminor=yminor ;;;if info.drawDashes then oplot, !x.crange, [0,0], line=2, color=info.colors(ith) AXIS, YAXIS=1, ystyle=1, YRANGE=!y.crange, ytitle=yUnits, $ color=info.colors(ith), yTickFormat=ytfmt !p.multi[0] = !p.multi[0] - 1 initSig = info.nSigsOnPage-info.nOverLays-1 n = info.nSigsOnPage-initSig labels = STRARR( n ) for il = 0, n-1 do begin signal = info.lastNsigs( initSig+il ) labels[il] = getMDSlabel( signal, status=status, /quiet) if NOT status then begin ; just got the signal name back IF info.JustUseLeafName then labels[il] = LEAFNAME( signal ) endif if info.shotInLabel or $ info.lastNshots( initSig+il ) NE $ info.lastNshots( (initSig+il-1)>0 ) then begin labels[il] = labels[il] + ' ' + $ STRTRIM( info.lastNshots( initSig+il ), 2 ) endif endfor if n_elements( labels ) ne 2 then begin ;;;print,'legend 2' ;;;stop LEGEND, strtrim(labels,2), color=info.colors[0:n-1], $ lines=info.lines(0:n-1), $ /right, /top, CharSize = .8, $ spacing=1, BOX=0 endif else begin ;;; rowInPixels = 1.1*!d.Y_CH_SIZE rowInPixels = !d.Y_CH_SIZE topOfWindow = (!y.window[1])*!d.Y_VSIZE leftOfWindow = (!x.window[0])*1.04*!d.x_VSIZE xyouts,leftOfWindow+(1.4*!d.X_CH_SIZE), $ topOfWindow-(1.8*rowInPixels), labels[0], $ /device, CharSize = .8 xyouts,leftOfWindow+(1.4*!d.X_CH_SIZE), $ topOfWindow-(2.8*rowInPixels), labels[1], $ /device, color=info.colors[ith], CharSize = .8 endelse ENDELSE ENDELSE info.timeOfPlot = SYSTIME(1) ; keep track of what is on the page, for printing and replotting info.nBoxesOnPage = (!P.MULTI[2] * !P.MULTI[1]) - !P.MULTI[0] IF info.nBoxesOnPage LE 0 THEN BEGIN ; !p.multi not set info.nBoxesOnPage = 1 ENDIF ;;;print, 'info.nBoxesOnPage=', info.nBoxesOnPage ;;;print, 'info.nOnLastPlot=', info.nOnLastPlot if info.nBoxesOnPage EQ 1 AND info.nOnLastPlot-1 EQ 0 AND $ NOT info.shotInLabel then begin aLittleMore = 0 ;;; IF !Y.OMargin[1] GT 0 THEN aLittleMore = !Y.OMargin[1]/!D.Y_CH_Size topScreen = !D.Y_Size IF !d.name NE 'SGLIB' THEN topScreen = !D.Y_Size*0.980 screenTitle = 'Shot ' + STRTRIM(info.shot_num,2) IF refShot GT 0 THEN screenTitle = screenTitle + ' (' + $ STRTRIM(refShot,2) + ')' if !p.charsize EQ 0.0 then charsize=1.0 else charsize=!p.charsize xLoc = !d.X_size-!D.X_CH_Size/2. IF !D.NAME EQ 'TEK' then $ xLoc = !d.X_size-(STRLEN(screenTitle)+1)*!D.X_CH_Size XYOUTS, xLoc, $ topScreen-!D.Y_CH_Size*0.9, screenTitle, $ charsize=1.5, ALIGNMENT=1, /DEVICE endif ; if just one sig per plot, and shot changed if info.nBoxesOnPage GT 1 and info.Noverlays EQ 0 and $ NOT info.shotInLabel then begin if info.lastNshots[0] NE info.shot_num then begin screenTitle = 'Shot ' + STRTRIM(info.shot_num,2) xPos = !d.X_size*!x.region[1]-1 ;;;-!D.X_CH_Size/2. YPos = !Y.Region[1]*!D.Y_Size - (!y.margin[1]-1)*!D.Y_CH_Size XYOUTS, XPos, YPos, screenTitle, charsize=1, ALIGNMENT=1.0, /DEVICE endif endif if info.nBoxesOnPage EQ 1 then NSTXlogo, $ yloc=float(!D.Y_Size-1.9*!D.Y_CH_Size)/!D.Y_Size IF refShot GT 0 THEN BEGIN ; Overplot the same signal for the Reference shot OPLOT_REf, signals, info, isig ENDIF ENDIF ELSE BEGIN plot, [0,1], [0,1], /NoData, xgridstyle=0, ygridstyle=0, $ xstyle=4, ystyle=4, xtickname=replicate('',30), $ ytickname=replicate('',30) legend, [ info.signal_name , ' NOT FOUND'], charsize=.8, /left ; so copy, etc, works the same: info.nSigsOnPage = info.nSigsOnPage + 1 info.lastNsigs( info.nSigsOnPage-1 ) = info.signal_name info.lastNshots( info.nSigsOnPage-1 ) = info.shot_num ENDELSE ENDFOR ; if skipped x-tick labels in the middle, but last plotted, then labels if (info.SameXtitle or SameXLabel) AND $ ( (!P.MULTI[0]-1) MOD !P.MULTI[2] ) NE -1 THEN BEGIN ;;; if SameXLabel and KEYWORD_SET(LabelLast) then begin if KEYWORD_SET(LabelLast) then begin xUnits = MDSUnits( info.signal_name, /TIME, /UNITS ) if NWORDS( xunits ) EQ 0 THEN xUnits='Seconds' ; assume !!! IF NWORDS(!x.title) NE 0 THEN xUnits=!x.title ; overridden in xaxisw axis,xaxis=0,xrange=!x.crange,xtitle=xUnits,xstyle=1, xTickFormat=xtfmt ;;; axis, xaxis=0, xrange=!x.crange, xtitle=xUnits, xstyle=1, $ ;;; xtickname=replicate(' ',30) endif endif ;;;CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; tell the cross-hairs routines which graph is "active" CH_SET, 'Graphs' IF info.debug THEN PRINT, ' >>nsigsonpage=', info.nSigsOnPage IF info.debug THEN PRINT, ' >>last sig name=', info.lastNsigs( info.nSigsOnPage-1 ) IF info.debug EQ 3 THEN BEGIN PRINT,'Leaving PlotSomething:' PRINT,' !p.multi=', !p.multi PRINT,' info.NBOXES=',info.NBOXES PRINT,' info.NBOXESONPAGE=', info.NBOXESONPAGE PRINT,' info.NonLASTPLOT=', info.NonLASTPLOT PRINT,' info.NOVERLAYS=', info.NOVERLAYS PRINT,' info.NSIGSONPAGE=', info.NSIGSONPAGE PRINT,' info.SIGNAL_NAME=', info.SIGNAL_NAME PRINT,' info.LASTNSIGS=', info.LASTNSIGS(0:info.NSIGSONPAGE-1) ENDIF END ;---------------------------------------------------------------------------------- ; This routine handles events from the Signal Menu window PRO ListSigs_event, ev, GROUP_LEADER=group_leader debug = GETENV('DEBUG_IDL') ; get a logical/environmental variable ; get the User Value from the originating base widget WIDGET_CONTROL,ev.id, GET_UVALUE = uvalue IF debug GE 5 THEN PRINT, ' >>from ListSigs_event, UVALUE=', UVALUE ; get the ID of the big Info structure out of the widget base WIDGET_CONTROL, ev.top, GET_UVALUE=infoBaseID ; test for resize event strc_name = TAG_NAMES( ev, /STRUCTURE_NAME ) IF (strc_name EQ 'WIDGET_BASE') THEN BEGIN ; must be a resize event charWidth = 7 charHeighth = 16 nRowsOther = 9 newListLength = (ev.y - (nRowsOther*charHeighth))/charHeighth > 2 newXsize = ev.x/charWidth newYsize = newListLength ;;; IF !VERSION.OS EQ "vms" THEN BEGIN ;;; newXsize = newXsize/3. ;;; newYsize = newYsize*0.7 ;;; ENDIF WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY WIDGET_CONTROL, info.sList.listID, XSize=newXsize, YSize=newYsize WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY RETURN ENDIF CASE uvalue of 'addToListFromFile': BEGIN fileName = DIALOG_PICKFILE( FILTER='*.txt') IF fileName NE '' THEN BEGIN OPENR,lun,filename[0],/GET_LUN name = ' ' WHILE NOT EOF(lun) DO BEGIN READF, lun, name IF N_ELEMENTS(addToListFromFile) EQ 0 THEN $ addToListFromFile = STRTRIM(name,2) ELSE $ addToListFromFile = [ addToListFromFile, STRTRIM(name,2) ] ENDWHILE FREE_LUN,lun WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY SigList = [ info.sList.list(0:info.sList.listLength-1), addToListFromFile ] if n_elements( SigList ) GT n_elements( info.sList.list ) then begin dum = DIALOG_MESSAGE([' ***Too many signals, list truncated ***', $ ' (see programmer) '], /ERROR) SigList = SigList[ 0:info.maxListLen-1 ] endif if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE=TrimTagNames( SigList, /treeOnly ) $ else WIDGET_CONTROL, info.sList.listID, SET_VALUE=SigList info.sList.list = SigList info.sList.listLength = n_elements( SigList ) WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY ENDIF END 'addToList': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY prompt=['Enter signal to add to list', $ '(can include math & TDI expressions)'] widget_control, info.treeID, get_value=tree REMCHAR, tree, ':' ; in case user had unecessary characters REMCHAR, tree, '\' if STRUPCASE( tree[0] ) EQ 'NSTX' THEN $ prompt=['Enter signal to add to list', $ ' e.g., \tree::tagname', $ '(can include math & TDI expressions)'] entry = DIALOG_INPUT( prompt=prompt, $ /RETURN_EVENTS, width=60 ) IF NWORDS(entry) GT 0 THEN BEGIN IF STRPOS( entry, '\') LT 0 then begin dum = DIALOG_MESSAGE(' *** Signal must have \ in name ***', $ /ERROR) endif else begin SigList = [ info.sList.list(0:info.sList.listLength-1), entry ] if n_elements( SigList ) GT info.maxListLen then begin dum = DIALOG_MESSAGE([' ***Too many signals ***', $ ' (see programmer) '], /ERROR) endif else begin if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE=TrimTagNames( SigList, /treeOnly ) $ else WIDGET_CONTROL, info.sList.listID, SET_VALUE=SigList info.sList.list = SigList info.sList.listLength = n_elements( SigList ) endelse endelse ENDIF WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'DelSelected': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY index = WIDGET_INFO( info.sList.listid, /list_select) IF index LT 0 THEN index = 0 ; if none selected, take first one IF debug THEN PRINT,' >> Will delete selected item from list' IF index LE info.sList.listLength-1 THEN BEGIN info.sList.lastDelete = info.sList.list( index ) info.sList.listLength = info.sList.listLength - 1 info.sList.list = DelFromList( info.sList.list, index ) if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ TrimTagNames( info.sList.list(0:info.sList.listLength-1 ), /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ info.sList.list(0:info.sList.listLength-1 ) ; store the structure back in the main widget base ENDIF WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'EditSelected': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY index = WIDGET_INFO( info.sList.listid, /list_select) IF (index LE info.sList.listLength-1) AND (index GT 0) THEN BEGIN selectedItem = info.sList.list( index ) prompt=['Enter the New Signal name', $ ' (may be a TDI expression)'] entry = DIALOG_INPUT( prompt=prompt, $ /RETURN_EVENTS, Initial=selectedItem, width=60 ) if entry NE '' then BEGIN editedItem = entry info.sList.list(index) = editedItem endif if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ TrimTagNames( info.sList.list(0:info.sList.listLength-1 ), /treeOnly )$ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ info.sList.list(0:info.sList.listLength-1 ) ENDIF ; store the structure back in the main widget base WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'Erase': BEGIN ; get the structure out of the main widget base WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY ErasePlot, info ; store the structure back in the main widget base WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'exit': WIDGET_CONTROL,ev.top,/DESTROY 'GetNextGoodShot': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY nextGoodShot = NextGoodShot(info.shot_num,GoodValue=info.IpGoodShot) if nextGoodShot EQ -1 then begin msg3Lines=['Not able to find a next "Good" shot within 10 tries.', $ ' ', $ 'Data may not be available yet.' ] dum=DIALOG_MESSAGE( msg3Lines, /INFO) endif else begin info.shot_num = nextGoodShot WIDGET_CONTROL, info.shotID, SET_VALUE = info.shot_num newSig = info.sList.list !Y.RANGE = [0,0] ; start with autoscaling (?) !P.MULTI[0] = 0 ; to make sure starts with new page (best?) signals = info.sList.list(0:info.sList.listLength-1) PlotSomething, signals, info, /LabelLast endelse WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'GetPreviousGoodShot': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY nextGoodShot = NextGoodShot(info.shot_num,GoodValue=info.IpGoodShot, $ /BackWards) if nextGoodShot EQ -1 then begin msg=['Not able to find a previous "Good" shot within 10 tries.'] dum=DIALOG_MESSAGE( msg, /INFO) endif else begin info.shot_num = nextGoodShot WIDGET_CONTROL, info.shotID, SET_VALUE = info.shot_num newSig = info.sList.list !Y.RANGE = [0,0] ; start with autoscaling (?) !P.MULTI[0] = 0 ; to make sure starts with new page (best?) signals = info.sList.list(0:info.sList.listLength-1) PlotSomething, signals, info, /LabelLast endelse WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'JustListTags' : BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY ; toggle menu IF info.sList.JustListTags eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Just List Nodes with Tags' info.sList.JustListTags = 0 actionWord = 'display' ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='List All Node Names' info.sList.JustListTags = 1 actionWord = 'remove' ENDELSE dum=DIALOG_MESSAGE(['Click in the Filter field, and hit Enter', $ ' to '+actionWord+' non-tagged nodes'],/INFO) WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'ListScalars' : BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY ; toggle menu IF info.sList.ListScalars eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Also List Scalars' info.sList.ListScalars = 0 actionWord = 'not list' ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Do Not List Scalars' info.sList.ListScalars = 1 actionWord = 'display' ENDELSE dum=DIALOG_MESSAGE(['Click in the Filter field, and hit Enter', $ ' to '+actionWord+' scalars'],/INFO) WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'MoveUpSelected': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY index = WIDGET_INFO( info.sList.listid, /list_select) IF (index LE info.sList.listLength-1) AND (index GT 0) THEN BEGIN IF debug THEN PRINT,' >> Will move up selected item' selectedItem = info.sList.list( index ) swapItem = info.sList.list( index-1 ) info.sList.list(index-1) = selectedItem info.sList.list(index) = swapItem if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ TrimTagNames( info.sList.list(0:info.sList.listLength-1 ), /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ info.sList.list(0:info.sList.listLength-1 ) ENDIF ; store the big info structure back in the main widget base WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'PlotAllOnOnePage': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY newSig = info.sList.list !Y.RANGE = [0,0] ; start with autoscaling (?) ;;; !X.RANGE = [0,0] !p.multi[0] = 0 signals = info.sList.list(0:info.sList.listLength-1) if info.nSigsOnPage ge n_elements( info.lastNsigs ) then begin dum = DIALOG_MESSAGE([' ***Too many signals, list truncated ***', $ ' (see programmer) '], /ERROR) signals = info.sList.list(0:n_elements( info.lastNsigs )-1) endif ; round up info.nBoxes = fix( float(n_elements( signals ))/(info.nOverlays+1) + .999 ) setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, $ ;;;NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set !P varibles in cross-hair routines PlotSomething, signals, info, $ NOSETYRANGE=info.lastNoSetY, /LabelLast info.lastNoSetY = 0 info.NCols = !p.multi[1] info.NRows = !p.multi[2] ; store the big info structure back in the main widget base WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'PlotAllSerially': BEGIN ; get the big info structure out of the main widget base WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY newSig = info.sList.list !Y.RANGE = [0,0] ; start with autoscaling (?) !P.MULTI[0] = 0 ; to make sure starts with new page (best?) signals = info.sList.list(0:info.sList.listLength-1) ;;;PlotSomething, signals, info, NOSETYRANGE=info.lastNoSetY PlotSomething, signals, info, $ NOSETYRANGE=info.lastNoSetY, /LabelLast info.lastNoSetY = 0 IF info.debug EQ 15 THEN BEGIN PRINT,'After PlotAllSerially ', info.sList.sameXaxes PRINT,'info structure written to wid=', infoBaseID PRINT,'info.sameXaxes =', info.sameXaxes ENDIF info.NCols = !p.multi[1] info.NRows = !p.multi[2] ; store the big info structure back in the main widget base WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'PrintAll': BEGIN ; get the big info structure out of the main widget base WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY SETUP_PS, name, PRINTER=info.printer signals = info.sList.list(0:info.sList.listLength-1) ;;; PlotSomething, signals, info, NOSETYRANGE=info.lastNoSetY, $ ;;; /LabelLast PlotSomething, signals, info, $ NOSETYRANGE=info.lastNoSetY, /LabelLast, $ SHOTS=info.lastNshots(0:(info.NsigsOnPage-1)>0) UNSETUP_PS ; will print the above .ps file info.lastNoSetY = 0 ; store the big info structure back in the main widget base WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'readList': BEGIN fileName = DIALOG_PICKFILE( FILTER='*.txt', $ TITLE='Select File of Signal Names' ) IF fileName NE '' THEN BEGIN SigList = READ_LIST( filename[0] ) WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE=TrimTagNames( SigList, /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE=SigList info.sList.list = SigList info.sList.listLength = n_elements( SigList ) WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY ENDIF END 'readSCOPE': BEGIN fileName = DIALOG_PICKFILE( FILTER='*.scope', $ TITLE='Select SCOPE Input File' ) IF fileName NE '' THEN BEGIN SigList = GetScopeNames( filename[0], trees=trees ) ; need for tags like '\engineering::ip1+\ip2' SigList = addTreeToTag( SigList, trees ) WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE=TrimTagNames( SigList, /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE=SigList info.sList.list = SigList info.sList.listLength = n_elements( SigList ) WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY ENDIF END 'saveList': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY fileName = DIALOG_PICKFILE( FILTER='*.txt', /WRITE) IF fileName NE '' THEN BEGIN OPENW,lun,filename[0],/GET_LUN signals = info.sList.list FOR i = 0, info.sList.listLength - 1 DO BEGIN PRINTF, lun, STRTRIM(signals(i),2) ENDFOR FREE_LUN,lun ENDIF WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'getScreenSigs': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY nPlots = info.NsigsOnPage SigList = info.lastNsigs(0:nPlots-1) if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE=TrimTagNames( SigList, /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE=SigList info.sList.list = SigList info.sList.listLength = n_elements( SigList ) WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'SigList': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY index = ev.index newSig = info.sList.list( index ) IF ev.clicks EQ 1 THEN BEGIN ; if single click, plot signal ; get the big info structure out of the main widget base ; write the full name in the small box WIDGET_CONTROL, info.sigID, SET_VALUE=STRTRIM(newSig,2) Label = getMDSlabel( newsig, STAT=stat, textNode=textNode, /QUIET ) if stat AND nwords(label) GT 0 then $ WIDGET_CONTROL, info.sList.LabelID, SET_VALUE=Label ELSE $ WIDGET_CONTROL, info.sList.LabelID, SET_VALUE='' if NOT textNode THEN BEGIN ; something to plot info.signal_name = STRTRIM(newSig,2) PlotSomething, STRTRIM(newSig,2), info, $ NOSETYRANGE=info.lastNoSetY ;;;info.lastNoSetY = 0 ENDIF ENDIF ELSE IF ev.clicks EQ 2 THEN BEGIN ; if double click, delete PRINT,' >> double-click detected; will delete from list' IF index LE info.sList.listLength-1 THEN BEGIN info.sList.lastDelete = info.sList.list( index ) info.sList.listLength = info.sList.listLength - 1 info.sList.list = DelFromList( info.sList.list, index ) if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ TrimTagNames( info.sList.list(0:info.sList.listLength-1 ), /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, SET_VALUE= $ info.sList.list(0:info.sList.listLength-1 ) ENDIF ENDIF WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'SignalFilter': BEGIN ; get the big info structure out of the main widget base WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY WIDGET_CONTROL, ev.id, GET_VALUE=filter filter = STRUPCASE( STRTRIM( filter[0], 2 ) ) info.filter = filter WIDGET_CONTROL, info.treeID, GET_VALUE=tree info.MDStree = tree[0] ;;;SigList = MDSVALUE( 'findtags($)', filter, STATUS=status ) SigList = FindMDSNodes(info.filter, tags=info.sList.JustListTags, $ scalars=info.sList.ListScalars, $ shot=info.shot_num, treeName=tree[0], $ status=status ) IF status AND NWORDS(SigList) GT 0 THEN BEGIN if n_elements(SigList) gt info.maxListLen then begin print, ' (Signal list being limited to ' + $ strtrim(info.maxListLen)+' names)' SigList = SigList[0:info.maxListLen-1] endif if NOT info.sList.showEntire then $ trimmedNames = TrimTagNames( STRTRIM(SigList,2), /treeOnly ) $ ELSE trimmedNames = STRTRIM(SigList,2) sortInds = SORT( trimmedNames ) trimmedNames = trimmedNames( sortInds ) sigList = sigList( sortInds ) ; write the filtered list (without tree name) into the field WIDGET_CONTROL, info.sList.listID, SET_VALUE=trimmedNames info.sList.list = SigList info.sList.listLength = n_elements( SigList ) ENDIF ELSE BEGIN PRINT,'***bad filter, status=', status dum = DIALOG_MESSAGE( 'Sorry, nothing found', /info) ENDELSE WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'showEntire': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY info.sList.showEntire = ev.select SigList = info.sList.list(0:info.sList.listLength-1) if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, SET_VALUE=TrimTagNames( SigList, /treeOnly ) $ else WIDGET_CONTROL, info.sList.listID, SET_VALUE=SigList WIDGET_CONTROL, ev.id, SET_VALUE=info.sList.showEntire WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END 'UndoDelete': BEGIN WIDGET_CONTROL, infoBaseID, GET_UVALUE=info, /NO_COPY ; if item saved, append to bottom of list IF NWORDS( info.sList.lastDelete ) GT 0 THEN BEGIN info.sList.list = [ info.sList.list(0:info.sList.listLength-1), $ info.sList.lastDelete ] info.sList.listLength = info.sList.listLength + 1 info.sList.lastDelete = '' ; write the filtered list (without tree name) into the field if NOT info.sList.showEntire then $ WIDGET_CONTROL, info.sList.listID, $ SET_VALUE=TrimTagNames( info.sList.list(0:info.sList.listLength-1), /treeOnly ) $ ELSE WIDGET_CONTROL, info.sList.listID, $ SET_VALUE=info.sList.list(0:info.sList.listLength-1) ENDIF WIDGET_CONTROL, infoBaseID, SET_UVALUE=info, /NO_COPY END ENDCASE END ;-------------------------------------------------------------- ; This routine is called when user selects "Show Signal Menu" PRO ListSigs, info, GROUP_LEADER=group_leader ; Define the main widget base and all the buttons, fields, etc. BaseID = WIDGET_BASE( TITLE = 'MDSW Signal Menu',/COLUMN, MBAR=wMBarBase , $ TLB_Size_EVENTS=1 ) ; send event on resize ; create the file pull-down menu wFileMenu = WIDGET_BUTTON( wMBarBase, VALUE='File', /MENU) buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Get New List from a TEXT File...', $ UVALUE='readList') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Get New List from a SCOPE File...', $ UVALUE='readSCOPE') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Add Name to List...', $ UVALUE='addToList') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Add Names to List from a File...', $ UVALUE='addToListFromFile') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Save List to a File...', $ UVALUE='saveList') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Save Signals on Screen to List', $ UVALUE='getScreenSigs') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Print Plots of Whole List', $ UVALUE='PrintAll') buttonID1 = WIDGET_BUTTON( wFileMenu, VALUE='Dismiss', UVALUE='exit') ; create the edit pull-down menu wEditMenu = WIDGET_BUTTON( wMBarBase, VALUE='Edit', /MENU) buttonID1 = WIDGET_BUTTON( wEditMenu, VALUE='Undo Last Delete', $ UVALUE='UndoDelete') buttonID1 = WIDGET_BUTTON( wEditMenu, VALUE='Delete Selected Signal', $ UVALUE='DelSelected') buttonID1 = WIDGET_BUTTON( wEditMenu, VALUE='Move Selected Signal Up', $ UVALUE='MoveUpSelected') buttonID1 = WIDGET_BUTTON( wEditMenu, VALUE='Edit Selected Signal Name', $ UVALUE='EditSelected') dum = WIDGET_BUTTON( wEditMenu, VALUE='List All Node Names', $ UVALUE='JustListTags' ) dum = WIDGET_BUTTON( wEditMenu, VALUE='Do Not List Scalars', $ UVALUE='ListScalars' ) wplotMenu = WIDGET_BUTTON( wMBarBase, VALUE='Plot', /MENU) wButton = WIDGET_BUTTON( wplotMenu, VALUE='All of List on One Page', $ UVALUE='PlotAllOnOnePage') wButton = WIDGET_BUTTON( wplotMenu, VALUE='All of List per Setup', $ UVALUE='PlotAllSerially') wButton = WIDGET_BUTTON( wplotMenu, VALUE='Erase', $ UVALUE='Erase') rowID = WIDGET_BASE( BaseID, /ROW ) xSize = 20 fieldID = CW_FIELD( rowID, VALUE=info.filter, /STRING, /RETURN_EVENTS, $ xsize=xsize, TITLE='Filter:', UVALUE='SignalFilter') dummyID = WIDGET_LABEL(BaseID, value='click on signal to plot:', /ALIGN_CENTER) dummyID = WIDGET_LABEL(BaseID, value='double click on signal to delete:', $ /ALIGN_CENTER) if info.sList.listLength EQ 0 THEN BEGIN ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open ;;; MDSOPEN, info.MDStree, info.shot_num, stat=stat ;;;SigList = MDSVALUE( 'findtags($)',info.filter ) ; get a list of signals from mds SigList = FindMDSNodes(info.filter, tags=info.sList.JustListTags, $ scalars=info.sList.ListScalars, $ shot=info.shot_num, treeName=info.MDStree, $ status=status ) if n_elements(SigList) gt info.maxListLen then begin print, ' (Signal list being limited to ' + $ strtrim(info.maxListLen)+' names)' SigList = SigList[0:info.maxListLen-1] endif ;;;SigList = TrimTagNames( SigList, /treeOnly ) xSize = 40 IF !VERSION.OS EQ "vms" THEN xSize = 25 ; fonts smaller on VMS? trimmedNames = TrimTagNames( STRTRIM(SigList,2), /treeOnly ) sortInds = SORT( trimmedNames ) trimmedNames = trimmedNames( sortInds ) sigList = sigList( sortInds ) info.sList.listLength = n_elements(trimmedNames) info.sList.list[0:info.sList.listLength-1] = SigList ENDIF else trimmedNames = info.sList.list[0:info.sList.listLength-1] lengths = STRLEN( trimmedNames ) xSize = xsize < MAX(lengths) listID = WIDGET_LIST( BaseID, VALUE = trimmedNames, $ YSIZE = 24, XSIZE = xsize, UVALUE = 'SigList' ) info.sList.ListID = listID checkBase = CW_BGROUP(BaseID, 'Show entire signal name', $ UVALUE='showEntire', /NONEXCLUSIVE) void = WIDGET_LABEL(BaseID, value='Text/Label sub-node:', /ALIGN_LEFT) info.sList.labelID = WIDGET_LIST( BaseID, VALUE=' ', YSIZE=3, XSIZE=xsize ) widget_control, info.baseID, set_uvalue=info row1 = WIDGET_BASE( BaseID, /ROW ) dum = WIDGET_LABEL(row1, VALUE='Change Shot:') getlID = WIDGET_BUTTON(row1, VALUE=' 1 ErasePlot, UVALUE signals = UVALUE.lastNsigs(0:nPlots-1) IF NWORDS(signals) GT 0 THEN $ PlotSomething, signals, UVALUE, NOSETYRANGE=UVALUE.lastNoSetY, $ shots=UVALUE.lastNshots(0:(UVALUE.NsigsOnPage-1)>0) WIDGET_CONTROL, UVALUE.baseID, SET_UVALUE=UVALUE RETURN ENDIF ; get the information structure out of the widget base WIDGET_CONTROL, ev.top, GET_UVALUE=info IF n_tags(info) GT 0 THEN BEGIN IF (info.debug) GE 5 THEN BEGIN ; draw event too frequent: IF UVALUE NE 'draw' THEN PRINT, ' >>In mdsw_event; UVALUE=', UVALUE ENDIF ENDIF CASE UVALUE of 'addXticks' : BEGIN prompt=['Enter the title for the X-axis'] entry = DIALOG_INPUT( prompt=prompt, $ /RETURN_EVENTS, Initial='Seconds', width=60 ) if entry NE '' then BEGIN axis,xaxis=0,xrange=!x.crange,xtitle=entry endif END 'AlternateCT': BEGIN prompt=['Enter a new Color Palette (0-40)'] entry = DIALOG_INPUT( prompt=prompt, $ /RETURN_EVENTS, Initial='33', width=5 ) if entry NE '' then BEGIN ctn = LONG(entry) if ctn GE 0 and ctn LE 40 then begin !P.COLOR = MK_COLOR('black', TABLE=ctn, /QUIET) ; table 33 gives green box !P.BACKGROUND = MK_COLOR('white') ; when PC & millions colors endif endif END 'axisOnRight' : BEGIN ; toggle menu IF info.axisOnRight eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Make 2nd axis on right' info.axisOnRight = 0 info.nOverLays = (info.nOverLays-1) > 0 !X.MARGIN[1]=3 ErasePlot,info setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) print, ' (assuming no overlays desired)' ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='No Axis on Right' info.axisOnRight = 1 info.nOverLays = 1 ErasePlot,info setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) print, ' (assuming 1 overlay desired)' !X.MARGIN[1]=12 ENDELSE CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set !P varibles in cross-hair routines WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'bangPSettings' : bangPw, UPDATECALLBACK = 'ch_updateaxes' 'Break': STOP 'Connect': BEGIN server = GET_TEXT_INPUT('Enter an MDS server name', $ DEFAULT=getenv('MDSHOST')) IF NWORDS(server) GT 0 THEN BEGIN MDSCONNECT, server, status=status IF NOT status THEN dum=DIALOG_MESSAGE('Failed to connect to Server', $ /ERROR) ENDIF END 'CopyPlot': BEGIN IF info.debug EQ 15 THEN BEGIN PRINT,'info structure read from wid=', ev.top PRINT,'info.sameXaxes =', info.sameXaxes ENDIF if info.NsigsOnPage le 0 then begin dum = DIALOG_MESSAGE( 'Sorry, there are no plots on the screen', /info) return endif nPlots = info.NsigsOnPage signals = info.lastNsigs(0:nPlots-1) info.nBoxes = info.nBoxesOnPage ; to get a new window for copy !P.MULTI[0] = 0 ; to get a new window for copy PlotSomething, signals, info, /MovePlotWindow, $ NOSETYRANGE=info.lastNoSetY, $ /LabelLast, $ SHOTS=info.lastNshots(0:(info.NsigsOnPage-1)>0) WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'draw': BEGIN ; when cross-hair routines invoke an event CH_GET, 'Graphs' ; set "focus" to graphics widget for cross-hairs CH_EV_FIT, ev, CH_DATA = ch ; update the cursor position in wavelength and data value coord = CONVERT_COORD(ev.x,ev.y,/to_data,/device) WIDGET_CONTROL,info.xID,SET_VALUE=coord[0] WIDGET_CONTROL,info.yID,SET_VALUE=coord[1] CASE info.which_plot Of ; ("which_plot" not needed if the same done to all) 'whatever': BEGIN ; ; check for any mouse events in draw window ; CASE ch.status of 2: BEGIN ;box zoom requested !X.RANGE = [MIN(ch.box(*,0)),MAX(ch.box(*,0))] IF NOT info.justZoomX THEN BEGIN !Y.RANGE = [MIN(ch.box(*,1)),MAX(ch.box(*,1))] NoSetYrange = 1 ENDIF else NoSetYrange = 0 nPlots = info.NsigsOnPage ;;;ERASE ; just redraw last plot signals = info.lastNsigs(nPlots-1:nPlots-1) ;;;!P.MULTI[0] = 0 ; to erase screen ;;;signals = info.lastNsigs(0:nPlots-1) PlotSomething, signals, info, $ NOSETYRANGE=NoSetYrange ;;;!X.RANGE = [0,0] ; set the information structure out of the widget base info.lastNoSetY = NoSetYrange WIDGET_CONTROL, ev.top, SET_UVALUE=info CH_SET,'Graphs', NewX=!x,NewY=!y,NewP=!p END 3: BEGIN ; back to auto scaling !X.RANGE = [0,0] ;;; had commented out for a while IF NOT info.justZoomX THEN $ !Y.RANGE = [0,0] nPlots = info.NsigsOnPage > 1 ;;;ERASE ; just redraw last plot signals = info.lastNsigs(nPlots-1:nPlots-1) ;;;!P.MULTI[0] = 0 ; to erase screen ;;;signals = info.lastNsigs(0:nPlots-1) PlotSomething, signals, info ; set the information structure out of the widget base info.lastNoSetY = 0 WIDGET_CONTROL, ev.top, SET_UVALUE=info CH_SET,'Graphs', NewX=!x,NewY=!y,NewP=!p END 1: BEGIN Print, '> Button 1 - Gets this message' Print, '> Button 2 - Draw Box for resizing' Print, '> Button 3 - Return to Autoscaling' END ELSE: ch.status=0 ENDCASE END ELSE: ; don't worry ENDCASE END 'drawDashes' : BEGIN ; toggle menu IF info.drawDashes eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Draw dashes at y=0' info.drawDashes = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='No dashes at y=0' info.drawDashes = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'Erase': BEGIN ErasePlot, info WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'everyotherXticklabel' : BEGIN ; toggle menu IF info.everyotherXticklabel eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Label every other X Tick Mark' info.everyotherXticklabel = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE="Label every X Tick Mark" info.everyotherXticklabel = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'everyotherYticklabel' : BEGIN ; toggle menu IF info.everyotherYticklabel eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Label every other Y Tick Mark' info.everyotherYticklabel = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE="Label every Y Tick Mark" info.everyotherYticklabel = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'exit': WIDGET_CONTROL,/DESTROY,ev.top 'GetLatest': BEGIN info.shot_num = LASTSHOT() WIDGET_CONTROL, info.shotID, SET_VALUE = info.shot_num WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open END 'GetNextGoodShot': BEGIN ;;;stop nextGoodShot = NextGoodShot(info.shot_num,GoodValue=info.IpGoodShot) if nextGoodShot EQ -1 then begin msg3Lines=['Not able to find a next "Good" shot within 10 tries.', $ ' ', $ 'Data may not be available yet.' ] dum=DIALOG_MESSAGE( msg3Lines, /INFO) endif else begin info.shot_num = nextGoodShot WIDGET_CONTROL, info.shotID, SET_VALUE = info.shot_num endelse WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base PlotSomething, info.signal_name, info, $ NOSETYRANGE=info.lastNoSetY ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open END 'GetPreviousGoodShot': BEGIN nextGoodShot = NextGoodShot(info.shot_num,GoodValue=info.IpGoodShot, $ /BackWards) if nextGoodShot EQ -1 then begin msg=['Not able to find a previous "Good" shot within 10 tries.'] dum=DIALOG_MESSAGE( msg, /INFO) endif else begin info.shot_num = nextGoodShot WIDGET_CONTROL, info.shotID, SET_VALUE = info.shot_num endelse WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base PlotSomething, info.signal_name, info, $ NOSETYRANGE=info.lastNoSetY ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open END 'GoodShot': BEGIN sinput = GET_TEXT_INPUT('Enter Ip (Amps) required for next-shot buttons', $ DEFAULT_INPUT=STRING(info.IpGoodShot) ) finput=FLOAT( sinput ) IF info.debug THEN PRINT, ' >>> about to set IpGoodShot to', finput info.IpGoodShot = finput WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'Help_Program': BEGIN IF !VERSION.OS EQ "vms" $ THEN XDISPLAYFILE,'NSTX$:[util.source.idl_cvs]mdsw.txt',GROUP=ev.top, $ height=40 $ ELSE XDISPLAYFILE,GETENV('NSTXUSR')+'/util/idl_cvs/mdsw.txt',GROUP=ev.top, $ height=40 END 'History_Display': BEGIN IF !VERSION.OS EQ "vms" $ THEN XDISPLAYFILE,'NSTX$:[util.source.idl_cvs]mdsw_history.txt',GROUP=ev.top, $ height=40 $ ELSE XDISPLAYFILE,GETENV('NSTXUSR')+'/util/idl_cvs/mdsw_history.txt',GROUP=ev.top, $ height=40 END 'includeZero' : BEGIN ; toggle menu IF info.includeZero eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Always include 0 on y axis' info.includeZero = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE="Don't Force 0 on y axis" info.includeZero = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'JustUseLeafName' : BEGIN ; toggle menu IF info.JustUseLeafName eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Just Use (last) "Leaf" name for Plot Titles' info.JustUseLeafName = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Use Entire Signal name for Plot Titles' info.JustUseLeafName = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'ListSigs': BEGIN ; read tree & shot number from the screen widget WIDGET_CONTROL, info.treeID, GET_VALUE=tree REMCHAR, tree, ':' ; in case user had unecessary characters REMCHAR, tree, '\' info.MDStree=tree WIDGET_CONTROL, info.shotID, GET_VALUE=namedVar info.shot_num=namedVar which_plot = 'whatever' ListSigs, info, GROUP_LEADER=ev.top END 'NBoxes': BEGIN p = STRPOS( ev.value,'Row' ) IF p LT 0 THEN BEGIN p = STRPOS( ev.value,'Col' ) info.nCols = fix( strmid( ev.value, 0, p-1) ) PRINT,' (# cols set to ', STRTRIM(info.nCols,2), ' )' ENDIF ELSE BEGIN info.nRows = fix( strmid( ev.value, 0, p-1) ) PRINT,' (# rows set to ', STRTRIM(info.nRows,2), ' )' ENDELSE info.nBoxes = info.nCols*info.nRows setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set !P varibles in cross-hair routines ErasePlot,info WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'NOverLays': BEGIN info.nOverLays = fix( ev.value ) IF info.nOverLays GT 1 AND info.axisOnRight EQ 1 THEN BEGIN dum = DIALOG_MESSAGE( $ 'Sorry, but no more than one overlay is allowed when 2nd axis on right', /info) RETURN ENDIF ErasePlot,info setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set !P varibles in cross-hair routines WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'PlotDelete': BEGIN device, window_state=ws if ws[ev.value] then WDELETE, FIX(ev.value) END 'Plot': BEGIN ; read tree & shot number from the screen widget WIDGET_CONTROL, info.treeID, GET_VALUE=tree REMCHAR, tree, ':' ; in case user had unecessary characters REMCHAR, tree, '\' info.MDStree=tree WIDGET_CONTROL, info.shotID, GET_VALUE=namedVar info.shot_num=namedVar which_plot = 'whatever' WIDGET_CONTROL, info.sigID, GET_VALUE=signal info.signal_name = STRTRIM(signal[0],2) ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ;;; IF stat THEN BEGIN PlotSomething, info.signal_name, info, $ NOSETYRANGE=info.lastNoSetY ;;; ENDIF ELSE BEGIN ;;; dum=Dialog_Message('Error opening that shot', $ ;;; DIALOG_PARENT=info.baseID) ;;; ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'print_bitmap': BEGIN ; this printing is much faster, but low-res print,' (printing a bitmap; this may take a while)' IF ( (!D.NAME EQ 'X') OR (!D.NAME EQ 'MAC') OR (!D.NAME EQ 'WIN')) THEN $ WIDGET_CONTROL,/hourglass filename = '~/IDLbitmap.ps' ; will leave a file with this name if !VERSION.OS EQ "vms" then filename = 'sys$login:IDLbitmap.ps' SCREENDUMP, filename SPAWNPRINT, filename, PRINTER=Info.printer END 'print_plot': BEGIN if info.NsigsOnPage le 0 then begin dum = DIALOG_MESSAGE( 'Sorry, there are no plots on the screen', /info) return endif ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ; make sure is open name = 'mdsw' ; will leave a file with this name.ps IF ( (!D.NAME EQ 'X') OR (!D.NAME EQ 'MAC') ) THEN WIDGET_CONTROL,/hourglass SETUP_PS, name, PRINTER=info.printer signals = info.lastNsigs(0:info.NsigsOnPage-1) !P.MULTI[0] = 0 ; to make sure starts with new page PlotSomething, signals, info, $ NOSETYRANGE=info.lastNoSetY, $ /LabelLast, $ SHOTS=info.lastNshots(0:(info.NsigsOnPage-1)>0) UNSETUP_PS ; will print the above .ps file ;;;WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'Printer_Select': BEGIN info.printer = ev.value ; strip extra stuff in SETUP_PS ;;; if STRPOS( info.printer, '\') EQ 1 THEN $ ; strip menu indicator ;;; info.printer = STRMID(info.printer, 2, 100) WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'RefShot': BEGIN END 'ReloadCT': BEGIN !P.COLOR = MK_COLOR('black', TABLE=11, /QUIET) ; table 11 gives red box on middle button !P.BACKGROUND = MK_COLOR('white') END 'restoreSettings': BEGIN fileName = DIALOG_PICKFILE( TITLE='Restore settings from a file', $ FILTER='*.sav', /READ) IF fileName NE '' THEN BEGIN info = RESTORE_INFO( fileName, info ) tags = TAG_NAMES(info) dum = where(tags eq 'SLIST', nfound) if nfound le 0 then begin dum = DIALOG_MESSAGE([' *** Sorry that restore file is no good ***', $ ' (it may be an old version) '], $ /ERROR) return endif WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base ; reset fields on main windowo WIDGET_CONTROL, info.treeID, SET_VALUE=info.MDStree WIDGET_CONTROL, info.shotID, SET_VALUE=info.shot_num WIDGET_CONTROL, info.sigID, SET_VALUE=info.Signal_Name setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) msg3Lines = ['Settings Restored' , ' ', $ 'If the "MDSW Signal Menu" is open, Dismiss it and re-open from the Special Menu'] dum=dialog_message(msg3Lines, /INFO) ; some tags may not be in older save files: dum = where(tags eq 'REF_SHOT_NUM', nfound) if nFound GT 0 then BEGIN if info.REF_SHOT_NUM GT 0 then $ WIDGET_CONTROL, info.refShotID, SET_VALUE=info.REF_SHOT_NUM endif ; set buttons below plot window, if in save file dum = where(tags eq 'JUSTZOOMX_ID', nfound) if nFound GT 0 then $ WIDGET_CONTROL, info.justZoomX_ID, SET_VALUE=info.justZoomX dum = where(tags eq 'SAMEXAXES_ID', nfound) if nFound GT 0 then $ WIDGET_CONTROL, info.sameXaxes_ID, SET_VALUE=info.sameXaxes ENDIF END 'sameXaxes': BEGIN info.sameXaxes = ev.select if info.sameXaxes then info.sameXtitle = 1 setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set !P varibles in cross-hair routines WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'sameXtitle' : BEGIN ; toggle menu IF info.sameXtitle eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Assume same X-axis title' info.sameXtitle = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE="Don't Assume same X-axis title" info.sameXtitle = 1 ENDELSE setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) CH_SET, 'Graphs', NewX=!x,NewY=!y,NewP=!p ; to set !P varibles in cross-hair routines ErasePlot,info WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'saveEPS': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save to an EPS file', $ FILTER='*.epsi', /WRITE) IF fileName NE '' THEN BEGIN s = [2, !D.X_size, !D.Y_size] ; Set the plotting device to PostScript: SET_PLOT, 'ps' ; Use the DEVICE procedure to make the output encapsulated, ; 8 bits, color, and only as wide and high as it needs to ; be to contain the XWD image: DEVICE, /ENCAPSUL, BITS_PER_PIXEL=8, /COLOR, $ FILENAME=filename, XSIZE=S[1]/1000., $ YSIZE=S[2]/1000., /PREVIEW ; preview will let you see image ; Write the image to the file: nPlots = info.NsigsOnPage signals = info.lastNsigs(0:nPlots-1) PlotSomething, signals, info, $ /LabelLast, $ SHOTS=info.lastNshots(0:(info.NsigsOnPage-1)>0) ; Close the file: DEVICE, /CLOSE ; Return plotting to X Windows: SET_PLOT, 'x' ENDIF END 'savePS': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save to a PS file', $ FILTER='*.ps', /WRITE) IF fileName NE '' THEN BEGIN IF ( (!D.NAME EQ 'X') OR (!D.NAME EQ 'MAC') ) THEN WIDGET_CONTROL,/hourglass SETUP_PS, fileName, PRINTER='POSTSCRIPT' signals = info.lastNsigs(0:info.NsigsOnPage-1) !P.MULTI[0] = 0 ; to make sure starts with new page PlotSomething, signals, info, $ /LabelLast, $ SHOTS=info.lastNshots(0:(info.NsigsOnPage-1)>0) UNSETUP_PS ; will print the above .ps file ENDIF END 'savegif': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save to a GIF file', $ FILTER='*.gif', /WRITE ) IF fileName NE '' THEN BEGIN TVLCT, r, g, b, /get ; so colors aren't expanded to 256 WRITE_GIF, filename, TVRD(), r, g, b ENDIF END 'saveJPEG': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save to a JPEG file', $ FILTER='*.jpg', /WRITE) IF fileName NE '' THEN BEGIN MK_JPEG, filename=filename ENDIF END 'savePDF': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save to a PDF file', $ FILTER='*.pdf', /WRITE) IF fileName NE '' THEN BEGIN fdecomp, filename, disk, dir, name, ext psfilename = disk+dir+name+'.ps' SETUP_PS, psfilename, /color PlotSomething, info UNSETUP_PS ; will print the above .ps file spawn, 'convert '+psfilename+' '+filename ENDIF END 'saveSettings': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save settings to a file', $ FILTER='*.sav', /WRITE) IF fileName NE '' THEN BEGIN bangX = !x bangY = !y bangP = !p ; read from screen, in case user changed and didn't plot WIDGET_CONTROL, info.shotID, GET_VALUE=namedVar info.shot_num = namedVar WIDGET_CONTROL, info.refShotID, GET_VALUE=namedVar info.REF_SHOT_NUM = namedVar save,info,bangX,bangY,bangP,file=filename ENDIF END 'saveTEK': BEGIN fileName = DIALOG_PICKFILE( TITLE='Save to a Tektronix file', $ FILTER='*.TEK', /WRITE) IF fileName NE '' THEN BEGIN save_dev = !D.Name ;;;SET_PLOT,'tek' setup_tek DEVICE, file=filename !P.MULTI[0] = 0 ; add 5/01 for non-filled pages nPlots = info.NsigsOnPage signals = info.lastNsigs(0:nPlots-1) SHOTS = info.lastNshots(0:(info.NsigsOnPage-1)>0) PlotSomething, signals, info, /MovePlotWindow, $ NOSETYRANGE=info.lastNoSetY, $ /LabelLast, SHOTS=shots DEVICE, /CLOSE unsetup_tek ;;;SET_PLOT, save_dev ENDIF END 'screenDump': SPAWN,'xwd -name "MDS Custom Plotter" | lpr' 'SetAz': BEGIN prompt=['Set Degrees for Surface plot rotation around Z axis'] entry = DIALOG_INPUT( prompt=prompt, $ /RETURN_EVENTS, Initial=info.Az, /float, width=5 ) if entry NE '' then BEGIN info.Az = LONG(entry) endif signals = info.sList.list(0:info.sList.listLength-1) PlotSomething, signals, info, /LabelLast WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'SetAx': BEGIN prompt=['Set Degrees for Surface plot rotation around X axis'] entry = DIALOG_INPUT( prompt=prompt, $ /RETURN_EVENTS, Initial=info.Ax, /float, width=5 ) if entry NE '' then BEGIN info.Ax = LONG(entry) endif signals = info.sList.list(0:info.sList.listLength-1) PlotSomething, signals, info, /LabelLast WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'Shot': BEGIN ; read a new shot number from the screen widget WIDGET_CONTROL, info.treeID, GET_VALUE=tree REMCHAR, tree, ':' ; in case user had unecessary characters REMCHAR, tree, '\' info.MDStree=tree WIDGET_CONTROL, ev.id, GET_VALUE=shot_num info.shot_num = shot_num WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ;;; IF NOT stat THEN BEGIN ;;; dum=Dialog_Message('Error opening that shot', $ ;;; DIALOG_PARENT=info.baseID) ;;; ENDIF END 'ShotInLabel' : BEGIN ; toggle menu IF info.ShotInLabel eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Shot # Always in Plot Titles' info.ShotInLabel = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Shot # NOT Always in Plot Titles' info.ShotInLabel = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'Signal': BEGIN ; read tree & shot number from the screen widget WIDGET_CONTROL, info.treeID, GET_VALUE=tree REMCHAR, tree, ':' ; in case user had unecessary characters REMCHAR, tree, '\' info.MDStree=tree WIDGET_CONTROL, info.shotID, GET_VALUE=namedVar info.shot_num=namedVar ;;; stat = OpenMDSshot( info.MDStree, info.shot_num, SERVER=info.server ) ;;; IF stat then begin ; now plot signal WIDGET_CONTROL, ev.id, GET_VALUE=signal_name info.signal_name = STRTRIM(signal_name[0],2) ;;; IF stat THEN BEGIN PlotSomething, info.signal_name, info ;;; ENDIF ELSE BEGIN ;;; dum=Dialog_Message('Error opening that shot', $ ;;; DIALOG_PARENT=info.baseID) ;;; ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base ;;; endif END 'SurfacePlots' : BEGIN ; toggle menu IF info.SurfacePlots eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Make 2-D Plots as Surfaces' info.SurfacePlots = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Make 2-D Plots with Color-Filled Contours' info.SurfacePlots = 1 ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'TekPlot': begin if info.NsigsOnPage le 0 then begin dum = DIALOG_MESSAGE( 'Sorry, there are no plots on the screen', /info) return endif TekPlot end 'titleEachBox' : BEGIN ; toggle menu IF info.titleEachBox eq 1 THEN BEGIN WIDGET_CONTROL, ev.id, SET_VALUE='Title each box with shot #' info.titleEachBox = 0 ENDIF ELSE BEGIN WIDGET_CONTROL, ev.id, SET_VALUE="Don't Title each box with shot #" info.titleEachBox = 1 ENDELSE setPMulti, info.NBOXES, SameXLabels=info.sameXaxes, $ SameXTitles=info.sameXtitle, NRows=info.nRows, $ SamePTitles=(info.nOverLays GT 0) WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'tree': BEGIN WIDGET_CONTROL, ev.id, GET_VALUE=MDStree info.MDStree = MDStree[0] WIDGET_CONTROL, info.shotID, GET_VALUE=namedVar info.shot_num=namedVar ; store new information back in base widget uvalue WIDGET_CONTROL, ev.top, SET_UVALUE=info END 'XaxisSettings' : xAxisw, UPDATECALLBACK = 'ch_updateaxes' 'YaxisSettings' : BEGIN yAxisw, UPDATECALLBACK = 'ch_updateaxes' info.lastNoSetY = 1 ; so will use !Y.RANGE WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END 'ZaxisSettings' : BEGIN zAxisw, UPDATECALLBACK = 'ch_updateaxes' END 'RightYaxisLimits' : RightYaxisLimits, GROUP_LEADER=group_leader 'ZoomType': BEGIN info.justZoomX = ev.select WIDGET_CONTROL, ev.id, SET_VALUE=info.justZoomX WIDGET_CONTROL, ev.top, SET_UVALUE=info ; store back in base END ENDCASE RETURN END ;--------------------------------------------------------------- PRO mdsw, XSIZE=xsize, YSIZE=ysize, shot_num=shot_num, tree_in=tree_in, $ Ax=Ax, Az=Az, server=server, CharSize=CharSize, $ signal_name=signal_name, debug=debug, verbose=verbose if NOT usingXwindows() THEN return ; first do (from UNIX): setenv DEBUG_IDL 1, to get debug info printed if nwords(debug) eq 0 then debug = GETENV('DEBUG_IDL') ; get a logical/environmental variable if nwords(debug) eq 0 then debug = 0 if debug eq 0 then ON_ERROR,2 ;Return on error if n_elements( verbose ) eq 0 then begin if debug then verbose = 1 else verbose = 0 endif IF N_ELEMENTS(CharSize) EQ 0 THEN CharSize = 1 IF N_ELEMENTS(Ax) EQ 0 THEN Ax = 30 IF N_ELEMENTS(Az) EQ 0 THEN Az = 30 ; defaults for input fields IF N_ELEMENTS(tree_in) EQ 0 THEN MDStree = 'NSTX' else MDStree = tree_in IF N_ELEMENTS(server) EQ 0 THEN server = 'europa.pppl.gov:8501' IF !VERSION.OS EQ 'vms' THEN server = '' IF N_ELEMENTS(shot_num) EQ 0 THEN BEGIN shot_num = lastshot() IF (shot_num LT 100000) OR (shot_num GT 900000) THEN shot_num = 109070 ENDIF IF N_ELEMENTS(signal_name) EQ 0 THEN signal_name = '\wf::ip' IF STRPOS( STRUPCASE(domainName()), 'GAT' ) GE 0 THEN BEGIN MDStree = 'EFIT01' server = 'omega.gat.com' shot_num = 95334 signal_name = '\pinj' ENDIF which_plot = 'whatever' ; so doesn't read data for initial display filter = '*' ; initialize some system parameters !P.COLOR = MK_COLOR('black', TABLE=11, /QUIET) ; table 11 gives red box on middle button !P.BACKGROUND = MK_COLOR('white') !P.MULTI = 0 !X.MARGIN=[12,3] ; for when negative numbers with exponents needed on ticks !X.STYLE=2 & !Y.STYLE=2 ; Extend axes by 5% !X.TICKLEN=0.03 ; a little bigger ; set font size so characters and fields the same size on different platforms ;;;Device, Set_Character_Size = [5, 9] ;;;Widget_Control, Default_Font = '6x13' if charsize ne 1 then !p.charsize=charsize setPMulti, 1, CharSize=CharSize ; so when reset later, looks the same as initial plot UnSetPMulti ; to restore to previous settings maxListLen = 2000 ; Create a base and some fields baseID = WIDGET_BASE( TITLE='MDS Plotter', /COLUMN, MBAR=wMBarBase, $ TLB_Size_EVENTS=1 ) ; send event on resize ; create the file pull-down menu wMenu = WIDGET_BUTTON( wMBarBase, VALUE='File', /MENU) ;;; IF !Version.OS_Family EQ 'unix' THEN $ ;;; bmid5 = WIDGET_BUTTON( wMenu, VALUE='Dump Graphics Screen to Printer', $ ;;; UVALUE = 'screenDump' ) Printer_List = PPPL_Printers( ) printer = Printer_List[0] printer_pdmenu = MK_PDMENU( Printer_List ) ; make a submenu printer_pdmenu[0].flags = 0 tempID =WIDGET_BUTTON( wMenu, VALUE='Printer', /MENU) wPrintSelect = CW_PDMENU( tempID, printer_pdmenu, $ UVALUE='Printer_Select',/RETURN_NAME, /MBAR) bmid5 = WIDGET_BUTTON( wMenu, VALUE='Print', $ UVALUE = 'print_plot' ) dum = WIDGET_BUTTON(wMenu, VALUE="PRINT Bitmap", $ UVALUE="print_bitmap") dum = WIDGET_BUTTON( wMenu, VALUE="Save Image as GIF File...", $ UVALUE="savegif") dum = WIDGET_BUTTON( wMenu, VALUE="Save Image as JPEG File...", $ UVALUE="saveJPEG") dum = WIDGET_BUTTON( wMenu, VALUE="Save Image as PS File...", $ UVALUE="savePS") dum = WIDGET_BUTTON( wMenu, VALUE="Save Image as EPS File...", $ UVALUE="saveEPS") dum = WIDGET_BUTTON( wMenu, VALUE="Save as PDF File...", $ UVALUE="savePDF") dum = WIDGET_BUTTON( wMenu, VALUE="Save Image as Tek File...", $ UVALUE="saveTEK") dum = WIDGET_BUTTON( wMenu, VALUE="Save Settings...", $ UVALUE="saveSettings") dum = WIDGET_BUTTON( wMenu, VALUE="Restore Settings...", $ UVALUE="restoreSettings") dum = WIDGET_BUTTON( wMenu, VALUE='Connect to a different MDS server', $ UVALUE = 'Connect' ) wQuit = WIDGET_BUTTON( wMenu, VALUE='Quit', UVALUE='exit') ; create the edit pull-down menu wMenu = WIDGET_BUTTON( wMBarBase, VALUE='Edit', /MENU) dum = WIDGET_BUTTON( wMenu, VALUE='Copy Plot to another window', $ UVALUE='CopyPlot' ) dum = WIDGET_BUTTON( wMenu, VALUE='Copy Plot to Tek Window', $ UVALUE='TekPlot' ) dum = WIDGET_BUTTON( wMenu, VALUE='X-axis Settings...', $ UVALUE='XaxisSettings') dum = WIDGET_BUTTON( wMenu, VALUE='Y-axis Settings...', $ UVALUE='YaxisSettings') dum = WIDGET_BUTTON( wMenu, VALUE='Z-axis Settings...', $ UVALUE='ZaxisSettings') dum = WIDGET_BUTTON( wMenu, VALUE='Right Y-axis Settings...', $ UVALUE='RightYaxisLimits') dum = WIDGET_BUTTON( wMenu, VALUE='Main Plot Settings (!P)...', $ UVALUE='bangPSettings') dum = WIDGET_BUTTON( wMenu, VALUE='Set Good-Shot Criterion', $ UVALUE='GoodShot' ) nPerMenu = WIDGET_BUTTON( wMenu, VALUE='Delete Copied Plot', /MENU) ;FOR i=0,20 DO dum = WIDGET_BUTTON( nPerMenu, VALUE=STRTRIM(i+1,2)+' Plots', $ ; UVALUE='NBoxes' ) desc = [ '0\4' , '0\5' , '0\6' , '0\7' , '0\8' , '0\9' , $ '0\10' , '0\11' , '0\12' , '0\13' , $ '0\14' , '0\15' , '0\16' , '0\17' , $ '0\18' , '0\19' , '0\20', '0\21' , '0\22' , '0\23' , $ '0\24' , '0\25' , '0\26' , '0\27' , $ '0\28' , '0\29' , '2\30' ] menu = CW_PDMENU(nPerMenu, desc, UVALUE='PlotDelete',/RETURN_NAME, /MBAR) dum = WIDGET_BUTTON( wMenu, VALUE='Erase', UVALUE='Erase') ; create another pull-down menus specialMenu = WIDGET_BUTTON( wMBarBase, VALUE='Special', /MENU) dum = WIDGET_BUTTON( specialMenu, VALUE='Show Signal Menu', $ UVALUE = 'ListSigs' ) dum = WIDGET_BUTTON( specialMenu, VALUE='Get Latest Shot #', $ UVALUE = 'GetLatest' ) ; create another pull-down menu wMenu = WIDGET_BUTTON( wMBarBase, VALUE='Appearance', /MENU) dum = WIDGET_BUTTON( wMenu, VALUE='Make 2nd axis on right', $ UVALUE = 'axisOnRight' ) axisOnRight = 0 dum = WIDGET_BUTTON( wMenu, VALUE='No dashes at y=0', $ UVALUE='drawDashes' ) drawDashes = 1 dum = WIDGET_BUTTON( wMenu, VALUE='Always include 0 on y axis', $ UVALUE='includeZero' ) includeZero = 0 dum = WIDGET_BUTTON( wMenu, VALUE='Label every other Y Tick Mark', $ UVALUE='everyotherYticklabel' ) everyotherYticklabel = 0 dum = WIDGET_BUTTON( wMenu, VALUE='Label every other X Tick Mark', $ UVALUE='everyotherXticklabel' ) everyotherXticklabel = 0 ;;; dum = WIDGET_BUTTON( wMenu, VALUE='Title each box with shot #', $ ;;; UVALUE='titleEachBox' ) titleEachBox = 0 dum = WIDGET_BUTTON( wMenu, VALUE='Assume same X-axis title', $ UVALUE='sameXtitle' ) sameXtitle = 0 dum = WIDGET_BUTTON( wMenu, VALUE='Add X tick labels to last plot', $ UVALUE='addXticks' ) JustUseLeafName = 0 dum = WIDGET_BUTTON( wMenu, VALUE='Just Use (last) "Leaf" name for Plot Title', $ UVALUE='JustUseLeafName' ) ShotInLabel = 0 dum = WIDGET_BUTTON( wMenu, VALUE='Shot # Always in Plot Titles', $ UVALUE='ShotInLabel' ) dum = WIDGET_BUTTON( wMenu, VALUE='Alternate Color Table...', $ UVALUE='AlternateCT' ) dum = WIDGET_BUTTON( wMenu, VALUE='Reload Default Color Table', $ UVALUE='ReloadCT' ) SurfacePlots = 1 dum = WIDGET_BUTTON( wMenu, VALUE='Make 2-D Plots with Color-Filled Contours', $ UVALUE='SurfacePlots' ) dum = WIDGET_BUTTON( wMenu, VALUE='Set Az for Surface Plots...', $ UVALUE='SetAz' ) dum = WIDGET_BUTTON( wMenu, VALUE='Set Ax for Surface Plots...', $ UVALUE='SetAx' ) ; create another pull-down menu nPerMenu = WIDGET_BUTTON( wMBarBase, VALUE='Arrangement', /MENU) ;FOR i=0,20 DO dum = WIDGET_BUTTON( nPerMenu, VALUE=STRTRIM(i+1,2)+' Plots', $ ; UVALUE='NBoxes' ) desc = [ '1\# Rows', '0\1 Row' , '0\2 Rows' , '0\3 Rows' , $ '0\4 Rows' , '0\5 Rows' , '0\6 Rows' , '0\7 Rows' , $ '0\8 Rows' , '0\9 Rows' , '2\10 Rows' , $ '1\# Columns', '0\1 Column' , '0\2 Columns' , '0\3 Columns' , $ '0\4 Columns' , '0\5 Columns' , '0\6 Columns' , $ '0\7 Columns' , '0\8 Columns' , '0\9 Columns' , $ '2\10 Columns' ] menu = CW_PDMENU(nPerMenu, desc, UVALUE='NBoxes',/RETURN_NAME, /MBAR) ; create another pull-down menu nPerMenu = WIDGET_BUTTON( wMBarBase, VALUE='#_Overlays', /MENU) ;FOR i=0,20 DO dum = WIDGET_BUTTON( nPerMenu, VALUE=STRTRIM(i+1,2)+' Plots', $ ; UVALUE='NPlots' ) desc = [ '0\0' , '0\1' , '0\2' , '0\3' , '0\4' , $ '0\5' , '0\6' , '0\7' , '0\8' , '0\9' , $ '0\10' , '0\11' , '0\12' , '0\13' , $ '0\14' , '0\15' , '0\16' , '0\17' , $ '0\18' , '0\19' , '2\20' ] menu = CW_PDMENU(nPerMenu, desc, UVALUE='NOverLays',/RETURN_NAME, /MBAR) ; create the Help pull-down menu wHelpMenu = WIDGET_BUTTON( wMBarBase, VALUE='Help', /HELP) wHelpButton = WIDGET_BUTTON( wHelpMenu, VALUE='Help', UVALUE='Help_Program') wHelpButton = WIDGET_BUTTON( wHelpMenu, VALUE='Modification History', UVALUE='History_Display') dum = WIDGET_BUTTON( wHelpMenu, VALUE='Break (for Programmer)', UVALUE='Break') ; keep window within screen size DEVICE, GET_SCREEN_SIZE = cScrnsz ; Determine hardware display size IF N_ELEMENTS( cScrnsz ) LE 0 THEN BEGIN dum=DIALOG_MESSAGE( 'This application can not be started from the ' + $ !D.NAME + ' graphics device' ) RETURN ENDIF xSize_pref = 550 < (.9 * cScrnsz[0]) ; Keep window within screen size ySize_pref = 400 < (.5 * cScrnsz[1]) IF N_ELEMENTS( xsize ) GT 0 THEN BEGIN xSize_toUse = xsize < cScrnsz[0] ; don't make bigger than screen ENDIF ELSE xSize_toUse = xSize_pref IF N_ELEMENTS( ysize ) GT 0 THEN BEGIN ySize_toUse = ysize < cScrnsz[1] ; don't make bigger than screen ENDIF ELSE ySize_toUse = ySize_pref wLRow = WIDGET_BASE(baseID, /ROW) buttonID2 = WIDGET_BUTTON(wLRow, VALUE=' Plot ', UVALUE='Plot') bCol = WIDGET_BASE(wLRow, /COL) row1 = WIDGET_BASE(bCol, /ROW) treeID = CW_FIELD(row1, Title='tree: ',/RETURN_EVENTS,/STRING, $ XSIZE=12, VALUE=MDStree, UVALUE = 'tree' ) dum = WIDGET_LABEL(row1, VALUE='Shot:') getlID = WIDGET_BUTTON(row1, VALUE='<', UVALUE = 'GetPreviousGoodShot' ) shotID = CW_FIELD(row1, /RETURN_EVENTS, TITLE=' ', /LONG, $ XSIZE=8, VALUE=shot_num, UVALUE = 'Shot' ) ;;; shotID = CW_FIELD(row1, Title='Shot: ',/RETURN_EVENTS, /LONG, $ ;;; XSIZE=7, VALUE=shot_num, UVALUE = 'Shot' ) getlID = WIDGET_BUTTON(row1, VALUE='>', UVALUE = 'GetNextGoodShot' ) RefShotID = CW_FIELD(row1, Title='Ref: ', /LONG, $ XSIZE=8, UVALUE = 'RefShot' ) xsize = 48 row2 = WIDGET_BASE(bCol, /ROW) sigID = CW_Field(row2, Title='Signal: ',/RETURN_EVENTS, /STRING, $ XSIZE=xsize, VALUE=signal_name, UVALUE = 'Signal' ) dum = WIDGET_BUTTON( row2, VALUE='Erase', UVALUE='Erase') dummyID = WIDGET_LABEL(baseID, $ value='to rescale: draw a box (middle button) on the last plot:', $ /ALIGN_CENTER) dummyID = WIDGET_LABEL(baseID, $ value='(click with right mouse button to autoscale)', $ /ALIGN_CENTER) ; Create the Draw widget baseRow1 = WIDGET_BASE( baseID, /ROW ) drawID = WIDGET_DRAW(baseRow1, RETAIN=2, XSIZE=xSize_toUse, $ YSIZE=ySize_toUse, $ /BUTTON_EVENTS, /MOTION_EVENTS, $ UVALUE='draw') ; create location fields baseRow2 = WIDGET_BASE( baseID, /ROW ,xoffset=100, yoffset=100 ) xID = CW_FIELD( baseRow2,title='x:',value = 0.0, xsize=12, /NOEdit ) yID = CW_FIELD( baseRow2,title='y:',value = 0.0, xsize=12, /NOEdit ) zoomInit = 1 justZoomX_ID = CW_BGROUP(baseRow2, 'Only Zoom X-axis', $ UVALUE='ZoomType', /NONEXCLUSIVE, set_value=zoomInit) sameXaxes_ID = CW_BGROUP(baseRow2, 'Assume same X-axis', $ UVALUE='sameXaxes', /NONEXCLUSIVE) WIDGET_CONTROL,baseID,/REALIZE WIDGET_CONTROL, drawID, GET_VALUE=wID ; get the graphics window ID WSET, wID ; set the graphics window ; create a structure to pass through the widget base colors = [MK_COLOR("black"), MK_COLOR("red"), MK_COLOR("blue"), $ MK_COLOR("green")] colors = [ colors, colors ] sList = { showEntire : 0, $ JustListTags : 1, $ lastDelete : '', $ labelID : 0L, $ list : STRARR(maxListLen), $ listLength : 0L, $ listID : 0L, $ ListScalars : 1 } info ={ $ axisOnRight : axisOnRight, $ ax : ax, $ az : az, $ baseID : baseID, $ colors : colors, $ SurfacePlots : SurfacePlots, $ debug : debug, $ drawDashes : drawDashes, $ drawID : drawID, $ drawXsize : xSize_toUse, $ drawYsize : ySize_toUse, $ everyotherXticklabel : everyotherXticklabel, $ everyotherYticklabel : everyotherYticklabel, $ filter : filter, $ includeZero : includeZero, $ IpGoodShot : 30000., $ JustUseLeafName : JustUseLeafName, $ justZoomX : zoomInit, $ justZoomX_ID: justZoomX_ID, $ lastNoSetY : 0, $; if=1, then last plot used mouse for y-scaling lastNsigs : STRARR(maxListLen), $ lastNshots : LONARR(maxListLen), $ lines :[0,2,4,0,2,4,0,2,4], $ maxListLen : maxListLen, $ maxOnPage : 150, $ MDStree : MDStree , $ nBoxes : 1, $ nBoxesOnPage: 0, $ nCols : 1, $ nOnLastPlot : 0, $ NoSetYrange : 0, $ nOverLays : 0, $ nRows : 1, $ nSigsOnPage : 1, $ PlotSaveWindow : 4, $ Printer : Printer , $ Printer_List: Printer_List, $ refShotID : refShotID, $ REF_SHOT_NUM: 0L, $ sameXaxes : 0, $ sameXaxes_ID: sameXaxes_ID, $ sameXtitle : sameXtitle, $ server : server, $ shot_num : shot_num , $ shotID : shotID, $ shotInLabel : shotInLabel, $ sigID : sigID, $ signal_name : signal_name , $ sList : sList, $ timeOfPlot : SYSTIME(1), $ titleEachBox: titleEachBox, $ treeID : treeID, $ which_plot : which_plot, $ wid : wID, $ xID : xID, $ yID : yID } ; store structure in the widget base WIDGET_CONTROL,baseID, SET_UVALUE=info COMMON common_forInteractive, baseID_save baseID_save = baseID ; Register the Window and call XMANAGER, which will wait for events CH_REGISTER, 'Graphs', wID IF debug NE "" THEN XMANAGER, CATCH=0 ; want to stop if error detected ;;;ListSigs, info, GROUP_LEADER=baseID XMANAGER,'mdsw', baseID, CLEANUP='ch_clear', /no_block, GROUP_LEADER=baseID ; (may not want this displayed as a default) IF !Version.os_family NE 'vms' THEN BEGIN IF ( (!D.NAME EQ 'X') OR (!D.NAME EQ 'MAC') OR (!D.NAME EQ 'WIN')) THEN $ WIDGET_CONTROL,/hourglass ListSigs, info, GROUP_LEADER=baseID ENDIF END