| 47 | | |
| 48 | | |
| 49 | | ;---------------------------------------------------------------------------- |
| 50 | | |
| 51 | | PRO d_vectrackMkVectors, u, v, w, fVerts, iConn, X=x, Y=y, Z=z, SCALE=scale,$ |
| 52 | | RANDOM=random, NVECTORS=nvectors, STEPSIZE=stepsize,$ |
| 53 | | bMAG=bMag, VC=vc |
| 54 | | |
| 55 | | ; Ensure volumes match in number of elements. |
| 56 | | nSamples = N_ELEMENTS(u) |
| 57 | | IF (nSamples NE N_ELEMENTS(v) OR nSamples NE N_ELEMENTS(w)) THEN BEGIN |
| 58 | | MESSAGE,'Number of elements in u, v, and w must match.' |
| 59 | | RETURN |
| 60 | | ENDIF |
| 61 | | sz = SIZE(u) |
| 62 | | |
| 63 | | ; Handle keywords, set defaults. |
| 64 | | IF (N_ELEMENTS(scale) EQ 0) THEN scale = 1.0 |
| 65 | | IF (N_ELEMENTS(random) EQ 0) THEN random=0 |
| 66 | | IF (N_ELEMENTS(nvectors) EQ 0) THEN nvectors = 100 |
| 67 | | IF (N_ELEMENTS(stepsize) eq 0) then stepsize = 1 |
| 68 | | IF (N_ELEMENTS(bMag) EQ 0) THEN bMag = BYTSCL(SQRT(u^2+v^2+w^2)) |
| 69 | | |
| 70 | | ; Get plane information. |
| 71 | | doPlane = 0 |
| 72 | | IF (N_ELEMENTS(x) GT 0) THEN BEGIN |
| 73 | | IF (random EQ 0) THEN BEGIN |
| 74 | | nRow = sz[2] / stepsize |
| 75 | | nCol = sz[3] / stepsize |
| 76 | | ENDIF |
| 77 | | doPlane = 1 |
| 78 | | ENDIF |
| 79 | | IF (N_ELEMENTS(y) GT 0) THEN BEGIN |
| 80 | | IF (doPlane) THEN MESSAGE,'X, Y, and Z keywords are mutually exclusive' |
| 81 | | IF (random EQ 0) THEN BEGIN |
| 82 | | nRow = sz[3] / stepsize |
| 83 | | nCol = sz[1] / stepsize |
| 84 | | ENDIF |
| 85 | | doPlane = 2 |
| 86 | | ENDIF |
| 87 | | IF (N_ELEMENTS(z) GT 0) THEN BEGIN |
| 88 | | IF (doPlane) THEN MESSAGE,'X, Y, and Z keywords are mutually exclusive' |
| 89 | | IF (random EQ 0) THEN BEGIN |
| 90 | | nRow = sz[2] / stepsize |
| 91 | | nCol = sz[1] / stepsize |
| 92 | | ENDIF |
| 93 | | doPlane = 3 |
| 94 | | ENDIF |
| 95 | | IF (doPlane EQ 0) THEN MESSAGE, 'Must specify a plane.' |
| 96 | | |
| 97 | | ; Grab max, min values in vector volumes. |
| 98 | | maxU = MAX(u, MIN=minU) |
| 99 | | maxV = MAX(v, MIN=minV) |
| 100 | | maxW = MAX(w, MIN=minW) |
| 101 | | |
| 102 | | ; Compute the magnitude. |
| 103 | | mag = SQRT((maxU-minU)^2 + (maxV-minV)^2 + (maxW-minW)^2) |
| 104 | | fNorm = scale / mag |
| 105 | | |
| 106 | | ; Compute radomly spaced vectors. |
| 107 | | IF (random) THEN BEGIN |
| 108 | | fVerts = FLTARR(3, 2*nvectors) |
| 109 | | iConn = LONARR(3*nvectors) |
| 110 | | vc = BYTARR(2*nvectors) |
| 111 | | |
| 112 | | CASE doPlane OF |
| 113 | | 1: BEGIN ; X=x |
| 114 | | randomX = REPLICATE(x, nvectors) |
| 115 | | seed = x |
| 116 | | randomY = RANDOMU(seed, nvectors) * (sz[2]-1) |
| 117 | | randomZ = RANDOMU(seed, nvectors) * (sz[3]-1) |
| 118 | | END |
| 119 | | 2: BEGIN ; Y=y |
| 120 | | seed = y |
| 121 | | randomX = RANDOMU(seed, nvectors) * (sz[1]-1) |
| 122 | | randomY = REPLICATE(y, nvectors) |
| 123 | | randomZ = RANDOMU(seed, nvectors) * (sz[3]-1) |
| 124 | | END |
| 125 | | 3: BEGIN ; Z=z |
| 126 | | seed = z |
| 127 | | randomX = RANDOMU(seed, nvectors) * (sz[1]-1) |
| 128 | | randomY = RANDOMU(seed, nvectors) * (sz[2]-1) |
| 129 | | randomZ = REPLICATE(z, nvectors) |
| 130 | | END |
| 131 | | ENDCASE |
| 132 | | |
| 133 | | inds = LINDGEN(nvectors) |
| 134 | | x0 = randomx[inds] |
| 135 | | y0 = randomy[inds] |
| 136 | | z0 = randomz[inds] |
| 137 | | |
| 138 | | v0 = transpose([[x0],[y0],[z0]]) |
| 139 | | v1 = transpose([[x0+u[x0,y0,z0]*fNorm],$ |
| 140 | | [y0+v[x0,y0,z0]*fNorm],$ |
| 141 | | [z0+w[x0,y0,z0]*fNorm]]) |
| 142 | | fVerts[*,inds*2] = v0[*,inds] |
| 143 | | fVerts[*,inds*2+1] = v1[*,inds] |
| 144 | | iConn[inds*3] = 2 |
| 145 | | iConn[inds*3+1] = inds*2 |
| 146 | | iConn[inds*3+2] = inds*2+1 |
| 147 | | |
| 148 | | vc[inds*2] = bMag[x0,y0,z0] |
| 149 | | vc[inds*2+1] = bMag[x0,y0,z0] |
| 150 | | |
| 151 | | ; Compute evenly sampled vectors. |
| 152 | | ENDIF ELSE BEGIN |
| 153 | | nV = nRow*nCol |
| 154 | | |
| 155 | | fVerts = FLTARR(3, 2*nV) |
| 156 | | iConn = LONARR(3*nV) |
| 157 | | vc = BYTARR(2*nV) |
| 158 | | |
| 159 | | CASE doPlane OF |
| 160 | | 1: BEGIN ; X=x |
| 161 | | x0 = REPLICATE(x,nV) |
| 162 | | y0 = REFORM((REPLICATE(1,nCol) # (LINDGEN(nRow)*stepsize)),nV) |
| 163 | | z0 = REFORM(((LINDGEN(nCol)*stepsize) # REPLICATE(1,nRow)),nV) |
| 164 | | END |
| 165 | | 2: BEGIN ; Y=y |
| 166 | | y0 = REPLICATE(y,nRow*nCol) |
| 167 | | z0 = REFORM((REPLICATE(1,nCol) # (LINDGEN(nRow)*stepsize)),nV) |
| 168 | | x0 = REFORM(((LINDGEN(nCol)*stepsize) # REPLICATE(1,nRow)),nV) |
| 169 | | END |
| 170 | | 3: BEGIN ; Z=z |
| 171 | | z0 = REPLICATE(z,nRow*nCol) |
| 172 | | y0 = REFORM((REPLICATE(1,nCol) # (LINDGEN(nRow)*stepsize)),nV) |
| 173 | | x0 = REFORM(((LINDGEN(nCol)*stepsize) # REPLICATE(1,nRow)),nV) |
| 174 | | END |
| 175 | | ENDCASE |
| 176 | | |
| 177 | | inds = LINDGEN(nV) |
| 178 | | v0 = transpose([[x0],[y0],[z0]]) |
| 179 | | v1 = transpose([[x0+u[x0,y0,z0]*fNorm],$ |
| 180 | | [y0+v[x0,y0,z0]*fNorm],$ |
| 181 | | [z0+w[x0,y0,z0]*fNorm]]) |
| 182 | | fVerts[*,inds*2] = v0[*,inds] |
| 183 | | fVerts[*,inds*2+1] = v1[*,inds] |
| 184 | | iConn[inds*3] = 2 |
| 185 | | iConn[inds*3+1] = inds*2 |
| 186 | | iConn[inds*3+2] = inds*2+1 |
| 187 | | |
| 188 | | vc[inds*2] = bMag[x0,y0,z0] |
| 189 | | vc[inds*2+1] = bMag[x0,y0,z0] |
| 190 | | ENDELSE |
| 191 | | |
| 192 | | END |
| 193 | | |
| 194 | | ;---------------------------------------------------------------------------- |
| 195 | | ; Integrate V to get S |
| 196 | | ; Stream Ribbons |
| 197 | | ; PRO d_vectrackRibbonTrace,vdata,start,auxdata,STEPS=steps,FRAC=frac, $ |
| 198 | | ; WIDTH=width, UP=up,COLOR=color, $ |
| 199 | | ; OUTVERTS = outverts, OUTCONN = outconn, $ |
| 200 | | ; VERT_COLORS = vertcolors |
| 201 | | |
| 202 | | ; if (N_ELEMENTS(steps) eq 0) then steps = 100 |
| 203 | | ; if (N_ELEMENTS(frac) eq 0) then frac = 1.0 |
| 204 | | ; if (N_ELEMENTS(up) eq 0) then up = [0.0,0.0,1.0] |
| 205 | | ; if (N_ELEMENTS(width) eq 0) then width = .5 |
| 206 | | |
| 207 | | ; PARTICLE_TRACE,vdata,start,overts,oconn,onormals, $ |
| 208 | | ; MAX_ITERATIONS=steps, MAX_STEPSIZE=frac,INTEGRATION=0 $ |
| 209 | | ; ,ANISOTROPY=[1,1,1], SEED_NORMALS=up |
| 210 | | |
| 211 | | ; if((N_ELEMENTS(oconn) gt 0) and (SIZE(overts, /N_DIMENSIONS) eq 2)) $ |
| 212 | | ; then begin |
| 213 | | ; STREAMLINE,overts,oconn,onormals*width,outverts,outconn |
| 214 | | ; cdata = INTERPOLATE(auxdata,outverts[0,*],outverts[1,*],outverts[2,*]) |
| 215 | | ; cdata = REFORM(cdata,N_ELEMENTS(outverts)/3) |
| 216 | | ; vertcolors = BYTSCL(cdata) |
| 217 | | ; end |
| 218 | | ; END |
| 219 | | |
| 220 | | |
| 221 | | ;---------------------------------------------------------------------------- |
| 222 | | ; Integrate V to get S |
| 223 | | ; Streamlines |
| 224 | | ; PRO d_vectrackStreamlineTrace,vdata,start,auxdata,STEPS=steps,FRAC=frac, $ |
| 225 | | ; OUTVERTS = outverts, OUTCONN = outconn, $ |
| 226 | | ; VERT_COLORS = vertcolors |
| 227 | | |
| 228 | | ; if (N_ELEMENTS(steps) eq 0) then steps = 100 |
| 229 | | ; if (N_ELEMENTS(frac) eq 0) then frac = 1.0 |
| 230 | | |
| 231 | | ; PARTICLE_TRACE,vdata,start,outverts,outconn, $ |
| 232 | | ; MAX_ITERATIONS=steps, MAX_STEPSIZE=frac,INTEGRATION=0 $ |
| 233 | | ; ,ANISOTROPY=[1,1,1] |
| 234 | | |
| 235 | | ; if((N_ELEMENTS(outconn) gt 0) and (SIZE(outverts, /N_DIMENSIONS) eq 2)) $ |
| 236 | | ; then begin |
| 237 | | ; cdata = INTERPOLATE(auxdata,outverts[0,*],outverts[1,*],outverts[2,*]) |
| 238 | | ; cdata = REFORM(cdata,N_ELEMENTS(outverts)/3) |
| 239 | | ; vertcolors = BYTSCL(cdata) |
| 240 | | ; end |
| 241 | | ; END |
| 242 | | |
| 243 | | |
| 396 | | ; Routine to generate a movie |
| 397 | | |
| 398 | | PRO d_vectrackRenderMovie,sState |
| 399 | | |
| 400 | | filename = DIALOG_PICKFILE(/READ, FILTER = '*.scr', /MUST_EXIST) |
| 401 | | IF (filename EQ '') THEN RETURN |
| 402 | | |
| 403 | | OPENR, lun, filename, ERROR = err, /GET_LUN |
| 404 | | IF (err NE 0) THEN BEGIN |
| 405 | | MESSAGE,"Unable to open input file:"+filename,/CONTINUE |
| 406 | | RETURN |
| 407 | | ENDIF |
| 408 | | |
| 409 | | ; Read the file |
| 410 | | ON_IOERROR, end_of_file |
| 411 | | |
| 412 | | sState.oGroup->GetProperty, TRANSFORM=intrans |
| 413 | | vol_rend = 0 |
| 414 | | file_num = 0 |
| 415 | | tstr = '' |
| 416 | | base_name = 'image_' |
| 417 | | farg = fltarr(4) |
| 418 | | iarg = intarr(4) |
| 419 | | WHILE (1) DO BEGIN |
| 420 | | READF,lun,tstr |
| 421 | | PRINT,'>',tstr |
| 422 | | str = STRTOK(tstr, ',', /EXTRACT) |
| 423 | | CASE STRUPCASE(str[0]) OF |
| 424 | | 'BASENAME': BEGIN ;[name] - set the filename base |
| 425 | | IF (N_ELEMENTS(str) EQ 2) THEN BEGIN |
| 426 | | base_name = str[1] |
| 427 | | END |
| 428 | | END |
| 429 | | 'ROTATE': BEGIN ;[dx,dy,dz,ang] - rotate the scene |
| 430 | | IF (N_ELEMENTS(str) EQ 5) THEN BEGIN |
| 431 | | farg[0] = str[1] |
| 432 | | farg[1] = str[2] |
| 433 | | farg[2] = str[3] |
| 434 | | farg[3] = str[4] |
| 435 | | sState.oGroup->Rotate,farg[0:2],farg[3] |
| 436 | | END |
| 437 | | END |
| 438 | | 'SAVE': BEGIN ; render and save an image |
| 439 | | sState.oVols[sState.iVrendVol]->SetProperty, $ |
| 440 | | HIDE=1-vol_rend |
| 441 | | demo_draw, sState.oWindow, sState.oView, debug=sState.debug |
| 442 | | sState.oVols[sState.iVrendVol]->SetProperty,HIDE=1 |
| 443 | | oImage = sState.oWindow->Read() |
| 444 | | oImage->GetProperty,DATA=data |
| 445 | | OBJ_DESTROY,oImage |
| 446 | | file_num = file_num + 1 |
| 447 | | outname=base_name+STRING(file_num,FORMAT='(I4.4)') |
| 448 | | OPENW, outlun, outname, /GET_LUN |
| 449 | | WRITEU, outlun, data |
| 450 | | CLOSE, outlun |
| 451 | | FREE_LUN, outlun |
| 452 | | sz = SIZE(data) |
| 453 | | PRINT,"Saved:",outname,sz[1],sz[2],sz[3] |
| 454 | | END |
| 455 | | 'TIMESTEP': BEGIN ;[num] select time step |
| 456 | | IF (N_ELEMENTS(str) EQ 2) THEN BEGIN |
| 457 | | iarg[0] = str[1] |
| 458 | | status=d_vectrackChangeData(sState,iarg[0]) |
| 459 | | END |
| 460 | | END |
| 461 | | 'VOLUME': BEGIN ;[0/1] off/on |
| 462 | | IF (N_ELEMENTS(str) EQ 2) THEN BEGIN |
| 463 | | iarg[0] = str[1] |
| 464 | | IF (iarg[0] NE 0) THEN BEGIN |
| 465 | | vol_rend = 1 |
| 466 | | END ELSE BEGIN |
| 467 | | vol_rend = 0 |
| 468 | | END |
| 469 | | END |
| 470 | | END |
| 471 | | ; 'SLICEPOS': BEGIN ;[axis,pos] axis-1,2,3,pos |
| 472 | | ; IF (N_ELEMENTS(str) EQ 3) THEN BEGIN |
| 473 | | ; iarg[0] = str[1] |
| 474 | | ; iarg[1] = str[2] |
| 475 | | ; END |
| 476 | | ; END |
| 477 | | ELSE: BEGIN |
| 478 | | PRINT,'Unknown command:',tstr |
| 479 | | END |
| 480 | | END |
| 481 | | END |
| 482 | | |
| 483 | | end_of_file: ON_IOERROR, NULL |
| 484 | | |
| 485 | | CLOSE, lun |
| 486 | | FREE_LUN, lun |
| 487 | | |
| 488 | | sState.oGroup->SetProperty, TRANSFORM=intrans |
| 489 | | |
| 490 | | END |
| 491 | | |
| 492 | | ;---------------------------------------------------------------------------- |
| 617 | | ;---------------------------------------------------------------------------- |
| 618 | | ; Convert a mouse point into a streamline... |
| 619 | | |
| 620 | | ; FUNCTION d_vectrackDoStream,sEvent,sState,new_flag |
| 621 | | ; pick = sState.oWindow->PickData(sState.oView,$ |
| 622 | | ; sState.oVols[0], $ |
| 623 | | ; [sEvent.x,sEvent.y],dataxyz) |
| 624 | | ; IF (pick NE 1) THEN RETURN,0 |
| 625 | | |
| 626 | | ; sState.oVols[2]->GetProperty,xcoord_conv=xc,ycoord_conv=yc,$ |
| 627 | | ; zcoord_conv=zc |
| 628 | | |
| 629 | | ; IF (new_flag) THEN BEGIN |
| 630 | | ; WIDGET_CONTROL, sState.wRibbons, GET_VALUE = bRibbons |
| 631 | | ; IF (bRibbons) THEN BEGIN |
| 632 | | ; sState.oStreamline = OBJ_NEW('IDLgrPolygon', $ |
| 633 | | ; SHADING=1,STYLE=2,UVALUE=dataxyz,$ |
| 634 | | ; xcoord_conv=xc,ycoord_conv=yc,zcoord_conv=zc) |
| 635 | | ; END ELSE BEGIN |
| 636 | | ; sState.oStreamline = OBJ_NEW('IDLgrPolyline', $ |
| 637 | | ; UVALUE=dataxyz,$ |
| 638 | | ; xcoord_conv=xc,ycoord_conv=yc,zcoord_conv=zc) |
| 639 | | ; END |
| 640 | | ; sState.oStreamModel->Add,sState.oStreamline |
| 641 | | ; END |
| 642 | | |
| 643 | | ; d_vectrackBuildRibbon,sState,sState.oStreamline,dataxyz |
| 644 | | |
| 645 | | ; RETURN,1 |
| 646 | | ; END |
| 647 | | |
| 648 | | ;-------------------------------------------------------------------------- |
| 649 | | ; Compute a single Ribbon/Streamline |
| 650 | | |
| 651 | | ; PRO d_vectrackBuildRibbon,sState,oObj,dataxyz |
| 652 | | |
| 653 | | ; sState.oVols[sState.iVrendVol]->GetProperty,DATA0=auxdata, $ |
| 654 | | ; RGB_TABLE0=auxpal, /NO_COPY |
| 655 | | ; auxpal = TRANSPOSE(auxpal) |
| 656 | | ; grAuxpal = OBJ_NEW('IDLgrPalette', $ |
| 657 | | ; auxpal[0, *], auxpal[1, *], auxpal[2, *]) |
| 658 | | ; iStep = 100 |
| 659 | | ; ;fFrac = 1.0/88.0 ; 1.0/max velocity |
| 660 | | ; fFrac = .5 ;step size |
| 661 | | |
| 662 | | ; WIDGET_CONTROL, sState.wRibbons, GET_VALUE = bRibbons |
| 663 | | ; IF (bRibbons) THEN BEGIN |
| 664 | | ; d_vectrackRibbonTrace, sState.vdata, dataxyz, auxdata,FRAC=fFrac, $ |
| 665 | | ; STEP=iStep,VERT_COLORS=vertcolors, WIDTH = sState.fWidth, $ |
| 666 | | ; OUTVERTS = outverts, OUTCONN = outconn |
| 667 | | ; END ELSE BEGIN |
| 668 | | ; d_vectrackStreamlineTrace, sState.vdata, dataxyz, auxdata,FRAC=fFrac, $ |
| 669 | | ; STEP=iStep,VERT_COLORS=vertcolors, $ |
| 670 | | ; OUTVERTS = outverts, OUTCONN = outconn |
| 671 | | ; END |
| 672 | | |
| 673 | | ; IF ((N_ELEMENTS(outconn) GT 1) AND (SIZE(outverts, /N_DIMENSIONS) EQ 2)) $ |
| 674 | | ; THEN BEGIN |
| 675 | | ; WIDGET_CONTROL, sState.wRibbons, GET_VALUE = bRibbons |
| 676 | | ; IF (bRibbons) and OBJ_VALID(oObj) THEN BEGIN |
| 677 | | ; ss = N_ELEMENTS(color)*0.5 |
| 678 | | ; oObj->SetProperty, REJECT=0, STYLE=2,SHADING=1,PALETTE=grAuxpal, $ |
| 679 | | ; DATA = outverts, POLYGONS = outconn, VERT_COLORS = vertcolors |
| 680 | | ; END ELSE BEGIN |
| 681 | | ; oObj->SetProperty,HIDE=0,DATA=outverts,POLYLINES = outconn, $ |
| 682 | | ; VERT_COLORS=vertcolors, PALETTE = grAuxpal |
| 683 | | ; END |
| 684 | | ; END ELSE BEGIN |
| 685 | | ; oObj->SetProperty,HIDE=1 |
| 686 | | ; END |
| 687 | | |
| 688 | | ; sState.oVols[sState.iVrendVol]->SetProperty,DATA0=auxdata,/NO_COPY |
| 689 | | |
| 690 | | ; END |
| | 323 | |