- Timestamp:
- 08/01/07 11:45:16 (13 months ago)
- Files:
-
- 1 modified
-
misc/clouds/xyztn.pro (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
misc/clouds/xyztn.pro
r800 r801 4 4 ; 5 5 ; Copyright (c) 2007, Ken & Jose. Do what you want with the code. 6 ; 7 ; This originated as d_vectrack.pro (IDL Thunderstorm Demo) 6 8 ; 7 9 ;+ … … 12 14 ; 13 15 ; PURPOSE: 14 ; Visualization of thunderstorm data.16 ; Visualization of 3D or 4D data 15 17 ; 16 18 ; MAJOR TOPICS: Visualization 17 19 ; 18 20 ; CATEGORY: 19 ; IDL Demo System20 ;21 ; INTERNAL FUNCTIONS and PROCEDURES:22 ; pro xyztnEvent - Event handler23 ; pro xyztnCleanup - Cleanup24 ; pro xyztn - Main procedure25 ;26 ; EXTERNAL FUNCTIONS, PROCEDURES, and FILES:27 ; pro trackball__define - Create the trackball object28 ; pro demo_gettips - Read the tip file and create widgets29 ; vectrack.tip30 ; storm.opa31 ; storm.pal32 ;33 ; REFERENCE: IDL Reference Guide, IDL User's Guide34 ;35 ; NAMED STRUCTURES:36 ; none.37 ;38 ; COMMON BLOCS:39 ; none.40 21 ; 41 22 ; MODIFICATION HISTORY: 42 23 ; 1/97, ACY - adapted from vec_track, written by D.D. 43 24 ; 7/99, KB - used PARTICLE_TRACE and STREAMLINE. 25 ; 7/07, KM,JC - Genericized for A. Fridlind and A. Ackerman. 26 ; 44 27 ;- 45 28 ;---------------------------------------------------------------------------- … … 60 43 61 44 62 ;---------------------------------------------------------------------------- 63 ; Routine to update the current planes 64 45 46 ;; draw the image planes 65 47 PRO xyztnPlanesUpdate,sState,bUpdate 66 48 67 IF (sState.bShow [0] AND ((bUpdate EQ 1) OR (bUpdate EQ 4))) THEN BEGIN49 IF (sState.bShow) THEN BEGIN 68 50 WIDGET_CONTROL, sState.wXSlider, GET_VALUE=x 69 IF (sState.bImage[0]) THEN BEGIN 70 sState.oVols[sState.iImgVol]->GetProperty,DATA0=vdata,$ 71 /NO_COPY,RGB_TABLE0=ctab 72 xyztnSampleOrthoPlane,vdata,0,x,sState.oSlices[0], $ 73 sState.oImages[0],ctab,sState.iAlpha 74 sState.oVols[sState.iImgVol]->SetProperty,DATA0=vdata,/NO_COPY 75 END ELSE BEGIN 76 sState.oVols[2]->GetProperty,DATA0=bMag,RGB_TABLE0=pal,/NO_COPY 77 xyztnMkVectors,sState.u,sState.v,sState.w,fVerts,iConn,X=x, $ 78 SCALE=scale, RANDOM=sState.bRandom, $ 79 NVECTORS=nvectors,STEPSIZE=stepsize,BMAG=bMag,Vc=vc 80 sState.oXPolyline->SetProperty,DATA=fVerts,POLYLINES=iConn, $ 81 VERT_COLORS=transpose(pal[vc,*]) 82 sState.oVols[2]->SetProperty,DATA0=bMag,/NO_COPY 83 END 84 ENDIF 85 IF (sState.bShow[1] AND ((bUpdate EQ 2) OR (bUpdate EQ 4))) THEN BEGIN 51 sState.oVols[sState.iImgVol]->GetProperty,DATA0=vdata,$ 52 /NO_COPY,RGB_TABLE0=ctab 53 xyztnSampleOrthoPlane,vdata,0,x,sState.oSlices[0], $ 54 sState.oImages[0],ctab,sState.iAlpha 55 sState.oVols[sState.iImgVol]->SetProperty,DATA0=vdata,/NO_COPY 56 86 57 WIDGET_CONTROL, sState.wYSlider, GET_VALUE=y 87 IF (sState.bImage[1]) THEN BEGIN 88 sState.oVols[sState.iImgVol]->GetProperty,DATA0=vdata,$ 89 /NO_COPY,RGB_TABLE0=ctab 90 xyztnSampleOrthoPlane,vdata,1,y,sState.oSlices[1], $ 91 sState.oImages[1],ctab,sState.iAlpha 92 sState.oVols[sState.iImgVol]->SetProperty,DATA0=vdata,/NO_COPY 93 END ELSE BEGIN 94 sState.oVols[2]->GetProperty,DATA0=bMag,RGB_TABLE0=pal,/NO_COPY 95 xyztnMkVectors,sState.u,sState.v,sState.w,fVerts,iConn,Y=y, $ 96 SCALE=scale, RANDOM=sState.bRandom, $ 97 NVECTORS=nvectors,STEPSIZE=stepsize,BMAG=bMag,Vc=vc 98 sState.oYPolyline->SetProperty,DATA=fVerts,POLYLINES=iConn, $ 99 VERT_COLORS=transpose(pal[vc,*]) 100 sState.oVols[2]->SetProperty,DATA0=bMag,/NO_COPY 101 END 102 ENDIF 103 IF (sState.bShow[2] AND ((bUpdate EQ 3) OR (bUpdate EQ 4))) THEN BEGIN 58 sState.oVols[sState.iImgVol]->GetProperty,DATA0=vdata,$ 59 /NO_COPY,RGB_TABLE0=ctab 60 xyztnSampleOrthoPlane,vdata,1,y,sState.oSlices[1], $ 61 sState.oImages[1],ctab,sState.iAlpha 62 sState.oVols[sState.iImgVol]->SetProperty,DATA0=vdata,/NO_COPY 63 104 64 WIDGET_CONTROL, sState.wZSlider, GET_VALUE=z 105 IF (sState.bImage[2]) THEN BEGIN 106 sState.oVols[sState.iImgVol]->GetProperty,DATA0=vdata,$ 107 /NO_COPY,RGB_TABLE0=ctab 108 xyztnSampleOrthoPlane,vdata,2,z,sState.oSlices[2], $ 109 sState.oImages[2],ctab,sState.iAlpha 110 sState.oVols[sState.iImgVol]->SetProperty,DATA0=vdata,/NO_COPY 111 END ELSE BEGIN 112 sState.oVols[2]->GetProperty,DATA0=bMag,RGB_TABLE0=pal,/NO_COPY 113 xyztnMkVectors,sState.u,sState.v,sState.w,fVerts,iConn,Z=z, $ 114 SCALE=scale, RANDOM=sState.bRandom, $ 115 NVECTORS=nvectors,STEPSIZE=stepsize,BMAG=bMag,Vc=vc 116 sState.oZPolyline->SetProperty,DATA=fVerts,POLYLINES=iConn, $ 117 VERT_COLORS=transpose(pal[vc,*]) 118 sState.oVols[2]->SetProperty,DATA0=bMag,/NO_COPY 119 END 120 ENDIF 65 sState.oVols[sState.iImgVol]->GetProperty,DATA0=vdata,$ 66 /NO_COPY,RGB_TABLE0=ctab 67 xyztnSampleOrthoPlane,vdata,2,z,sState.oSlices[2], $ 68 sState.oImages[2],ctab,sState.iAlpha 69 sState.oVols[sState.iImgVol]->SetProperty,DATA0=vdata,/NO_COPY 70 ENDIF 121 71 END 122 72 … … 294 244 ;; Restore the color table. 295 245 TVLCT, sState.colorTable 246 if sState.groupBase ne 0 then $ 296 247 if WIDGET_INFO(sState.groupBase, /VALID_ID) then $ 297 248 WIDGET_CONTROL, sState.groupBase, /MAP … … 358 309 END 359 310 311 'IMG_SHOW': BEGIN 312 sState.bShow = 1-sState.bShow 313 bUpdate = 4 314 bRedraw = 1 315 IF NOT (sState.bShow) THEN sState.oIsopolygon->SetProperty,HIDE=1 316 END 317 360 318 'IMG_VOLSEL': BEGIN 361 319 sState.iImgVol = sEvent.index … … 364 322 bRedraw = 1 365 323 END 366 324 325 ;; Contour UI 326 'CONT_SHOW': BEGIN 327 sState.bContShow = 1-sState.bContShow 328 bUpdate = 4 329 bRedraw = 1 330 IF NOT (sState.bContShow) THEN sState.oIsopolygon->SetProperty,HIDE=1 331 END 332 'CONT_VOLSEL': BEGIN 333 sState.iContVol = sEvent.index 334 xyztnColorBarUpdate,sState 335 bUpdate = 4 336 bRedraw = 1 337 END 338 339 367 340 'ALPHA_LEVEL': BEGIN 368 341 WIDGET_CONTROL, sState.wAlpha[0], GET_VALUE=v1 … … 417 390 WIDGET_CONTROL, sState.wXSlider, GET_VALUE=Val 418 391 slider_value = kdm_range(Val, minmax, slider_value) 419 WIDGET_CONTROL, sState.wXtext, SET_VALUE=STRtrim(string(slider_value, FORMAT='(F10.3)'), 2) 420 IF (sState.bShow[0]) THEN BEGIN 392 WIDGET_CONTROL, sState.wXtext, SET_VALUE= $ 393 STRtrim(string(slider_value, FORMAT='(F10.3)'), 2) 394 IF (sState.bShow) THEN BEGIN 421 395 bUpdate = 1 422 396 bRedraw = 1 … … 428 402 WIDGET_CONTROL, sState.wYSlider, GET_VALUE=Val 429 403 slider_value = kdm_range(Val, minmax, slider_value) 430 WIDGET_CONTROL, sState.wYtext, SET_VALUE=STRtrim(string(slider_value, FORMAT='(F10.3)'), 2) 431 IF (sState.bShow[1]) THEN BEGIN 404 WIDGET_CONTROL, sState.wYtext, SET_VALUE= $ 405 STRtrim(string(slider_value, FORMAT='(F10.3)'), 2) 406 IF (sState.bShow) THEN BEGIN 432 407 bUpdate = 2 433 408 bRedraw = 1 … … 439 414 WIDGET_CONTROL, sState.wZSlider, GET_VALUE=Val 440 415 slider_value = kdm_range(Val, minmax, slider_value) 441 WIDGET_CONTROL, sState.wZtext, SET_VALUE=STRtrim(string(slider_value, FORMAT='(F10.3)'), 2) 442 IF (sState.bShow[2]) THEN BEGIN 416 WIDGET_CONTROL, sState.wZtext, SET_VALUE= $ 417 STRtrim(string(slider_value, FORMAT='(F10.3)'), 2) 418 IF (sState.bShow) THEN BEGIN 443 419 bUpdate = 3 444 420 bRedraw = 1 … … 502 478 ;; start by hiding everything 503 479 hid = (1-sState.bShow) 504 sState.oXPolyline->SetProperty,HIDE=hid [0]+sState.bImage[0]505 sState.oYPolyline->SetProperty,HIDE=hid [1]+sState.bImage[1]506 sState.oZPolyline->SetProperty,HIDE=hid [2]+sState.bImage[2]507 sState.oSlices[0]->SetProperty,HIDE=hid [0]+(1-sState.bImage[0])508 sState.oSlices[1]->SetProperty,HIDE=hid [1]+(1-sState.bImage[1])509 sState.oSlices[2]->SetProperty,HIDE=hid [2]+(1-sState.bImage[2])480 sState.oXPolyline->SetProperty,HIDE=hid+sState.bImage 481 sState.oYPolyline->SetProperty,HIDE=hid+sState.bImage 482 sState.oZPolyline->SetProperty,HIDE=hid+sState.bImage 483 sState.oSlices[0]->SetProperty,HIDE=hid+(1-sState.bImage) 484 sState.oSlices[1]->SetProperty,HIDE=hid+(1-sState.bImage) 485 sState.oSlices[2]->SetProperty,HIDE=hid+(1-sState.bImage) 510 486 sState.oIsopolygon->SetProperty,HIDE=(1-sState.bIsoShow) 511 487 … … 572 548 ;; Set up dimensions of the drawing (viewing) area. 573 549 if ScreenSize[0] GE 1800 then ScreenSize[0] = 1800 574 xdim = screenSize[0]*0. 7550 xdim = screenSize[0]*0.6 575 551 ydim = xdim*0.8 576 552 … … 623 599 wLabel = WIDGET_LABEL(wFrameBase,VALUE='Planes') 624 600 625 wIVolSel = WIDGET_DROPLIST(wFrameBase,VALUE=dnames, $ 601 ;; Image controls 602 wRow = WIDGET_BASE(wFrameBase,/ROW) 603 wIVolSel = WIDGET_DROPLIST(wRow,VALUE=dnames, $ 626 604 FRAME=frame,TITLE='Image',UVAL='IMG_VOLSEL') 627 628 605 wRowB = WIDGET_BASE(wRow,/ROW,/NONEXCLUSIVE) 606 wImgShow = WIDGET_BUTTON(wRowB,VALUE='Show',UVAL='IMG_SHOW') 607 WIDGET_CONTROL,wImgShow,/SET_BUTTON 608 609 ;; Contour 610 ; wRow = WIDGET_BASE(wFrameBase,/ROW) 611 ; wIVolSel = WIDGET_DROPLIST(wRow,VALUE=dnames, $ 612 ; FRAME=frame,TITLE='Contour',UVAL='IMG_VOLSEL') 613 ; wRowB = WIDGET_BASE(wRow,/ROW,/NONEXCLUSIVE) 614 ; wContShow = WIDGET_BUTTON(wRowB,VALUE='Show',UVAL='CONT_SHOW') 615 616 ;; Possible vector 617 ; IF XIASTREC(data,'U') AND XIASTREC(data,'V') AND XIASTREC(data,'W')THEN BEGIN 618 ; wVecBase = WIDGET_BASE(wFrameBase,/NONEXCLUSIVE) 619 ; wIVolSel = WIDGET_BUTTON(wVecBase,VALUE="U/V/W Vectors",UVAL='IMG_VOLSEL') 620 ; ENDIF 621 622 ;; Planes for image/contour/vectors 629 623 wRow = WIDGET_BASE(wFrameBase,/ROW) 630 624 wText = WIDGET_LABEL(wRow, VALUE='X:' ) … … 655 649 656 650 657 658 ;wTrans = WIDGET_BASE(wFrameBase,/ROW,/FRAME) 651 ;; Transparency min/max (alpha channel) for Images 659 652 wSpace = WIDGET_LABEL(wFrameBase,VALUE='Image Transparency') 660 ; Calculate the transparency value = mode+1653 ;; Calculate the transparency value = mode+1 661 654 transparencyMin = KDM_RANGE(mode(d0), [min(d0),max(d0)], [0,255] )+1 662 655 wRow = WIDGET_BASE(wFrameBase,/ROW) … … 671 664 672 665 673 674 675 666 wFrameBase = WIDGET_BASE(wRowBase, /COLUMN, /FRAME) 676 667 frame = !version.os_family ne 'unix' ; Workaround problem 7763. 677 668 678 679 680 681 682 IF KEYWORD_SET(showvolume) THEN BEGIN 683 wRow0 = WIDGET_BASE(wFrameBase,/ROW) 684 wVVolSel = WIDGET_DROPLIST(wRow0,VALUE=dnames, $ 685 FRAME=frame, TITLE='Volume', $ 686 UVAL='VREND_VOLSEL') 687 wRow1 = WIDGET_BASE(wRow0,/ROW,/NONEXCLUSIVE) 688 wVRender = WIDGET_BUTTON(wRow1, VALUE='On?', $ 689 UVALUE='VREND', UNAME='XYZTN:volrendr') 690 ENDIF 691 669 ;; Volume 670 wRow0 = WIDGET_BASE(wFrameBase,/ROW) 671 wVVolSel = WIDGET_DROPLIST(wRow0,VALUE=dnames, $ 672 FRAME=frame, TITLE='Volume', $ 673 UVAL='VREND_VOLSEL') 674 wRow1 = WIDGET_BASE(wRow0,/ROW,/NONEXCLUSIVE) 675 wVRender = WIDGET_BUTTON(wRow1, VALUE='Show', $ 676 UVALUE='VREND', UNAME='XYZTN:volrendr') 677 678 ;; Isosurface 692 679 wRow0 = WIDGET_BASE(wFrameBase,/ROW) 693 680 wSVolSel = WIDGET_DROPLIST(wRow0,VALUE=dnames, $ 694 681 FRAME=frame, TITLE='Iso',UVAL='ISO_VOLSEL') 695 682 wRow1 = WIDGET_BASE(wRow0,/ROW,/NONEXCLUSIVE) 696 wIsotoggle = WIDGET_BUTTON(wRow1,VALUE=' On?',UVALUE='ISO_SHOW')683 wIsotoggle = WIDGET_BUTTON(wRow1,VALUE='Show',UVALUE='ISO_SHOW') 697 684 698 685 wRow2 = WIDGET_BASE(wFrameBase,/ROW) … … 704 691 wGuiBase3 = WIDGET_BASE(wFrameBase,/COLUMN,/NONEXCLUSIVE) 705 692 706 693 694 ;; Time 707 695 IF (nSteps GT 0) THEN BEGIN 708 696 ;wLabel = WIDGET_LABEL(wGuiBase, VALUE='Time') … … 735 723 ;; Compute viewplane rect based on aspect ratio. 736 724 aspect = FLOAT(xdim) / FLOAT(ydim) 737 myview = [-0.5, -0.5, 1, 1] * 1. 8 ;1.5725 myview = [-0.5, -0.5, 1, 1] * 1.7 738 726 IF (aspect > 1) THEN BEGIN 739 727 myview[0] = myview[0] - ((aspect-1.0)*myview[2])/2.0 … … 746 734 ;; Drop the view down a bit to make room for the colorbar 747 735 ;; myview[1] = myview[1] - 0.1 748 myview[1] = myview[1] - 0.1 0736 myview[1] = myview[1] - 0.15 749 737 750 738 ;; Create view. … … 784 772 _range = XIASTREC(meta,'xrange')?meta.xrange:[0, xMax] 785 773 TickValues = kdm_range(TickValues, [0, xMax], _range) 786 oTickValues = OBJ_NEW('IDLgrText', STRINGS=STRtrim(string(TickValues, FORMAT='(F10.2)'), 2)) 774 oTickValues = OBJ_NEW('IDLgrText', STRINGS= $ 775 STRtrim(string(TickValues,FORMAT='(F10.2)'), 2)) 787 776 oAxis = OBJ_NEW('IDLgrAxis', 0, COLOR=[255,255,255], $ 788 777 RANGE=[0,xMax], /EXACT, $ … … 800 789 _range = XIASTREC(meta,'yrange')?meta.yrange:[0, yMax] 801 790 TickValues = kdm_range(TickValues, [0, yMax], _range) 802 oTickValues = OBJ_NEW('IDLgrText', STRINGS=STRtrim(string(TickValues, FORMAT='(F10.2)'), 2)) 791 oTickValues = OBJ_NEW('IDLgrText', STRINGS= $ 792 STRtrim(string(TickValues, FORMAT='(F10.2)'), 2)) 803 793 oAxis = OBJ_NEW('IDLgrAxis', 1, COLOR=[255,255,255], $ 804 794 RANGE=[0,yMax], /EXACT, $ … … 816 806 _range = XIASTREC(meta,'zrange')?meta.zrange:[0, zMax] 817 807 TickValues = kdm_range(TickValues, [0, zMax], _range) 818 oTickValues = OBJ_NEW('IDLgrText', STRINGS=STRtrim(string(TickValues, FORMAT='(F10.2)'), 2)) 808 oTickValues = OBJ_NEW('IDLgrText', STRINGS= $ 809 STRtrim(string(TickValues, FORMAT='(F10.2)'), 2)) 819 810 oAxis = OBJ_NEW('IDLgrAxis', 2, COLOR=[255,255,255], $ 820 811 RANGE=[0,zMax-1],$ … … 864 855 oGroup->Add, oYPolygon 865 856 oGroup->Add, oZPolygon 857 858 ;; Contours (on image planes) 859 oXContour = OBJ_NEW('IDLgrContour') 860 oYContour = OBJ_NEW('IDLgrContour') 861 oZContour = OBJ_NEW('IDLgrContour') 862 ; oGroup->Add, oContour 863 866 864 867 865 ;; Iso Surface objects … … 973 971 minmaxarr: minmaxarr, $ 974 972 vdata:vdata, $ 975 bShow: [0b,0b,0b], $ 976 bImage: [0b,0b,0b], $ 973 ; bContShow: [0b,0b,0b], $ 974 bShow: 0b, $ 975 bImage: 0b, $ 977 976 bRandom: 0b, $ 978 977 oHolder: oHolder, $ … … 997 996 oCBAxis: oCBAxis, $ 998 997 iAlpha: [transparencyMin,255], $ ; KDM 998 iContVol: 0, $ 999 999 iImgVol: 0, $ 1000 1000 iVrendVol: 0, $ … … 1003 1003 oIsopolygon: oIsopolygon, $ 1004 1004 oImages: [oXImage,oYImage,oZImage], $ 1005 oContours: [oXContour, oYContour, oZContour], $ 1005 1006 iIsoVol: 0, $ 1006 1007 fIsoLevel: 128, $ … … 1022 1023 1023 1024 ;; Initialize with an interesting view 1024 sState.bShow [*]=11025 sState.bImage [*]=11025 sState.bShow=1 1026 sState.bImage=1 1026 1027 sState.bIsoShow=0 1027 1028 sState.bVolShow = 0
