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