📄 chapter10volumerenderexercise.pro
字号:
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 + -