;+ ; Project : SOHO - LASCO/EIT ; ; Name : MVIPLAY ; ; Purpose : Widget tool to display animation sequence. ; ; Explanation : This tool allows the user to view a series of images as ; an animation sequence. The user can control the direction, ; speed, and number of frames with widget controls. ; Click any mouse button inside draw window to bring forward/hide ; control widget. ; ; Use : IDL> MVIPLAY [, mvifile [,/FITSCREEN [,SKIP=skip]]] ; ; Without any inputs, program will prompt user to select an existing .mvi file. ; Example : IDL> MVIPLAY ; ; Or you could have one argument, the .mvi file you want to load. ; Example : IDL> MVIPLAY, 'mymovie.mvi' ; ; Use keyword /FITSCREEN to redimension image to 640x480 ; Example : IDL> MVIPLAY, 'mymovie.mvi', /FITSCREEN ; ; Use the keyword SKIP to skip every n frames (good for large movies). ; Example : IDL> MVIPLAY, SKIP=1 ;* to skip every other frame ; ; Use the keyword START to start reading movie at frame n (good for large movies). ; Example : IDL> MVIPLAY, START=100 ;* frame 100 becomes 1st frame of movie ; ; Use the keyword LENGTH to specify number of frames to read in (good for large movies). ; Example : IDL> MVIPLAY, START=100, LENGTH=60 ;* to load frames 100-159 ; ; Use the keyword TIMES to display date & time on frames (if not already there). ; Example : IDL> MVIPLAY, /TIMES ; ; Calls : BREAK_FILE ; ; Side effects: None. ; ; Category : Image Display. Animation. ; ; Written : Scott Paswaters, NRL Dec. 2 1996. ; Modified : SEP 10 Jan 1997 - Added SKIP,START,LENGTH,TIMES keywords. ; SEP 05 Feb 1997 - Mods for mvi version 1 format. ; SEP 04 Apr 1997 - Fixed swapflag for .mvi files written on big_endian workstations ; ; Version : 2.0 ; ; See Also : MKMOVIE.PRO ; @(#)mviplay.pro 1.1 10/12/96 LASCO IDL LIBRARY ;- ;____________________________________________________________________________ ; PRO READ_MVI, lu, file_hdr, ihdrs, imgs, swapflag file_hdr = {file_hdr, nf:0, $; # images in file nx:0, $; # columns in each image ny:0, $; # rows in each image mx:0, $; # maximum number of images in file nb:0L, $; # bytes in image header ver:0, $; # mvi version number ;following for version 1 fh_nb:0, $; bytes in file header sunxcen:0.0, $; sun x center sunycen:0.0, $; sun y center sec_pix:0.0} ; arc seconds per pixel nb = 128 tmp_file_hdr = ASSOC(lu,INTARR(nb/2)) tmp_fh = tmp_file_hdr(0) nf = tmp_fh(0) nx = tmp_fh(1) ny = tmp_fh(2) nb = tmp_fh(4) ver = tmp_fh(5) IF (ver LT 0) OR (ver GT 10) OR (nx LE 0) OR (ny LE 0) OR (nb LE 0) OR (nb LE 0) THEN BEGIN BYTEORDER, tmp_fh swapflag = 1 ENDIF ELSE swapflag = 0 file_hdr.nf = tmp_fh(0) file_hdr.nx = tmp_fh(1) file_hdr.ny = tmp_fh(2) file_hdr.mx = tmp_fh(3) file_hdr.nb = LONG(tmp_fh(4)) file_hdr.ver = tmp_fh(5) file_hdr.fh_nb = file_hdr.nb IF (file_hdr.ver EQ 1) OR (file_hdr.ver EQ 2) THEN BEGIN f_nb = 20 file_hdr.fh_nb = LONG(tmp_fh(6)) file_hdr.sunxcen = tmp_fh(7) file_hdr.sunxcen = tmp_fh(8) IF (file_hdr.ver EQ 2) THEN BEGIN file_hdr.sunxcen = FLOAT(file_hdr.sunxcen)/10 file_hdr.sunycen = FLOAT(file_hdr.sunycen)/10 ENDIF file_hdr.sec_pix = FLOAT(tmp_fh(9))/100 red = ASSOC(lu,BYTARR(256), f_nb) green = ASSOC(lu,BYTARR(256), f_nb+256) blue = ASSOC(lu,BYTARR(256), f_nb+256+256) r = red(0) g = green(0) b = blue(0) TVLCT, r, g, b ENDIF ihdrs = ASSOC(lu,BYTARR(file_hdr.nb), file_hdr.fh_nb) imgs = ASSOC(lu,BYTARR(file_hdr.nx,file_hdr.ny),file_hdr.fh_nb+file_hdr.nb*(file_hdr.mx)) END pro break_file, file, disk_log, dir, filnam, ext, fversion, node ;+ ; Project : SOHO - CDS ; ; Name : ; BREAK_FILE ; Purpose : ; Break a filename into its component parts. ; Explanation : ; Given a file name, break the filename into the parts ; of disk/logical, the directory, the filename, the ; extension, and the file version (for VMS) ; Use : ; BREAK_FILE, FILE, DISK_LOG, DIR, FILNAM, EXT, FVERSION, NODE ; Inputs : ; file - The file name ; Opt. Inputs : ; None. ; Outputs : ; disk_log- The disk or logical (looks for a ":") ; This is generally only valid on VMS machines ; dir - The directory ; filnam - The filename (excluding the ".") ; ext - The filename extension (including the ".") ; fversion- The file version (only VMS) ; node - The Node name (only VMS) ; Opt. Outputs: ; None. ; Keywords : ; None. ; Calls : ; None. ; Common : ; None. ; Restrictions: ; VMS: ; Assumes that : always precedes [] ; ULTRIX: ; Right now it has trouble with the ultrix option of use ; of "." or ".." ; Side effects: ; None. ; Category : ; Utilities, Operating_system. ; Prev. Hist. : ; Written 1988 by M.Morrison ; Aug-91 (MDM) Changed to handle Unix filename convensions ; 28-Feb-92 (MDM) * Adjusted to handle arrays ; 11-Mar-92 (MDM) - Perform a STRTRIM(x,2) on input string before ; doing the "break-up" ; 1-Dec-92 (MDM) - Moved code to do filename, extension and version ; number for both VMS and Unix (previously it ; did not do version number code for Unix) ; 29-Jan-93 (DMZ/MDM) - checked for node in file name ; Written : ; M. Morrison, August 1991. ; Modified : ; Version 1, William Thompson, GSFC, 23 April 1993. ; Incorporated into CDS library. ; Version 1.1, William Thompson, GSFC, 7 May 1993. ; Added IDL for Windows compatibility. ; Version : ; Version 1.1, 7 May 1993. ;- ; n = n_elements(file) node = strarr(n) disk_log = strarr(n) dir = strarr(n) filnam = strarr(n) ext = strarr(n) fversion = strarr(n) ; for ifil=0,n-1 do begin file0 = file(ifil) file0 = strtrim(file0, 2) ;MDM added 11-Mar-92 len=strlen(file0) ; ;-- node name present ;DMZ added Jan'93 ; (if so then strip it off now and then add it back later) dcolon=strpos(file0,'::') if dcolon gt -1 then begin node(ifil)=strmid(file0,0,dcolon+2) file0=strmid(file0,dcolon+2,1000) endif ; if (!version.os eq 'vms') then begin ;WTT changed 7-May-93 p=strpos(file0,':') if (p ne 1) then disk_log(ifil)=strmid(file0,0,p+1) ;includes : len=len-p+1 file0=strmid(file0, p+1, len) ; p=strpos(file0,']') if (p ne -1) then dir(ifil)=strmid(file0,0,p+1) ;includes ] len=len-p+1 file0=strmid(file0, p+1, len) ; ; William Thompson, added support for Microsoft Windows, 7 May 1993. ; end else if STRLOWCASE(STRMID(!version.os,0,3)) eq 'win' then begin p = strpos(file0,':') if p ne -1 then begin disk_log(ifil) = strmid(file0,0,p+1) ;Includes : len = len - p + 1 file0 = strmid(file0,p+1,len) endif p = -1 while (strpos(file0,'\', p+1) ne -1) do p = strpos(file0,'\',p+1) ;find last \ dir(ifil) = strmid(file0, 0, p+1) file0 = strmid(file0, p+1, len-(p+1)) end else begin p = -1 ;WTT changed 7-May-93 while (strpos(file0,'/', p+1) ne -1) do p = strpos(file0,'/',p+1) ;find last / dir(ifil) = strmid(file0, 0, p+1) file0 = strmid(file0, p+1, len-(p+1)) end p=strpos(file0,'.') if (p eq -1) then begin filnam(ifil) = strmid(file0,0,len) p=len end else filnam(ifil) = strmid(file0,0,p) ;not include . len=len-p file0=strmid(file0, p, len) ; p=strpos(file0,';') if (p eq -1) then begin ext(ifil) = strmid(file0,0,len) p=len end else ext(ifil) = strmid(file0,0,p) ;includes . but not ; len=len-p file0=strmid(file0, p, len) ; fversion(ifil) = '' if (len ne 0) then fversion(ifil) = file0 ;-- now prefix disk name with node name if node(ifil) ne '' then disk_log(ifil)=node(ifil)+disk_log(ifil) end ; if (n eq 1) then begin ;turn output into scalars disk_log = disk_log(0) dir = dir(0) filnam = filnam(0) ext = ext(0) fversion = fversion(0) node = node(0) end ; end ;____________________________________________________________________________ ; PRO WRUNMOVIE_DRAW0, ev COMMON MVI_COMMON, base WIDGET_CONTROL, base, GET_UVALUE=moviev ; get structure from UVALUE IF (ev.press GT 0) THEN RETURN ;** only look at PRESS events IF (moviev.showmenu EQ 0) THEN BEGIN WIDGET_CONTROL, moviev.base, MAP=1 moviev.showmenu = 1 ENDIF ELSE BEGIN WIDGET_CONTROL, moviev.base, MAP=0 moviev.showmenu = 0 ENDELSE WIDGET_CONTROL, base, SET_UVALUE=moviev END ;------------------ runmovie event ------------------------------- PRO WRUNMOVIE_EVENT0, ev WIDGET_CONTROL, ev.top, GET_UVALUE=moviev ; get structure from UVALUE IF (ev.id EQ ev.handler) THEN BEGIN ; A top level base timer event IF (moviev.forward) THEN BEGIN ;** going forward IF ((moviev.bounce) AND (moviev.current EQ moviev.last)) THEN BEGIN moviev.current = moviev.last-1 moviev.pause = 1 moviev.forward = 0 ;** set direction to reverse ENDIF $ ELSE BEGIN moviev.current = (moviev.current + 1) MOD moviev.len IF ((moviev.current EQ 0) AND (moviev.bounce EQ 0)) THEN moviev.pause = 1 IF ((moviev.current GT moviev.last) OR (moviev.current LT moviev.first)) THEN BEGIN moviev.pause = 1 moviev.current = moviev.first ENDIF ENDELSE ENDIF $ ELSE BEGIN ;** going in reverse IF ((moviev.bounce) AND (moviev.current EQ moviev.first)) THEN BEGIN moviev.current = moviev.first+1 moviev.pause = 1 moviev.forward = 1 ;** set direction to forward ENDIF $ ELSE BEGIN moviev.current = (moviev.current - 1) MOD moviev.len IF ((moviev.current EQ moviev.last) AND (moviev.bounce EQ 0)) THEN moviev.pause = 1 IF ((moviev.current LT moviev.first) OR (moviev.current GT moviev.last)) THEN BEGIN moviev.current = moviev.last moviev.pause = 1 ENDIF ENDELSE ENDELSE IF (moviev.pause AND moviev.dopause) THEN BEGIN moviev.pause = 0 WAIT, .75 ENDIF ;** out of range error checks (to stop bombs from COPY) IF (moviev.current LT 0) THEN moviev.current = moviev.first IF (moviev.current GE moviev.len) THEN moviev.current = moviev.last IF (NOT(moviev.deleted(moviev.current))) THEN BEGIN ;** if not deleted then display DEVICE, COPY = [0, 0, moviev.hsize, moviev.vsize, 0, 0, moviev.win_index(moviev.current)] WIDGET_CONTROL, moviev.cframe, SET_VALUE=STRCOMPRESS(moviev.current, /REMOVE_ALL) WIDGET_CONTROL, moviev.cname, SET_VALUE=STRCOMPRESS(moviev.frames(moviev.current), /REMOVE_ALL) WIDGET_CONTROL, moviev.base, TIMER=moviev.stall ; Request another timer event ENDIF ELSE $ ;** else immediately look for the next non-deleted frame WIDGET_CONTROL, moviev.base, TIMER=.01 ENDIF ELSE BEGIN ;** event other than timer WIDGET_CONTROL, ev.id, GET_UVALUE=input CASE (input) OF 'DRAW' : BEGIN ;image window END 'SPEED' : BEGIN ;speed IF (ev.value EQ 0) THEN $ moviev.stall = 5. $ ELSE $ moviev.stall = (100 - ev.value)/50. moviev.stallsave = moviev.stall WIDGET_CONTROL, moviev.base, TIMER=moviev.stall ; Request another timer event END 'SLIDE_FIRST' : BEGIN ;first frame moviev.first = ev.value END 'SLIDE_LAST' : BEGIN ;last frame moviev.last = ev.value END ELSE : BEGIN PRINT, '%%WRUNMOVIE_EVENT0. Unknown event.' END ENDCASE ENDELSE WIDGET_CONTROL, ev.top, SET_UVALUE=moviev END ;------------------ end runmovie_event ------------------------- ;------------------ runmovie event for CW_BGROUP buttons --------- FUNCTION WRUNMOVIE_BGROUP0, ev WIDGET_CONTROL, ev.top, GET_UVALUE=moviev ; get structure from UVALUE input = ev.value CASE (input) OF 'DONE' : BEGIN ;** exit program WIDGET_CONTROL, /DESTROY, moviev.base WIDGET_CONTROL, /DESTROY, moviev.winbase FOR i=0, moviev.len-1 DO WDELETE, moviev.win_index(i) RETURN, 0 END 'ADJCT' : BEGIN ;color table adjustment XLOADCT END 'DELETE' : BEGIN ;delete current frame WIDGET_CONTROL, moviev.base, TIMER=10000. ; Put timer on hold moviev.deleted(moviev.current) = 1 END 'NEXT' : IF (ev.select NE 0) THEN BEGIN ;next frame WIDGET_CONTROL, moviev.base, TIMER=10000. ; Put timer on hold moviev.stall = 10000. moviev.forward = 1 REPEAT BEGIN moviev.current = (moviev.current + 1) MOD moviev.len IF (moviev.current GT moviev.last) THEN moviev.current = moviev.first IF (moviev.current LT moviev.first) THEN moviev.current = moviev.first ENDREP UNTIL (NOT(moviev.deleted(moviev.current))) DEVICE, COPY=[0, 0, moviev.hsize, moviev.vsize, 0, 0, moviev.win_index(moviev.current)] WIDGET_CONTROL, moviev.cframe, SET_VALUE=STRCOMPRESS(moviev.current, /REMOVE_ALL) WIDGET_CONTROL, moviev.cname,SET_VALUE=STRCOMPRESS(moviev.frames(moviev.current),/REMOVE_ALL) ENDIF 'PREV' : IF (ev.select NE 0) THEN BEGIN ;previous frame WIDGET_CONTROL, moviev.base, TIMER=10000. ; Put timer on hold moviev.stall = 10000. moviev.forward = 0 REPEAT BEGIN moviev.current = (moviev.current - 1) MOD moviev.len IF (moviev.current LT moviev.first) THEN moviev.current = moviev.last IF (moviev.current GT moviev.last) THEN moviev.current = moviev.last ENDREP UNTIL (NOT(moviev.deleted(moviev.current))) DEVICE, COPY=[0, 0, moviev.hsize, moviev.vsize, 0, 0, moviev.win_index(moviev.current)] WIDGET_CONTROL, moviev.cframe, SET_VALUE=STRCOMPRESS(moviev.current, /REMOVE_ALL) WIDGET_CONTROL, moviev.cname,SET_VALUE=STRCOMPRESS(moviev.frames(moviev.current),/REMOVE_ALL) ENDIF 'CONTINUOUS' : IF (ev.select NE 0) THEN BEGIN ;continuous ;** set direction to saved direction moviev.forward = moviev.dirsave moviev.stall = moviev.stallsave WIDGET_CONTROL, moviev.base, TIMER=moviev.stall ; Request another timer event ENDIF 'FORWARD' : IF (ev.select NE 0) THEN BEGIN ;forward moviev.bounce = 0 moviev.forward = 1 moviev.dirsave = 1 ENDIF 'REVERSE' : IF (ev.select NE 0) THEN BEGIN ;reverse moviev.bounce = 0 moviev.forward = 0 moviev.dirsave = 0 ENDIF 'BOUNCE' : IF (ev.select NE 0) THEN BEGIN ;bounce moviev.bounce = 1 ENDIF 'PAUSE' : IF (ev.select NE 0) THEN BEGIN ;pause moviev.dopause = 1 ENDIF 'NO_PAUSE' : IF (ev.select NE 0) THEN BEGIN ;no pause moviev.dopause = 0 ENDIF 'LOAD' : BEGIN ;** load movie from file win_index = PICKFILE(filter='*.mvi',file=moviev.filename,/MUST_EXIST, $ TITLE='Select movie file to load', $ PATH=moviev.filepath, GET_PATH=path) IF ((win_index EQ '') OR (win_index EQ moviev.filename)) THEN RETURN, 0 BREAK_FILE, win_index, a, dir, name, ext moviev.filepath = a+dir IF (dir EQ '') THEN BEGIN moviev.filepath = './' win_index = path+win_index ENDIF WIDGET_CONTROL, /DESTROY, moviev.base WIDGET_CONTROL, /DESTROY, moviev.winbase FOR i=0, moviev.len-1 DO WDELETE, moviev.win_index(i) MVIPLAY, win_index RETURN, 0 END ELSE : BEGIN PRINT, '%%WRUNMOVIE_BGROUP0. Unknown event.' END ENDCASE WIDGET_CONTROL, ev.top, SET_UVALUE=moviev RETURN, 0 END ;----------------------- wrunmovie --------------------------------- PRO MVIPLAY, win_index, NAMES=names, HDRS=hdrs, FITSCREEN=fitscreen, SKIP=skip, $ TIMES=times, START=start, LENGTH=length COMMON MVI_COMMON, base stall0 = 100 stall = (100 - stall0)/50. stallsave = stall filename = 'default.mvi' filepath = './' ftitle='' ;** have user select movie file (.mvi) sz = SIZE(win_index) IF (sz(1) EQ 0) THEN BEGIN file = PICKFILE(filter='*.mvi', /MUST_EXIST, TITLE='Select movie file to load',GET_PATH=path) IF (file EQ '') THEN RETURN BREAK_FILE, file, a, dir, name, ext IF (dir EQ '') THEN win_index = path+file ELSE win_index = file ENDIF ;** read movie in from movie file (.mvi) sz = SIZE(win_index) IF (sz(N_ELEMENTS(sz)-2) EQ 7) THEN BEGIN BREAK_FILE, win_index, a, dir, name, ext ftitle = name+ext filename = win_index filepath = a+dir OPENR,lu,filename,/GET_LUN READ_MVI, lu, file_hdr, ihdrs, imgs, swapflag win_index = INTARR(file_hdr.nf) names = STRARR(file_hdr.nf) ahdr = {filename:'',detector:'',time_obs:'',date_obs:'',filter:'',polar:'',sector:''} hdrs = REPLICATE(ahdr,file_hdr.nf) nx = file_hdr.nx ny = file_hdr.ny IF (KEYWORD_SET(FITSCREEN)) THEN BEGIN orig_nx = nx orig_ny = ny max_nx = 640 max_ny = 480 IF (orig_nx GT orig_ny) THEN BEGIN ;** bigger in x dimension nx = max_nx ny = FLOAT(nx)/orig_nx*orig_ny ENDIF ELSE BEGIN ;** bigger in y dimension ny = max_ny nx = FLOAT(ny)/orig_ny*orig_nx ENDELSE ENDIF IF KEYWORD_SET(SKIP) THEN BEGIN skip = skip ENDIF ELSE skip=0 IF KEYWORD_SET(START) THEN start=start-1 ELSE start=0 IF KEYWORD_SET(LENGTH) THEN length=start+length ELSE length=file_hdr.nf FOR i=start,length-1,skip+1 DO BEGIN PRINT, '%%MVIPLAY reading frame ', STRING(i+1,FORMAT='(I4)'), ' of ',STRING(file_hdr.nf,FORMAT='(I4)'), $ ' from movie file ', filename WINDOW, XSIZE = nx, YSIZE = ny, /PIXMAP, /FREE IF ((SIZE(win_ind))(1) eq 0) THEN win_ind = !D.WINDOW ELSE win_ind = [win_ind, !D.WINDOW] image = imgs(i) IF (KEYWORD_SET(FITSCREEN)) THEN image = CONGRID(image, nx, ny) TV, image hdr = ihdrs(i) IF ( swapflag EQ 1 ) THEN BYTEORDER, hdr hdrs(i).date_obs = STRTRIM(hdr(0:14),2) hdrs(i).time_obs = STRTRIM(hdr(15:29),2) hdrs(i).filename = STRTRIM(hdr(30:44),2) hdrs(i).filter = STRTRIM(hdr(45:54),2) hdrs(i).detector = STRTRIM(hdr(65:74),2) IF (hdrs(i).detector EQ 'EIT') THEN $ hdrs(i).sector = STRTRIM(hdr(55:64),2) $ ELSE $ hdrs(i).polar = STRTRIM(hdr(55:64),2) IF KEYWORD_SET(TIMES) THEN $ XYOUTS, 10, 10, hdrs(i).date_obs + ' ' + STRMID(hdrs(i).time_obs,0,5), CHARSIZE=1.5,/DEVICE ENDFOR win_index = win_ind names = hdrs.filename CLOSE,lu FREE_LUN,lu ENDIF ;** load movies from existing pixmaps WSET, win_index(0) hsize = !D.X_SIZE vsize = !D.Y_SIZE ;** get length of movie len = N_ELEMENTS(win_index) frames = STRARR(len) ;** array of movie frame names (empty) IF (KEYWORD_SET(names) NE 0) THEN frames = names first = 0 last = len-1 current = 0 forward = 1 dirsave = 1 bounce = 0 pause = 0 dopause = 1 deleted = BYTARR(len) showmenu = 0 ;**--------------------Create Widgets-------------------------------** hhsize = (hsize+20) > (512+20) title = 'MVIPLAY: '+ftitle winbase = WIDGET_BASE(TITLE=title) base = WIDGET_BASE(/COLUMN, XOFFSET=275, YOFFSET=275, TITLE='MVIPLAY Control') ;** create window widget to display images in draw_w = WIDGET_DRAW(winbase, XSIZE=hsize, YSIZE=vsize, EVENT_PRO='WRUNMOVIE_DRAW0', $ /FRAME, /BUTTON_EVENTS, RETAIN=2) base1 = WIDGET_BASE(base, /ROW) base2 = WIDGET_BASE(base1, /COLUMN, /FRAME) flabel = WIDGET_LABEL(base2, VALUE=' # Frame') base25 = WIDGET_BASE(base2, /ROW) cframe = WIDGET_TEXT(base25, VALUE='0', XSIZE=3, YSIZE=1) cname = WIDGET_TEXT(base25, VALUE=' ', XSIZE=12, YSIZE=1) slide2 = WIDGET_SLIDER(base1, TITLE='First Frame', $ VALUE=0, UVALUE='SLIDE_FIRST', MIN=0, MAX=len) slide3 = WIDGET_SLIDER(base1, TITLE='Last Frame', $ VALUE=len-1, UVALUE='SLIDE_LAST', MIN=0, MAX=len-1) slide1 = WIDGET_SLIDER(base1, TITLE='Playback Speed', SCROLL=1, $ VALUE=stall0, UVALUE='SPEED', MIN=0, MAX=100, /DRAG) base3 = WIDGET_BASE(base, /ROW) tmp = CW_BGROUP(base3, ['Forward', 'Reverse', 'Bounce'], /EXCLUSIVE, /COLUMN, IDS=dirb, $ BUTTON_UVALUE = ['FORWARD', 'REVERSE','BOUNCE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, ['Pause At End', 'No Pause'], /EXCLUSIVE, /COLUMN, IDS=pauseb, $ BUTTON_UVALUE = ['PAUSE','NO_PAUSE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, ['Continuous', 'Next Frame', 'Prev. Frame'], /COLUMN, $ BUTTON_UVALUE = ['CONTINUOUS', 'NEXT','PREV'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, ['Adjust Color', 'Delete Frame'], /COLUMN, IDS=otherb, $ BUTTON_UVALUE = ['ADJCT', 'DELETE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') tmp = CW_BGROUP(base3, [' Load Movie ', ' Quit '], /COLUMN, $ BUTTON_UVALUE = ['LOAD','DONE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0') ;**--------------------Done Creating Widgets-----------------------------** WIDGET_CONTROL, /REAL, winbase WIDGET_CONTROL, draw_w, GET_VALUE=draw_win WIDGET_CONTROL, base, MAP=0 WIDGET_CONTROL, /REAL, base WIDGET_CONTROL, dirb(0), SET_BUTTON=1 WIDGET_CONTROL, pauseb(0), SET_BUTTON=1 WIDGET_CONTROL, base, TIMER=.01 WSET, draw_win IF (KEYWORD_SET(HDRS) NE 0) THEN img_hdrs = hdrs ELSE img_hdrs = 0 moviev = { $ base:base, $ winbase:winbase, $ current:current, $ forward:forward, $ dirsave:dirsave, $ bounce:bounce, $ first:first, $ last:last, $ pause:pause, $ dopause:dopause, $ len:len, $ hsize:hsize, $ vsize:vsize, $ win_index:win_index, $ draw_win:draw_win, $ cframe:cframe, $ cname:cname, $ frames:frames, $ deleted:deleted, $ showmenu:showmenu, $ filename:filename, $ filepath:filepath, $ img_hdrs:img_hdrs, $ stallsave:stallsave, $ stall:stall $ } WIDGET_CONTROL, base, SET_UVALUE=moviev PRINT, '%%' PRINT, '%%MVIPLAY: Click any mouse button in the display window to bring up control panel.' PRINT, '%%MVIPLAY: Click in display window again to hide control panel.' PRINT, '%%' PRINT, '%% If you are running out of memory when loading a mvi try a combination of these options:' PRINT, '%% IDL> MVIPLAY, "mymovie.mvi", LENGTH=30 ;** to load only the first 30 frames' PRINT, '%% IDL> MVIPLAY, "mymovie.mvi", START=20,LENGTH=30 ;** to load frames 20-49' PRINT, '%% IDL> MVIPLAY, "mymovie.mvi", SKIP=1 ;** to load every other frame' PRINT, '%%' XMANAGER, 'WRUNMOVIE', base, EVENT_HANDLER='WRUNMOVIE_EVENT0' END