⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter10volumerenderexercise.pro

📁 idl 可视化分析与应用(随书程序)
💻 PRO
📖 第 1 页 / 共 3 页
字号:
                      end
;                     Display the point coordinates and its value.
                      str = string(j[0], j[1], j[2], k, $
                         FORMAT='("X=",I3.3,",Y=",I3.3,",Z=",I3.3,",Value=",I3.3)')
                      WIDGET_CONTROL, (*pState).InformationLabel, SET_VALUE = str
                    end
                else:
            endcase
            (*pState).btndown = event.press
            WIDGET_CONTROL,(*pState).wDraw, /DRAW_MOTION
        endif
;       Mouse-button motion.
        if event.type eq 2 then begin
            case (*pState).btndown of
                4: begin ; Right mouse-button.
                     j = (*pState).rVolume->pickvoxel( $
                         (*pState).rWindow, (*pState).rView,[event.x,event.y])
                     k= -1
                     if (j[0] NE -1) then begin
                        (*pState).rVolume->GetProperty, DATA0=dd, /NO_COPY
                         k = dd[j[0],j[1],j[2]]
                        (*pState).rVolume->SetProperty, DATA0=dd, /NO_COPY
                     end
                     str = string( j[0], j[1], j[2], k, $
                        FORMAT='("X=",I3.3,",Y=",I3.3,",Z=",I3.3,",Value=",I3.3)')
                     WIDGET_CONTROL, (*pState).InformationLabel, SET_VALUE = str
                   end
                2: begin
                    xy = ([event.x,event.y] - (*pState).center)
                    r = total(xy^2) ; distance from center of unit circle
                    (*pState).sc[2] = (SQRT(r) / (*pState).sc[1]) / (*pState).sc[2]
                    (*pState).rScaleToys->Scale, $
                        (*pState).sc[2], (*pState).sc[2], (*pState).sc[2]
                    (*pState).rModel->GetProperty, RADIUS=radius
                    (*pState).rModel->SetProperty, RADIUS=radius*(*pState).sc[2]
                    (*pState).sc[2] = (SQRT(r)/(*pState).sc[1])
                    (*pState).rWindow->SetProperty, QUALITY=1
                    (*pState).rWindow->Draw, (*pState).rView
                    end
                else:
            endcase
        end
;       Mouse-button release.
        if (event.type eq 1) then begin
            case (*pState).btndown of
                2: begin
                     (*pState).sc[0] = (*pState).sc[2] * (*pState).sc[0]
                   end
                4: begin
                     j = (*pState).rVolume->pickvoxel( $
                         (*pState).rWindow,(*pState).rView,[event.x,event.y])
                     k = -1
                     if (j[0] NE -1) then begin
                        (*pState).rVolume->GetProperty, DATA0=dd, /NO_COPY
                        k = dd[j[0],j[1],j[2]]
                        (*pState).rVolume->SetProperty, DATA0=dd, /NO_COPY
                        str = string(j[0], j[1], j[2], k,  $
                           FORMAT='("X=",I3.3,",Y=",I3.3,",Z=",I3.3,",Value=",I3.3)')
                        WIDGET_CONTROL, (*pState).InformationLabel, SET_VALUE = str
                     end
                   end
                else:
            endcase
            (*pState).btndown = 0
            WIDGET_CONTROL, (*pState).wDraw, DRAW_MOTION=0
        endif
        WIDGET_CONTROL, event.top, SET_UVALUE=pState, /NO_COPY
      end
      else:
  endcase
end
;----------------------------------------------------------------------------
pro Chapter10VolumeRenderExerciseCleanup,wTopBase
WIDGET_CONTROL, wTopBase, GET_UVALUE=pState
for i=0,n_tags(*pState)-1 do begin
    case size((*pState).(i), /TNAME) of
        'POINTER':  ptr_free,    (*pState).(i)
        'OBJREF' :  obj_destroy, (*pState).(i)
        else:
    endcase
end
end
;----------------------------------------------------------------------------
pro Chapter10VolumeRenderExercise
device, GET_SCREEN_SIZE = scr
xdim = scr[0] * 0.4  &  ydim = xdim * 0.8
rTopModel = OBJ_NEW('IDLgrModel')
rModel = OBJ_NEW('IDLexRotator', [xdim/2.0, ydim/2.0], xdim/2.0)
rView = OBJ_NEW('IDLgrView')
rView->Add, rTopModel
rTopModel->Add, rModel
rScaleToys = obj_new('IDLgrModel')
rModel->Add, rScaleToys
WIDGET_CONTROL, /HOURGLASS
restore, demo_filepath('mri.sav',SUBDIR=['examples','demo','demodata'])
i = SIZE(vol0)
m = i[1] > i[2] > (i[3] * 1.0)
sx = 1.0 / m  &  sy = 1.0 / m  &  sz =(1.0 / m) * 1.0     ; scale  x, y, z.
ox = -i[1] * sx * 0.5 & oy = -i[2] * sy * 0.5 & oz = -i[3] * sz * 0.5 ; offset x,y,z.
rVolume = OBJ_NEW('IDLgrVolume', vol0, /ZERO_OPACITY_SKIP, /ZBUFFER, HINT=2, $
    xcoord_conv=[ox, sx], ycoord_conv=[oy, sy], zcoord_conv=[oz, sz], /NO_COPY)
rScaleToys->Add, rVolume
rModel->Rotate,[0,0,1],-45
rModel->Rotate,[1,0,0],-75
;Create Axes
xpc = [-1.,1.,0.,0.,0.,0.]
ypc = [0.,0.,-1.,1.,0.,0.]
zpc = [0.,0.,0.,0.,-1.,1.]
plc = [2,0,1,2,2,3,2,4,5]
vcc = [[255B,0B,0B],[255B,0B,0B],[0B,255B,0B],[0B,255B,0B],[0B,0B,255B],[0B,0B,255B]]
rObject=OBJ_NEW('IDLgrPolyline',xpc,ypc,zpc,POLYLINES=plc,VERT_COLOR=vcc)
rScaleToys->Add, rObject
vl = OBJ_NEW('IDLgrLight', DIRECTION=[-1,0,1], TYPE=2)
vl->SetProperty, COLOR=[255,255,255], INTENSITY=1.0
sl = OBJ_NEW('IDLgrLight', TYPE=0, INTENSITY=1.0)
rTopModel->Add, vl
rTopModel->Add, sl
wBase = WIDGET_BASE(/COLUMN,XPAD=0,YPAD=0,TITLE="Volume Rendering", $
        /TLB_KILL_REQUEST_EVENTS, TLB_FRAME_ATTR=1)
subBase = WIDGET_BASE(wBase, COLUMN=2)
wLeftbase = WIDGET_BASE(subBase, /COLUMN, /FRAME)
void=WIDGET_LABEL(wLeftBase,VALUE='Left Mouse Button Action:',/ALIGN_LEFT)
wLMBMode = WIDGET_DROPLIST(wLeftBase,       $ ;left mouse-button mode
           VALUE=["Rotate Unconstrained",       "Rotate about Screen X",      $
                  "Rotate about Screen Y",      "Rotate about Screen Z",      $
                  "Rotate about Data X (Red)",  "Rotate about Data Y (Green)",$
                  "Rotate about Data Z (Blue)", "Scale"],                     $
           UVALUE='LMBMODE', /ALIGN_LEFT )
wNonExclusiveBase = WIDGET_BASE(wLeftBase, /NONEXCLUSIVE, /FRAME)
wLightButton=WIDGET_BUTTON(wNonExclusiveBase,VALUE="Lighting",UVALUE='LIGHTING')
wCuttingSlider=WIDGET_SLIDER(wLeftBase, TITLE='Cutting Plane',UVALUE='CUTTING_PLANE')
TransparencyBase = Widget_Base(wLeftBase,  FRAME=1 $
      ,SCR_XSIZE=169 ,SCR_YSIZE=66 ,SPACE=3 ,XPAD=3 ,YPAD=3)
TransparencySlider = Widget_Slider(TransparencyBase , SENSITIVE = 0 $
      ,XOFFSET=10 ,YOFFSET=3 ,MINIMUM=0 ,MAXIMUM=255 ,VALUE=0 $
      ,SCR_XSIZE=148 ,SCR_YSIZE=33 ,UVALUE='TransparencySlider')
TransparencyLabel =  Widget_Label(TransparencyBase, XOFFSET=9 ,YOFFSET=43 $
      ,SCR_XSIZE=80 ,SCR_YSIZE=16 ,/ALIGN_LEFT ,VALUE='Transparency')
TransparencyOnBase = Widget_Base(TransparencyBase, XOFFSET=90 ,YOFFSET=36  $
      ,SCR_XSIZE=60 ,SCR_YSIZE=22 ,XPAD=3 ,YPAD=3 ,COLUMN=1 ,/NONEXCLUSIVE)
TransparencyOn=Widget_Button(TransparencyOnBase,XOFFSET=3,YOFFSET=3,SCR_XSIZE=70  $
      ,SCR_YSIZE=20 ,/ALIGN_LEFT ,VALUE='On/Off', UVALUE='Transparency0n')

hSlice_base = Widget_Base(wLeftBase,  $
      UNAME='hSlice_base' ,FRAME=1 ,XOFFSET=837 ,YOFFSET=20  $
      ,SCR_XSIZE=169 ,SCR_YSIZE=166 ,SPACE=3 ,XPAD=3 ,YPAD=3)

Slice_label = Widget_Label(hSlice_base,  $
      UNAME='Slice_label' ,XOFFSET=12 ,YOFFSET=3  $
      ,SCR_XSIZE=150 ,SCR_YSIZE=18 ,/ALIGN_CENTER ,VALUE='Slice Operation')

hSlice_base_line = Widget_Base(hSlice_base,  $
      UNAME='hSlice_base_line' ,FRAME=1 ,XOFFSET=6  $
      ,YOFFSET=25 ,SCR_XSIZE=146 ,SCR_YSIZE=2 ,SPACE=3 ,XPAD=3 ,YPAD=3)

Slice_x_label = Widget_Label(hSlice_base,  $
      UNAME='Slice_x_label' ,XOFFSET=2 ,YOFFSET=46  $
      ,SCR_XSIZE=18 ,SCR_YSIZE=18 ,/ALIGN_CENTER ,VALUE='X')

Slice_y_label = Widget_Label(hSlice_base,  $
      UNAME='Slice_y_label' ,XOFFSET=2 ,YOFFSET=80  $
      ,SCR_XSIZE=18 ,SCR_YSIZE=18 ,/ALIGN_CENTER ,VALUE='Y')

Slice_z_label = Widget_Label(hSlice_base,  $
      UNAME='Slice_z_label' ,XOFFSET=2 ,YOFFSET=113  $
      ,SCR_XSIZE=19 ,SCR_YSIZE=18 ,/ALIGN_CENTER ,VALUE='Z')

hSlice_x_slider = Widget_Slider(hSlice_base,  $
      UNAME='Slice_x_slider' ,XOFFSET=20 ,YOFFSET=29  $
      ,SCR_XSIZE=100 ,SCR_YSIZE=32 ,MINIMUM=1 ,MAXIMUM=200 ,VALUE=1 ,$
      UVALUE='hfslicexslider')

hSlice_y_slider = Widget_Slider(hSlice_base,  $
      UNAME='Slice_y_slider' ,XOFFSET=20 ,YOFFSET=62  $
      ,SCR_XSIZE=100 ,SCR_YSIZE=32 ,MINIMUM=1 ,MAXIMUM=200 ,VALUE=1 ,$
      UVALUE='hfsliceyslider')

hSlice_z_slider = Widget_Slider(hSlice_base,  $
      UNAME='Slice_z_slider' ,XOFFSET=20 ,YOFFSET=95  $
      ,SCR_XSIZE=100 ,SCR_YSIZE=32 ,MINIMUM=1 ,MAXIMUM=200 ,VALUE=1 ,$
      UVALUE='hfslicezslider')

Slice_on_label = Widget_Label(hSlice_base,  $
      UNAME='Slice_on_label' ,XOFFSET=130 ,YOFFSET=30  $
      ,/ALIGN_LEFT ,VALUE='On')

Slice_on_x_base = Widget_Base(hSlice_base,  $
      UNAME='Slice_on_x_base' ,XOFFSET=130 ,YOFFSET=40  $
      ,SCR_XSIZE=18 ,SCR_YSIZE=22 ,COLUMN=1 ,/NONEXCLUSIVE)

hSlice_on_x_button = Widget_Button(Slice_on_x_base,  $
      UNAME='Slice_on_x_button' ,/ALIGN_LEFT ,VALUE='' ,$
      UVALUE='hfsliceonxbutton')

Slice_on_y_base = Widget_Base(hSlice_base,  $
      UNAME='Slice_on_y_base' ,XOFFSET=130 ,YOFFSET=73  $
      ,SCR_XSIZE=18 ,SCR_YSIZE=22 ,COLUMN=1 ,/NONEXCLUSIVE)

hSlice_on_y_button = Widget_Button(Slice_on_y_base,  $
      UNAME='Slice_on_y_button' ,/ALIGN_LEFT ,VALUE='' ,$
      UVALUE='hfsliceonybutton')

Slice_on_z_base = Widget_Base(hSlice_base,  $
      UNAME='Slice_on_z_base' ,XOFFSET=130 ,YOFFSET=106  $
      ,SCR_XSIZE=18 ,SCR_YSIZE=22 ,COLUMN=1 ,/NONEXCLUSIVE)

hSlice_on_z_button = Widget_Button(Slice_on_z_base,  $
      UNAME='Slice_on_z_button' ,/ALIGN_LEFT ,VALUE='' ,$
      UVALUE='hfsliceonzbutton')

Slice_on_base = Widget_Base(hSlice_base,  $
      UNAME='Slice_on_base' ,XOFFSET=14 ,YOFFSET=133  $
      ,SCR_XSIZE=60 ,SCR_YSIZE=20 ,YPAD=3 ,COLUMN=1 ,/NONEXCLUSIVE)

hSlice_on = Widget_Button(Slice_on_base,  $
      UNAME='Slice_on' ,YOFFSET=3 ,SCR_XSIZE=66  $
      ,SCR_YSIZE=20 ,/ALIGN_LEFT ,VALUE='On/Off' ,$
      UVALUE='hfsliceon')

hSlice_save = Widget_Button(hSlice_base,  $
      UNAME='Slice_save' ,XOFFSET=100 ,YOFFSET=135  $
      ,SCR_XSIZE=43 ,SCR_YSIZE=20 ,/ALIGN_CENTER ,VALUE='Save' ,$
      UVALUE='hfslicesave')

InformationLabel=Widget_Label(wLeftBase,VALUE='Information',/FRAME,/DYNAMIC_RESIZE)
      wRightbase = WIDGET_BASE(subBase)
wDraw=WIDGET_DRAW(wRightBase,GRAPHICS_LEVEL=2,XSIZE=xdim,YSIZE=ydim,/BUTTON_EVENTS, $
                  UVALUE='DRAW', RETAIN=0, /EXPOSE_EVENTS, RENDERER=1)
WIDGET_CONTROL, wBase, /REALIZE
WIDGET_CONTROL, wBase, /CLEAR_EVENTS
WIDGET_CONTROL, wDraw, GET_VALUE=rWindow
zoom = sqrt(2)
myview = [-.5, -.5, 1, 1] * zoom
aspect = FLOAT(xdim)/FLOAT(ydim)
if (aspect gt 1) then begin
    myview[0] = myview[0] - ((aspect-1.0)*myview[2])/2.0
    myview[2] = myview[2] * aspect
endif else begin
    myview[1] = myview[1] - (((1.0/aspect)-1.0)*myview[3])/2.0
    myview[3] = myview[3] / aspect
endelse
rView->SetProperty, VIEWPLANE_RECT=myview, PROJECTION=1, $
    EYE=2.0, ZCLIP=[1.0,-1.0], COLOR=[0,0,0]
rVolume->GetProperty,DATA0 = originalvolumedata
pState = PTR_NEW({         $
    center:[xdim,ydim]/2., radius:ydim/2, lmb_scale:0, btndown: 0b, sc:FLTARR(3), $
    TransparencyStatus:0, TransparencySlider: TransparencySlider,          $
    wDraw: wDraw, rVolume: rVolume, InformationLabel:InformationLabel,     $
    rScaleToys: rScaleToys, rModel:rModel, rView: rView, rWindow: rWindow, $

    originalvolumedata: originalvolumedata,    $
    volumexlength: i[1],            $
    volumeylength: i[2],            $
    volumezlength: i[3],            $

    hSlice_base: hSlice_base,                      $
    hSlice_x_slider: hSlice_x_slider,              $
    hSlice_y_slider: hSlice_y_slider,              $
    hSlice_z_slider: hSlice_z_slider,              $
    hSlice_on_x_button: hSlice_on_x_button,        $
    hSlice_on_y_button: hSlice_on_y_button,        $
    hSlice_on_z_button: hSlice_on_z_button,        $
    hSlice_on_x_button_status: 0,                           $
    hSlice_on_y_button_status: 0,                           $
    hSlice_on_z_button_status: 0,                           $
    hSlice_on: hSlice_on,                          $
    hSlice_on_status: 0,                                    $ ; 1=yes, 0=no
    hSlice_save: hSlice_save                       $
    })
WIDGET_CONTROL, wBase, SET_UVALUE=pState
WIDGET_CONTROL, (*pState).hSlice_x_slider,    SENSITIVE = 0
WIDGET_CONTROL, (*pState).hSlice_y_slider,    SENSITIVE = 0
WIDGET_CONTROL, (*pState).hSlice_z_slider,    SENSITIVE = 0
WIDGET_CONTROL, (*pState).hSlice_on_x_button, SENSITIVE = 0
WIDGET_CONTROL, (*pState).hSlice_on_y_button, SENSITIVE = 0
WIDGET_CONTROL, (*pState).hSlice_on_z_button, SENSITIVE = 0
WIDGET_CONTROL, (*pState).hSlice_save,        SENSITIVE = 0

(*pState).rVolume->SetProperty, VOLUME_SELECT=0
(*pState).rVolume->SetProperty, INTERPOLATE=1
(*pState).rWindow->SetProperty, QUALITY=2
rWindow->Draw, rView
XMANAGER, 'Chapter10VolumeRenderExercise', wBase, $
       CLEANUP='Chapter10VolumeRenderExerciseCleanup', /NO_BLOCK
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -