home *** CD-ROM | disk | FTP | other *** search
/ SGI Hot Mix 17 / Hot Mix 17.iso / HM17_SGI / research / examples / object / wcontour.pro < prev   
Encoding:
Text File  |  1997-07-08  |  4.1 KB  |  144 lines

  1. PRO wcontour_event, sEvent
  2.  
  3.     ; Handle destroy of top-level base.
  4.     IF TAG_NAMES(sEvent, /STRUCTURE_NAME) EQ 'WIDGET_KILL_REQUEST' THEN BEGIN
  5.         WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState, /NO_COPY 
  6.         OBJ_DESTROY, sState.oView
  7.         WIDGET_CONTROL, sEvent.top, /DESTROY
  8.         RETURN  
  9.     ENDIF
  10.  
  11.     ; Handle other events.
  12.     WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
  13.     CASE uval OF
  14.        'DRAW': BEGIN
  15.            ; Expose.
  16.            IF (sEvent.type EQ 4) THEN BEGIN
  17.                WIDGET_CONTROL, sEvent.top, GET_UVALUE=sState, /NO_COPY 
  18.                sState.oWindow->Draw, sState.oView
  19.                WIDGET_CONTROL, sEvent.top, SET_UVALUE=sState, /NO_COPY 
  20.                RETURN
  21.            ENDIF 
  22.        END
  23.     ENDCASE 
  24. END
  25. ;-----------------------------------------------------------------------------
  26. FUNCTION GET_CONTOUR_COLOR, level, nLevels
  27.  
  28.   val = BYTE((255.0 / FLOAT(nLevels-1)) * FLOAT(level))
  29.  
  30.   RETURN, [val, val, val]
  31.  
  32. END
  33.  
  34. ;-----------------------------------------------------------------------------
  35. PRO wcontour, zData, NLEVELS=nlevels
  36.     xdim = 640
  37.     ydim = 480
  38.  
  39.     ; Set defaults.
  40.     IF (N_ELEMENTS(zData) EQ 0) THEN $
  41.         zData = BESELJ(SHIFT(DIST(80),20,20)/2,0)
  42.  
  43.     IF (N_ELEMENTS(nlevels) EQ 0) THEN $
  44.         nlevels = 2
  45.  
  46.     ; Create widgets.
  47.     wBase = WIDGET_BASE(/COLUMN,TITLE='Contour', /TLB_KILL_REQUEST_EVENTS)
  48.  
  49.     wDraw = WIDGET_DRAW(wBase, XSIZE=xdim, YSIZE=ydim, UVALUE='DRAW',$
  50.                         GRAPHICS_LEVEL=2, RETAIN=0, /EXPOSE_EV, /BUTTON_EV)
  51.  
  52.     sz = SIZE(zData)
  53.     maxX = sz[1] - 1
  54.     maxY = sz[2] - 1
  55.     maxZ = MAX(zData,Min=minZ)
  56.  
  57.     ; Compute coordinate conversion to normalize.
  58.     xs = [0,1.0/maxX]
  59.     ys = [0,1.0/maxY]
  60.     minZ = minZ - 1
  61.     maxZ = maxZ + 1 
  62.     zs = [-minZ/(maxZ-minZ), 1.0/(maxZ-minZ)]
  63.  
  64.    ; Create a view.
  65.    aspect = FLOAT(xdim)/FLOAT(ydim)
  66.    IF (aspect > 1) THEN $
  67.        viewRect = [(1.0-aspect)/2.0, 0.0, aspect, 1.0] $
  68.    ELSE $
  69.        viewRect = [0.0, (1.0-(1.0/aspect))/2.0, 1.0, (1.0/aspect)]
  70.  
  71.    oView = OBJ_NEW('IDLgrView',PROJ=2,EYE=3,VIEW=viewRect,COLOR=[60,60,80])
  72.  
  73.    ; Create model tree.
  74.    oTopModel = OBJ_NEW('IDLgrModel')
  75.    oView->Add, oTopModel
  76.  
  77.    ; Generate the contour path.
  78.    CONTOUR, zData, PATH_XY=xyData, PATH_INFO=contourInfo, /PATH_DATA_COORDS, $
  79.                    NLEVELS=nlevels
  80.  
  81.    nContours = N_ELEMENTS(contourInfo)
  82.    nLevels = MAX(contourInfo[*].level) + 1
  83.  
  84.    ; Ceate one contour for each level.
  85.    oPolys = OBJARR(nLevels)
  86.    FOR i = 0, nLevels-1 DO BEGIN
  87.       IF (i EQ 0) THEN BEGIN
  88.         oPolys[i] = OBJ_NEW('IDLgrPolyline', xyData, $
  89.             COLOR=GET_CONTOUR_COLOR(i, nLevels), $
  90.         XCOORD_CONV=xs, YCOORD_CONV=ys, ZCOORD_CONV=zs, UVALUE=i)
  91.       ENDIF ELSE BEGIN
  92.         oPolys[i] = OBJ_NEW('IDLgrPolyline', SHARE_DATA=oPolys[0], $
  93.             COLOR=GET_CONTOUR_COLOR(i, nLevels), $
  94.         XCOORD_CONV=xs, YCOORD_CONV=ys, ZCOORD_CONV=zs, UVALUE=i)
  95.       ENDELSE
  96.    ENDFOR
  97.    oTopModel->Add, oPolys
  98.  
  99.    FOR i=0,nContours-1 DO BEGIN
  100.        nVerts = contourInfo[i].n
  101.        offset = contourInfo[i].offset
  102.  
  103.        ; If closed, add to connectivity list.
  104.        IF (contourInfo[i].type EQ 1) THEN BEGIN
  105.            pConn = [nVerts+1, LINDGEN(nVerts)+offset, offset] 
  106.        ENDIF ELSE BEGIN
  107.            pConn = [nVerts, LINDGEN(nVerts)+offset]
  108.        ENDELSE
  109.  
  110.        ; Add the contour to the current list.
  111.        (oPolys[contourInfo[i].level])->GetProperty,POLYLINES=oConn
  112.        IF (N_ELEMENTS(oConn) EQ 1) THEN BEGIN
  113.            oConn = pConn
  114.        ENDIF ELSE BEGIN
  115.            oConn = [oConn, pConn]
  116.        ENDELSE
  117.        (oPolys[contourInfo[i].level])->SetProperty,POLYLINES=oConn
  118.  
  119.    ENDFOR 
  120.  
  121.    ; Remove any unused levels.
  122.    FOR i = 0, nLevels-1 DO BEGIN
  123.         (oPolys[i])->GetProperty,POLYLINES=oConn
  124.         IF (N_ELEMENTS(oConn) EQ 1) THEN BEGIN
  125.             oTopModel->Remove,oPolys[i]
  126.             OBJ_DESTROY,oPolys[i]
  127.         ENDIF
  128.    ENDFOR
  129.  
  130.    WIDGET_CONTROL, wBase, /REALIZE
  131.    WIDGET_CONTROL, wDraw, GET_VALUE=oWindow
  132.  
  133.    oWindow->Draw, oView
  134.   
  135.    sState = { oWindow:oWindow, $
  136.               oView:oView, $
  137.               oTopModel:oTopModel $
  138.             }
  139.  
  140.    WIDGET_CONTROL, wBase, SET_UVALUE=sState, /NO_COPY
  141.    XMANAGER, 'wcontour', wBase, /NO_BLOCK
  142. END
  143.  
  144.