; docformat = 'rst' ;+ ; Object-widget program to display surface data and bring up a property sheet ; to change the surface's properties when the surface is double-clicked. ;- ;+ ; Event handler for surface viewer widget program. ; ; :Params: ; event : in, required, type=structure ; event structure for any event generated by this program ;- pro mgwidsurfaceviewer::handleEvents, event compile_opt strictarr uname = widget_info(event.id, /uname) case uname of 'draw': begin update = self.trackball->update(event, transform=rotation) if (update) then begin self.model->getProperty, transform=transform self.model->setProperty, transform=transform # rotation self.draw->draw, self.view endif if (event.clicks eq 2L) then begin selected = self.draw->select(self.view, [event.x, event.y]) if (selected eq self.surface) then begin if (obj_valid(self.properties)) then begin self.properties->show endif else begin self.properties = obj_new('MGwidSurfaceProperties', $ self.surface, viewer=self) endelse endif endif end else: message, 'unknown widget generated event' endcase end ;+ ; Cleanup routine for widget program. ; ; :Params: ; tlb : in, optional, type=long ; top-level base widget identifier for this program ;- pro mgwidsurfaceviewer::cleanupWidgets, tlb compile_opt strictarr obj_destroy, self end ;+ ; Routine to create the object graphics hierarchy for the surface display. ;- pro mgwidsurfaceviewer::_createGraphics compile_opt strictarr self.view = obj_new('IDLgrView', color=[0, 0, 0]) self.model = obj_new('IDLgrModel') self.view->add, self.model self.surface = obj_new('IDLgrSurface', *self.data, name='IDLgrSurface', $ style=2, color=[255, 0, 0], bottom=[100, 0, 0], $ /register_properties) self.model->add, self.surface self.surface->getProperty, xrange=xr, yrange=yr, zrange=zr xc = norm_coord(xr) xc[0] -= 0.5 yc = norm_coord(yr) yc[0] -= 0.5 zc = norm_coord(zr) zc[0] -= 0.5 self.surface->setProperty, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc self.model->rotate, [1, 0, 0], -90 self.model->rotate, [0, 1, 0], -30 self.model->rotate, [1, 0, 0], 30 lightmodel = obj_new('IDLgrModel') self.view->add, lightmodel light = obj_new('IDLgrLight', type=2, location=[-1, 1, 1]) lightmodel->add, light self.trackball = obj_new('Trackball', [300, 300], 300) self->refreshDisplay end ;+ ; Refreshes object graphics display. ;- pro mgwidsurfaceviewer::refreshDisplay compile_opt strictarr self.draw->draw, self.view end ;+ ; Creates widget hierarchy. ;- pro mgwidsurfaceviewer::createWidgets compile_opt strictarr self.tlb = widget_base(title='Surface viewer', /column, uvalue=self) draw = widget_draw(self.tlb, uname='draw', graphics_level=2, $ /motion_events, /button_events, $ xsize=600, ysize=600) end ;+ ; Realize the widget hierarchy. ;- pro mgwidsurfaceviewer::realizeWidgets compile_opt strictarr widget_control, self.tlb, /realize widget_control, widget_info(self.tlb, find_by_uname='draw'), get_value=draw self.draw = draw end ;+ ; Start event handling. ;- pro mgwidsurfaceviewer::startXmanager compile_opt strictarr xmanager, 'mgwidsurfaceviewer', self.tlb, /no_block, $ event_handler='mg_object_event_handler', $ cleanup='mg_object_cleanup' end ;+ ; Free resources of this object. ;- pro mgwidsurfaceviewer::cleanup compile_opt strictarr ptr_free, self.data obj_destroy, [self.view, self.trackball, self.properties] end ;+ ; Create a surface viewer object. ; ; :Returns: ; 1 for success, 0 for failure ; ; :Params: ; z : in, required, type="fltarr(m, n)" ; data to display as a surface ;- function mgwidsurfaceviewer::init, z compile_opt strictarr self.data = ptr_new(z) self->createWidgets self->realizeWidgets self->_createGraphics self->startXmanager return, 1 end ;+ ; Define instance variables for the surface viewer. ; ; :Fields: ; tlb ; widget identifier for the top-level base ; data ; pointer to surface data ; draw ; object reference to IDLgrWindow ; trackball ; Trackball object for rotating surface ; view ; IDLgrView of the display ; model ; IDLgrModel containing surface ; surface ; IDLgrSurface displayed ; properties ; MGwidSurfaceProperties widget program reference ;- pro mgwidsurfaceviewer__define compile_opt strictarr define = { MGwidSurfaceViewer, $ tlb: 0L, $ data: ptr_new(), $ draw: obj_new(), $ trackball: obj_new(), $ view: obj_new(), $ model: obj_new(), $ surface: obj_new(), $ properties: obj_new() $ } end