home *** CD-ROM | disk | FTP | other *** search
- PRO wcontour_event, sEvent
-
- ; Handle destroy of top-level base.
- IF TAG_NAMES(sEvent, /STRUCTURE_NAME) EQ 'WIDGET_KILL_REQUEST' THEN BEGIN
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState, /NO_COPY
- OBJ_DESTROY, sState.oView
- WIDGET_CONTROL, sEvent.top, /DESTROY
- RETURN
- ENDIF
-
- ; Handle other events.
- WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
- CASE uval OF
- 'DRAW': BEGIN
- ; Expose.
- IF (sEvent.type EQ 4) THEN BEGIN
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState, /NO_COPY
- sState.oWindow->Draw, sState.oView
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState, /NO_COPY
- RETURN
- ENDIF
- END
- ENDCASE
- END
- ;-----------------------------------------------------------------------------
- FUNCTION GET_CONTOUR_COLOR, level, nLevels
-
- val = BYTE((255.0 / FLOAT(nLevels-1)) * FLOAT(level))
-
- RETURN, [val, val, val]
-
- END
-
- ;-----------------------------------------------------------------------------
- PRO wcontour, zData, NLEVELS=nlevels
- xdim = 640
- ydim = 480
-
- ; Set defaults.
- IF (N_ELEMENTS(zData) EQ 0) THEN $
- zData = BESELJ(SHIFT(DIST(80),20,20)/2,0)
-
- IF (N_ELEMENTS(nlevels) EQ 0) THEN $
- nlevels = 2
-
- ; Create widgets.
- wBase = WIDGET_BASE(/COLUMN,TITLE='Contour', /TLB_KILL_REQUEST_EVENTS)
-
- wDraw = WIDGET_DRAW(wBase, XSIZE=xdim, YSIZE=ydim, UVALUE='DRAW',$
- GRAPHICS_LEVEL=2, RETAIN=0, /EXPOSE_EV, /BUTTON_EV)
-
- sz = SIZE(zData)
- maxX = sz[1] - 1
- maxY = sz[2] - 1
- maxZ = MAX(zData,Min=minZ)
-
- ; Compute coordinate conversion to normalize.
- xs = [0,1.0/maxX]
- ys = [0,1.0/maxY]
- minZ = minZ - 1
- maxZ = maxZ + 1
- zs = [-minZ/(maxZ-minZ), 1.0/(maxZ-minZ)]
-
- ; Create a view.
- aspect = FLOAT(xdim)/FLOAT(ydim)
- IF (aspect > 1) THEN $
- viewRect = [(1.0-aspect)/2.0, 0.0, aspect, 1.0] $
- ELSE $
- viewRect = [0.0, (1.0-(1.0/aspect))/2.0, 1.0, (1.0/aspect)]
-
- oView = OBJ_NEW('IDLgrView',PROJ=2,EYE=3,VIEW=viewRect,COLOR=[60,60,80])
-
- ; Create model tree.
- oTopModel = OBJ_NEW('IDLgrModel')
- oView->Add, oTopModel
-
- ; Generate the contour path.
- CONTOUR, zData, PATH_XY=xyData, PATH_INFO=contourInfo, /PATH_DATA_COORDS, $
- NLEVELS=nlevels
-
- nContours = N_ELEMENTS(contourInfo)
- nLevels = MAX(contourInfo[*].level) + 1
-
- ; Ceate one contour for each level.
- oPolys = OBJARR(nLevels)
- FOR i = 0, nLevels-1 DO BEGIN
- IF (i EQ 0) THEN BEGIN
- oPolys[i] = OBJ_NEW('IDLgrPolyline', xyData, $
- COLOR=GET_CONTOUR_COLOR(i, nLevels), $
- XCOORD_CONV=xs, YCOORD_CONV=ys, ZCOORD_CONV=zs, UVALUE=i)
- ENDIF ELSE BEGIN
- oPolys[i] = OBJ_NEW('IDLgrPolyline', SHARE_DATA=oPolys[0], $
- COLOR=GET_CONTOUR_COLOR(i, nLevels), $
- XCOORD_CONV=xs, YCOORD_CONV=ys, ZCOORD_CONV=zs, UVALUE=i)
- ENDELSE
- ENDFOR
- oTopModel->Add, oPolys
-
- FOR i=0,nContours-1 DO BEGIN
- nVerts = contourInfo[i].n
- offset = contourInfo[i].offset
-
- ; If closed, add to connectivity list.
- IF (contourInfo[i].type EQ 1) THEN BEGIN
- pConn = [nVerts+1, LINDGEN(nVerts)+offset, offset]
- ENDIF ELSE BEGIN
- pConn = [nVerts, LINDGEN(nVerts)+offset]
- ENDELSE
-
- ; Add the contour to the current list.
- (oPolys[contourInfo[i].level])->GetProperty,POLYLINES=oConn
- IF (N_ELEMENTS(oConn) EQ 1) THEN BEGIN
- oConn = pConn
- ENDIF ELSE BEGIN
- oConn = [oConn, pConn]
- ENDELSE
- (oPolys[contourInfo[i].level])->SetProperty,POLYLINES=oConn
-
- ENDFOR
-
- ; Remove any unused levels.
- FOR i = 0, nLevels-1 DO BEGIN
- (oPolys[i])->GetProperty,POLYLINES=oConn
- IF (N_ELEMENTS(oConn) EQ 1) THEN BEGIN
- oTopModel->Remove,oPolys[i]
- OBJ_DESTROY,oPolys[i]
- ENDIF
- ENDFOR
-
- WIDGET_CONTROL, wBase, /REALIZE
- WIDGET_CONTROL, wDraw, GET_VALUE=oWindow
-
- oWindow->Draw, oView
-
- sState = { oWindow:oWindow, $
- oView:oView, $
- oTopModel:oTopModel $
- }
-
- WIDGET_CONTROL, wBase, SET_UVALUE=sState, /NO_COPY
- XMANAGER, 'wcontour', wBase, /NO_BLOCK
- END
-
-