[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GARP NIDS mouse over values
- Subject: Re: GARP NIDS mouse over values
- Date: 07 Apr 2004 17:03:14 -0600
Robert,
Apparently the Garp program is looking for NIDS or WSI as the
string in $GEMTBL/sat/imgtyp.tbl which
some time ago was changed to strings like "Local 1KM Base".
I have attatched the updated $GARPHOME/gempak/pointerinfo.c
routine.
I'll repack the 5.7.1 distribution again before announcing its release.
Steve Chiswell
Unidata User Support
/***********************************************************************
*
* Copyright 1996, University Corporation for Atmospheric Research.
*
* pointerinfo.c
*
* Functions that return info at the pointer location
*
* History:
*
* 11/96 COMET Original copy
* 2/97 COMET Added new units
* 05/97 COMET Changed to get image data from metObject
* 11/97 COMET Small change to account for removal of .5 factor
* in getimagecoords()
* 01/98 COMET Changed getimagecoords() calling sequence
* 04/04 Unidata Fixed display of radar values for imgtyp.tbl change
*
***********************************************************************/
#include <string.h>
#include "winobj.h"
#include "underscore.h"
#define KM2MI 0.6214
#define KM2NM 0.53939
float pr_tmkc(), pr_tmkf();
void GetCursorPosition( WindowObjectType *wo, int x, int y, char *string )
{
char Dcoords [] = "D";
float fx, fy, lat, lon;
GeoRefObjectType *geo;
strcpy ( string, "" );
geo = GetGeoRefObject( wo );
if ( ! geo || geo->viewType != PLAN ) return;
fx = x;
fy = y;
if ( getlatlon ( Dcoords, &fx, &fy, &lat, &lon ) )
sprintf ( string, "Latlon:%6.2f,%7.2f", lat, lon );
else
strcpy ( string, "Latlon:---.--,----.--");
return;
}
void GetDistanceInfo( WindowObjectType *wo, char *units,
int x1, int y1, int x2, int y2, char *string )
{
char Dcoords [] = "D";
float fx1, fy1, fx2, fy2;
float lat1, lon1, lat2, lon2;
float lat1r, lon1r, lat2r, lon2r;
float latdif, londif, az, angle, dist;
strcpy ( string, "" );
if ( ! GetAnchorFlag ( wo ) ) return;
fx1 = x1;
fy1 = y1;
fx2 = x2;
fy2 = y2;
/*
* Get the lat/lon of each point, convert to radians, take the
* difference of each.
*/
if ( getlatlon ( Dcoords, &fx1, &fy1, &lat1, &lon1 ) &&
getlatlon ( Dcoords, &fx2, &fy2, &lat2, &lon2 ) ) {
lat1r = lat1 * DTR;
lon1r = lon1 * DTR;
lat2r = lat2 * DTR;
lon2r = lon2 * DTR;
latdif = lat2r - lat1r;
londif = lon2r - lon1r;
if ( londif > PI ) londif = londif - TWOPI;
if ( londif < -PI ) londif = londif + TWOPI;
/*
* Determine the azimuth direction from point 1 to 2
*/
if ( (x1 == x2) && (y1 == y2) ) az = 0.0;
else {
az = ( atan2 ( londif, latdif ) ) * RTD;
if ( az < 0. ) az += 360.;
}
/*
* Get the distance from point 1 to 2 in km
*/
londif = londif * cos ( (lat1r + lat2r)/2.);
angle = sqrt ( (latdif*latdif) + (londif*londif) );
dist = ( angle * RADIUS) / 1000.;
/*
* Convert to user-specified units
*/
if ( strcmp ( units, "NM" ) == 0 ) dist *= KM2NM;
else if ( strcmp ( units, "MI" ) == 0 ) dist *= KM2MI;
sprintf ( string, "Az: %5.1f Range: %.1f%s", az, dist, units );
}
else
strcpy ( string, "Az: ----- Range: ---- ---" );
}
/*
* Gets data at X, Y position - assumes that the X, Y point has
* been validated. (Still checks for a reasonable data offset location
* though.)
*/
void GetDataAtCursor( WindowObjectType *wo, char *units, int x, int y, char
*string )
{
unsigned int dvalue;
float fdvalue, brtemp, temp;
unsigned long pixloc;
unsigned char *dptr;
char ctemp[30];
PixmapObjectType *po;
AnyImageObjectType *iot;
MetObjectType *mot;
int i, k, iret, mindex;
int overlayClass;
float ix, iy, dx, dy;
int nx, ny, np, vis;
char Dcoords [] = "D";
strcpy ( string, "" );
po = GetActivePixmapObject (wo);
if ( ! po ) return;
/*
* Get the metobject content pointer. Find out which metObject is the
* image. If there is a background (image), bail out.
*/
mindex = -1;
for( i = 0; i < po->numMetObjects; i++ ) {
mot = po->metObjects[i];
overlayClass = GetMetObjectClass( GetMetObjectType( mot ) );
if( overlayClass == IMAGE ) mindex = i;
if( overlayClass == BACKGROUND ) return;
}
if ( mindex == -1 ) return;
iot = (AnyImageObjectType *) po->metObjects[mindex]->metObjectContent;
if ( ! iot->imgCmn.imageData ) return;
/*
* Determine the image coordinates
*/
dx = (float) x;
dy = (float) y;
getimagecoords ( po, Dcoords, &dx, &dy, &ix, &iy ) ;
/*
* Round to nearest pixel
*/
nx = (int) (ix + .5);
ny = (int) (iy + .5);
np = 1;
gptvis ( Dcoords, &np, &dx, &dy, &vis, &iret, strlen ( Dcoords)) ;
dvalue = 0;
/*printf("image coords: nx: %d, (max=%d), ny: %d, (max=%d), depth: %d, vis:
%d\n",
nx,iot->imgCmn.imnpix,ny,iot->imgCmn.imnlin,iot->imgCmn.imdpth,vis);*/
/*
* If this is a valid point, calculate offset.
*/
if ( nx > 0 && nx <= iot->imgCmn.imnpix &&
ny > 0 && ny <= iot->imgCmn.imnlin && vis ) {
pixloc = iot->imgCmn.imdpth * ((ny - 1) * iot->imgCmn.imnpix + (nx
- 1));
/*printf(" pixel location: %d\n",pixloc);*/
if ( iot->imgCmn.imdpth == 1 )
dvalue = *(iot->imgCmn.imageData + pixloc);
else {
if ( iot->imgCmn.imbswp )
dptr = iot->imgCmn.imageData + pixloc + iot->imgCmn.imdpth
- 1;
else
dptr = iot->imgCmn.imageData + pixloc;;
for ( k = 0; k < iot->imgCmn.imdpth; k++ ) {
dvalue = dvalue << 8;
dvalue += *dptr;
if ( iot->imgCmn.imbswp )
dptr--;
else
dptr++ ;
}
}
}
sprintf ( string, " RAW: %3d",dvalue);
/*
* Convert brightness temp to deg K, C, or F.
*/
if ((strncmp ( iot->imgCmn.cmtype, "IR", 2 ) == 0 ||
strncmp ( iot->imgCmn.cmtype, "WV", 2 ) == 0 ) &&
strncmp ( iot->imgCmn.cmcalb, "BRIT", 4 ) == 0 ) {
fdvalue = (float) dvalue;
/*temp = im_btot ( &fdvalue );*/
/* Chiz/Unidata change for im_btot now a subroutine*/
np = 1;
im_btot ( &np, (int *)(&dvalue), &temp, &iret );
if ( strcmp ( units, "C" ) == 0 ) {
brtemp = pr_tmkc ( &temp ); }
else if ( strcmp ( units, "F" ) == 0 ) {
brtemp = pr_tmkf ( &temp ); }
else{
brtemp = temp;
}
sprintf ( ctemp, " (%5.1f%s)", brtemp, units);
strcat ( string, ctemp);
}
else if ((strncmp ( iot->imgCmn.cmcalb, "PROD",4) == 0)&&
iot->imgCmn.cmbunt[0] != '\0')
{
/* Chiz/Unidata ** Calculate a value from color bar settings */
if(iot->imgCmn.cmblev[dvalue][0] != '\0')
sprintf ( ctemp, " (%s %s)" , iot->imgCmn.cmblev[dvalue],
iot->imgCmn.cmbunt);
else
{
i = dvalue; ix = -9999.; iy = -9999.;
ctemp[0] = '\0';
while(i>iot->imgCmn.immnpx)
{
i--;
if(iot->imgCmn.cmblev[i][0] != '\0')
{
sscanf(iot->imgCmn.cmblev[i],"%f",&ix);
break;
}
}
k = dvalue;
while((k<iot->imgCmn.immxpx)&&(ix != -9999))
{
k++;
if(iot->imgCmn.cmblev[k][0] != '\0')
{
sscanf(iot->imgCmn.cmblev[k],"%f",&iy);
break;
}
}
if((ix != -9999)&&(iy != -9999))
{
dx = (float)(dvalue - i);
dy = (float)(k - i);
fdvalue = ix + (dx/dy)*(iy - ix);
sprintf(ctemp," (%5.1f%s)",fdvalue,iot->imgCmn.cmbunt);
}
}
strcat (string, ctemp);
}
/*
* Radar data is calibrated to provided units.
*/
/*else if ((strncmp (iot->imgCmn.cmsorc, "NIDS", 4) == 0 ||
strncmp (iot->imgCmn.cmsorc, "WSI", 3) == 0 ) &&
iot->imgCmn.cmbunt[0] != '\0' ) {*/
else if ( iot->imgCmn.imradf == 1 || iot->imgCmn.cmbunt[0] != '\0' ) {
sprintf ( ctemp, " (%s %s)" ,iot->imgCmn.cmblev[dvalue],
iot->imgCmn.cmbunt);
strcat (string, ctemp);
}
return;
}