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

📄 chapter14happyyou3dscontrol.pro

📁 idl 可视化分析与应用(随书程序)
💻 PRO
📖 第 1 页 / 共 3 页
字号:
    if (OBJ_VALID(state.oCurrentView)) then begin
      if (OBJ_VALID(state.oBasePlatePolygon)) then begin
        state.oBasePlatePolygon->SetProperty, $
                   hide=1-Chapter14HappyYou3DSControlToggleState(state.wGridButton)
        state.win->Draw, state.scene
      end
    end
    widget_control, ev.top, set_uvalue=state, /no_copy
  end
  'DRAW': begin
    widget_control, ev.top, get_uvalue=state, /no_copy
    ; Expose.
    if (ev.type EQ 4) then state.win->Draw, state.scene
    ; Handle trackball updates.
    if state.oTrackballMB2->Update(ev, transform=qmat) then begin
      state.oWorldRotModel->GetProperty, transform=t
      mt = t # qmat
      state.oWorldRotModel->setproperty,transform=mt
      state.win->Draw, state.scene
    end
    have_mb1_transform = state.oTrackballMB1->Update(ev, transform=mb1_transform)
    ; Handle other events
    case ev.type of
      0 : begin ; Button press
        case 1 of
          ev.press EQ 4: begin
            widget_control, /hourglass
            if ev.x lt 0 then begin
              state.oCurrentView->GetProperty, uvalue=view_uval
              if n_elements(*(state.model_lists[view_uval.num])) gt 1 then begin
                state.model_cycle_pos = state.model_cycle_pos + ([0,1])[abs(ev.x) - 1]
                state.model_cycle_pos = state.model_cycle_pos $
                  mod ( n_elements( *(state.model_lists[view_uval.num]) ) - 1 )
                picked = (( $
                  *(state.model_lists[view_uval.num]))[state.model_cycle_pos])->get()
              end else begin
                picked = obj_new()
              end
            end else begin
              state.oModelMan->setproperty,hide=1
              picked = state.win->select( state.oCurrentView,[ev.x,ev.y] )
              state.oModelMan->setproperty,hide=0
            end
            if obj_valid(picked[0]) then begin
              if (picked[0] EQ state.oBasePlatePolygon) then begin
                state.selected = state.oCurrentTopModel
                str = "No current selection  "
                widget_control, state.wModelDeleteButton, sensitive=0
                widget_control, state.wAddChildButton, sensitive=0
                widget_control, state.wUnselectButton, sensitive=0
                widget_control, state.wSaveButton, sensitive=0
              end else begin
                if (obj_isa(picked[0],'IDLgrModel') EQ 1) then begin
                  picked[0]->IDLgrModel::getproperty,parent=p
                end else begin
                  picked[0]->GetProperty, parent=p
                end
                if (state.selected EQ p) then begin
                  state.oModelMan->GetProperty, mode=mode
                  Chapter14HappyYou3DSControlNewMode, state, (mode + 1) mod 3
                end
                state.oCurrentView->GetProperty, uvalue=view_uval
                state.model_cycle_pos = where(*(state.model_lists[view_uval.num]) eq p)
                state.selected = p
                state.selected->GetProperty, uvalue=s
                str = "Current selection :  " + s
                widget_control, state.wModelDeleteButton, sensitive=1
                widget_control, state.wAddChildButton, sensitive=1
                widget_control, state.wUnselectButton, sensitive=1
                widget_control, state.wModelModeRadio, sensitive=1
                widget_control, state.wSaveButton, sensitive=([1,0])[lmgr(/demo)]
                state.oCurrentView->GetProperty, uvalue=view_uval
                if n_elements( *(state.model_lists[view_uval.num]) ) le 2 then begin
                  widget_control, state.wModelSelectButton, sensitive=0
                endif
              end
            end else begin
              state.selected = state.oCurrentTopModel
              str = "No current selection  "
              widget_control, state.wModelDeleteButton, sensitive=0
              widget_control, state.wAddChildButton, sensitive=0
              widget_control, state.wUnselectButton, sensitive=0
              widget_control, state.wModelModeRadio, sensitive=0
              ; try to change the current view...
              if ev.x ge 0 then begin
                state.oViewMan->setproperty,hide=1
                picked = state.win->select(state.scene,[ev.x,ev.y])
                state.oViewMan->setproperty, hide=0
              end
              state.oCurrentView->GetProperty, uvalue=view_uval
              if n_elements( *(state.model_lists[view_uval.num]) ) gt 1 then begin
                widget_control, state.wModelSelectButton, sensitive=1
              endif
            end
            ; point the oModelMan at the node...
            state.oModelMan->GetProperty,target=manip
            if (manip ne state.selected) then begin
              state.oModelMan->SetTarget,obj_new()
            end
            if ((state.selected ne state.oCurrentTopModel) and $
                (state.selected ne obj_new())) then begin
              state.oModelMan->SetTarget,state.selected
            end
            widget_control, state.text, set_value=str
            state.win->Draw, state.scene
          end
          ev.press EQ 2: begin
            state.win->setproperty, QUALITY=state.dragq
            widget_control,state.wDraw,/draw_motion
          end
          ev.press EQ 1: begin
            state.win->SetProperty, QUALITY=state.dragq
            widget_control, state.wDraw, /draw_motion
            state.btndown = 1b
            if ((state.selected ne state.oCurrentTopModel) and $
                (state.selected ne obj_new())) then begin
              state.oModelMan->MouseDown, [ev.x,ev.y], state.win
            end
          end
          else:
        endcase
      end
      2: begin ; Button motion.
        if state.btndown eq 1b then begin
          case 1 of
            (state.selected ne state.oCurrentTopModel) and  $
                              (state.selected ne obj_new()): begin
              state.oModelMan->MouseTrack, [ev.x,ev.y], state.win
              state.win->Draw, state.scene
            end
            else: begin
              ; Rotate.
              if have_mb1_transform then begin
                state.oWorldRotModel->GetProperty, transform=t
                state.oWorldRotModel->SetProperty, transform=t # mb1_transform
                state.win->Draw, state.scene
              end
            end
          endcase
        end
      end
      1: begin ; Button release.
        if state.btndown eq 1b then begin
          case 1 of
            (state.selected ne state.oCurrentTopModel) and $
            (state.selected ne obj_new()):state.oModelMan->MouseUp,[ev.x,ev.y],state.win
            else:
          endcase
        end
        state.btndown = 0b
        state.win->setproperty, QUALITY=2
        state.win->Draw, state.scene
        widget_control,state.wDraw,draw_motion=0
      end
      else:
    endcase
    widget_control, ev.top, set_uvalue=state, /no_copy
  end
  endcase
end
; -----------------------------------------------------------------
pro Chapter14HappyYou3DSControl
  device, get_screen_size = screensize
  xdim = screensize[0]*0.6   &   ydim = xdim*0.6
  wTopBase = widget_base( /column, title="HappyYou 3DS", xpad=0, ypad=0, $
          /tlb_kill_request_events, tlb_frame_attr=1, mbar=FileMenuBase )
  wFileButton = widget_button(FileMenuBase, value='File', /menu)
  wLoadButton = widget_button( wFileButton, value="Load", uval='LOAD' )
  wSaveButton = widget_button( wFileButton, value="Save Selection", uval='SAVE' )
  wPrintButton = widget_button( wFileButton, value="Print", uval='PRINT' )
  wVRMLButton = widget_button( wFileButton, value="Export VRML", uval='VRML' )
  void = widget_button( wFileButton, value='Quit', /separator, uvalue='QUIT' )
  wOptionsButton = widget_button(FileMenuBase, /menu, value="Options")
  wDragQ = widget_button(wOptionsButton, /menu, value="Drag Quality")
  wDragQLow = widget_button( wDragQ, value='Low', uval='DRAGQLOW' )
  wDragQMedium = widget_button( wDragQ, value='Medium', uval='DRAGQMEDIUM' )
  wDragQHigh = widget_button( wDragQ, value='High', uval='DRAGQHIGH' )
  wGridButton = widget_button( wOptionsButton, value="Show Grid (on )", uval='GRID' )
  wHelpButton = widget_button(FileMenuBase, value='3DS Help', /help, /menu)
  waboutbutton = widget_button(wHelpButton, value='Help', uvalue='HELP')
  waboutbutton = widget_button(wHelpButton, value='About 3DS', uvalue='ABOUT')
  wTopRowBase = widget_base(wTopBase,/row,/frame)
  addable_subjects = [ 'Sphere', 'Cube', 'Tetrahedron', 'Cone', 'Green Light', $
                       'Surface', 'Image',     'White Light','3D Text','Plot', $
                       'Ribbon Plot','Bar Plot' ]
  wGuiBase1 = widget_base(wTopRowBase, /column )
  wStackerBase = widget_base(wGuiBase1, xpad=0, ypad=0)
  wModelControlBase = widget_base(wStackerBase, xpad=0, ypad=0, /column )
  wModelModeRadio = cw_bgroup( wModelControlBase, ['Translate','Rotate','Scale'], $
                            /exclusive, /no_release, set_value=0, uvalue='MODELMODE')
  wAddButton = widget_button( wModelControlBase, value='Add', /menu )
  for i=0,n_elements(addable_subjects)-1 do begin
    void = widget_button(wAddButton, value=addable_subjects[i], $
    uvalue=['ADD', addable_subjects[i]] )
  end
  wAddChildButton = widget_button( wModelControlBase, value='Add Child', /menu )
  for i=0,n_elements(addable_subjects)-1 do begin
    void = widget_button(wAddChildButton, value=addable_subjects[i], $
      uvalue=['ADDCHILD', addable_subjects[i]] )
  end
  wModelDeleteButton = widget_button( wModelControlBase, value="Delete", uval='DEL' )
  wModelSelectButton = widget_button( wModelControlBase, value='Select', $
  uvalue='MODELSELECT' )
  wUnselectButton=widget_button(wModelControlBase,value='Unselect',uvalue='UNSELECT')
  wGuiBase2 = widget_base(wTopRowBase, xpad=0, ypad=0)
  wDraw = widget_draw(wGuiBase2, xsize=xdim, ysize=ydim,/button_ev, uval='DRAW', $
            retain=0, /expose_ev, graphics_level=2 )
  wStatusBase = widget_base(wTopBase, /row)
  wText = widget_label(wStatusBase, /dynamic_resize, value='')
  TempText = widget_label(wStatusBase, $
             value='    < Select by Right Button, Operate by Drag Left Button !>')
  widget_control, wTopBase, /realize
  widget_control, wdraw, get_value=win
  Scene=obj_new('IDLgrScene')
  oCurrentView = Chapter14HappyYou3DSControlmakeview(xdim,ydim,{name:'ObjView',num:0})
  oCurrentView->getproperty, dim=dim, loc=loc
  Scene->add, oCurrentView
  Chapter14HappyYou3DSControlgetviewobjs, $
      oCurrentView, oWorldRotModel, oBasePlatePolygon, oCurrentTopModel
  thefont = objarr(4)
  thefont[0] = obj_new('IDLgrFont','times',size=30)
  thefont[1] = obj_new('IDLgrFont','hershey*3',size=9)
  thefont[2] = obj_new('IDLgrFont','helvetica',size=40)
  thefont[3] = obj_new('IDLgrFont','helvetica',size=12)
  state = { oTrackballMB1: obj_new('trackball', (loc + dim/2.0), dim[0] / 2.0 ),   $
    oTrackballMB2: obj_new('trackball', (loc + dim/2.0), dim[0] / 2.0, mouse=2b ), $
    btndown: 0b, thefont: thefont, wDraw: wDraw,   $
    oWorldRotModel: oWorldRotModel, oBasePlatePolygon: oBasePlatePolygon,          $
    oCurrentView: oCurrentView,      $
    oModelMan : obj_new('IDLexModelManip', translate=[1,1,1],        $
    selector_color=[255,255,255], manipulator_color=[255, 60, 60] ), $
    oViewMan : obj_new('IDLexViewManip', color=[255, 0, 0] ),        $
    addable_subjects: addable_subjects, $
    text: wtext, win: win, oCurrentTopModel: oCurrentTopModel, $
    selected: oCurrentTopModel, Scene: Scene, dragq: 1, model_lists: ptrarr(50),  $
    wModelControlBase: wModelControlBase, wModelDeleteButton: wModelDeleteButton, $
    wAddChildButton: wAddChildButton,     wModelSelectButton: wModelSelectButton, $
    wModelModeRadio: wModelModeRadio,     wUnselectButton: wUnselectButton,   $
    wDragQLow: wDragQLow, wDragQMedium: wDragQMedium, wDragQHigh: wDragQHigh, $
    wGridButton: wGridButton, wLoadButton: wLoadButton, wSaveButton: wSaveButton, $
    model_cycle_pos: 1  }
  restore, demo_filepath('objw_surf.sav', subdir=['examples','demo','demodata'] ), $
                         /relaxed_structure_assignment
  tmp_obj->translate, 0, 0, .001, /premultiply
  state.selected->add, tmp_obj
  state.model_lists[0] = ptr_new([ tmp_obj, tmp_obj->get(position=1), obj_new()])
  state.selected = tmp_obj->Get(position=1)
  state.oModelMan->SetTarget, state.selected
  state.selected->getproperty,uvalue=s
  str = "Current selection :  " + s
  widget_control, state.text, set_value=str
  state.oWorldRotModel->rotate, [-1,0,0], 40
  state.oWorldRotModel->rotate, [0,1,0], 20
  state.oWorldRotModel->rotate, [0,0,1], 20
  widget_control, wDragQMedium, sensitive=0
  widget_control, wTopBase, set_uvalue=state, /no_copy
  xmanager,'Chapter14HappyYou3DSControl', $
    wTopBase,event_handler='Chapter14HappyYou3DSControlevent', $
    cleanup='Chapter14HappyYou3DSControlcleanup', /no_block
end

⌨️ 快捷键说明

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