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

📄 chapter10volumerenderexercise.pro

📁 idl 可视化分析与应用(随书程序)
💻 PRO
📖 第 1 页 / 共 3 页
字号:
; Chapter10VolumeRenderExercise.pro
;----------------------------------------------------------------------------
PRO Chapter10VolumeRendeBackground, MyStatus, MyView
    IF MyStatus THEN BEGIN
        MyView->Setproperty, color = [255, 255, 255]
    ENDIF ELSE BEGIN
        MyView->Setproperty, color = [0, 0, 0]
    ENDELSE
END
;----------------------------------------------------------------------------
pro Chapter10VolumeRenderExercise_Event, event
if (TAG_NAMES(event, /STRUCTURE_NAME) eq 'WIDGET_KILL_REQUEST') then begin
    WIDGET_CONTROL, event.top, /DESTROY
    RETURN
endif
WIDGET_CONTROL, event.id, GET_UVALUE=uval
WIDGET_CONTROL, event.top, GET_UVALUE=pState
case uval of
    'LMBMODE' : begin ; Left Mouse-Button Mode.
        WIDGET_CONTROL, event.top, GET_UVALUE=pState, /NO_COPY
        case event.index of
            0: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, CONSTRAIN=0
                end
            1: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, AXIS=0, /CONSTRAIN
                end
            2: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, AXIS=1, /CONSTRAIN
                end
            3: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, AXIS=2, /CONSTRAIN
                end
            4: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, AXIS=0, CONSTRAIN=2
                end
            5: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, AXIS=1, CONSTRAIN=2
                end
            6: begin
                (*pState).lmb_scale = 0
                (*pState).rModel->SetProperty, AXIS=2, CONSTRAIN=2
                end
            7: begin
                (*pState).lmb_scale = 1
                end
            else:
        endcase
        Chapter10VolumeRendeBackground, (*pState).TransparencyStatus, (*pState).rView
        (*pState).rWindow->Draw, (*pState).rView
        WIDGET_CONTROL, event.top, SET_UVALUE=pState, /NO_COPY
     end
    'CUTTING_PLANE' : begin
        WIDGET_CONTROL, event.top, GET_UVALUE=pState, /NO_COPY
        Chapter10VolumeRendeBackground, (*pState).TransparencyStatus, (*pState).rView
        (*pState).rVolume->GetProperty, YRANGE=yrange
        (*pState).rVolume->SetProperty, $
                  CUTTING_PLANE=[0,1,0, -(event.value / 100.) * yrange[1]]
        (*pState).rWindow->Draw, (*pState).rView
        WIDGET_CONTROL, event.top, SET_UVALUE=pState, /NO_COPY
     end
    'LIGHTING': begin
        WIDGET_CONTROL, event.top, GET_UVALUE=pState, /NO_COPY
        Chapter10VolumeRendeBackground, (*pState).TransparencyStatus, (*pState).rView
        (*pState).rVolume->SetProperty, LIGHTING_MODEL=event.select
        (*pState).rWindow->Draw, (*pState).rView
        WIDGET_CONTROL, event.top, SET_UVALUE=pState, /NO_COPY
     end
    'TransparencySlider': begin
        WIDGET_CONTROL, event.top, GET_UVALUE=pState, /NO_COPY
        Chapter10VolumeRendeBackground, (*pState).TransparencyStatus, (*pState).rView
        widget_control, (*pState).TransparencySlider, get_value = myslider
        opac = BYTARR(256)
        opac[0:255] = BINDGEN(256)/myslider
        (*pState).rVolume -> SetProperty, OPACITY_TABLE0=opac
        (*pState).rWindow->Draw, (*pState).rView
        WIDGET_CONTROL, event.top, SET_UVALUE=pState, /NO_COPY
     end
    'Transparency0n': begin
        WIDGET_CONTROL, event.top, GET_UVALUE=pState, /NO_COPY
        (*pState).TransparencyStatus = event.select
        Chapter10VolumeRendeBackground, (*pState).TransparencyStatus, (*pState).rView
        if (*pState).TransparencyStatus then begin
            widget_control, (*pState).TransparencySlider, SENSITIVE = 1
            widget_control, (*pState).TransparencySlider, set_value = 16
            opac = BYTARR(256)
            opac[0:255] = BINDGEN(256)/16
            (*pState).rVolume -> SetProperty, OPACITY_TABLE0 = opac
        endif else begin
            widget_control, (*pState).TransparencySlider, SENSITIVE = 0
            widget_control, (*pState).TransparencySlider, set_value = 0
            opac = BYTARR(256)
            for i=0,255 do opac[i] = i
            (*pState).rVolume -> SetProperty, OPACITY_TABLE0 = opac
        endelse
        (*pState).rWindow->Draw, (*pState).rView
        WIDGET_CONTROL, event.top, SET_UVALUE=pState, /NO_COPY
     end   ; of Transparency

;
;     Slice operation.
;
        'hfslicexslider': begin

            (*pState).rVolume->SetProperty, DATA0 = (*pState).originalvolumedata
         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

        'hfsliceyslider': begin

            (*pState).rVolume->SetProperty, DATA0 = (*pState).originalvolumedata
         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

        'hfslicezslider': begin

            (*pState).rVolume->SetProperty, DATA0 = (*pState).originalvolumedata
         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

        'hfsliceon': begin

          (*pState).hSlice_on_status = event.select

             if (*pState).hSlice_on_status then begin

          widget_control, (*pState).hSlice_x_slider, SENSITIVE = 1
          widget_control, (*pState).hSlice_y_slider, SENSITIVE = 1
          widget_control, (*pState).hSlice_z_slider, SENSITIVE = 1
          widget_control, (*pState).hSlice_on_x_button, SENSITIVE = 1
          widget_control, (*pState).hSlice_on_y_button, SENSITIVE = 1
          widget_control, (*pState).hSlice_on_z_button, SENSITIVE = 1
          widget_control, (*pState).hSlice_save,     SENSITIVE = 1

          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

               (*pState).rVolume->SetProperty, $
                    CUTTING_PLANE=[xvalue, yvalue, zvalue, -(xvalue*xvalue + yvalue*yvalue + zvalue*zvalue)]

               (*pState).rWindow->Draw, (*pState).rView

⌨️ 快捷键说明

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