/* @(#)Point.c 1.4 6/14/99 */ /*----------------------------------------------------------------------------- Copyright (C) 1993, Molecular Structure Group of Biochemestry Dept. at University of California at San Francisco. These coded instructions, statements, and computer programs comprise unpublished proprietary information of the Molecular Structure Group of the Biochemistry Department at University of California at San Francisco, and are protected by Federal copyright law. They may not be disclosed to third parties, copied or duplicated in any form - in whole or in part - without the prior written consent of Molecular Structure Group of Biochemistry Department at University of California at San Francisco. -------------------------------------------------------------------------*/ #include "IWInclude.h" #include "WMInclude.h" #include #include #include #include void update_scr(void); static char winid[10] = " "; static char coord[16] = " "; static char valstr[13] = " "; static char pixstr[10] = " "; static char *wave_str[IW_MAX_WAVE] = {" 0 ", " 1 ", " 2 ", " 3 ", " 4 "}; static int wave_sensitive[IW_MAX_WAVE] = { 0, 0, 0, 0, 0 }; static Widget gwWaveMenu; static int testwave=0, iwave=0; static int idata[4]; static int giMode; static int nxyz[3]; static int giFileClose = 1; static XEvent gXEvent; int Motion(int* w, XEvent* event) { float xyz[3]; gXEvent = (*event); IWXEvtToData(1,iwave,&gXEvent,xyz,&idata[3]); idata[0] = xyz[0]; idata[1] = xyz[1]; idata[2] = xyz[2]; update_scr(); return 1; } int dis_change() { float xyz[3]; IWXEvtToData(1, iwave, &gXEvent, xyz, &idata[3]); idata[0] = xyz[0]; idata[1] = xyz[1]; idata[2] = xyz[2]; update_scr(); return 1; } void update_scr(void) { unsigned char pixel; int iSection; int ip, nxy[2]; float buffer[2]; float dataValue; float scale[4]; int dis_mode; if(idata[0] < 0 || idata[1] < 0 || idata[0] >= nxyz[0] || idata[1] >= nxyz[1]) { strcpy(coord," NA "); strcpy(valstr," NA "); strcpy(pixstr," NA "); } else { sprintf(coord, "%d %d %d", idata[0], idata[1], idata[2]); IMRtSecNum(1, idata[2], iwave, idata[3], &iSection); IMPosnZWT(1, idata[2], iwave, idata[3]); IMRdPas(1, buffer, 1, 1, idata[0], idata[0], idata[1], idata[1]); IWRtSecScl(1, iSection, scale); if (0.0f == scale[0] && 0.0f == scale[1]) { IWRtScl(1, iwave, scale); } nxy[1] = nxy[0] = 1; if (giMode == 4) { dis_mode = IWRtComplexDis(1); switch (dis_mode) { case IW_COMPLEX_AMPLITUDE: dataValue = sqrtf(buffer[0] * buffer[0] + buffer[1] * buffer[1]); break; case IW_COMPLEX_REAL: dataValue = buffer[0]; break; case IW_COMPLEX_IMAGINARY: dataValue = buffer[1]; break; case IW_COMPLEX_PHASE: dataValue = fatan2(buffer[1], buffer[0]); } dis_mode |= IW_COMPLEX | IWRtSclAlgorithm(1); } else { dis_mode = IW_FLOAT | IWRtSclAlgorithm(1); dataValue = buffer[0]; } IWScaleImage(buffer, nxy, dis_mode, scale, &pixel); sprintf(valstr,"%g", dataValue); ip=pixel; sprintf(pixstr,"%d",ip); } WMUpdateGroup(1); return; } int select_wave(void) { int iz, iw, it; if (IWRtColorMode(1) == IW_TRUE_COLOR) { if (IWIsWaveMap(1,testwave)) { iwave = testwave; } } else { IWRtDisSec_ZWT(1, &iz, &iw, &it); if (testwave == iw) { iwave = iw; } else { testwave = iwave; WMUpdateGroup(1); } } update_scr(); return 1; } int EnterWindow(int* w, XEvent* event) { int wid; int iz, iw, it; int mxyz[3], nz, nwave, nt, interleaving; float dmin, dmax, dmean; while (!giFileClose) { WMProcEvent(1); } wid = IWIsIWLEvt(event); idata[0]=-1; sprintf(winid, "%5d", wid); IWAttachWin(1, wid, "ro"); IMAlPrt(0); IMRdHdr(1, nxyz, mxyz, &giMode, &dmin, &dmax, &dmean); IMRtZWT(1, &nz, &nwave, &nt, &interleaving); giFileClose = 0 ; /* try select wave here */ select_wave(); if (IWRtColorMode(1) == IW_PSEUDO) { IWRtDisSec_ZWT(1,&iz,&iw,&it); iwave = iw; } else if (iwave >= nwave) { iwave = nwave - 1; } testwave = iwave; WMProcDisplayChange(1, dis_change, NULL); WMAddEventHandler(1, PointerMotionMask, Motion, NULL); for (iw = 0; iw < nwave; ++iw) { wave_sensitive[iw] = 1; } for (; iw < IW_MAX_WAVE; ++iw) { wave_sensitive[iw] = 0; } WMChangePulldown(gwWaveMenu, wave_str, wave_sensitive, IW_MAX_WAVE); WMUpdateGroup(1); return 1; } int LeaveWindow(int *w, XEvent *event) { if (!giFileClose) { WMCancelEventHandler(1, PointerMotionMask); WMCancelDisplayChange(1); IMClose(1); giFileClose = 1; } return 1; } int quit() { while (! giFileClose) { WMProcEvent(1); } WMCancelEventHandler(IW_ALL_WINDOWS, EnterWindowMask | LeaveWindowMask); exit(0); return 1; } int quitWrapper(void) { return quit(); } int main(int argc, char* argv[]) { if (IWAttach() == NULL) { printf(" ERROR: IWL Shared Memory attach failure; exit\n"); exit(1); } WMInit("Point Info"); WMSetLoc(512, 512); WMAddInfoButton("Wid", "Point WINDOW"); WMAddText(winid, sizeof(winid) - 1, 1); WMAddInfoButton("Wave:", "Point WAVE_NUM"); WMSetPulldownShowChoice(1); gwWaveMenu = WMAddPulldown(wave_str, IW_MAX_WAVE, &testwave, NULL, NULL, 0, 1); WMAttachRightSide(); WMNewRow(); WMAddInfoButton("X/Y/Z:", "Point X_Y"); WMAddText(coord, sizeof(coord) - 1, 1); WMAttachRightSide(); WMNewRow(); WMAddInfoButton(" Data:", "Point DATA"); WMAddText(valstr, sizeof(valstr) - 1, 1); WMAttachRightSide(); WMNewRow(); WMAddInfoButton("Pixel:","Point PIXEL"); WMAddText(pixstr, sizeof(pixstr) - 1, 1); WMAttachRightSide(); WMNewRow(); WMAddInfoButton("?", "Point"); WMAddFuncButton("Quit", quit, NULL, 0, 0); WMSetExitFunction(quitWrapper); WMAttachRightSide(); WMDisplay(); WMAddEventHandler(IW_ALL_WINDOWS, EnterWindowMask, EnterWindow, NULL); WMAddEventHandler(IW_ALL_WINDOWS, LeaveWindowMask, LeaveWindow, NULL); WMEnableIWLEvent(); WMAppMainLoop(); return 1; }