📄 chapter14happyyou3dscontrol.pro
字号:
state.model_cycle_pos = 0
state.selected = oModel
g = oModel->get(pos=0)
if (obj_isa(g,'IDLgrText')) then begin
rect = state.win->gettextdimensions(g)
end
state.oModelMan->SetTarget, state.selected
state.selected->GetProperty, uvalue=s
str = "Current selection : " + s
widget_control, state.text, set_value=str
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)]
widget_control, state.wModelSelectButton, sensitive= $
n_elements(*(state.model_lists[view_uval.num])) gt 2
state.win->Draw, state.scene
end
;----------------------------------------------------------------------------
Function Chapter14HappyYou3DSControlToggleState, wid
widget_control, wid, get_value=name
s = strpos(name,'(off)')
if (s NE -1) then begin
strput,name,'(on )',s
ret = 1
end else begin
s = strpos(name,'(on )')
strput,name,'(off)',s
ret = 0
end
widget_control, wid, set_value=name
return,ret
end
;----------------------------------------------------------------------------
pro Chapter14HappyYou3DSControlCleanup, wTopBase
widget_control, wtopbase, get_uvalue=state, /no_copy
for i=0,n_tags(state)-1 do begin
case size(state.(i), /TNAME) of
'POINTER': ptr_free, state.(i)
'OBJREF':obj_destroy, state.(i)
else:
endcase
end
end
;----------------------------------------------------------------------------
pro Chapter14HappyYou3DSControlEvent, ev
if tag_names(ev, /structure_name) eq 'WIDGET_KILL_REQUEST' then begin
widget_control,ev.top,/destroy
return
end
;If mouse buttons are down, only process draw widget events.
widget_control, ev.top, get_uvalue=state, /no_copy
widget_control, ev.id, get_uval=uval
if state.btndown eq 1 then begin
if uval[0] eq 'DRAW' then begin
if ev.type eq 0 then begin ; Button down event
widget_control, ev.top, set_uvalue=state, /no_copy
return ;ignore it.A mouse button is already down.
end
end else begin
widget_control, ev.top, set_uvalue=state, /no_copy
return
end
end
widget_control, ev.top, set_uvalue=state, /no_copy
;Normal event handling.
case uval[0] of
'QUIT' : begin
widget_control, ev.top, /destroy
return
end
'HELP' : begin
Chapter14HappyYou3DSHelp, 'Chapter14HappyYou3DSHelp.txt', TITLE='3DS Help System'
end
'ABOUT' : begin
result=dialog_message(['3DS System v 6.0 ','','Programming : HappyYou','', $
'程序设计 : Happy You ',' ', ' 2005.5.30'],/information)
end
'VRML' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
if (state.oCurrentView NE obj_new()) then begin
file=dialog_pickfile(/write,file='untitled.wrl',group=ev.top,filter='*.wrl')
if (file NE '') then begin
widget_control, /hourglass
state.win->GetProperty, dimension=wdims, resolution=res,color_model=cm, $
n_colors=icolors
oVRML = obj_new('IDLgrVRML', dimensions=wdims, resolution=res, $
color_model=cm, n_colors=icolors )
oVRML->setproperty, filename=file
oVRML->Draw, state.oCurrentView
obj_destroy,oVRML
end
end
widget_control, ev.top, set_uvalue=state, /no_copy
end
'PRINT' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
oPrinter = obj_new('IDLgrPrinter')
if (dialog_printersetup(oPrinter)) then begin
if (dialog_printjob(oPrinter)) then begin
oPrinter->GetProperty,resolution=res
DPI = 2.54/float(res)
state.win->GetProperty,resolution=res
DPI = 2.54/float(res)
state.win->GetProperty, dimension=wdims
oViews = state.scene->get(/all)
for i=0,n_elements(oViews)-1 do begin
oViews[i]->IDLgrView::getproperty, loc=loc,dim=vdim
loc = loc/DPI
vdim = vdim/DPI
oViews[i]->IDLgrView::setproperty, loc=loc, dim=vdim, units=1
end
oPrinter->Draw, state.scene
oPrinter->newdocument
for i=0,N_ELEMENTS(oViews)-1 do begin
oViews[i]->IDLgrView::getproperty, loc=loc,dim=vdim
loc = loc*DPI
vdim = vdim*DPI
oViews[i]->IDLgrView::setproperty, loc=loc,dim=vdim,units=0
end
end
end
obj_destroy,oPrinter
widget_control, ev.top, set_uvalue=state, /no_copy
end
'LOAD' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
if state.selected ne obj_new() then begin
file = dialog_pickfile( /read, /must_exist, group=ev.top, filter='*.sav' )
if (file NE '') then begin
restore, file, /relaxed_structure_assignment
Chapter14HappyYou3DSControlAdd, state, tmp_obj
end
end
widget_control, ev.top, set_uvalue=state, /no_copy
end
'SAVE' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
if state.selected NE obj_new() and $
state.selected NE state.oCurrentTopModel then begin
file = dialog_pickfile(/write,file='untitled.sav',group=ev.top, filter='*.sav')
if (file NE '') then begin
; Isolate tmp_obj from the tree.
state.selected->GetProperty, parent=parent
parent->remove, state.selected
state.oModelMan->SetTarget, obj_new()
tmp_obj = state.selected
save, tmp_obj, filename=file
; Repair the tree.
parent->add, state.selected
state.oModelMan->SetTarget, state.selected
end
end
widget_control, ev.top, set_uvalue=state, /no_copy
end
'MODELSELECT': begin ; Select next object.
widget_control, ev.top, get_uvalue=state, /no_copy
wDraw = state.wDraw
widget_control, ev.top, set_uvalue=state, /no_copy
Chapter14HappyYou3DSControlEvent, $
{id:wDraw,top:ev.top,handler:0L,type:0,press:4,x:-2,y:-2}
end
'UNSELECT': begin
widget_control, ev.top, get_uvalue=state, /no_copy
state.selected = state.oCurrentTopModel
widget_control, state.wModelDeleteButton, sensitive=0
widget_control, state.wAddChildButton, sensitive=0
widget_control, state.wUnselectButton, sensitive=0
widget_control, state.wModelModeRadio, sensitive=0
widget_control, state.wModelSelectButton, sensitive=1
widget_control, state.wSaveButton, sensitive=0
widget_control, state.text, set_value="No current selection "
state.oModelMan->SetTarget, obj_new()
state.win->Draw, state.scene
widget_control, ev.top, set_uvalue=state, /no_copy
end
'MODELMODE': begin
widget_control, ev.top, get_uvalue=state, /no_copy
Chapter14HappyYou3DSControlNewMode, state, ev.value
state.win->Draw, state.scene
widget_control, ev.top, set_uvalue=state, /no_copy
end
'ADD': begin
widget_control, ev.top, get_uvalue=state, /no_copy
if state.oBasePlatePolygon ne obj_new() then begin
Chapter14HappyYou3DSControlAdd, state, Chapter14HappyYou3DSControlMakeObj( $
(where(state.addable_subjects eq uval[1]))[0], state.theFont )
end
widget_control, ev.top, set_uvalue=state, /no_copy
end
'ADDCHILD': begin
widget_control, /hourglass
widget_control, ev.top, get_uvalue=state, /no_copy
if state.oBasePlatePolygon ne obj_new() then begin
Chapter14HappyYou3DSControlAdd, state, Chapter14HappyYou3DSControlMakeObj( $
(where(state.addable_subjects eq uval[1]))[0], state.theFont ), /as_child
end
widget_control, ev.top, set_uvalue=state, /no_copy
end
'DEL': begin
widget_control, ev.top, get_uvalue=state, /no_copy
if ((state.selected ne obj_new()) AND $
(state.selected ne state.oCurrentTopModel)) then begin
state.oModelMan->SetTarget, obj_new()
state.selected->GetProperty, parent=p
p->remove, state.selected
obj_destroy, state.selected
state.oCurrentView->GetProperty, uvalue=view_uval
indx = where( obj_valid(*(state.model_lists[view_uval.num])), count )
if indx[0] eq -1 then begin
*(state.model_lists[view_uval.num]) = obj_new()
state.selected = state.oCurrentTopModel
str = "No current selection "
widget_control, state.text, set_value=str
widget_control, state.wModelDeleteButton, sensitive=0
widget_control, state.wAddChildButton, sensitive=0
widget_control, state.wUnselectButton, sensitive=0
widget_control, state.wModelSelectButton, sensitive=0
widget_control, state.wSaveButton, sensitive=0
widget_control, state.wModelModeRadio, sensitive=0
state.win->Draw, state.scene
end else begin
*(state.model_lists[view_uval.num]) = $
[(*(state.model_lists[view_uval.num]))[indx], obj_new() ]
; Select something.
wDraw = state.wDraw
widget_control, ev.top, set_uvalue=state, /no_copy
Chapter14HappyYou3DSControlEvent, $
{id: wDraw, top: ev.top, handler:0L, type:0, press:4, x:-1, y:-1 }
return
end
end
widget_control, ev.top, set_uvalue=state, /no_copy
end
'DRAGQLOW' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
state.dragq = 0
widget_control, state.wDragQLow,sensitive=0
widget_control, state.wDragQMedium, sensitive=1
widget_control, state.wDragQHigh, sensitive=1
widget_control, ev.top, set_uvalue=state, /no_copy
end
'DRAGQMEDIUM' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
state.dragq = 1
widget_control, state.wDragQLow,sensitive=1
widget_control, state.wDragQMedium, sensitive=0
widget_control, state.wDragQHigh, sensitive=1
widget_control, ev.top, set_uvalue=state, /no_copy
end
'DRAGQHIGH' : begin
widget_control, ev.top, get_uvalue=state, /no_copy
state.dragq = 2
widget_control, state.wDragQLow,sensitive=1
widget_control, state.wDragQMedium, sensitive=1
widget_control, state.wDragQHigh, sensitive=0
widget_control, ev.top, set_uvalue=state, /no_copy
end
'GRID' : begin
widget_control, /hourglass
widget_control, ev.top, get_uvalue=state, /no_copy
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -