; $Id$ pro safe_obj_destroy,obj obj_size = n_elements(obj) if obj_size eq 1 then begin if obj_valid(obj) then obj_destroy,obj endif else begin for i = 0L, obj_size-1 do safe_obj_destroy,obj[i] endelse end PRO vizit_isoupd, data, state wBase = state.wBase widget_control, wBase, bad=bad, get_uvalue=state if bad ne 0 then return if nlevels eq 1 then begin shade_volume, data, state.level, vert ,poly *(state.data) = data ;if n_elements(vert) le 1 then return if n_elements(vert) le 1 then begin vert=fltarr(3,3) vert[*,*]=0. poly=[3,0,1,2] endif if state.nonequidistant eq 1 then begin vert[0,*]=interpol(state.xx,findgen(n_elements(state.xx)),reform(vert[0,*])) vert[1,*]=interpol(state.yy,findgen(n_elements(state.yy)),reform(vert[1,*])) vert[2,*]=interpol(state.zz,findgen(n_elements(state.zz)),reform(vert[2,*])) endif state.oPolygon->Setproperty, data=vert, poly=poly oModel->add, oPolygon endif else begin ;for eachlevel=0,nlevels-1 do oModel->add, oPolygon[eachlevel] endelse ;state.oModel->Rotate, [0,1,0], 5 state.oMainWindow->draw, state.oMainView min = min(data, max=max) hist = alog10(histogram(data, min=min, max=max, binsize=(max-min)/255.)+0.1) xcc = [0.,1./n_elements(hist)] & ycc = [0.,1./max(hist)] state.min = min state.max = max state.oPlot->SetProperty, datay=hist, XCOORD=xcc, YCOORD=ycc index = byte(255.*(state.level-min)/(max-min)) state.oLine->SetProperty, datay=[0,max(hist)], datax=[index,index], $ color=255, XCOORD=xcc, YCOORD=ycc state.oPlotWindow->draw, state.oPlotView widget_control, wBase, set_uvalue=state END ;---------------------------------------------------------------- PRO vizit, object, xsize=xsz, ysize=ysz, colortable=coltab, $ dx=dx, dy=dy, dz=dz, state=state, bgcolor=bgcolor, $ Lx=Lx,Ly=Ly,Lz=Lz,xyz0=xyz0, $ plevel=plevel, level=level, index=index, $ pVector=pVector, alpha=alpha, $ bboxcolor=bboxcolor, bboxfgcolor=bboxfgcolor, bboxbgcolor=bboxbgcolor, $ xtitle=xtitle,ytitle=ytitle,ztitle=ztitle,title=title, $ xrange=xrange,yrange=yrange,zrange=zrange, $ surfaces=surfaces, surfacealpha=surfacealpha, $ surfaceindex=surfaceindex, noiso=noiso, $ png=png,gif=gif,jpg=jpg,filename=filename, $ xx=xx,yy=yy,zz=zz, nonequidistant=nonequidistant, $ calcnormals=calcnormals, $ hideXAxis, hideYaxis, hideZaxis, $ drawbbox, drawcontent, $ drawdatabox, $ tmat=tmat, bboxthick=bboxthick, $ frameno=frameno, format_frameno=format_frameno,$ DEPTH_REORDER=DEPTH_REORDER, zclip=zclip, $ clip_planes=clip_planes, gradvar=gradvar, $ _extra=extra COMMON colors, ro,go, bo, r,g,b COMMON vizit, curr_coltab, curr_r, curr_g, curr_b IF N_PARAMS() EQ 0 THEN BEGIN print, "VIZIT, object, xsize=xsz, ysize=ysz, colortable=coltab, dx=dx, dy=dy, dz=dz" print, " object: a 3D data array, or a structure {data:d, dx:dx, dy:dy, dz:dz}" print, " xsize: window x-size" print, " ysize: window y-size" print, "colortable: color table number (default=40), or an RGB triplet" print, " " print, " left mousebutton: rotate" print, "middle mousebutton: translate" print, " right mousebutton: dolly" return ENDIF default, xsz, 600 default, ysz, 600 default, clip_planes, -1 default, bgcolor, [50,50,50] default, bboxcolor, [255,255,255] default, coltab, 39 default, curr_coltab, -1 default, bboxthick, 1. default, bboxfgcolor, bboxcolor default, bboxbgcolor, uint(bgcolor*0.25+bboxfgcolor*0.75) default, xtitle, '' default, ytitle, '' default, ztitle, '' default, hideXAxis, 1 default, hideYAxis, 1 default, hideZAxis, 1 default, drawdatabox, 0 if keyword_set(PNG) then begin default, drawbbox, 1 default, drawcontent, 1 endif else begin default, drawbbox, 0 default, drawcontent, 0 endelse default, format_frameno,'(I06)' if keyword_set(nonequidistant) then nonequidistant=1 else nonequidistant=0 if keyword_set(calcnormals) then calcnormals=1 else calcnormals=0 s=size(object) IF s[s[0]+1] EQ 8 THEN BEGIN default,field,'data' if tag_exists(object, field) then begin res=execute(strjoin(['data=object.',field]),1) endif if tag_exists(object, 'vector') then pVector = object.vector if tag_exists(object, 'dx' ) then default, dx, object.dx if tag_exists(object, 'dy' ) then default, dy, object.dy if tag_exists(object, 'dz' ) then default, dz, object.dz if tag_exists(object,'xyz0' ) then default, xyz0, object.xyz0 END ELSE BEGIN data=object END s = size(data) mx = s[1] & my = s[2] & mz = s[3] if not keyword_set(nonequidistant) then begin default, dx, 1. default, dy, 1. default, dz, 1. default, Lx, dx*mx default, Ly, dy*my default, Lz, dz*mz default, xyz0, [-Lx/2.,-Ly/2.,-Lz/2.] default,xrange,[xyz0[0],xyz0[0]+Lx] default,yrange,[xyz0[1],xyz0[1]+Ly] default,zrange,[xyz0[2],xyz0[2]+Lz] endif else begin default, xx, findgen(mx) default, yy, findgen(my) default, zz, findgen(mz) default, Lx, max(xx)-min(xx) default, Ly, max(yy)-min(yy) default, Lz, max(zz)-min(zz) default, xyz0, [min(xx),min(yy),min(zz)] endelse default,xrange,[xyz0[0],xyz0[0]+Lx] default,yrange,[xyz0[1],xyz0[1]+Ly] default,zrange,[xyz0[2],xyz0[2]+Lz] size = sqrt((Lx^2+Ly^2+Lz^2)/3.) box_size=[Lx,Ly,Lz]/size box_xyz0=-(box_size/2.) xcc_surfaces = [box_xyz0[0]-box_size[0]*(xyz0[0]/Lx),box_size[0]/Lx] ycc_surfaces = [box_xyz0[1]-box_size[1]*(xyz0[1]/Ly),box_size[1]/Ly] zcc_surfaces = [box_xyz0[2]-box_size[2]*(xyz0[2]/Lz),box_size[2]/Lz] xcc_polygon = [box_xyz0[0],box_size[0]/mx] ycc_polygon = [box_xyz0[1],box_size[1]/my] zcc_polygon = [box_xyz0[2],box_size[2]/mz] xcc_axis = [box_xyz0[0]-box_size[0]*(xyz0[0]/Lx),box_size[0]/Lx] ycc_axis = [box_xyz0[1]-box_size[1]*(xyz0[1]/Ly),box_size[1]/Ly] zcc_axis = [box_xyz0[2]-box_size[2]*(xyz0[2]/Lz),box_size[2]/Lz] default,axes_intersect,[min(xrange),min(yrange),min(zrange)] dev = !d.name set_plot,'z' IF n_elements(coltab) eq 1 THEN BEGIN if (coltab ne curr_coltab) then begin loadct, coltab, ncol=256 tvlct, curr_r, curr_g, curr_b, /GET curr_coltab=coltab endif END ELSE IF n_elements(coltab) eq 3 THEN BEGIN curr_r = replicate(coltab[0], 256) curr_g = replicate(coltab[1], 256) curr_b = replicate(coltab[2], 256) curr_coltab=-1 endif else begin if (curr_coltab ne 0) then begin loadct, 0, ncol=256 tvlct, curr_r, curr_g, curr_b, /GET curr_coltab=0 print, 'COLORTABLE should be either a colortable number or an RGB triple' endif endelse set_plot, dev oPalette = obj_new('IDLgrPalette', RED=curr_r, GREEN=curr_g, BLUE=curr_b) min = min(data,max=max) if min eq max then begin ; create fake variation eps = 1e-6*abs(max)+1e-20 data(mx/2,my/2,mz/2) = data(mx/2,my/2,mz/2)+eps min = min-eps default,level,min+0.5*eps level[*]=min+0.5*eps plevel=level plevel[*]=0.5 nlevels=n_elements(level) default, index, 128 endif else begin default, plevel, 0.9 default, level, (1.-plevel)*min + plevel*max plevel=(level-min)/(max-min) nlevels=n_elements(level) default, index, byte(255.*plevel) endelse ; ; Generate extra surfaces ; nsurfaces=n_elements(surfaces) oSurfaces=0 oTexture=0 if (nsurfaces gt 0) then begin surfnumbers=findgen(nsurfaces)/nsurfaces default, surfaceindex, byte((127.*surfnumbers)+128) oSurfaces=objarr(nsurfaces) default,surfacealpha,make_array(nsurfaces,value=255,/int) for eachsurface=0,nsurfaces-1 do begin texture=fltarr(2,2,2) texture[0,*,*]=surfaceindex[eachsurface] texture[1,*,*]=surfacealpha[eachsurface] oTexture=obj_new('IDLgrImage',texture,interleave=0) undefine,normals if (has_tag(surfaces[eachsurface], 'normals')) then begin if (ptr_valid(surfaces[eachsurface].normals)) then begin normals=*(surfaces[eachsurface].normals) endif endif oSurfaces[eachsurface] = obj_new('IDLgrPolygon', $ *(surfaces[eachsurface].vertices), $ POLYGONS=*(surfaces[eachsurface].triangles), $ NORMALS=normals, $ COLOR=surfaceindex[eachsurface], $ BOTTOM=surfaceindex[eachsurface], $ HIDE=1-drawcontent, $ PALETTE=oPalette, /SHADING, $ XCOORD_CONV=xcc_surfaces, $ YCOORD_CONV=ycc_surfaces, $ ZCOORD_CONV=zcc_surfaces, $ TEXTURE_MAP=oTexture) if ((((size(tmat))[0] eq 2) and n_elements(tmat) eq 16)) then begin if keyword_set(DEPTH_REORDER) then reorder_by_depth,oSurfaces[eachsurface],tmat=tmat endif endfor endif if keyword_set(noiso) then begin oPolygon=0 endif else begin ; ; Render Isosurface Objects (can be regenerated dynamically later) ; if (nlevels eq 1) then begin shade_volume, data, level, vert, poly if n_elements(vert) le 1 then begin vert=fltarr(3,3) vert[*,*]=0. poly=[3,0,1,2] endif default,alpha,255 index_shape=n_elements(index) if (index_shape eq 1) then begin print,"Color from color table" texture=fltarr(2,2,2) texture[0,*,*]=index texture[1,*,*]=alpha endif else if (index_shape eq 3) then begin print,"Color from RGB values" texture=fltarr(4,2,2) texture[0,*,*]=255 texture[1,*,*]=255 texture[2,*,*]=255 ;texture[0,*,*]=index[0] ;texture[1,*,*]=index[1] ;texture[2,*,*]=index[2] texture[3,*,*]=alpha endif else begin print,"Color index must be scalar colour index or [3] R,G,B value" exit endelse oTexture=obj_new('IDLgrImage',texture,interleave=0) if calcnormals eq 1 then begin default,gradvar,grad(data) normals=vert normals[0,*]=interpolate(gradvar[*,*,*,0],vert[0,*],vert[1,*],vert[2,*]) normals[1,*]=interpolate(gradvar[*,*,*,1],vert[0,*],vert[1,*],vert[2,*]) normals[2,*]=interpolate(gradvar[*,*,*,2],vert[0,*],vert[1,*],vert[2,*]) endif if nonequidistant eq 1 then begin vert[0,*]=interpol(xx,findgen(n_elements(xx)),reform(vert[0,*])) vert[1,*]=interpol(yy,findgen(n_elements(yy)),reform(vert[1,*])) vert[2,*]=interpol(zz,findgen(n_elements(zz)),reform(vert[2,*])) oPolygon = obj_new('IDLgrPolygon', vert, POLYGONS=poly, $ COLOR=index, BOTTOM=index, PALETTE=oPalette, $ /SHADING, TEXTURE_MAP=oTexture, $ HIDE=1-drawcontent, $ NORMALS=normals, $ XCOORD_CONV=xcc_surfaces, $ YCOORD_CONV=ycc_surfaces, $ ZCOORD_CONV=zcc_surfaces) if (((size(tmat))[0] eq 2) and n_elements(tmat) eq 16) then begin if keyword_set(DEPTH_REORDER) then reorder_by_depth,oPolygon,tmat=tmat endif endif else begin ; print,index,curr_r[index],curr_g[index],curr_b[index] oPolygon = obj_new('IDLgrPolygon', vert, POLYGONS=poly, $ COLOR=index, BOTTOM=index, PALETTE=oPalette, $ ; COLOR=255, BOTTOM=255, PALETTE=oPalette, $ /SHADING, TEXTURE_MAP=oTexture, $ HIDE=1-drawcontent, $ NORMALS=normals, $ XCOORD_CONV=xcc_polygon, $ YCOORD_CONV=ycc_polygon, $ ZCOORD_CONV=zcc_polygon) if (((size(tmat))[0] eq 2) and n_elements(tmat) eq 16) then begin if keyword_set(DEPTH_REORDER) then reorder_by_depth,oPolygon,tmat=tmat endif endelse endif else begin oPolygon=objarr(nlevels) for eachlevel=0,nlevels-1 do begin default,alpha,make_array(nlevels,value=255,/int) shade_volume, data, level[eachlevel], vert, poly if n_elements(vert) le 1 then begin vert=fltarr(3,3) vert[*,*]=0. poly=[3,0,1,2] endif index_shape=size(index) if (index_shape[0] eq 1) then begin texture=fltarr(2,2,2) texture[0,*,*]=index[eachlevel] texture[1,*,*]=alpha[eachlevel] endif else if (index_shape[0] eq 2) then begin texture=fltarr(4,2,2) ; print,index[*,eachlevel] ;texture[0,*,*]=255 ;texture[1,*,*]=255 ;texture[2,*,*]=255 texture[0,*,*]=index[0,eachlevel] texture[1,*,*]=index[1,eachlevel] texture[2,*,*]=index[2,eachlevel] texture[3,*,*]=alpha endif else begin print,"Color index must be scalar colour index or [3] R,G,B value" exit endelse ; texture=fltarr(2,2,2) ; texture[0,*,*]=index[eachlevel] ; texture[1,*,*]=alpha[eachlevel] oTexture=obj_new('IDLgrImage',texture,interleave=0) if nonequidistant eq 1 then begin vert[0,*]=interpol(xx,findgen(n_elements(xx)),vert[0,*]) vert[1,*]=interpol(yy,findgen(n_elements(yy)),vert[1,*]) vert[2,*]=interpol(zz,findgen(n_elements(zz)),vert[2,*]) print,"Attempted to interpolate surface coords to streached grid..." oPolygon[eachlevel] = obj_new('IDLgrPolygon', vert, POLYGONS=poly, $ ; COLOR=index[eachlevel], BOTTOM=index[eachlevel], PALETTE=oPalette, $ COLOR=255, BOTTOM=255, PALETTE=oPalette, $ /SHADING, TEXTURE_MAP=oTexture, $ HIDE=1-drawcontent, $ XCOORD_CONV=xcc_surfaces, $ YCOORD_CONV=ycc_surfaces, $ ZCOORD_CONV=zcc_surfaces) if (((size(tmat))[0] eq 2) and n_elements(tmat) eq 16) then begin if keyword_set(DEPTH_REORDER) then reorder_by_depth,oPolygon[eachlevel],tmat=tmat endif endif else begin oPolygon[eachlevel] = obj_new('IDLgrPolygon', vert, POLYGONS=poly, $ COLOR=index[eachlevel], BOTTOM=index[eachlevel], PALETTE=oPalette, $ /SHADING, TEXTURE_MAP=oTexture, $ HIDE=1-drawcontent, $ XCOORD_CONV=xcc_polygon, $ YCOORD_CONV=ycc_polygon, $ ZCOORD_CONV=zcc_polygon) if (((size(tmat))[0] eq 2) and n_elements(tmat) eq 16) then begin if keyword_set(DEPTH_REORDER) then reorder_by_depth,oPolygon[eachlevel],tmat=tmat endif endelse endfor endelse endelse minbboxpal=120 BBoxPal=intarr(3,256) ; BBoxPal=spread(bgcolor,1,256) for bboxcol=0,255 do begin frac=bboxcol/255 BBoxPal[*,bboxcol]=uint(frac*bboxfgcolor+(1.-frac)*bboxbgcolor) ; BBoxPal=round(bgcolor+(bboxcolor-bgcolor)*float(bboxcol+1)/(256.-minbboxpal)) endfor pnts=where (BBoxPal gt 255, count) if count gt 0 then BBoxPal[pnts]=255 pnts=where (BBoxPal lt 0, count) if count gt 0 then BBoxPal[pnts]=0 oBBoxPalette = obj_new('IDLgrPalette',BBoxPal[0,*],BBoxPal[1,*],BBoxPal[2,*]) XBox = box_size[0]*[0,1,0,1,0,1,0,1]+box_xyz0[0] YBox = box_size[1]*[0,0,1,1,0,0,1,1]+box_xyz0[1] ZBox = box_size[2]*[0,0,0,0,1,1,1,1]+box_xyz0[2] BBox = [5,0,1,3,2,0, 5,4,5,7,6,4, 2,0,4, 2,1,5, 2,2,6, 2,3,7, -1] oBBox = obj_new('IDLgrPolyLine', XBox, YBox, ZBox, POLYLINES=BBox, $ THICK=bboxthick, $ HIDE=1-drawbbox, $ PALETTE=oBBoxPalette , $ COLOR=bboxfgcolor) oDatabox = obj_new('IDLgrPolyLine', XBox, YBox, ZBox, POLYLINES=BBox, $ THICK=bboxthick, $ HIDE=1-drawdatabox, $ ; PALETTE=oBBoxPalette , $ COLOR=bboxfgcolor) oXTitle= obj_new('IDLgrText',xtitle) oYTitle= obj_new('IDLgrText',ytitle) oZTitle= obj_new('IDLgrText',ztitle) oXAxis = obj_new('IDLgrAxis',0, $ XCOORD_CONV=xcc_axis, $ YCOORD_CONV=ycc_axis, $ ZCOORD_CONV=zcc_axis, $ TITLE=oXTitle,HIDE=hideXAxis, $ TICKLEN=(0.01-xcc_axis[0])/xcc_axis[1], $ EXTEND=0, $ RANGE=xrange, $ LOCATION=axes_intersect, $ _extra=extra) oYAxis = obj_new('IDLgrAxis',1, $ XCOORD_CONV=xcc_axis, $ YCOORD_CONV=ycc_axis, $ ZCOORD_CONV=zcc_axis, $ TITLE=oYTitle,HIDE=hideYAxis, $ TICKLEN=(0.01-ycc_axis[0])/ycc_axis[1], $ EXTEND=0, $ RANGE=yrange, $ LOCATION=axes_intersect, $ _extra=extra) oZAxis = obj_new('IDLgrAxis',2, $ XCOORD_CONV=xcc_axis, $ YCOORD_CONV=ycc_axis, $ ZCOORD_CONV=zcc_axis, $ TICKLEN=(0.01-zcc_axis[0])/zcc_axis[1], $ TITLE=oZTitle,HIDE=hideZAxis, $ EXTEND=0, $ RANGE=zrange, $ LOCATION=axes_intersect, $ _extra=extra) oMainView = obj_new('IDLgrView', projection=2, color=bgcolor) ;, depth_cue=[0.,0.], zclip=[10.,-10.]) wBase = WIDGET_BASE(/COLUMN, XPAD=0, YPAD=0, TITLE="VizIt", $ /TLB_KILL_REQUEST_EVENTS,/TLB_SIZE_EVENTS) wControl = WIDGET_BASE(/COLUMN, XPAD=0, YPAD=0, TITLE="VizIt Controls", $ /TLB_KILL_REQUEST_EVENTS) wButtonBars = WIDGET_BASE(wControl, /COLUMN, UVALUE='BUTTONS') wButtons1 = WIDGET_BASE(wButtonBars, /ROW, UVALUE='BUTTONS') wButtons2 = WIDGET_BASE(wButtonBars, /ROW, UVALUE='BUTTONS') wLAB = WIDGET_LABEL (wButtons1, VALUE='snapshots:') wGif = WIDGET_BUTTON(wButtons1, VALUE='idl.gif', UVALUE='GIF') wJPEG = WIDGET_BUTTON(wButtons1, VALUE='idl.jpg', UVALUE='JPEG') wVRML = WIDGET_BUTTON(wButtons1, VALUE='idl.wrl', UVALUE='VRML') wPS = WIDGET_BUTTON(wButtons1, VALUE='idl.ps', UVALUE='PS') wTRANS = WIDGET_BUTTON(wButtons1, VALUE='TMat', UVALUE='TRANS') wREDRAW = WIDGET_BUTTON(wButtons2, VALUE='Redraw', UVALUE='REDRAW') wAUTO = CW_BGROUP(wButtons2, ['auto'], ROW=1, /NONEXCLUSIVE, /RETURN_NAME) wSHOWWHAT = CW_BGROUP(wButtons2, ['bbox','content'], COLUMN=1, /NONEXCLUSIVE, /RETURN_NAME) wAXES = CW_BGROUP(wButtons2, ['xaxis','yaxis','zaxis'], COLUMN=1, /NONEXCLUSIVE, /RETURN_NAME) wDEPTHORDER = WIDGET_BUTTON(wButtons2, VALUE='Depth Reorder', UVALUE='DEPTHORDER') wHIDDEN = CW_BGROUP(wButtons2, ['hidden_line'], ROW=1, /NONEXCLUSIVE, /RETURN_NAME) wSTYLE = CW_BGROUP(wButtons2, ['points','wireframe','solid'], COLUMN=1, /EXCLUSIVE, /RETURN_NAME) wSHADING = CW_BGROUP(wButtons2, ['flat','Gouraud'], COLUMN=1, /EXCLUSIVE, /RETURN_NAME) if nlevels eq 1 then begin wLAB = WIDGET_LABEL (wButtons2, UVALUE='LEVEL', UNAME='LEVEL', $ VALUE=' level = '+string(level,format='(g10.3)')) endif else begin strlevels='' for eachlevel=0,nlevels-1 do begin strlevels=strjoin([strlevels, string(level[eachlevel],format='(g10.3)'),', ']) endfor wLAB = WIDGET_LABEL (wButtons, UVALUE='LEVEL', UNAME='LEVEL', $ VALUE=strjoin([' level = ',strlevels])) endelse wDraw = WIDGET_DRAW(wBase, XSIZE=xsz, YSIZE=ysz, UVALUE='MAIN', $ RETAIN=0, /EXPOSE_EVENTS, /BUTTON_EVENTS, GRAPHICS_LEVEL=2) wZClip0 = CW_FIELD( wControl , /FLOATING , /RETURN_EVENTS, /ROW, STRING=string, TEXT_FRAME=2, TITLE='Near Z Clip', UVALUE='ZCLIP0') wZClip1 = CW_FIELD( wControl , /FLOATING , /RETURN_EVENTS, /ROW, STRING=string, TEXT_FRAME=2, TITLE='Far Z Clip', UVALUE='ZCLIP1') if keyword_set(PNG) then begin oMainWindow = obj_new('IDLgrBuffer', $ DIMENSIONS=[xsz,ysz]) endif else begin WIDGET_CONTROL, wControl, /REALIZE WIDGET_CONTROL, wBase, /REALIZE WIDGET_CONTROL, wDraw, GET_VALUE=oMainWindow WIDGET_CONTROL, wDraw, /DRAW_MOTION endelse oModel = obj_new('IDLgrModel',CLIP_PLANES=clip_planes) oDataboxModel = obj_new('IDLgrModel',CLIP_PLANES=clip_planes) if nsurfaces gt 0 then begin for eachsurface=0,nsurfaces-1 do begin oModel->add, oSurfaces[eachsurface] ; print,"Adding to plot...",eachsurface endfor endif if not keyword_set(noiso) then begin if nlevels eq 1 then begin oModel->add, oPolygon endif else begin for eachlevel=0,nlevels-1 do oModel->add, oPolygon[eachlevel] endelse endif oModel->add, oBBox oModel->add, oXAxis oModel->add, oYAxis oModel->add, oZAxis oMainView->add, oModel oDataboxModel->add, oDatabox oMainView->add, oDataboxModel get_bounds, oModel, xr, yr, zr oMainView->setproperty, dept=[zr(0),zr(1)+2.5*(zr(1)-zr(0))] ; oMainView->setproperty, dept=[0.,0.] ; oMaINvIEw->setproperty, zclip=[20.,-20.] set_view, oMainView, oMainWindow, /isotr oLight0 = obj_new('IDLgrLight', TYPE=0, INTENSITY=0.50) oLight1 = obj_new('IDLgrLight', TYPE=1, INTENSITY=0.75, LOCATION=[ 1, 1, 0]) oLight2 = obj_new('IDLgrLight', TYPE=1, INTENSITY=0.95, LOCATION=[-1, 1, 1]) oLights = obj_new('IDLgrModel') oLights->add, oLight0 oLights->add, oLight1 oLights->add, oLight2 oMainView->add, oLights scl=0.95 oModel->scale, scl,scl,scl ; oModel->rotate, [1,1,0], 15 if keyword_set(tmat) then begin if n_elements(tmat) eq 16 then begin oModel->SetProperty, TRANSFORM=tmat endif else if ((size(tmat))[0]) eq 3 then begin if n_elements(tmat[0,*,*]) eq 16 then begin oModel->SetProperty, TRANSFORM=reform(tmat[0,*,*]) endif endif endif yszPlot=64 if (n_elements(zclip) eq 2) then $ oMainView->SetProperty, ZCLIP=zclip oMainView->GetProperty, ZCLIP=zclipget WIDGET_CONTROL, wZClip0, set_value=zclipget[0] WIDGET_CONTROL, wZClip1, set_value=zclipget[1] ; vizit_BBoxFade,oBBox,oModel,bboxfgcolor=bboxfgcolor,bboxbgcolor=bboxbgcolor vizit_BBoxFade,oBBox,oModel if not keyword_set(PNG) then begin wPlot = WIDGET_DRAW(wControl, XSIZE=xsz, YSIZE=yszPlot, UVALUE='HIST', $ RETAIN=0, /EXPOSE_EVENTS, /BUTTON_EVENTS, GRAPHICS_LEVEL=2) WIDGET_CONTROL, wPlot, /DRAW_MOTION WIDGET_CONTROL, wPlot, GET_VALUE=oPlotWindow hist = alog10(histogram(data, min=min, max=max, binsize=(max-min)/255.)+0.1) xcc = [0.,1./n_elements(hist)] & ycc = [0.,1./max(hist)] oPlot = obj_new('IDLgrPlot', hist, color=255, XCOORD=xcc, YCOORD=ycc) index = byte(255.*plevel) oLine = obj_new('IDLgrPlot', [0,max(hist)], DATAX=[index,index], $ color=255, XCOORD=xcc, YCOORD=ycc) oPlotModel = obj_new('IDLgrModel') image = bytscl(rebin(reform(findgen(xsz),xsz,1),xsz,yszPlot)) oPlotImage = obj_new('IDLgrImage', image, PALETTE=oPalette, $ XCOORD=[0.,1./xsz], YCOORD=[0.,1./yszPlot]) oPlotView = obj_new('IDLgrView', viewplane=[0.,0.,1.,1.], color=[50,50,50]) oPlotModel->add, oPlotImage oPlotModel->add, oPlot oPlotModel->add, oLine oPlotView->add, oPlotModel oPlotWindow->draw, oPlotView endif else begin oPlot=0. oPlotView=0. oPlotWindow=0. oPlotImage=0. oPlotModel=0. oLine=0. wPlot=0. endelse oTrack = obj_new('vizit_trackball', [xsz/2.,ysz/2.], (xsz < ysz)/2.) oHolder = obj_new('IDL_Container') oHolder->add, oMainView if not keyword_set(PNG) then oHolder->add, oPlotView oHolder->add, oTrack drawbbox=1 drwacontent=1 default,xx,0 default,yy,0 default,zz,0 sState = { oHolder: oHolder, $ oTrack: oTrack, $ oBBox: oBBox, $ oXAxis: oXAxis, $ oYAxis: oYAxis, $ oZAxis: oZAxis, $ oXTitle: oXTitle, $ oYTitle: oYTitle, $ oZTitle: oZTitle, $ oMainView: oMainView, $ oMainWindow: oMainWindow, $ wZClip0: wZClip0, $ wZClip1: wZClip1, $ wBase: wBase, $ wControl: wControl, $ wDraw: wDraw, $ oPlot: oPlot, $ oPlotView: oPlotView, $ oPlotImage: oPlotImage, $ oPlotWindow: oPlotWindow, $ oPolygon: oPolygon, $ oSurfaces: oSurfaces, $ oLine: oLine, $ oLight0: oLight0, $ oLight1: oLight1, $ oLight2: oLight2, $ oLights: oLights, $ oModel: oModel, $ oPalette: oPalette, $ oPlotModel: oPlotModel, $ oTexture: oTexture, $ wPlot: wPlot, $ xx: xx, $ yy: yy, $ zz: zz, $ nonequidistant: nonequidistant, $ calcnormals: calcnormals, $ xsize: xsz, $ ysize: yszPlot, $ min: min, $ max: max, $ data: ptr_new(data),$ level: level, $ index: index, $ ; pVector: pVector, $ autodraw: 1, $ hideXAxis: hideXaxis, $ hideYAxis: hideYaxis, $ hideZAxis: hideZaxis, $ drawbbox: drawbbox, $ drawcontent: drawcontent, $ bboxfgcolor: bboxfgcolor, $ bboxbgcolor: bboxbgcolor, $ noiso: keyword_set(noiso), $ nsurfaces: nsurfaces, $ type: 'vizit', $ nlevels: nlevels, $ active: 0 $ } if (keyword_set(PNG) or keyword_set(GIF) or keyword_set(JPG)) then begin default,filename,'idl' if (drawbbox eq 1) then vizit_BBoxFade, oBBox, oModel if keyword_set(tmat) then begin if n_elements(tmat) eq 16 then begin oModel->SetProperty, TRANSFORM=tmat oMainWindow->draw, oMainView oImage = oMainWindow->read() oImage->GetProperty, data=im image2D = Color_Quan(im, 1, r, g, b) if n_elements(frameno) eq 1 then begin frame_filename=filename+string(frameno,format=format_frameno) frameno=frameno+1 endif else begin frame_filename=filename endelse if keyword_set(PNG) then begin write_png, frame_filename+'.png', image2d, r, g, b endif else if keyword_set(GIF) then begin write_gif, frame_filename+'.gif', image2d, r, g, b endif else if keyword_set(JPG) then begin write_jpeg2000, frame_filename+'.jpg', image2d, r, g, b endif endif else if ((size(tmat))[0]) eq 3 then begin if n_elements(tmat[0,*,*]) eq 16 then begin default,frameno,0L totalframes=(size(tmat))[1] nextinc=10 for frame=0,totalframes-1 do begin oModel->SetProperty, TRANSFORM=reform(tmat[frame,*,*]) if keyword_set(DEPTH_REORDER) then begin if (not keyword_set(noiso)) then begin for i=0L,n_elements(oPolygon)-1 do begin reorder_by_depth,oPolygon[i],tmat=reform(tmat[frame,*,*]) endfor endif for i=0L,n_elements(oSurfaces)-1 do begin reorder_by_depth,oSurfaces[i],tmat=reform(tmat[frame,*,*]) endfor endif oMainWindow->draw, oMainView oImage = oMainWindow->read() oImage->GetProperty, data=im image2D = Color_Quan(im, 1, r, g, b) frame_filename=filename+string(frameno,format=format_frameno) if keyword_set(PNG) then begin write_png, frame_filename+'.png', image2d, r, g, b endif else if keyword_set(GIF) then begin write_gif, frame_filename+'.gif', image2d, r, g, b endif else if keyword_set(JPG) then begin write_jpeg2000, frame_filename+'.jpg', image2d, r, g, b endif frameno=frameno+1 pcent=totalframes/frameno if pcent ge nextinc then begin print,nextinc,'%' nextinc=nextinc+10 endif endfor endif endif endif OBJ_DESTROY, oHolder WIDGET_CONTROL, wControl, /DESTROY WIDGET_CONTROL, wBase, /DESTROY if ptr_valid(sState.data) then ptr_free,sState.data SAFE_OBJ_DESTROY,oMainWindow SAFE_OBJ_DESTROY,oMainView SAFE_OBJ_DESTROY,oPolygon SAFE_OBJ_DESTROY,oSurfaces SAFE_OBJ_DESTROY,oBBox SAFE_OBJ_DESTROY,oImage SAFE_OBJ_DESTROY,oLight0 SAFE_OBJ_DESTROY,oLight1 SAFE_OBJ_DESTROY,oLight2 SAFE_OBJ_DESTROY,oLights SAFE_OBJ_DESTROY,oModel SAFE_OBJ_DESTROY,oPalette SAFE_OBJ_DESTROY,oPlot SAFE_OBJ_DESTROY,oPlotModel SAFE_OBJ_DESTROY,oTrack SAFE_OBJ_DESTROY,oXAxis SAFE_OBJ_DESTROY,oYAxis SAFE_OBJ_DESTROY,oZAxis SAFE_OBJ_DESTROY,oXTitle SAFE_OBJ_DESTROY,oYTitle SAFE_OBJ_DESTROY,oZTitle SAFE_OBJ_DESTROY,oPlotView SAFE_OBJ_DESTROY,oTexture SAFE_OBJ_DESTROY,oLine SAFE_OBJ_DESTROY,oPlotImage endif else begin WIDGET_CONTROL, wControl, SET_UVALUE=ptr_new(sState) WIDGET_CONTROL, wBase, SET_UVALUE=ptr_new(sState) XMANAGER, 'vizit_control', wControl, /NO_BLOCK XMANAGER, 'vizit', wBase, /NO_BLOCK endelse END