📄 chapter10volumerenderexercise.pro
字号:
endif else begin
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
widget_control, (*pState).hSlice_on_x_button, SET_BUTTON = 0
widget_control, (*pState).hSlice_on_y_button, SET_BUTTON = 0
widget_control, (*pState).hSlice_on_z_button, SET_BUTTON = 0
(*pState).hSlice_on_x_button_status = 0
(*pState).hSlice_on_x_button_status = 0
(*pState).hSlice_on_x_button_status = 0
widget_control, (*pState).hSlice_x_slider, set_value = 1
widget_control, (*pState).hSlice_y_slider, set_value = 1
widget_control, (*pState).hSlice_z_slider, set_value = 1
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
tmpdd = (*pState).originalvolumedata
(*pState).rVolume->SetProperty,DATA0 = tmpdd
(*pState).rVolume->SetProperty, CUTTING_PLANE = 0
(*pState).rWindow->Draw, (*pState).rView
endelse
end
'hfsliceonxbutton': begin
(*pState).hSlice_on_x_button_status = event.select
(*pState).rVolume->SetProperty,DATA0 = (*pState).originalvolumedata
(*pState).rVolume->SetProperty, CUTTING_PLANE=0
widget_control, (*pState).hSlice_x_slider, get_value = xvalue
widget_control, (*pState).hSlice_y_slider, get_value = yvalue
widget_control, (*pState).hSlice_z_slider, get_value = zvalue
if (*pState).hSlice_on_x_button_status or $
(*pState).hSlice_on_y_button_status or $
(*pState).hSlice_on_z_button_status then begin
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
(*pState).rVolume->SetProperty, CUTTING_PLANE = 0
if (*pState).hSlice_on_x_button_status then begin
for j = 0, (*pState).volumeylength-1 do begin
for k = 0, (*pState).volumezlength-1 do begin
tmpdd[xvalue-1,j,k] = (*pState).originalvolumedata[xvalue-1,j,k]
endfor
endfor
endif
if (*pState).hSlice_on_y_button_status then begin
for i = 0, (*pState).volumexlength-1 do begin
for k = 0, (*pState).volumezlength-1 do begin
tmpdd[i,yvalue-1,k] = (*pState).originalvolumedata[i,yvalue-1,k]
endfor
endfor
endif
if (*pState).hSlice_on_z_button_status then begin
for i = 0, (*pState).volumexlength-1 do begin
for j = 0, (*pState).volumeylength-1 do begin
tmpdd[i,j,zvalue-1] = (*pState).originalvolumedata[i,j,zvalue-1]
endfor
endfor
endif
(*pState).rVolume->SetProperty,DATA0 = tmpdd
endif else begin
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
tmpdd = (*pState).originalvolumedata
(*pState).rVolume->SetProperty,DATA0 = tmpdd
(*pState).rVolume->SetProperty, $
CUTTING_PLANE=[xvalue, yvalue, zvalue, -(xvalue*xvalue + yvalue*yvalue + zvalue*zvalue)]
endelse
(*pState).rWindow->Draw, (*pState).rView
end
'hfsliceonybutton': begin
(*pState).hSlice_on_y_button_status = event.select
(*pState).rVolume->SetProperty,DATA0 = (*pState).originalvolumedata
(*pState).rVolume->SetProperty, CUTTING_PLANE=0
widget_control, (*pState).hSlice_x_slider, get_value = xvalue
widget_control, (*pState).hSlice_y_slider, get_value = yvalue
widget_control, (*pState).hSlice_z_slider, get_value = zvalue
if (*pState).hSlice_on_x_button_status or $
(*pState).hSlice_on_y_button_status or $
(*pState).hSlice_on_z_button_status then begin
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
(*pState).rVolume->SetProperty, CUTTING_PLANE = 0
if (*pState).hSlice_on_x_button_status then begin
for j = 0, (*pState).volumeylength-1 do begin
for k = 0, (*pState).volumezlength-1 do begin
tmpdd[xvalue-1,j,k] = (*pState).originalvolumedata[xvalue-1,j,k]
endfor
endfor
endif
if (*pState).hSlice_on_y_button_status then begin
for i = 0, (*pState).volumexlength-1 do begin
for k = 0, (*pState).volumezlength-1 do begin
tmpdd[i,yvalue-1,k] = (*pState).originalvolumedata[i,yvalue-1,k]
endfor
endfor
endif
if (*pState).hSlice_on_z_button_status then begin
for i = 0, (*pState).volumexlength-1 do begin
for j = 0, (*pState).volumeylength-1 do begin
tmpdd[i,j,zvalue-1] = (*pState).originalvolumedata[i,j,zvalue-1]
endfor
endfor
endif
(*pState).rVolume->SetProperty,DATA0 = tmpdd
endif else begin
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
tmpdd = (*pState).originalvolumedata
(*pState).rVolume->SetProperty,DATA0 = tmpdd
(*pState).rVolume->SetProperty, $
CUTTING_PLANE=[xvalue, yvalue, zvalue, -(xvalue*xvalue + yvalue*yvalue + zvalue*zvalue)]
endelse
(*pState).rWindow->Draw, (*pState).rView
end
'hfsliceonzbutton': begin
(*pState).hSlice_on_z_button_status = event.select
(*pState).rVolume->SetProperty,DATA0 = (*pState).originalvolumedata
(*pState).rVolume->SetProperty, CUTTING_PLANE=0
widget_control, (*pState).hSlice_x_slider, get_value = xvalue
widget_control, (*pState).hSlice_y_slider, get_value = yvalue
widget_control, (*pState).hSlice_z_slider, get_value = zvalue
if (*pState).hSlice_on_x_button_status or $
(*pState).hSlice_on_y_button_status or $
(*pState).hSlice_on_z_button_status then begin
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
(*pState).rVolume->SetProperty, CUTTING_PLANE = 0
if (*pState).hSlice_on_x_button_status then begin
for j = 0, (*pState).volumeylength-1 do begin
for k = 0, (*pState).volumezlength-1 do begin
tmpdd[xvalue-1,j,k] = (*pState).originalvolumedata[xvalue-1,j,k]
endfor
endfor
endif
if (*pState).hSlice_on_y_button_status then begin
for i = 0, (*pState).volumexlength-1 do begin
for k = 0, (*pState).volumezlength-1 do begin
tmpdd[i,yvalue-1,k] = (*pState).originalvolumedata[i,yvalue-1,k]
endfor
endfor
endif
if (*pState).hSlice_on_z_button_status then begin
for i = 0, (*pState).volumexlength-1 do begin
for j = 0, (*pState).volumeylength-1 do begin
tmpdd[i,j,zvalue-1] = (*pState).originalvolumedata[i,j,zvalue-1]
endfor
endfor
endif
(*pState).rVolume->SetProperty,DATA0 = tmpdd
endif else begin
tmpdd = intarr((*pState).volumexlength,(*pState).volumeylength,(*pState).volumezlength)
tmpdd = (*pState).originalvolumedata
(*pState).rVolume->SetProperty,DATA0 = tmpdd
(*pState).rVolume->SetProperty, $
CUTTING_PLANE=[xvalue, yvalue, zvalue, -(xvalue*xvalue + yvalue*yvalue + zvalue*zvalue)]
endelse
(*pState).rWindow->Draw, (*pState).rView
end
'hfslicesave': begin
widget_control, (*pState).hSlice_x_slider, get_value = xvalue
widget_control, (*pState).hSlice_y_slider, get_value = yvalue
widget_control, (*pState).hSlice_z_slider, get_value = zvalue
xvalue = float(xvalue)
yvalue = float(yvalue)
zvalue = float(zvalue)
myangleline = float(xvalue*xvalue + yvalue*yvalue + zvalue*zvalue)
lvalue = myangleline/xvalue
mvalue = myangleline/yvalue
nvalue = myangleline/zvalue
myxrotation = -acos(zvalue / sqrt(yvalue*yvalue+zvalue*zvalue))
myyrotation = acos(sqrt(yvalue*yvalue+zvalue*zvalue) / sqrt(myangleline))
myzrotation = !pi/2.0-acos(nvalue*nvalue / $
(sqrt(mvalue*mvalue+nvalue*nvalue)*sqrt(lvalue*lvalue+nvalue*nvalue)))
mymax = 3*((*pState).volumexlength>(*pState).volumexlength>(*pState).volumexlength)
sliceimage = extract_slice((*pState).originalvolumedata, $
mymax,mymax,xvalue,yvalue,zvalue, $
myxrotation, myyrotation, myzrotation, out_val=0, /RADIANS)
window, 0, xsize=mymax, ysize=mymax, $
TITLE='Slice Show Window',RETAIN=2
tvscl, sliceimage
Slice = DIALOG_PICKFILE( FILE='Slice.tif', $
FILTER='*.tif', /WRITE, TITLE='Saving Window ' )
if strlen(strtrim(slice)) ne 0 then begin
WRITE_TIFF, slice, sliceimage
result = dialog_message('OK! Slice is already saved !', /information, $
title='Information Window')
endif else begin
result = dialog_message(['Sorry, Slice can not be saved !', '', $
'File name can not be empty !'], $
title='Warning Window')
endelse
WDELETE, 0
end
'DRAW': begin
WIDGET_CONTROL, event.top, GET_UVALUE=pState, /NO_COPY
Chapter10VolumeRendeBackground, (*pState).TransparencyStatus, (*pState).rView
if (event.type eq 0) then $
if (event.press eq 1) AND ((*pState).lmb_scale eq 1) then event.press = 2
; Rotation updates.
if (*pState).rModel->Update(event) then begin
(*pState).rWindow->SetProperty, QUALITY=1
(*pState).rWindow->Draw, (*pState).rView
end
; Mouse button press.
if (event.type eq 0) then begin
case event.press of
2 : begin
; Middle mouse-button. Scale the objects.
xy = ([event.x, event.y] - (*pState).center)
r= TOTAL(xy^2) ; distance from center of unit circle
(*pState).sc[1] = SQRT(r)
(*pState).sc[2] = 1.0
end
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -