!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !.IDENTIFICATION: plotexampl.prg !.PURPOSE: MIDAS procedure to plot a line of an image ! execute as @@ plotexampl par1 [par2] [par3] [par4] [par5] ! where: ! par1 = input frame ! par2 = line number (defaulted to 1) ! par3 = 1st point,last point on the line (defaulted to 1,npix) ! this parameters is read in automatic scaling mode only ! par4 = sc_x,sc_y,off_x,off_y (defaults device filling) ! par5 = options for AG_AXES !.AUTHOR: R.M. van Hees !.VERSION: RvH 931025 ! ----------------------------------------------------------------------- DEFINE/PARAM P1 ? IMA "Enter image:" ! frame WRITE/KEYWORD IN_A {P1} DEFINE/PARAM P2 @1 ! line number ! IF {PLRSTAT(1)} .NE. 0.0 .AND. {PLRSTAT(2)} .NE. 0.0 THEN DEFINE/PARAM P3 MANUAL C ELSE DEFINE/PARAM P3 <,> C IF P3(1:1) .EQ. "M" THEN WRITE/OUT "*** FATAL: X axis not manually set; use SET/GRAPHICS" RETURN ENDIF ENDIF ! DEFINE/PARAM P4 0.,0.,-999,-999 NUM @ plscoff {P4} ! get the scales and offsets WRITE/KEYWORD INPUTC {P5} ! options for AGL ! DATTIM = M$TIME() ! time and date of the plot RUN plotexampl ! draw the plot ! WRITE/KEYWORD PLCDATA/C/1/60 {P1} ! name of data structure WRITE/KEYWORD PLCDATA/C/61/20 "FRAME " ! type of data structure ! @ purgeplt {P1} IF MID$PLOT(26:30) .EQ. "SPOOL" THEN ! make plot if spool is on @ sendplot ENDIF
To run the application execute the procedure via:
Midas 001> @@ plotexampl frame line_nr start,end sc_x,sc_y,off_x,off_y AGL_options
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .COPYRIGHT (c) 1993 European Southern Observatory .IDENTifer PLOTEXMPL .AUTHOR R.M. van Hees IPG-ESO Garching .KEYWORDS Graphics, bulk data frame, one-dimensional plotting .LANGUAGE C .PURPOSE Plot a line of a FRAME in/output: IN_A/C/1/60 = input frame P2/C/72 = line number (default 1) P3/C/72 = first and last pixel of the line (default: the whole line). INPUTC/1/80 = options for PCAXES .RETURNS .COMMENTS Test program for high level plot interfaces .ENVIRONment MIDAS #include <midas_def.h> Prototypes for MIDAS interfaces #include <plot_def.h> General symbols for Plot routines .VERSION 1.0 09-Sep-1993 Creation R.M. van Hees ------------------------------------------------------------*/ /* * Define _POSIX_SOURCE to indicate * that this is a POSIX program */ #define _POSIX_SOURCE 1 /* * definition of the used functions */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> /* * define some macros and constants */ #include <midas_def.h> #include <plot_def.h> #define FOR_Y 4 #define PLDIM2 2 /* only two dimensional plots */ #define KEY_EXIT 32 /* AGL key code for middle mouse buton */ /* * here starts the code of the function */ int main() { int actvals, binmod, ii, imf, key, ltype, naxis, nrprow, stat, stype, npix[PLDIM2]; float xpos, ypos, *xdata, *ydata, area[4], image[4], wcfram[8]; double start[PLDIM2], step[PLDIM2]; char *bin, *cmnd, *name, *cunit, *ident, *input, *buff, *text, *option, *label[PLDIM2], *pntr, *cpntr; /* * initialised variables */ int access = 0, /* parameter for PCOPEN: NEW plot mode */ plmode = -1; /* plot mode taken from keyword PMODE */ float y_off = 0.0; /* no offset in the Y direction of the plot */ char *err_1dim = "*** WARNING: Image column contains only one point!", *err_flat = "*** WARNING: zero dynamic range in data at %13.8g"; /* * allocate memory for different character pointers and initialise a few */ bin = osmmget(4); cmnd = osmmget(21); ident = osmmget(33); name = osmmget(61); input = osmmget(73); option = osmmget(81); buff = osmmget(81); text = osmmget(81); cunit = osmmget(PLDIM2 * 16 + 1); for ( ii = 0; ii < PLDIM2; ii++ ) label[ii] = osmmget(81); strcpy( label[0], "Position (" ); strcpy( label[1], "Pixel value (" ); strcpy( ident, " " ); /* SCIGET needs this */ *cunit = '\0'; for ( ii = 0; ii < PLDIM2; ii++ ) strncat( cunit, " ", 16 ); /* * start of executable code */ stat = SCSPRO( "PLEXMPL" ); /*contact with the MIDAS monitor*/ /* * find file name and read header information */ stat = SCKGETC( "IN_A", 1, 60, &actvals, name ); stat = SCIGET( name, D_R4_FORMAT, F_I_MODE,F_IMA_TYPE, PLDIM2, &naxis, npix, start, step, ident, cunit, &cpntr, &imf ); if ( npix[0] == 1 ) stat = SCTPUT( err_1dim ); /* * line number (Y-coordinate) */ image[2] = image[3] = 1; /* default line number = 1 */ if ( naxis > 1 ) { stat = SCKGETC( "P2", 1, 72, &actvals, input ); image[2] = image[3] = GETSIN( input, npix[1], start[1], step[1] ); BOXPTW( image+2, npix[1], start[1], step[1], area+2 ); } /* * find first and last pixel along the row (X-coordinate) */ stat = SCKGETC( "P3", 1, 72, &actvals, input ); strcpy( buff, input ); image[0] = GETSIN( strtok( buff,"," ), npix[0], start[0], step[0] ); pntr = strchr( input, ',' ); image[1] = GETSIN( pntr+1, npix[0], start[0], step[0] ); BOXPTW( image, npix[0], start[0], step[0], area ); /* * Store the size of the extracted data in PLRGRAP */ PCKWRR( "PIXEL", 4, image ); /* * allocate virtual memory for a single line of the frame */ nrprow =(int) fabs(image[1] - image[0]) + 1; /*number of points in the row*/ xdata = (float *) osmmget( nrprow * sizeof(float)); ydata = (float *) osmmget( nrprow * sizeof(float)); /* * copy the data of the row */ GETBDF( cpntr, image, npix, start, step, xdata, ydata ); /* * Get the manual setting for the axes */ PCKRDR( "XAXIS", 4, &actvals, wcfram ); PCKRDR( "YAXIS", 4, &actvals, wcfram+FOR_Y ); /* * If the X axis is not defined by the user we calculate frame along X axis */ if ( fabs( *wcfram ) < PLT_EPS && fabs( *(wcfram+1) ) < PLT_EPS ) { wcfram[0] = area[0]; wcfram[1] = area[1]; } /* * If the Y axis is not defined by the user we calculate frame along Y axis */ if ( fabs( *(wcfram+FOR_Y)) < PLT_EPS && fabs( *(wcfram+FOR_Y+1)) < PLT_EPS ) { MINMAX( ydata, nrprow, wcfram + FOR_Y, wcfram + FOR_Y + 1 ); if ( wcfram[FOR_Y] == wcfram[FOR_Y+1] ) { sprintf( buff, err_flat, wcfram[FOR_Y] ); SCTPUT( buff ); } } /* * the tick marks will be set by PCAXES */ wcfram[2] = wcfram[3] = wcfram[FOR_Y+2] = wcfram[FOR_Y+3] = 0.0; /* * still we have to save the coordinate frame in PLRGRAP */ PCKWRR( "XWNDL", 4, wcfram ); PCKWRR( "YWNDL", 4, wcfram+FOR_Y ); /* * setup graphics device according to MIDAS settings * default graphics display & meta-file name */ PCOPEN( " ", " ", access, &plmode ); /* * plot the axes */ if ( strlen( cunit ) > 0 ) { strncat( label[0], cunit+17, 16 ); strncat( label[1], cunit, 16 ); } for ( ii = 0; ii < PLDIM2; ii++ ) { strcat( label[ii], ")" ); LABSTR( label[ii] ); } /* * draw the axes and define the clipping area */ stat = SCKGETC( "INPUTC", 1, 80, &actvals, option ); PCAXES( wcfram, wcfram+FOR_Y, label[0], label[1], option ); /* * get the symbol type, line type and binmode */ PCKRDI( "STYPE", 1, &actvals, &stype ); PCKRDI( "LTYPE", 1, &actvals, <ype ); PCKRDC( "BINMOD", 4, &actvals, bin ); binmod = (strncmp( bin, "ON", 2 ) == 0) ? 1 : 0; /* * plot the data */ PCDATA( stype, ltype, binmod, xdata, ydata, y_off, nrprow ); /* * draw some additional information */ SCTPUT( "Go with the cursor to plot info about the frame (left mouse button)"); stat = PCGCUR( &xpos, &ypos, &key ); if ( key != KEY_EXIT ) { sprintf( text, "Frame: %s", name ); PCTEXT( text, xpos, ypos, 0.0, 0.75, 0 ); } SCTPUT( "Go with the cursor to plot info about the drawn row" ); stat = PCGCUR( &xpos, &ypos, &key ); if ( key != KEY_EXIT ) { sprintf( text, "Row: %.0f", image[2] ); PCTEXT( text, xpos, ypos, 0.0, 0.75, 0 ); } /* * close plot file and terminate graphic operations */ PCCLOS(); return SCSEPI(); }