2812 lines
83 KiB
C
2812 lines
83 KiB
C
#define GLOBAL
|
|
#define VIDEO
|
|
#include "gui.h"
|
|
#include "sharp95.h"
|
|
/***************************************************************/
|
|
/* SHARP-95 */
|
|
/* Advanced Interactive Sounding Analysis Program */
|
|
/* */
|
|
/* XW Video Graphics Routines (Part #6) */
|
|
/* These routines have been used in the porting of SHARP */
|
|
/* to X/Xt/Motif. */
|
|
/* */
|
|
/* John Hart & Jim Whistler */
|
|
/* National Severe Storms Forecast Center */
|
|
/* Kansas City, Missouri */
|
|
/* */
|
|
/* -------------------------------------------------- */
|
|
/* List of Routines in this module: */
|
|
/* */
|
|
/* X_Init */
|
|
/* setcliprgn */
|
|
/* setlinestyle */
|
|
/* getgtextextent */
|
|
/* moveto */
|
|
/* lineto */
|
|
/* rectangle */
|
|
/* setcolor */
|
|
/* set_font */
|
|
/* reset_graphic */
|
|
/* parcel_popup */
|
|
/* */
|
|
/***************************************************************/
|
|
/* OPC MODIFICATION - J. Morgan 4/27/05 */
|
|
/* page_next() - Increased page number to 5 */
|
|
/***************************************************************/
|
|
|
|
/*
|
|
* Private functions
|
|
*/
|
|
void expose_overlays (Widget, XtPointer,
|
|
XmDrawingAreaCallbackStruct *call);
|
|
void file_cb (Widget, XtPointer, XtPointer);
|
|
void gem_loop (void);
|
|
void inset_graphic (Widget, XtPointer, XtPointer);
|
|
void interp_data (Widget, XtPointer, XtPointer);
|
|
void load_cb (Widget, XtPointer, XtPointer);
|
|
void mdl_cursor_fmt_val (int getset, int fmt, int *curval);
|
|
void mdl_cursor_mkstr (float lat, float lon, char *cpos);
|
|
void option_cb (Widget, XtPointer, XtPointer);
|
|
void option_graphic (Widget, XtPointer, XtPointer);
|
|
void page_next (Widget, XtPointer, XtPointer);
|
|
void parcel_popup (Widget );
|
|
void pointer_update (Widget, XtPointer, XEvent *event);
|
|
void position_cursor (Widget, XtPointer, XEvent *event);
|
|
void redraw_sounding (Widget, XtPointer, XEvent *event);
|
|
void reset_graphic (Widget, XtPointer, XtPointer);
|
|
void resize_callback (Widget, XtPointer, XtPointer);
|
|
void set_user_level (Widget, XtPointer, XtPointer);
|
|
void sharp_load (Widget, XtPointer, XtPointer);
|
|
void show_acars_info (Widget );
|
|
void show_profiler_info (Widget );
|
|
void tog_graph (Widget, XtPointer, XtPointer);
|
|
void Toggle_Callback (Widget, long, XtPointer);
|
|
void update_pointer (Widget, XtPointer, XEvent *event);
|
|
GC xs_create_xor_gc (Widget, char *color);
|
|
|
|
void load_cpf (void);
|
|
|
|
#define RESOURCE_FILE "Nsharp"
|
|
|
|
typedef struct
|
|
{ /* for drawing moving crosshairs or zoom boxes */
|
|
int start_x, start_y, last_x, last_y;
|
|
GC gc;
|
|
XPoint points[4];
|
|
int itype; /* 0 = temp 1 = dwpt */
|
|
int ilev; /* 0 = bottom 1 = top 2 = inbetween */
|
|
short yy, i;
|
|
} rubber_band_data;
|
|
|
|
|
|
stnlist_t stnList;
|
|
plotdata_t plotData;
|
|
usrslct_t usrSelect;
|
|
srchinfo_t srchInfo;
|
|
|
|
mapstruct obs_map, pfc_map, mod_map;
|
|
|
|
XtAppContext app;
|
|
XFontStruct *font_struct = NULL;
|
|
XPoint lpoints[2];
|
|
Cardinal current_parcel = 4;
|
|
rubber_band_data rbdata;
|
|
Widget toplevel, gemfile_timelist, gemfile_text, gemfile_stationlist,
|
|
mdlfile_text, mdl_statext, user_defined_text, load_sharp,
|
|
menubar_form, dwell_panel, parcel_button;
|
|
|
|
Widget mdl_map, mdl_cursor_text;
|
|
char time_list[500][20], sta_id[5], mdlsoundfile[200],
|
|
mdlsoundtime[20], mtime_list[500][20], mdlsoundsta[12], mdl_selected[12];
|
|
int ntimes, sounding_type = 999;
|
|
float user_level = 850.;
|
|
char _transferInterrupt = 0;
|
|
|
|
extern int cursor_xwdth, cursor_xhght;
|
|
extern char pfcsoundfile[200], pfcsoundtime[20];
|
|
extern _NXMpixmapData NXMpixmapData;
|
|
extern _NXManimationFlags NXManimationFlags;
|
|
extern Widget print_dialog;
|
|
|
|
/*=====================================================================*/
|
|
|
|
void X_Init (void)
|
|
/************************************************************************
|
|
* X_INIT *
|
|
* John Hart NSSFC KCMO *
|
|
* *
|
|
* Draws basic SHARP graphic template on screen, including *
|
|
* areas, buttons, and tables. *
|
|
* *
|
|
* T. Piper/SAIC 07/03 removed *Cid initialization *
|
|
* T. Piper/SAIC 02/04 Changed name and location of help index *
|
|
* T. Piper/SAIC 12/04 Changed about to Help *
|
|
* T. Piper/SAIC 01/05 Added check on NxmGmpkInit *
|
|
***********************************************************************/
|
|
{
|
|
int ret, xloc, yloc;
|
|
unsigned int wd, ht, bw, dpth;
|
|
XmString load_st, sharp_st, sounding_st, model_st,
|
|
help_st, pfc_st, acars_st, print_st, file_st, exit_st, xstr;
|
|
|
|
Widget topform, inset_button, reset_button,
|
|
interp_button, option_button, next_page,
|
|
graph_tog, menubar, help_menu, show_text, buttonrc, stop_rc;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
int argc = 0;
|
|
|
|
/*
|
|
* Get the NWX map info table for AREA selection widget
|
|
*/
|
|
ret = nwxtbl_init ();
|
|
|
|
|
|
/* ----- Initialize X Toolkit and Load Resources ----- */
|
|
toplevel = XtVaAppInitialize (&app, RESOURCE_FILE, NULL, 0,
|
|
&argc, NULL, NULL,
|
|
XmNbaseWidth, 780,
|
|
XmNbaseHeight, 680,
|
|
XmNminWidth, 860, XmNminHeight, 750, NULL);
|
|
|
|
if (toplevel == NULL)
|
|
printf ("toplevel is null\n");
|
|
|
|
/*
|
|
* check resource file
|
|
*/
|
|
NxmInitialize (toplevel);
|
|
NxmRes_check (XtDisplay (toplevel), RESOURCE_FILE, NULL);
|
|
/*
|
|
* display version in title string
|
|
*/
|
|
NxmVers_showTitle (toplevel);
|
|
|
|
|
|
/* ----- Create Graphics Form (window) ----- */
|
|
topform = XtVaCreateManagedWidget ("graphic_form",
|
|
xmFormWidgetClass, toplevel,
|
|
XmNfractionBase, 28, NULL);
|
|
|
|
/*
|
|
* initialize GEMPAK variables
|
|
*/
|
|
if ( NxmGmpkInit (topform, 2, NULL) != 0 ) {
|
|
exit(1);
|
|
}
|
|
|
|
/* ----- Initialize GEMPAK color palette ----- */
|
|
{
|
|
int color_bank = GraphCid, ncolors;
|
|
xqclrs (&color_bank, &ncolors, pixels, &ret);
|
|
}
|
|
|
|
menubar_form = XtVaCreateManagedWidget ("menubar_form",
|
|
xmFormWidgetClass, topform,
|
|
XmNtopAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
NULL);
|
|
|
|
|
|
|
|
/* ----- Create Menu bar across top of "topform" ----- */
|
|
load_st = XmStringCreateLocalized ("Load");
|
|
help_st = XmStringCreateLocalized ("Help");
|
|
file_st = XmStringCreateLocalized ("File");
|
|
xstr = XmStringCreateLocalized ("Options");
|
|
menubar = XmVaCreateSimpleMenuBar (menubar_form, "menubar",
|
|
XmVaCASCADEBUTTON, file_st, (KeySym)'F',
|
|
XmVaCASCADEBUTTON, load_st, (KeySym)'L',
|
|
XmVaCASCADEBUTTON, xstr, (KeySym)'t',
|
|
XmVaCASCADEBUTTON, help_st, (KeySym)'H',
|
|
XmNtopAttachment, XmATTACH_FORM,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
/*XmNbottomAttachment, XmATTACH_FORM, */
|
|
XmNrightAttachment, XmATTACH_FORM, NULL);
|
|
|
|
XmStringFree (load_st);
|
|
XmStringFree (help_st);
|
|
XmStringFree (file_st);
|
|
XmStringFree (xstr);
|
|
XtManageChild (menubar);
|
|
|
|
/* ----- Create Help Menu Option ----- */
|
|
help_menu = XtNameToWidget (menubar, "button_3");
|
|
XtVaSetValues (menubar, XmNmenuHelpWidget, help_menu, NULL);
|
|
XtAddCallback (help_menu, XmNactivateCallback,
|
|
(XtCallbackProc) NxmHelp_helpBtnCb, (XtPointer) 1);
|
|
|
|
/* ----- Create Pulldown Menu for Loading Soundings ----- */
|
|
sharp_st = XmStringCreateLocalized ("Archive Files");
|
|
sounding_st = XmStringCreateLocalized ("Observed Soundings");
|
|
model_st = XmStringCreateLocalized ("Model Soundings");
|
|
pfc_st = XmStringCreateLocalized ("PFC Soundings");
|
|
acars_st = XmStringCreateLocalized ("ACARS Soundings");
|
|
XmVaCreateSimplePulldownMenu (menubar, "load_menu",
|
|
1, load_cb,
|
|
XmVaPUSHBUTTON, sharp_st, (KeySym)'r', NULL, NULL,
|
|
XmVaPUSHBUTTON, sounding_st, (KeySym)'O', NULL, NULL,
|
|
XmVaPUSHBUTTON, model_st, (KeySym)'M', NULL, NULL,
|
|
XmVaPUSHBUTTON, pfc_st, (KeySym)'P', NULL, NULL,
|
|
XmVaPUSHBUTTON, acars_st, (KeySym)'A', NULL, NULL,
|
|
NULL);
|
|
XmStringFree (sharp_st);
|
|
XmStringFree (sounding_st);
|
|
XmStringFree (model_st);
|
|
XmStringFree (pfc_st);
|
|
XmStringFree (acars_st);
|
|
print_st = XmStringCreateLocalized ("Print");
|
|
exit_st = XmStringCreateLocalized ("Exit");
|
|
XmVaCreateSimplePulldownMenu (menubar, "file_menu",
|
|
0, file_cb,
|
|
XmVaPUSHBUTTON, print_st, (KeySym)'P', NULL, NULL,
|
|
XmVaPUSHBUTTON, exit_st, (KeySym)'x', NULL, NULL,
|
|
NULL);
|
|
XmStringFree (print_st);
|
|
XmStringFree (exit_st);
|
|
|
|
xstr = XmStringCreateLocalized ("Dwell");
|
|
XmVaCreateSimplePulldownMenu (menubar, "file_menu",
|
|
2, option_cb,
|
|
XmVaPUSHBUTTON, xstr, (KeySym)'D', NULL, NULL, NULL);
|
|
XmStringFree (xstr);
|
|
|
|
dwell_panel = NxmDwell_popupCreate (menubar_form, "DwellPanel");
|
|
|
|
stop_rc = XtVaCreateWidget ("stop_rc",
|
|
xmRowColumnWidgetClass, menubar_form,
|
|
XmNtopAttachment, XmATTACH_WIDGET,
|
|
XmNtopWidget, menubar,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
XmNorientation, XmHORIZONTAL, NULL);
|
|
|
|
/*
|
|
* create stop/busy buttons
|
|
*/
|
|
NxmBusy_createBtns (stop_rc);
|
|
|
|
/*
|
|
* initialize STOP button as insensitive
|
|
*/
|
|
NxmBusy_setStopBtn (1);
|
|
|
|
XtManageChild (stop_rc);
|
|
|
|
|
|
print_dialog = NxmPrt_create ("Print dialog", topform, printdialog_ok_cb);
|
|
|
|
/*
|
|
* create HELP popup
|
|
*/
|
|
NxmHelp_create (topform, "HelpDialog", "Help",
|
|
"$GEMHLP/hlp/nsharpIndex.hlp", 20, 80);
|
|
|
|
|
|
/* ----- Create main area for soundings/parameters ----- */
|
|
draw_reg = XtVaCreateManagedWidget ("canvas",
|
|
xmDrawingAreaWidgetClass, topform,
|
|
XmNtopAttachment, XmATTACH_WIDGET,
|
|
XmNtopWidget, menubar_form,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
XmNbottomAttachment, XmATTACH_POSITION,
|
|
XmNbottomPosition, 26,
|
|
XmNbackground, pixels[0],
|
|
XmNwidth, 900, XmNheight, 620, NULL);
|
|
|
|
/* ----- Create SKEWT/HODOGRAPH button ----- */
|
|
graph_tog = XtVaCreateManagedWidget ("Hodograph",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment, XmATTACH_POSITION,
|
|
XmNleftPosition, 0,
|
|
XmNtopAttachment, XmATTACH_POSITION,
|
|
XmNtopPosition, 26,
|
|
XmNbottomAttachment, XmATTACH_POSITION,
|
|
XmNbottomPosition, 27,
|
|
XmNrightAttachment, XmATTACH_POSITION,
|
|
XmNrightPosition, 4, NULL);
|
|
XtAddCallback (graph_tog, XmNactivateCallback,
|
|
(XtCallbackProc) tog_graph, NULL);
|
|
|
|
/* ----- Create RESET button ----- */
|
|
reset_button = XtVaCreateManagedWidget ("RESET",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment,
|
|
XmATTACH_POSITION, XmNleftPosition,
|
|
4, XmNtopAttachment,
|
|
XmATTACH_POSITION, XmNtopPosition,
|
|
26, XmNbottomAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNbottomPosition, 27,
|
|
XmNrightAttachment,
|
|
XmATTACH_POSITION, XmNrightPosition,
|
|
8, NULL);
|
|
XtAddCallback (reset_button, XmNactivateCallback,
|
|
(XtCallbackProc)reset_graphic, NULL);
|
|
|
|
/* ----- Create PARCEL button ----- */
|
|
parcel_button = XtVaCreateManagedWidget ("PARCEL",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment,
|
|
XmATTACH_POSITION, XmNleftPosition,
|
|
8, XmNtopAttachment,
|
|
XmATTACH_POSITION, XmNtopPosition,
|
|
26, XmNbottomAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNbottomPosition, 27,
|
|
XmNrightAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNrightPosition, 12, NULL);
|
|
XtAddCallback (parcel_button, XmNactivateCallback,
|
|
(XtCallbackProc)parcel_popup, NULL);
|
|
|
|
/* ----- Create INSET button ----- */
|
|
inset_button = XtVaCreateManagedWidget ("INSET",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment,
|
|
XmATTACH_POSITION, XmNleftPosition,
|
|
0, XmNtopAttachment,
|
|
XmATTACH_POSITION, XmNtopPosition,
|
|
27, XmNbottomAttachment,
|
|
XmATTACH_FORM, XmNrightAttachment,
|
|
XmATTACH_POSITION, XmNrightPosition,
|
|
4, NULL);
|
|
XtAddCallback (inset_button, XmNactivateCallback,
|
|
(XtCallbackProc)inset_graphic, NULL);
|
|
|
|
/* ----- Create INTERP button ----- */
|
|
interp_button = XtVaCreateManagedWidget ("INTERP",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment,
|
|
XmATTACH_POSITION, XmNleftPosition,
|
|
4, XmNtopAttachment,
|
|
XmATTACH_POSITION, XmNtopPosition,
|
|
27, XmNbottomAttachment,
|
|
XmATTACH_FORM, XmNrightAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNrightPosition, 8, NULL);
|
|
XtAddCallback (interp_button, XmNactivateCallback,
|
|
(XtCallbackProc)interp_data, NULL);
|
|
|
|
/* ----- Create OPTIONS button ----- */
|
|
option_button = XtVaCreateManagedWidget ("Overlay: OFF",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment,
|
|
XmATTACH_POSITION, XmNleftPosition,
|
|
8, XmNtopAttachment,
|
|
XmATTACH_POSITION, XmNtopPosition,
|
|
27, XmNbottomAttachment,
|
|
XmATTACH_FORM, XmNrightAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNrightPosition, 12, NULL);
|
|
XtAddCallback (option_button, XmNactivateCallback,
|
|
(XtCallbackProc)option_graphic, NULL);
|
|
|
|
/* ----- Create NEXT PAGE button ----- */
|
|
next_page = XtVaCreateManagedWidget ("NEXT PAGE",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment, XmATTACH_POSITION,
|
|
XmNleftPosition, 12,
|
|
XmNtopAttachment, XmATTACH_POSITION,
|
|
XmNtopPosition, 26,
|
|
XmNbottomAttachment, XmATTACH_POSITION,
|
|
XmNbottomPosition, 27,
|
|
XmNrightAttachment, XmATTACH_POSITION,
|
|
XmNrightPosition, 16, NULL);
|
|
XtAddCallback (next_page, XmNactivateCallback,
|
|
(XtCallbackProc)page_next, NULL);
|
|
|
|
show_text = XtVaCreateManagedWidget ("SHOW TEXT",
|
|
xmPushButtonWidgetClass, topform,
|
|
XmNleftAttachment, XmATTACH_POSITION,
|
|
XmNleftPosition, 12,
|
|
XmNtopAttachment, XmATTACH_POSITION,
|
|
XmNtopPosition, 27,
|
|
XmNbottomAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_POSITION,
|
|
XmNrightPosition, 16, NULL);
|
|
XtAddCallback (show_text, XmNactivateCallback,
|
|
(XtCallbackProc)show_textCb, NULL);
|
|
|
|
/* ---- Create Cursor Readout display ---- */
|
|
cursor_out = XtVaCreateManagedWidget ("cursor_out",
|
|
xmDrawingAreaWidgetClass, topform,
|
|
XmNleftAttachment, XmATTACH_POSITION,
|
|
XmNleftPosition, 17,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
XmNbottomAttachment, XmATTACH_FORM,
|
|
XmNtopAttachment, XmATTACH_POSITION,
|
|
XmNtopPosition, 26,
|
|
XmNbackground, pixels[0], NULL);
|
|
|
|
/* ----- Manage Menubar and loop controls ----- */
|
|
{
|
|
int nloop_insensitive = 4;
|
|
Pixel background;
|
|
WidgetList loopsensitive;
|
|
|
|
loopsensitive = (WidgetList) XtMalloc ((size_t) nloop_insensitive *
|
|
sizeof (Widget));
|
|
loopsensitive[0] = option_button;
|
|
loopsensitive[1] = show_text;
|
|
loopsensitive[2] = reset_button;
|
|
loopsensitive[3] = interp_button;
|
|
buttonrc = NxmAnimationPanelCreate (menubar_form, "AnimationButtons",
|
|
"yellow", "black", loopsensitive,
|
|
nloop_insensitive,
|
|
(XtCallbackProc)
|
|
NxmLoopButtonCallback, gem_loop);
|
|
|
|
XtVaGetValues (toplevel, XmNbackground, &background, NULL);
|
|
XtVaSetValues (buttonrc,
|
|
XmNbackground, background,
|
|
XmNtopAttachment, XmATTACH_WIDGET,
|
|
XmNtopWidget, menubar,
|
|
XmNrightAttachment, XmATTACH_WIDGET,
|
|
XmNrightWidget, stop_rc,
|
|
XmNrightOffset, 30, XmNorientation, XmHORIZONTAL, NULL);
|
|
|
|
}
|
|
|
|
XtManageChild (menubar_form);
|
|
NxmLoopbuttonSensitive (False);
|
|
|
|
|
|
/* ----- Create Window and Map Screen ----- */
|
|
XtRealizeWidget (toplevel);
|
|
{
|
|
char wname[] = "skewt_canvas";
|
|
NxmGmpkRgstr (draw_reg, wname, NULL);
|
|
}
|
|
|
|
|
|
/* ----- Query "Graphic Context" ----- */
|
|
gc = xqgemgc ();
|
|
|
|
/* ----- callback for expose ----- */
|
|
XtAddCallback (draw_reg, XmNexposeCallback,
|
|
(XtCallbackProc)expose_overlays, NULL);
|
|
|
|
/* ----- callback for resize ----- */
|
|
XtAddCallback (draw_reg, XmNresizeCallback,
|
|
(XtCallbackProc)resize_callback, NULL);
|
|
|
|
/* ----- "button pressed" event ----- */
|
|
XtAddEventHandler (draw_reg, ButtonPressMask, FALSE,
|
|
(XtEventHandler)position_cursor, (XtPointer)NULL);
|
|
|
|
/* ----- "mouse moved with button #1 depressed" event ----- */
|
|
XtAddEventHandler (draw_reg, Button1MotionMask, FALSE,
|
|
(XtEventHandler)update_pointer, (XtPointer)NULL);
|
|
|
|
/* ----- "button released" event ----- */
|
|
XtAddEventHandler (draw_reg, ButtonReleaseMask, FALSE,
|
|
(XtEventHandler)redraw_sounding, (XtPointer)NULL);
|
|
|
|
/* ----- "mouse moved" event ----- */
|
|
XtAddEventHandler (draw_reg, PointerMotionMask, FALSE,
|
|
(XtEventHandler)pointer_update, (XtPointer)NULL);
|
|
|
|
XGrabButton (XtDisplay (draw_reg), AnyButton, AnyModifier,
|
|
XtWindow (draw_reg), TRUE,
|
|
ButtonPressMask | Button1MotionMask |
|
|
ButtonReleaseMask,
|
|
GrabModeAsync, GrabModeAsync, XtWindow (draw_reg), 0);
|
|
|
|
{
|
|
/* ----- Create Cursor Graphic Context ----- */
|
|
Window root;
|
|
/*---------------------------------------------------------------------*/
|
|
gc_cursor =
|
|
XCreateGC (XtDisplay(cursor_out), XtWindow(cursor_out), 0, 0);
|
|
/* ----- Set background color to Black (pixels[0]) ----- */
|
|
XSetBackground (XtDisplay(cursor_out), gc_cursor, pixels[0]);
|
|
XGetGeometry (XtDisplay(cursor_out), XtWindow(cursor_out), &root, &xloc,
|
|
&yloc, &wd, &ht, &bw, &dpth);
|
|
cursor_xwdth = (int) wd;
|
|
cursor_xhght = (int) ht;
|
|
canvas_cursor =
|
|
XCreatePixmap (XtDisplay (cursor_out), root, wd, ht, dpth);
|
|
}
|
|
XtVaGetValues ( draw_reg,
|
|
XmNwidth, &wd,
|
|
XmNheight, &ht,
|
|
NULL );
|
|
xwdth = (int)wd;
|
|
xhght = (int)ht;
|
|
/* initialize canvas to first pixmap */
|
|
canvas = xqpxms (0, 0);
|
|
|
|
/* ----- Set background color to Black (pixels[0]) ----- */
|
|
XSetBackground (XtDisplay (draw_reg), gc, pixels[0]);
|
|
XFillRectangle (XtDisplay (draw_reg), canvas, gc, 0, 0, wd, ht);
|
|
|
|
/* ----- Initialize "RubberBand" struct for skewt edit ----- */
|
|
rbdata.gc = xs_create_xor_gc (draw_reg, "white");
|
|
rbdata.start_x = 0;
|
|
rbdata.start_y = 0;
|
|
rbdata.last_x = 0;
|
|
rbdata.last_y = 0;
|
|
rbdata.itype = 0;
|
|
rbdata.ilev = 2;
|
|
rbdata.yy = 0;
|
|
rbdata.i = 0;
|
|
rbdata.points[0].x = rbdata.points[1].x = rbdata.points[2].x = 0;
|
|
rbdata.points[0].y = rbdata.points[1].y = rbdata.points[2].y = 0;
|
|
|
|
set_font (2);
|
|
|
|
|
|
resize_callback (draw_reg, (XtPointer) NULL, (XtPointer)NULL);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void setcliprgn (short tlx, short tly, short brx, short bry, Widget _canvas,
|
|
GC _gc)
|
|
/*************************************************************/
|
|
/* SETCLIPRGN */
|
|
/*************************************************************/
|
|
{
|
|
Region regn;
|
|
XRectangle rect;
|
|
/*---------------------------------------------------------------------*/
|
|
regn = XCreateRegion ();
|
|
rect.x = (short) tlx - (short) 1;
|
|
rect.y = tly - (short) 1;
|
|
rect.width = (unsigned short) (brx - tlx + 5);
|
|
rect.height = (unsigned short) (bry - tly + 5);
|
|
XUnionRectWithRegion (&rect, regn, regn);
|
|
|
|
XSetRegion (XtDisplay (_canvas), _gc, regn);
|
|
|
|
XDestroyRegion (regn);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void setlinestyle (short style, short width)
|
|
/*************************************************************/
|
|
/* SETLINESTYLE */
|
|
/* style = 1 = solid */
|
|
/* style = 2 = dash */
|
|
/* style = 3 = dash dot dash */
|
|
/* style = 4 = short dash long dash */
|
|
/*************************************************************/
|
|
{
|
|
int dash_offset = 1;
|
|
static char dash_dash[] = { 3, 3 };
|
|
static char dash_dot[] = { 4, 4, 2, 4 };
|
|
static char dash_long[] = { 3, 3, 6, 3 };
|
|
Cardinal line_width;
|
|
/*---------------------------------------------------------------------*/
|
|
if (width < 0 || width > 10)
|
|
line_width = 1;
|
|
else
|
|
line_width = (Cardinal) width;
|
|
|
|
if (style == 1)
|
|
{
|
|
XSetLineAttributes (XtDisplay (draw_reg), gc, line_width,
|
|
LineSolid, CapButt, JoinRound);
|
|
}
|
|
else
|
|
{
|
|
XSetLineAttributes (XtDisplay (draw_reg), gc, line_width,
|
|
LineOnOffDash, CapButt, JoinRound);
|
|
}
|
|
|
|
if (style == 2)
|
|
{
|
|
XSetDashes (XtDisplay (draw_reg), gc, dash_offset, dash_dash, 2);
|
|
}
|
|
else if (style == 3)
|
|
{
|
|
XSetDashes (XtDisplay (draw_reg), gc, dash_offset, dash_dot, 4);
|
|
}
|
|
else if (style == 4)
|
|
{
|
|
XSetDashes (XtDisplay (draw_reg), gc, dash_offset, dash_long, 4);
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
int getgtextextent (char *st)
|
|
/*************************************************************/
|
|
/* GETGTEXTEXTENT */
|
|
/*************************************************************/
|
|
{
|
|
return XTextWidth (font_struct, st, (int) strlen (st));
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void moveto (short x, short y)
|
|
/*************************************************************/
|
|
/* MOVETO */
|
|
/*************************************************************/
|
|
{
|
|
lpoints[0].x = x;
|
|
lpoints[0].y = y;
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void lineto (short x, short y)
|
|
/*************************************************************/
|
|
/* LINETO */
|
|
/*************************************************************/
|
|
{
|
|
lpoints[1].x = x;
|
|
lpoints[1].y = y;
|
|
|
|
XDrawLine (XtDisplay (draw_reg), canvas, gc,
|
|
(int) lpoints[0].x, (int) lpoints[0].y,
|
|
(int) lpoints[1].x, (int) lpoints[1].y);
|
|
lpoints[0].x = x;
|
|
lpoints[0].y = y;
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void rectangle (int type, short x, short y, short width, short height)
|
|
/*************************************************************/
|
|
/* RECTANGLE */
|
|
/*************************************************************/
|
|
{
|
|
|
|
if (type == 0)
|
|
{
|
|
XDrawRectangle (XtDisplay (draw_reg), (canvas), gc,
|
|
(int) x, (int) y, (Cardinal) (width - x),
|
|
(Cardinal) (height - y));
|
|
}
|
|
else if (type == 1)
|
|
{
|
|
XFillRectangle (XtDisplay (draw_reg), (canvas), gc, (int) x,
|
|
(int) y, (Cardinal) (width - x + 1),
|
|
(Cardinal) (height - y + 1));
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void rectangle_cursor (int type, short x, short y, short width, short height)
|
|
/*************************************************************/
|
|
/* RECTANGLE_CURSOR */
|
|
/*************************************************************/
|
|
{
|
|
|
|
if (type == 0)
|
|
{
|
|
XDrawRectangle (XtDisplay (cursor_out), XtWindow (cursor_out),
|
|
gc_cursor, (int) x, (int) y, (Cardinal) (width - x),
|
|
(Cardinal) (height - y));
|
|
}
|
|
else if (type == 1)
|
|
{
|
|
XFillRectangle (XtDisplay (cursor_out), XtWindow (cursor_out),
|
|
gc_cursor, (int) x, (int) y, (Cardinal) (width - x),
|
|
(Cardinal) (height - y));
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void setcolor (int color, Widget canvas, GC _gc)
|
|
/*************************************************************/
|
|
/* SETCOLOR */
|
|
/*************************************************************/
|
|
{
|
|
XSetForeground (XtDisplay (canvas), _gc, pixels[color]);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
static char font_1[] =
|
|
{ "-adobe-helvetica-bold-r-normal--20-140-100-100-p-105-iso8859-1" };
|
|
|
|
static char font_2[] =
|
|
{ "-adobe-courier-bold-r-normal--14-100-100-100-m-90-iso8859-1" };
|
|
|
|
static char font_3[] =
|
|
{ "-adobe-times-bold-r-normal--17-120-100-100-p-88-iso8859-1" };
|
|
|
|
static char font_4[] =
|
|
{ "-adobe-new century schoolbook-bold-*-*-*-34-*-*-*-*-*-*-*" };
|
|
|
|
static char font_5[] = { "-*-symbol-medium-*-*-*-14-140-75-75-p-85-*-*" };
|
|
|
|
void set_font (short font)
|
|
/*************************************************************/
|
|
/* SET_FONT */
|
|
/*************************************************************/
|
|
{
|
|
if (font_struct)
|
|
XFreeFont (XtDisplay (draw_reg), font_struct);
|
|
|
|
if (font == 1)
|
|
{
|
|
font_struct = XLoadQueryFont (XtDisplay (draw_reg), font_1);
|
|
}
|
|
else if (font == 2)
|
|
{
|
|
font_struct = XLoadQueryFont (XtDisplay (draw_reg), font_2);
|
|
}
|
|
else if (font == 3)
|
|
{
|
|
font_struct = XLoadQueryFont (XtDisplay (draw_reg), font_3);
|
|
}
|
|
else if (font == 4)
|
|
{
|
|
font_struct = XLoadQueryFont (XtDisplay (draw_reg), font_4);
|
|
}
|
|
else if (font == 5)
|
|
{
|
|
font_struct = XLoadQueryFont (XtDisplay (draw_reg), font_5);
|
|
}
|
|
|
|
if (font_struct)
|
|
XSetFont (XtDisplay (draw_reg), gc, font_struct->fid);
|
|
}
|
|
|
|
void
|
|
set_font_cursor (short font, Widget _canvas, GC _gc, XFontStruct ** _fs)
|
|
/*************************************************************/
|
|
/* SET_FONT_CURSOR */
|
|
/*************************************************************/
|
|
{
|
|
|
|
if (*_fs)
|
|
XFreeFont (XtDisplay (_canvas), *_fs);
|
|
|
|
switch ((int) font)
|
|
{
|
|
case 1:
|
|
*_fs = XLoadQueryFont (XtDisplay (_canvas), font_1);
|
|
break;
|
|
case 2:
|
|
*_fs = XLoadQueryFont (XtDisplay (_canvas), font_2);
|
|
break;
|
|
case 3:
|
|
*_fs = XLoadQueryFont (XtDisplay (_canvas), font_3);
|
|
break;
|
|
case 4:
|
|
*_fs = XLoadQueryFont (XtDisplay (_canvas), font_4);
|
|
break;
|
|
case 5:
|
|
*_fs = XLoadQueryFont (XtDisplay (_canvas), font_5);
|
|
break;
|
|
default:
|
|
printf ("Unknown font number %d\n", font);
|
|
*_fs = XLoadQueryFont (XtDisplay (_canvas), font_2);
|
|
}
|
|
|
|
if (*_fs)
|
|
XSetFont (XtDisplay (_canvas), _gc, (*_fs)->fid);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void reset_graphic (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* RESET_GRAPHIC */
|
|
/*************************************************************/
|
|
{
|
|
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
|
|
restore_origsndg ();
|
|
reset_options (mode, pagenum);
|
|
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
static Widget rbutton[5];
|
|
void parcel_popup (Widget wdgt)
|
|
/*************************************************************/
|
|
/* PARCEL_POPUP */
|
|
/* */
|
|
/* Creates pop-up window to choose parcel. */
|
|
/*************************************************************/
|
|
{
|
|
static Widget parcel_pane, form, prcl_top = 0;
|
|
static Widget rowcol, form2, parcel_cancel;
|
|
long ii;
|
|
char *labels[] = { "Current Surface", "Forecast Surface",
|
|
"Mean mixing layer",
|
|
"Most unstable parcel",
|
|
"User Defined level"
|
|
};
|
|
XmString pop_title;
|
|
/*---------------------------------------------------------------------*/
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
|
|
if (!prcl_top)
|
|
{
|
|
|
|
/* ----- Create a Dialog for parcel selection ----- */
|
|
pop_title = XmStringCreateLocalized ("Select Thermodynamic Parcel");
|
|
prcl_top = XmCreateBulletinBoardDialog (wdgt, "parcel_panel", NULL, 0);
|
|
XtVaSetValues (prcl_top, XmNdialogTitle, pop_title, NULL);
|
|
XmStringFree (pop_title);
|
|
|
|
parcel_pane = XtVaCreateWidget ("parcel_pane",
|
|
xmPanedWindowWidgetClass,
|
|
prcl_top,
|
|
XmNsashWidth, 1,
|
|
XmNsashHeight, 1, NULL);
|
|
|
|
form = XtCreateManagedWidget ("content_form",
|
|
xmFormWidgetClass, parcel_pane, NULL, 0);
|
|
|
|
/* Create a rowcol */
|
|
|
|
rowcol = XtVaCreateManagedWidget ("Parcel",
|
|
xmRowColumnWidgetClass, form,
|
|
XmNnumColumns, 2,
|
|
XmNorientation, XmVERTICAL,
|
|
XmNspacing, 4,
|
|
XmNtopAttachment, XmATTACH_POSITION,
|
|
XmNtopPosition, 2,
|
|
XmNleftAttachment, XmATTACH_POSITION,
|
|
XmNleftPosition, 2, NULL);
|
|
|
|
for (ii = 0; ii < (long)XtNumber (labels); ii++)
|
|
{
|
|
rbutton[ii] = XtVaCreateManagedWidget (labels[ii],
|
|
xmToggleButtonWidgetClass,
|
|
rowcol, XmNindicatorType,
|
|
XmONE_OF_MANY, NULL);
|
|
|
|
XtAddCallback (rbutton[ii], XmNvalueChangedCallback,
|
|
(XtCallbackProc)Toggle_Callback, (XtPointer)ii);
|
|
|
|
if (ii == (long)(current_parcel - 1))
|
|
XmToggleButtonSetState (rbutton[ii], True, True);
|
|
}
|
|
|
|
for (ii = 0; ii < (long)XtNumber (labels); ii++)
|
|
{
|
|
if (ii == 4)
|
|
{
|
|
user_defined_text = XtVaCreateManagedWidget ("user_text",
|
|
xmTextWidgetClass,
|
|
rowcol, XmNcolumns,
|
|
16, XmNvalue,
|
|
"850", NULL);
|
|
|
|
XtAddCallback (user_defined_text, XmNvalueChangedCallback,
|
|
set_user_level, NULL);
|
|
}
|
|
else
|
|
{
|
|
XtVaCreateManagedWidget (labels[ii],
|
|
xmSeparatorWidgetClass, rowcol,
|
|
XmNseparatorType, XmNO_LINE, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
form2 = XtVaCreateWidget ("form", xmFormWidgetClass,
|
|
parcel_pane, XmNfractionBase, 7, NULL);
|
|
|
|
|
|
parcel_cancel = XtVaCreateManagedWidget ("CANCEL",
|
|
xmPushButtonWidgetClass, form2,
|
|
XmNleftAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNleftPosition, 2,
|
|
XmNtopAttachment,
|
|
XmATTACH_FORM,
|
|
XmNbottomAttachment,
|
|
XmATTACH_FORM,
|
|
XmNrightAttachment,
|
|
XmATTACH_POSITION,
|
|
XmNrightPosition, 5, NULL);
|
|
|
|
XtAddCallback (parcel_cancel, XmNactivateCallback,
|
|
(XtCallbackProc) popdown_cb, prcl_top);
|
|
|
|
|
|
XtManageChild (form2);
|
|
XtManageChild (parcel_pane);
|
|
|
|
|
|
}
|
|
XtManageChild (prcl_top);
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void inset_graphic (Widget wdgt, XtPointer clnt, XtPointer call )
|
|
/*************************************************************/
|
|
/* INSET_GRAPHIC */
|
|
/*************************************************************/
|
|
{
|
|
char winname[] = "skewt_canvas";
|
|
int i, ier, len =
|
|
strlen (winname), ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
int npxms, curpxm;
|
|
|
|
|
|
inset_options (mode);
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
|
|
xqcpxm (&npxms, &curpxm);
|
|
|
|
for (i = 0; i < npxms; i++)
|
|
{
|
|
if ((sndgs[i] != NULL) && (sndgs[i]->numlev > 0))
|
|
{
|
|
xscpxm (i, &ier);
|
|
canvas = xqpxms (0, i);
|
|
sndgp = sndgs[i];
|
|
redraw_graph (mode);
|
|
}
|
|
}
|
|
xscpxm (curpxm, &ier);
|
|
sndgp = sndgs[curpxm];
|
|
canvas = xqpxms (0, curpxm);
|
|
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void interp_data (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* INTERP_DATA */
|
|
/*************************************************************/
|
|
{
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
|
|
interp_sndg ();
|
|
redraw_graph (mode);
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
show_page (pagenum);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void option_graphic (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/****************************************************************
|
|
* OPTION_GRAPHIC *
|
|
** *
|
|
* T. Piper/SAIC 2/02 Freed XmStringCreateLocalized *
|
|
***************************************************************/
|
|
{
|
|
XmString tmp;
|
|
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
overlay_previous += 1;
|
|
if (overlay_previous == 2)
|
|
overlay_previous = 0;
|
|
if (overlay_previous == 0)
|
|
{
|
|
XtVaSetValues (wdgt, XmNlabelString,
|
|
tmp = XmStringCreateLocalized ("Overlay: OFF"), NULL);
|
|
XmStringFree (tmp);
|
|
}
|
|
if (overlay_previous == 1)
|
|
{
|
|
XtVaSetValues (wdgt, XmNlabelString,
|
|
tmp = XmStringCreateLocalized ("Overlay: ON"), NULL);
|
|
XmStringFree (tmp);
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void expose_overlays (Widget wdgt, XtPointer clnt,
|
|
XmDrawingAreaCallbackStruct *call)
|
|
/*************************************************************/
|
|
/* EXPOSE_OVERLAYS */
|
|
/*Log: *
|
|
* T. Piper/SAIC 12/04 Added check on count *
|
|
***********************************************************************/
|
|
{
|
|
XEvent *event;
|
|
/*---------------------------------------------------------------------*/
|
|
event = call->event;
|
|
if ( event->xexpose.count == 0 )
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void
|
|
resize_callback (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* RESIZE_CALLBACK */
|
|
/*************************************************************/
|
|
{
|
|
Dimension nwdth, nhght, xdim, ydim;
|
|
/*Dimension ndist;
|
|
char st[80]; */
|
|
int i, ier, npxms, curpxm;
|
|
char winname[] = "skewt_canvas";
|
|
int len =
|
|
strlen (winname), ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
|
|
|
|
XtVaGetValues (draw_reg, XmNwidth, &nwdth, XmNheight, &nhght, NULL);
|
|
|
|
xdim = (Dimension) (nwdth - 355 - skv.tlx - 20); /* Added 15 to 340 for better spacing */
|
|
ydim = (Dimension) (nhght - skv.tly);
|
|
|
|
/*if ( xdim < ydim ) used to constrain x/y for window
|
|
ndist = xdim;
|
|
else
|
|
ndist = ydim;
|
|
skv.brx = skv.bry = ndist;
|
|
hov.brx = hov.bry = ndist; */
|
|
|
|
|
|
skv.brx = xdim;
|
|
skv.bry = ydim;
|
|
hov.brx = xdim;
|
|
hov.bry = ydim;
|
|
|
|
xwdth = nwdth;
|
|
xhght = nhght;
|
|
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
xqcpxm (&npxms, &curpxm);
|
|
xscpxm (0, &ier);
|
|
xclear (&ixsize, &iysize, &isxsiz, &isysiz, &ier);
|
|
|
|
for (i = 0; i < npxms; i++)
|
|
{
|
|
if (i > 0)
|
|
xsplot (&ier); /* first pixmap already created in xclear */
|
|
|
|
canvas = xqpxms (0, i);
|
|
|
|
setcliprgn (1, 1, xwdth, xhght, draw_reg, gc);
|
|
setcolor (0, draw_reg, gc);
|
|
XFillRectangle (XtDisplay (draw_reg), canvas, gc, 0, 0, xwdth, xhght);
|
|
|
|
/* ----- Parameter Area ----- */
|
|
setcolor (4, draw_reg, gc);
|
|
rectangle (1, skv.brx + 20, skv.tly, xwdth - 5, xhght - 5);
|
|
setcolor (1, draw_reg, gc);
|
|
rectangle (0, skv.brx + 20, skv.tly, xwdth - 5, xhght - 5);
|
|
|
|
/* ----- Cursor Data Area ----- *--
|
|
setcolor (3, draw_reg, gc);
|
|
strcpy (st, "CURSOR DATA");
|
|
outgtext (st,
|
|
(((skv.brx + 20 + xwdth) / 2) - (getgtextextent (st) / 2)),
|
|
skv.tly + 5);
|
|
setcolor (0, draw_reg, gc);
|
|
rectangle (1, skv.brx + 30, skv.tly + 22, xwdth - 15, 100);
|
|
setcolor (1, draw_reg, gc);
|
|
rectangle (0, skv.brx + 30, skv.tly + 22, xwdth - 15, 100); */
|
|
|
|
sndgp = sndgs[i];
|
|
if (mode == 1)
|
|
{
|
|
draw_skewt (); /* will draw graph background if no data yet */
|
|
if ((sndgp != NULL) && (sndgp->numlev > 0))
|
|
{
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
}
|
|
}
|
|
else
|
|
draw_hodo ();
|
|
|
|
if ((sndgp != NULL) && (sndgp->numlev > 0))
|
|
show_page (pagenum);
|
|
}
|
|
|
|
xscpxm (curpxm, &ier);
|
|
if (curpxm > 0)
|
|
NxmChangePixmapData (curpxm, npxms);
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void
|
|
position_cursor (Widget w, XtPointer clnt, XEvent *event)
|
|
/************************************************************************/
|
|
/* POSITION_CURSOR */
|
|
/* */
|
|
/* Handles "mouse button depressed" event */
|
|
/* S. Chiswell/Unidata 06/06 raob_mod is set as check for cases */
|
|
/* where button release occurs after */
|
|
/* data selection window pops down. */
|
|
/************************************************************************/
|
|
{
|
|
short i, yy;
|
|
float pres, temp, dwpt, tcur, d1, d2;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
/* ----- Determine if a button is pushed ----- */
|
|
if (event->xbutton.button == 1)
|
|
{
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
|
|
raob_mod = 1;
|
|
|
|
if (mode == 1)
|
|
{
|
|
if (event->xbutton.y > skv.bry || event->xbutton.x > skv.brx ||
|
|
event->xbutton.y < skv.tly || event->xbutton.x < skv.tlx)
|
|
return;
|
|
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[0].x,
|
|
rbdata.points[0].y,
|
|
(int) rbdata.points[1].x, (int) rbdata.points[1].y);
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[1].x,
|
|
rbdata.points[1].y,
|
|
(int) rbdata.points[2].x, (int) rbdata.points[2].y);
|
|
|
|
|
|
/* ----- Determine pres/temp coords of cursor ----- */
|
|
pres = pix_to_pres ((short) event->xbutton.y);
|
|
tcur = pix_to_temp ((short) event->xbutton.x,
|
|
(short) event->xbutton.y);
|
|
|
|
if (pres > sndgp->sndg[sfc ()].pres)
|
|
{
|
|
pres = sndgp->sndg[sfc ()].pres;
|
|
}
|
|
|
|
temp = i_temp (pres);
|
|
dwpt = i_dwpt (pres);
|
|
d1 = (float) fabs ((double) (tcur - temp));
|
|
d2 = (float) fabs ((double) (tcur - dwpt));
|
|
|
|
if (d1 < d2)
|
|
{
|
|
|
|
/* ----- Edit Temperatures ----- */
|
|
rbdata.itype = 0;
|
|
rbdata.i = i = grab_level (pres);
|
|
if (!qc (sndgp->sndg[i].temp))
|
|
{
|
|
sndgp->sndg[i].temp = i_temp (sndgp->sndg[i].pres);
|
|
}
|
|
|
|
/* ----- Move mouse to starting spot ----- */
|
|
rbdata.yy = yy = pres_to_pix (sndgp->sndg[i].pres);
|
|
XWarpPointer (XtDisplay (draw_reg), XtWindow (draw_reg),
|
|
XtWindow (draw_reg), (int) skv.tlx, (int) skv.tly,
|
|
(Cardinal) skv.brx + skv.tlx,
|
|
(Cardinal) skv.bry + skv.tly,
|
|
temp_to_pix (sndgp->sndg[i].temp,
|
|
sndgp->sndg[i].pres), yy);
|
|
rbdata.last_x = rbdata.start_x = event->xbutton.x;
|
|
rbdata.last_y = rbdata.start_y = event->xbutton.y;
|
|
rbdata.points[1].x =
|
|
temp_to_pix (sndgp->sndg[i].temp, sndgp->sndg[i].pres);
|
|
rbdata.points[1].y = yy;
|
|
|
|
if (i == 0)
|
|
{
|
|
rbdata.points[0].x = rbdata.points[1].x;
|
|
rbdata.points[0].y = rbdata.points[1].y;
|
|
rbdata.points[2].x =
|
|
temp_to_pix (sndgp->sndg[i + 1].temp,
|
|
sndgp->sndg[i + 1].pres);
|
|
rbdata.points[2].y = pres_to_pix (sndgp->sndg[i + 1].pres);
|
|
rbdata.ilev = 0;
|
|
}
|
|
else if (i == sndgp->numlev - 1)
|
|
{
|
|
rbdata.points[2].x = rbdata.points[1].x;
|
|
rbdata.points[2].y = rbdata.points[1].y;
|
|
rbdata.points[0].x =
|
|
temp_to_pix (sndgp->sndg[i - 1].temp,
|
|
sndgp->sndg[i - 1].pres);
|
|
rbdata.points[0].y = pres_to_pix (sndgp->sndg[i - 1].pres);
|
|
rbdata.ilev = 1;
|
|
}
|
|
else
|
|
{
|
|
rbdata.points[0].x =
|
|
temp_to_pix (sndgp->sndg[i - 1].temp,
|
|
sndgp->sndg[i - 1].pres);
|
|
rbdata.points[0].y = pres_to_pix (sndgp->sndg[i - 1].pres);
|
|
rbdata.points[2].x =
|
|
temp_to_pix (sndgp->sndg[i + 1].temp,
|
|
sndgp->sndg[i + 1].pres);
|
|
rbdata.points[2].y = pres_to_pix (sndgp->sndg[i + 1].pres);
|
|
rbdata.ilev = 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* ----- Edit Dew Points ----- */
|
|
rbdata.itype = 1;
|
|
rbdata.i = i = grab_level (pres);
|
|
if (!qc (sndgp->sndg[i].dwpt))
|
|
{
|
|
sndgp->sndg[i].dwpt = i_dwpt (sndgp->sndg[i].pres);
|
|
}
|
|
|
|
/* ----- Move mouse to starting spot ----- */
|
|
rbdata.yy = yy = pres_to_pix (sndgp->sndg[i].pres);
|
|
XWarpPointer (XtDisplay (draw_reg), XtWindow (draw_reg),
|
|
XtWindow (draw_reg), (int) skv.tlx, (int) skv.tly,
|
|
(Cardinal) skv.brx + skv.tlx,
|
|
(Cardinal) skv.bry + skv.tly,
|
|
temp_to_pix (sndgp->sndg[i].dwpt,
|
|
sndgp->sndg[i].pres), yy);
|
|
rbdata.last_x = rbdata.start_x = event->xbutton.x;
|
|
rbdata.last_y = rbdata.start_y = event->xbutton.y;
|
|
rbdata.points[1].x =
|
|
temp_to_pix (sndgp->sndg[i].dwpt, sndgp->sndg[i].pres);
|
|
rbdata.points[1].y = yy;
|
|
if (i == 0)
|
|
{
|
|
rbdata.points[0].x = rbdata.points[1].x;
|
|
rbdata.points[0].y = rbdata.points[1].y;
|
|
rbdata.points[2].x =
|
|
temp_to_pix (sndgp->sndg[i + 1].dwpt,
|
|
sndgp->sndg[i + 1].pres);
|
|
rbdata.points[2].y = pres_to_pix (sndgp->sndg[i + 1].pres);
|
|
rbdata.ilev = 0;
|
|
}
|
|
else if (i == sndgp->numlev - 1)
|
|
{
|
|
rbdata.points[2].x = rbdata.points[1].x;
|
|
rbdata.points[2].y = rbdata.points[1].y;
|
|
rbdata.points[0].x =
|
|
temp_to_pix (sndgp->sndg[i - 1].dwpt,
|
|
sndgp->sndg[i - 1].pres);
|
|
rbdata.points[0].y = pres_to_pix (sndgp->sndg[i - 1].pres);
|
|
rbdata.ilev = 1;
|
|
}
|
|
else
|
|
{
|
|
rbdata.points[0].x =
|
|
temp_to_pix (sndgp->sndg[i - 1].dwpt,
|
|
sndgp->sndg[i - 1].pres);
|
|
rbdata.points[0].y = pres_to_pix (sndgp->sndg[i - 1].pres);
|
|
rbdata.points[2].x =
|
|
temp_to_pix (sndgp->sndg[i + 1].dwpt,
|
|
sndgp->sndg[i + 1].pres);
|
|
rbdata.points[2].y = pres_to_pix (sndgp->sndg[i + 1].pres);
|
|
rbdata.ilev = 2;
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
pix_to_hodo ((short) event->xbutton.x, (short) event->xbutton.y,
|
|
&sndgp->st_dir, &sndgp->st_spd);
|
|
redraw_graph (mode);
|
|
show_page (pagenum);
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
hodo_cursor_data ((short) event->xbutton.x,
|
|
(short) event->xbutton.y);
|
|
}
|
|
|
|
XFlush (XtDisplay (draw_reg));
|
|
|
|
}
|
|
else if (event->xbutton.button == 3)
|
|
{
|
|
switch (sounding_type)
|
|
{
|
|
case 0:
|
|
XtManageChild (load_sharp);
|
|
break;
|
|
|
|
case 1:
|
|
observed_sounding_cb (w);
|
|
break;
|
|
|
|
case 2:
|
|
model_sounding_cb (w);
|
|
break;
|
|
|
|
case 3:
|
|
pfc_sounding_cb (w);
|
|
break;
|
|
|
|
case 4:
|
|
show_acars_info (w);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void
|
|
pointer_update (Widget w, XtPointer clnt, XEvent *event)
|
|
/*************************************************************/
|
|
/* POINTER_UPDATE */
|
|
/* */
|
|
/* Handles "mouse moved w/ no buttons" event */
|
|
/*************************************************************/
|
|
{
|
|
|
|
/* ----- Update Cursor Data when mouse is moved ----- */
|
|
if (mode == 1)
|
|
{
|
|
if ((event->xbutton.x < skv.brx) && (event->xbutton.y < skv.bry))
|
|
skewt_cursor_data ((short) event->xbutton.x,
|
|
(short) event->xbutton.y);
|
|
}
|
|
else
|
|
{
|
|
if ((event->xbutton.x < hov.brx) && (event->xbutton.y < hov.bry))
|
|
hodo_cursor_data ((short) event->xbutton.x, (short) event->xbutton.y);
|
|
}
|
|
XFlush (XtDisplay (cursor_out));
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void
|
|
update_pointer (Widget w, XtPointer clnt, XEvent *event)
|
|
/************************************************************************
|
|
* UPDATE_POINTER *
|
|
* *
|
|
* Handles "mouse moved while button #1 was depressed" event *
|
|
* *
|
|
** * * Log: *
|
|
* T. Piper/SAIC 03/05 Added check of button location *
|
|
***********************************************************************/
|
|
{
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
|
|
if (mode == 1)
|
|
{
|
|
if ( event->xbutton.y > skv.bry || event->xbutton.x > skv.brx ||
|
|
event->xbutton.y < skv.tly || event->xbutton.x < skv.tlx) {
|
|
return;
|
|
}
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[0].x, rbdata.points[0].y,
|
|
(int) rbdata.points[1].x, (int) rbdata.points[1].y);
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[1].x, rbdata.points[1].y,
|
|
(int) rbdata.points[2].x, (int) rbdata.points[2].y);
|
|
|
|
rbdata.last_x = event->xbutton.x;
|
|
rbdata.last_y = event->xbutton.y;
|
|
rbdata.points[1].x = event->xbutton.x;
|
|
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[0].x, rbdata.points[0].y,
|
|
(int) rbdata.points[1].x, (int) rbdata.points[1].y);
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[1].x, rbdata.points[1].y,
|
|
(int) rbdata.points[2].x, (int) rbdata.points[2].y);
|
|
|
|
set_font (2);
|
|
skewt_cursor_data ((short) event->xbutton.x,
|
|
(short) rbdata.points[1].y);
|
|
|
|
}
|
|
else
|
|
{
|
|
pix_to_hodo ((short) event->xbutton.x, (short) event->xbutton.y,
|
|
&sndgp->st_dir, &sndgp->st_spd);
|
|
|
|
/* ----- Display Hodograph Inset ----- */
|
|
draw_hoinset ();
|
|
|
|
set_font (2);
|
|
hodo_cursor_data ((short) event->xbutton.x, (short) event->xbutton.y);
|
|
}
|
|
|
|
XFlush (XtDisplay (draw_reg));
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void redraw_sounding (Widget w, XtPointer clnt, XEvent *event)
|
|
/************************************************************************
|
|
* REDRAW_SOUNDING *
|
|
* *
|
|
** *
|
|
* Log: *
|
|
* T. Piper/SAIC 03/05 Added check of button location *
|
|
* S. Chiswell/Unidata 06/06 Added check for button to have been *
|
|
* depressed in position_cursor *
|
|
***********************************************************************/
|
|
{
|
|
float chg1;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
if (!qc (i_temp (700.0F)))
|
|
return;
|
|
|
|
if ( ( event->xbutton.button != 1) || ( ! raob_mod ) )
|
|
return;
|
|
|
|
raob_mod = 0;
|
|
|
|
/* Redraw previous line */
|
|
|
|
if (mode == 1)
|
|
{
|
|
if (event->xbutton.y > skv.bry || event->xbutton.x > skv.brx ||
|
|
event->xbutton.y < skv.tly || event->xbutton.x < skv.tlx) {
|
|
return;
|
|
}
|
|
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[0].x,
|
|
rbdata.points[0].y,
|
|
(int) rbdata.points[1].x, (int) rbdata.points[1].y);
|
|
XDrawLine (XtDisplay (w), XtWindow (w), rbdata.gc,
|
|
rbdata.points[1].x,
|
|
rbdata.points[1].y,
|
|
(int) rbdata.points[2].x, (int) rbdata.points[2].y);
|
|
|
|
if (!rbdata.itype)
|
|
{
|
|
chg1 = pix_to_temp ((short) event->xbutton.x, rbdata.yy);
|
|
if (chg1 < i_dwpt (sndgp->sndg[rbdata.i].pres))
|
|
{
|
|
chg1 = i_dwpt (sndgp->sndg[rbdata.i].pres);
|
|
}
|
|
sndgp->sndg[rbdata.i].temp = chg1;
|
|
redraw_graph (mode);
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
show_page (pagenum);
|
|
}
|
|
else
|
|
{
|
|
chg1 = pix_to_temp ((short) event->xbutton.x, rbdata.yy);
|
|
if (chg1 > i_temp (sndgp->sndg[rbdata.i].pres))
|
|
{
|
|
chg1 = i_temp (sndgp->sndg[rbdata.i].pres);
|
|
}
|
|
sndgp->sndg[rbdata.i].dwpt = chg1;
|
|
redraw_graph (mode);
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
show_page (pagenum);
|
|
}
|
|
rbdata.points[0].x = rbdata.points[1].x = rbdata.points[2].x = 0;
|
|
rbdata.points[0].y = rbdata.points[1].y = rbdata.points[2].y = 0;
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
pix_to_hodo ((short) event->xbutton.x, (short) event->xbutton.y,
|
|
&sndgp->st_dir, &sndgp->st_spd);
|
|
redraw_graph (mode);
|
|
show_page (pagenum);
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
hodo_cursor_data ((short) event->xbutton.x, (short) event->xbutton.y);
|
|
XFlush (XtDisplay (draw_reg));
|
|
}
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void tog_graph (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/************************************************************************
|
|
* TOG_GRAPH *
|
|
** *
|
|
* T. Piper/SAIC 1/02 Freed XmStringCreateLocalized *
|
|
* T. Piper/SAIC 11/06 Changed winname from char* to char array*
|
|
************************************************************************/
|
|
{
|
|
XmString tmp;
|
|
|
|
int ii, ier, npxms, curpxm;
|
|
char winname[] = "skewt_canvas";
|
|
int len =
|
|
strlen (winname), ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
if (sndgp == NULL)
|
|
return;
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
xqcpxm (&npxms, &curpxm);
|
|
xscpxm (0, &ier);
|
|
xclear (&ixsize, &iysize, &isxsiz, &isysiz, &ier);
|
|
|
|
xstanm (&ier);
|
|
|
|
for (ii = 0; ii < npxms; ii++)
|
|
{
|
|
if (ii > 0)
|
|
xsplot (&ier); /* first pixmap already created in xclear */
|
|
|
|
canvas = xqpxms (0, ii);
|
|
|
|
sndgp = sndgs[ii];
|
|
|
|
if (sndgp != NULL)
|
|
switch_modes (mode);
|
|
}
|
|
xenanm (&ier);
|
|
|
|
if (mode == 2)
|
|
mode = 1;
|
|
else
|
|
mode = 2;
|
|
|
|
xscpxm (curpxm, &ier);
|
|
if (curpxm > 0)
|
|
NxmChangePixmapData (curpxm, npxms);
|
|
|
|
if (mode == 1)
|
|
{
|
|
tmp = XmStringCreateLocalized ("Hodograph");
|
|
XtVaSetValues (wdgt, XmNlabelString, tmp, NULL);
|
|
XmStringFree (tmp);
|
|
XtVaSetValues (parcel_button, XmNsensitive, True, NULL);
|
|
}
|
|
else
|
|
{
|
|
tmp = XmStringCreateLocalized ("Skewt");
|
|
XtVaSetValues (wdgt, XmNlabelString, tmp, NULL);
|
|
XmStringFree (tmp);
|
|
XtVaSetValues (parcel_button, XmNsensitive, False, NULL);
|
|
}
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void page_next (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/************************************************************************
|
|
* PAGE_NEXT *
|
|
* *
|
|
* Log: *
|
|
* J. Morgan/OPC 4/05 Increased page number to 5 *
|
|
* T. Piper/SAIC 11/06 Changed winname from char* to char array*
|
|
***********************************************************************/
|
|
{
|
|
char winname[] = "skewt_canvas";
|
|
int curpxm, ier, ii, isxsiz, isysiz, ixo, ixsize, iyo, iysize,
|
|
len = strlen (winname), ncurwn, npxms;
|
|
/*---------------------------------------------------------------------*/
|
|
if (!qc(i_temp(700.0F))) return;
|
|
pagenum += 1;
|
|
if (pagenum == 6)
|
|
pagenum = mode;
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
|
|
xqcpxm (&npxms, &curpxm);
|
|
|
|
for (ii = 0; ii < npxms; ii++) {
|
|
if ((sndgs[ii] != NULL) && (sndgs[ii]->numlev > 0) && ii != curpxm) {
|
|
xscpxm (ii, &ier);
|
|
sndgp = sndgs[ii];
|
|
canvas = xqpxms (0, ii);
|
|
show_page (pagenum);
|
|
}
|
|
}
|
|
|
|
xscpxm (curpxm, &ier);
|
|
sndgp = sndgs[curpxm];
|
|
canvas = xqpxms (0, curpxm);
|
|
show_page (pagenum);
|
|
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
char * itoa (int value, char *st, int radx)
|
|
/*************************************************************/
|
|
/* ITOA */
|
|
/*************************************************************/
|
|
{
|
|
sprintf (st, "%d", value);
|
|
return st;
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void outcursor (char *st, int x, int y)
|
|
/*************************************************************/
|
|
/* OUTCURSOR */
|
|
/*************************************************************/
|
|
{
|
|
y = y + font_struct->ascent;
|
|
XDrawImageString (XtDisplay (cursor_out), XtWindow (cursor_out), gc_cursor,
|
|
x, y, st, (int) strlen (st));
|
|
}
|
|
/*=====================================================================*/
|
|
|
|
void outtext (char *st, int x, int y)
|
|
/*************************************************************/
|
|
/* OUTTEXT */
|
|
/*************************************************************/
|
|
{
|
|
y = y + font_struct->ascent;
|
|
XDrawImageString (XtDisplay (draw_reg), XtWindow (draw_reg), gc,
|
|
x, y, st, (int) strlen (st));
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void outgtext (char *st, int x, int y)
|
|
/*************************************************************/
|
|
/* OUTGTEXT */
|
|
/*************************************************************/
|
|
{
|
|
y = y + font_struct->ascent;
|
|
XDrawString (XtDisplay (draw_reg), (canvas), gc, x, y, st,
|
|
(int) strlen (st));
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void Toggle_Callback (Widget w, long which, XtPointer call)
|
|
/*************************************************************/
|
|
/* TOGGLE_CALLBACK */
|
|
/* *
|
|
* Log: *
|
|
* T. Piper/SAIC 12/04 Toggle for all pixmaps *
|
|
***********************************************************************/
|
|
{
|
|
char winname[] = "skewt_canvas";
|
|
int ii, ier, npxms, curpxm, ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
int len = strlen (winname);
|
|
static int lastpick = (-1);
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
XtUnmanageChild (XtParent (XtParent (XtParent (XtParent (w)))));
|
|
if (which == 5)
|
|
return;
|
|
if ((lastpick >= 0) && (lastpick != which))
|
|
XtVaSetValues (rbutton[lastpick], XmNset, False, NULL);
|
|
else
|
|
XtVaSetValues (rbutton[which], XmNset, True, NULL);
|
|
|
|
pagenum = 1;
|
|
current_parcel = which + 1;
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
xqcpxm (&npxms, &curpxm);
|
|
for (ii = 0; ii < npxms; ii++) {
|
|
if ((sndgs[ii] != NULL) && (sndgs[ii]->numlev > 0) && ii != curpxm) {
|
|
xscpxm (ii, &ier);
|
|
sndgp = sndgs[ii];
|
|
canvas = xqpxms (0, ii);
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
show_page (pagenum);
|
|
}
|
|
}
|
|
xscpxm (curpxm, &ier);
|
|
sndgp = sndgs[curpxm];
|
|
canvas = xqpxms (0, curpxm);
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
show_page (pagenum);
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
lastpick = which;
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
GC xs_create_xor_gc (Widget w, char *color)
|
|
/*************************************************************/
|
|
/* XS_CREATE_XOR_GC */
|
|
/*************************************************************/
|
|
{
|
|
XGCValues values;
|
|
GC gc;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
XtVaGetValues (w, XtNbackground, &values.background, NULL);
|
|
|
|
/*
|
|
* Set the fg to the XOR of the fg and bg, so if it is
|
|
* XOR'ed with the bg, the result will be fg and vice-versa.
|
|
* This effectively achieves inverse video for the line.
|
|
*/
|
|
values.foreground = pixels[1];
|
|
values.background = pixels[0];
|
|
values.foreground = values.foreground ^ values.background;
|
|
|
|
/* Set rubber band gc to use XOR mode and draw solid line */
|
|
values.line_style = LineSolid;
|
|
values.line_width = 4;
|
|
values.function = GXxor;
|
|
|
|
gc = XtGetGC (w, GCForeground | GCBackground | GCFunction | GCLineStyle,
|
|
&values);
|
|
|
|
return gc;
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void file_cb (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
{
|
|
int item_no = (long)clnt;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
switch (item_no)
|
|
{
|
|
case 0:
|
|
if (sndgp == NULL)
|
|
return;
|
|
if (sndgp->numlev > 0)
|
|
print_selection (wdgt);
|
|
break;
|
|
case 1:
|
|
exit (0);
|
|
break;
|
|
default:
|
|
printf ("Unknown callback\n");
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void option_cb (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
{
|
|
int item_no = (long)clnt;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
switch (item_no)
|
|
{
|
|
case 0:
|
|
XtManageChild (dwell_panel);
|
|
break;
|
|
/*case 1:
|
|
NxmBusy_setStopBtn(1);
|
|
break;
|
|
case 2:
|
|
NxmBusy_setStopBtn(0);
|
|
break; */
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void _mapzoom_cb (Widget mapCanvW, XtEventHandler pickstn_func,
|
|
mapstruct *mapdata, void (*cb_func)(void))
|
|
{
|
|
int ityp, np, i;
|
|
float xpts[2], ypts[2], xdev[2], ydev[2];
|
|
int iret;
|
|
/*---------------------------------------------------------------------*/
|
|
/*
|
|
* Change mouse event handling for zooming
|
|
*/
|
|
if (pickstn_func != NULL)
|
|
XtRemoveEventHandler (mapCanvW, ButtonPressMask, FALSE,
|
|
(XtEventHandler) pickstn_func, NULL);
|
|
|
|
/*
|
|
* change to the zoom cursor
|
|
*/
|
|
NxmCursor_setCursor (mapCanvW, CURS_POINT_SELECT);
|
|
ityp = 13;
|
|
np = 2;
|
|
for (i = 0; i < np; i++)
|
|
xpts[i] = ypts[i] = 0.0F;
|
|
ggtpnt (sys_D, &ityp, xdev, ydev, &iret, strlen (sys_D));
|
|
|
|
NxmCursor_setCursor (mapCanvW, CURS_DEFAULT);
|
|
|
|
/*
|
|
* Restore mouse to be selection status
|
|
*/
|
|
XSelectInput (XtDisplay(mapCanvW), XtWindow (mapCanvW),
|
|
ButtonPressMask | ButtonReleaseMask | ExposureMask);
|
|
|
|
if (pickstn_func != NULL)
|
|
XtAddEventHandler (mapCanvW, ButtonPressMask, FALSE,
|
|
(XtEventHandler) pickstn_func, NULL);
|
|
|
|
/*
|
|
* check if the box is big enough
|
|
*/
|
|
if (fabs ((double) (xdev[0] - xdev[1])) > 20. &&
|
|
fabs ((double) (ydev[0] - ydev[1])) > 20.)
|
|
{
|
|
|
|
gtrans (sys_D, sys_M, &np, xdev, ydev, xpts, ypts,
|
|
&iret, strlen (sys_D), strlen (sys_M));
|
|
|
|
if (iret == 0)
|
|
{
|
|
for (i = 0; i < np; i++)
|
|
{
|
|
mapdata->mapb.x[i] = xpts[i];
|
|
mapdata->mapb.y[i] = ypts[i];
|
|
};
|
|
mapdata->zoomflg = 1;
|
|
}
|
|
}
|
|
cb_func ();
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void load_cb (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/****************************************************************
|
|
* LOAD_CB *
|
|
** *
|
|
* T. Piper/SAIC 2/02 Freed title *
|
|
* T. Piper/SAIC 12/04 Stop looping during load *
|
|
***************************************************************/
|
|
{
|
|
int item_no = (long)clnt;
|
|
XmString title;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
if ( NxmQueryAnimationStatus() ) NxmStopAnimation();
|
|
sounding_type = item_no;
|
|
if (item_no == 0)
|
|
{
|
|
if (!load_sharp)
|
|
{
|
|
title = XmStringCreateLocalized ("Archive File Selection");
|
|
load_sharp = XmCreateFileSelectionDialog (toplevel,
|
|
"sharp_sel", NULL, 0);
|
|
XtAddCallback (load_sharp, XmNokCallback, sharp_load, NULL);
|
|
XtAddCallback (load_sharp, XmNcancelCallback,
|
|
(XtCallbackProc) XtUnmanageChild, NULL);
|
|
XtAddCallback (load_sharp, XmNokCallback,
|
|
(XtCallbackProc) XtUnmanageChild, NULL);
|
|
XtVaSetValues (load_sharp, XmNdialogTitle, title, NULL);
|
|
XmStringFree (title);
|
|
}
|
|
XtManageChild (load_sharp);
|
|
}
|
|
else if (item_no == 1)
|
|
{
|
|
observed_sounding_cb (wdgt);
|
|
}
|
|
else if (item_no == 2)
|
|
{
|
|
model_sounding_cb (wdgt);
|
|
}
|
|
else if (item_no == 3)
|
|
{
|
|
pfc_sounding_cb (wdgt);
|
|
}
|
|
else if (item_no == 4)
|
|
{
|
|
show_acars_info (wdgt);
|
|
}
|
|
else
|
|
{
|
|
show_profiler_info (wdgt);
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void sharp_load (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* SHARP_LOAD */
|
|
/*************************************************************/
|
|
{
|
|
float ix1, ix2;
|
|
|
|
char *file = NULL, filename[200], winname[] = "skewt_canvas";
|
|
int i, npxms, curpxm;
|
|
int ier, len =
|
|
strlen (winname), ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
XmFileSelectionBoxCallbackStruct *cbs =
|
|
(XmFileSelectionBoxCallbackStruct *) call;
|
|
|
|
if (cbs)
|
|
{
|
|
file = XmStringUnparse (cbs->value, NULL, XmCHARSET_TEXT,
|
|
XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
|
|
strcpy (filename, config.filename);
|
|
strcpy (config.filename, file);
|
|
XtFree (file);
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize, &isxsiz, &isysiz, &ixo, &iyo,
|
|
&ncurwn, &ier);
|
|
xstanm (&ier);
|
|
xsplot (&ier);
|
|
xqcpxm (&npxms, &curpxm);
|
|
canvas = xqpxms (0, curpxm);
|
|
NxmChangePixmapData (curpxm, npxms);
|
|
if (sndgs[curpxm] == NULL)
|
|
{
|
|
sndgs[curpxm] =
|
|
(struct sndg_struct *) malloc (sizeof (struct sndg_struct));
|
|
sndgs[curpxm]->numlev = 0;
|
|
}
|
|
|
|
sndgp = sndgs[curpxm];
|
|
|
|
if (sndgp->numlev > 0)
|
|
copy_sndg ();
|
|
else
|
|
sndgp->ovrlev = 0;
|
|
|
|
if (get_sndg ())
|
|
{
|
|
printf ("\n Error reading file %s", config.filename);
|
|
strcpy (config.filename, filename);
|
|
return;
|
|
}
|
|
|
|
save_origsndg ();
|
|
|
|
mode = 1;
|
|
draw_skewt ();
|
|
define_parcel ((short)current_parcel, user_level);
|
|
show_parcel ();
|
|
pagenum = 1;
|
|
/*write_file(); */
|
|
mean_wind (sndgp->sndg[sfc ()].pres, i_pres (msl (6000.0F)), &ix1, &ix2,
|
|
&sndgp->st_dir, &sndgp->st_spd);
|
|
sndgp->st_spd *= .75F;
|
|
sndgp->st_dir += 30.0F;
|
|
if (sndgp->st_dir > 360.0F)
|
|
sndgp->st_dir -= 360.0F;
|
|
printf ("storm motion = %f/%f\n", sndgp->st_dir, sndgp->st_spd);
|
|
|
|
show_page (pagenum);
|
|
xenanm (&ier);
|
|
i = curpxm + 1;
|
|
while ((i < MAX_PIXMAP) && (sndgs[i] != NULL))
|
|
{
|
|
sndgs[i]->numlev = 0;
|
|
i++;
|
|
}
|
|
NxmLoopbuttonSensitive (False);
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void Load_stationlist (void)
|
|
/*************************************************************/
|
|
/* LOAD_STATIONLIST */
|
|
/* */
|
|
/* T. Lee/SAIC 10/02 Used LLSTFL in station dimension */
|
|
/* R. Tian/SAIC 02/03 Added Cursor Points mark */
|
|
/* D.W.Plummer/NCEP 3/03 modify ctb_rdcpf calling sequence */
|
|
/*************************************************************/
|
|
{
|
|
char station_tbl[12], statlist[LLSTFL][18];
|
|
int nsta, ncp, i;
|
|
int ncolor, mrktyp, mrkwid, pltval, iposn, jcolr;
|
|
int iret;
|
|
float sta_lat[LLSTFL], sta_lon[LLSTFL], sizmrk;
|
|
float cpf_lat[LLSTFL], cpf_lon[LLSTFL];
|
|
static char map_winname[] = "mapobs";
|
|
|
|
switch (obs_map.mapindx)
|
|
{
|
|
case 0:
|
|
sprintf (station_tbl, "US");
|
|
break;
|
|
|
|
case 1:
|
|
sprintf (station_tbl, "CN");
|
|
break;
|
|
|
|
case 2:
|
|
sprintf (station_tbl, "MX");
|
|
break;
|
|
|
|
default:
|
|
sprintf (station_tbl, "DSET");
|
|
}
|
|
|
|
|
|
nsharp_draw_map (map_winname, &obs_map, &iret);
|
|
|
|
if (gemsoundfile[0] != '\0' && gemsoundtime[0] != '\0' &&
|
|
station_tbl[0] != '\0')
|
|
{
|
|
|
|
ncolor = 1;
|
|
mrktyp = 6;
|
|
sizmrk = 1.0F;
|
|
mrkwid = 2;
|
|
pltval = G_FALSE;
|
|
iposn = 0;
|
|
jcolr = 2;
|
|
|
|
|
|
get_gem_stns (gemsoundfile, station_tbl, gemsoundtime,
|
|
statlist, &nsta, sta_lat, sta_lon,
|
|
strlen (gemsoundfile), strlen (station_tbl),
|
|
strlen (gemsoundtime), 18);
|
|
|
|
map_mark (&nsta, sta_lat, sta_lon, NULL, &ncolor, NULL,
|
|
&jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval, &iposn, &iret);
|
|
|
|
ctb_rdcpf ("nmap2.cpf", &ncp, cpf_lat, cpf_lon, &iret);
|
|
if (iret == 0 && ncp > 0)
|
|
{
|
|
ncolor = 1;
|
|
mrktyp = 5;
|
|
sizmrk = 2.0F;
|
|
mrkwid = 2;
|
|
pltval = G_FALSE;
|
|
iposn = 0;
|
|
jcolr = 5;
|
|
|
|
map_mark (&ncp, cpf_lat, cpf_lon, NULL, &ncolor, NULL,
|
|
&jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval,
|
|
&iposn, &iret);
|
|
}
|
|
|
|
stnList.nstn = nsta;
|
|
for (i = 0; i < nsta; i++)
|
|
{
|
|
statlist[i][17] = 0;
|
|
stnList.lat[i] = sta_lat[i];
|
|
stnList.lon[i] = sta_lon[i];
|
|
strcpy (stnList.stnName[i], statlist[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
stnList.nstn = 0;
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void get_listitem (char *srchstr, int findex, char sep, char *outstr, int *iret)
|
|
{
|
|
int ipos;
|
|
char *spos, *epos;
|
|
|
|
outstr[0] = '\0';
|
|
*iret = 0;
|
|
|
|
if (findex > 0)
|
|
cst_nocc (srchstr, sep, findex, 0, &ipos, iret);
|
|
else
|
|
ipos = 0;
|
|
|
|
if (*iret != 0)
|
|
return;
|
|
|
|
if (ipos != 0)
|
|
ipos++;
|
|
spos = srchstr + ipos;
|
|
epos = strchr (spos, sep);
|
|
if (epos == NULL)
|
|
strcpy (outstr, spos);
|
|
else
|
|
strncat (outstr, spos, epos - spos);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void Load_gem_sounding (Widget _mypane, Widget wid, char *snd_station, char *stid)
|
|
/*************************************************************/
|
|
/* LOAD_GEM_SOUNDING */
|
|
/*************************************************************/
|
|
{
|
|
int ier;
|
|
float ix1, ix2;
|
|
XtPointer userdata;
|
|
char sndtime[20], sndfile[200];
|
|
|
|
if ((wid == NULL) || (snd_station == NULL) || (snd_station[0] == '\0'))
|
|
return;
|
|
|
|
XtVaGetValues (wid, XmNuserData, &userdata, NULL);
|
|
|
|
if (userdata != NULL)
|
|
{
|
|
int i, npxms, curpxm;
|
|
char winname[] = "skewt_canvas";
|
|
int len =
|
|
strlen (winname), ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
char *choice;
|
|
struct obs_file_times *olist = (struct obs_file_times *) userdata;
|
|
XmStringTable item_list;
|
|
|
|
XtVaGetValues (wid, XmNselectedItems, &item_list, NULL);
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
xstanm (&ier);
|
|
|
|
_transferInterrupt = 0;
|
|
NxmBusy_invoke (draw_reg, &_transferInterrupt);
|
|
for (i = olist->nitems - 1; i >= 0 && !_transferInterrupt; i--)
|
|
{
|
|
int findex;
|
|
static char sep = ';';
|
|
|
|
sprintf (sndfile, "%s/", olist->path);
|
|
findex = olist->posindex[olist->selected_items[i] - 1];
|
|
get_listitem (olist->filstr, findex, sep,
|
|
sndfile + strlen (sndfile), &ier);
|
|
|
|
choice = XmStringUnparse (item_list[i], NULL, XmCHARSET_TEXT,
|
|
XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
|
|
strcpy (sndtime, choice);
|
|
XtFree (choice);
|
|
|
|
xsplot (&ier);
|
|
xqcpxm (&npxms, &curpxm);
|
|
canvas = xqpxms (0, curpxm);
|
|
NxmChangePixmapData (curpxm, npxms);
|
|
|
|
if (sndgs[curpxm] == NULL)
|
|
{
|
|
sndgs[curpxm] =
|
|
(struct sndg_struct *) malloc (sizeof (struct sndg_struct));
|
|
sndgs[curpxm]->numlev = 0;
|
|
}
|
|
|
|
sndgp = sndgs[curpxm];
|
|
|
|
if (sndgp->numlev > 0)
|
|
copy_sndg ();
|
|
else
|
|
sndgp->ovrlev = 0;
|
|
|
|
|
|
get_gem_snd (sndfile, sndtime, snd_station,
|
|
(float **) sndgs[curpxm]->sndg, &sndgp->numlev,
|
|
strlen (sndfile), strlen (sndtime),
|
|
strlen (snd_station));
|
|
|
|
if (strlen (stid) > (size_t)2)
|
|
sprintf (raobtitle, " %s %s ", stid, sndtime);
|
|
else
|
|
sprintf (raobtitle, " %s %s ", snd_station, sndtime);
|
|
strcpy (sndgs[curpxm]->title, raobtitle);
|
|
|
|
strcpy (raob_type, "RAOB");
|
|
/*write_file(); */
|
|
xtnd_sndg ();
|
|
save_origsndg ();
|
|
if (sndgp->numlev > 2 && sndgp->sndg[0].pres > 100.0F)
|
|
{
|
|
pagenum = 1;
|
|
define_parcel ((short)current_parcel, user_level);
|
|
mean_wind (sndgp->sndg[sfc ()].pres, i_pres (msl (6000.0F)),
|
|
&ix1, &ix2, &sndgp->st_dir, &sndgp->st_spd);
|
|
sndgp->st_spd *= .75F;
|
|
sndgp->st_dir += 30.0F;
|
|
if (sndgp->st_dir > 360.0F)
|
|
sndgp->st_dir -= 360.0F;
|
|
show_page (pagenum);
|
|
}
|
|
mode = 1;
|
|
|
|
/*
|
|
* clean_uvvs( sndgp ); this is done ins the data reading routine
|
|
*/
|
|
draw_skewt ();
|
|
show_parcel ();
|
|
NxmBusy_checkStopBtn ();
|
|
}
|
|
xenanm (&ier);
|
|
|
|
if (!_transferInterrupt)
|
|
NxmBusy_animateFinish ();
|
|
_transferInterrupt = 0;
|
|
|
|
i = curpxm + 1;
|
|
while ((i < MAX_PIXMAP) && (sndgs[i] != NULL))
|
|
{
|
|
sndgs[i]->numlev = 0;
|
|
i++;
|
|
}
|
|
if (olist->nitems > 1)
|
|
NxmLoopbuttonSensitive (True);
|
|
else
|
|
NxmLoopbuttonSensitive (False);
|
|
XtUnmanageChild (_mypane);
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void popdown_cb (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* POPDOWN_CB */
|
|
/*************************************************************/
|
|
{
|
|
Widget wid = (Widget)clnt;
|
|
XtUnmanageChild (wid);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void gem_loop ( void )
|
|
/************************************************************************
|
|
** *
|
|
* Log: *
|
|
* T. Piper/SAIC 03/05 Added update_text_values() *
|
|
***********************************************************************/
|
|
{
|
|
int ier;
|
|
char winname[] = "skewt_canvas";
|
|
int len =
|
|
strlen (winname), ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
int npxms, curpxm;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
|
|
xqcpxm (&npxms, &curpxm);
|
|
|
|
if (NXMpixmapData.current == 0)
|
|
{
|
|
if (NXManimationFlags.loopfrwdbkwd)
|
|
{
|
|
if (npxms > 2)
|
|
NXMpixmapData.current = 2;
|
|
else
|
|
NXMpixmapData.current = 1;
|
|
}
|
|
else if (curpxm == 1)
|
|
NXMpixmapData.current = npxms - 1;
|
|
else
|
|
NXMpixmapData.current = 1;
|
|
}
|
|
|
|
xscpxm (NXMpixmapData.current, &ier);
|
|
canvas = xqpxms (0, NXMpixmapData.current); /* update global canvas pointer to current pixmap */
|
|
|
|
XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
|
|
gc, 0, 0, (Cardinal)xwdth, (Cardinal)xhght, 0, 0);
|
|
|
|
/* set current data structure pointer */
|
|
if (sndgs[NXMpixmapData.current] == NULL)
|
|
printf ("Hmmm Data pointer is null %d\n", NXMpixmapData.current);
|
|
else
|
|
sndgp = sndgs[NXMpixmapData.current];
|
|
|
|
update_text_values();
|
|
|
|
XFlush (XtDisplay(draw_reg));
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void mdl_pointer (Widget w, XtPointer clnt, XEvent *event)
|
|
/*************************************************************/
|
|
/* MDL_POINTER */
|
|
/* */
|
|
/* Handles "mouse moved w/ no buttons" event */
|
|
/* R. Tian/SAIC 02/03 Added CPF check */
|
|
/*************************************************************/
|
|
{
|
|
char cursor_pos[20];
|
|
float xdev, ydev, lat, lon;
|
|
int iret, np = 1;
|
|
static char sysin[] = "D";
|
|
static char sysout[] = "M";
|
|
XmString str;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
xdev = (float) event->xbutton.x;
|
|
ydev = (float) event->xbutton.y;
|
|
|
|
gtrans (sysin, sysout, &np, &xdev, &ydev, &lat, &lon,
|
|
&iret, strlen (sysin), strlen (sysout));
|
|
|
|
if (iret == 0)
|
|
{
|
|
mdl_cursor_mkstr (lat, lon, cursor_pos);
|
|
if (strncmp (cursor_pos, "CPF", 3) != 0)
|
|
{
|
|
str = XmStringCreateLocalized (cursor_pos);
|
|
XtVaSetValues (mdl_cursor_text, XmNlabelString, str, NULL);
|
|
XmStringFree (str);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sprintf (cursor_pos, "------;-------");
|
|
str = XmStringCreateLocalized (cursor_pos);
|
|
XtVaSetValues (mdl_cursor_text, XmNlabelString, str, NULL);
|
|
XmStringFree (str);
|
|
}
|
|
|
|
XFlush (XtDisplay (mdl_map));
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void mdl_cursor_mkstr (float lat, float lon, char *cpos)
|
|
/*************************************************************/
|
|
/* R. Tian/SAIC 02/03 Added CPF check */
|
|
/*************************************************************/
|
|
{
|
|
int cfmt;
|
|
char stn[20];
|
|
float dist, dir;
|
|
int iret;
|
|
/*---------------------------------------------------------------------*/
|
|
mdl_cursor_fmt_val (0, 0, &cfmt);
|
|
|
|
switch (cfmt)
|
|
{
|
|
case 0:
|
|
sprintf (cpos, "%4.2f;%4.2f", lat, lon);
|
|
break;
|
|
case 1:
|
|
clo_tdirect ("SFSTNS", lat, lon, stn, &dist, &dir, &iret);
|
|
sprintf (cpos, "%s", stn);
|
|
break;
|
|
case 2:
|
|
sprintf (cpos, "%s", "CPF");
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void load_cpf (void)
|
|
/*************************************************************/
|
|
/* LOAD_CPF */
|
|
/* */
|
|
/* Load Cursor Point lat/lon from a file for model sounding */
|
|
/* */
|
|
/* R. Tian/SAIC Coding */
|
|
/* D.W.Plummer/NCEP 3/03 modify ctb_rdcpf calling sequence */
|
|
/*************************************************************/
|
|
{
|
|
int ncp, len, iret;
|
|
char buffer[18];
|
|
float cpf_lat[LLSTFL], cpf_lon[LLSTFL];
|
|
XmString str;
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
ctb_rdcpf ("nmap2.cpf", &ncp, cpf_lat, cpf_lon, &iret);
|
|
if (iret == 0 && ncp > 0)
|
|
{
|
|
sprintf (buffer, "%7.2f;%7.2f", cpf_lat[0], cpf_lon[0]);
|
|
cst_rmbl (buffer, buffer, &len, &iret);
|
|
}
|
|
else
|
|
{
|
|
sprintf (buffer, "%s", "No Cursor Point");
|
|
}
|
|
|
|
XtVaSetValues (mdl_statext, XmNvalue, buffer, NULL);
|
|
|
|
sprintf (buffer, "%s", "------;-------");
|
|
str = XmStringCreateLocalized (buffer);
|
|
XtVaSetValues (mdl_cursor_text, XmNlabelString, str, NULL);
|
|
XmStringFree (str);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void mdl_cursor_fmt_val (int getset, int fmt, int *curval)
|
|
/*************************************************************/
|
|
/* R. Tian/SAIC 02/03 Added CPF check */
|
|
/*************************************************************/
|
|
{
|
|
int iret;
|
|
static int cursorFORMAT = 0;
|
|
/*---------------------------------------------------------------------*/
|
|
if (getset == 1)
|
|
{
|
|
switch (fmt)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
clo_init (&iret);
|
|
cursorFORMAT = fmt;
|
|
break;
|
|
case 2:
|
|
cursorFORMAT = fmt;
|
|
load_cpf ();
|
|
break;
|
|
default:
|
|
printf ("unknown format use latlon %d\n", fmt);
|
|
cursorFORMAT = 0;
|
|
}
|
|
}
|
|
else
|
|
*curval = cursorFORMAT;
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void mdl_cursor_fmt (Widget wdgt, long which, XtPointer call)
|
|
{
|
|
XmToggleButtonCallbackStruct *cbs;
|
|
int iret;
|
|
|
|
cbs = (XmToggleButtonCallbackStruct *)call;
|
|
|
|
if (cbs->set == 0)
|
|
return;
|
|
|
|
mdl_cursor_fmt_val (1, (int)which, &iret);
|
|
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void modmap_selCb (Widget w, XtPointer clnt, XEvent *event)
|
|
/*************************************************************/
|
|
/* R. Tian/SAIC 02/03 Added CPF check */
|
|
/*************************************************************/
|
|
{
|
|
float xloc, yloc;
|
|
float lat, lon;
|
|
int iret, np = 1;
|
|
|
|
char locstr[20];
|
|
static char sysin[] = "D";
|
|
static char sysout[] = "M";
|
|
/*---------------------------------------------------------------------*/
|
|
/*
|
|
* Check if it is a left mouse button.
|
|
*/
|
|
|
|
if (event->xbutton.button == 1)
|
|
{
|
|
xloc = (float) event->xbutton.x;
|
|
yloc = (float) event->xbutton.y;
|
|
|
|
gtrans (sysin, sysout, &np, &xloc, &yloc,
|
|
&lat, &lon, &iret, strlen (sysin), strlen (sysout));
|
|
|
|
if (iret == 0)
|
|
{
|
|
mdl_cursor_mkstr (lat, lon, locstr);
|
|
if (strncmp (locstr, "CPF", 3) != 0)
|
|
{
|
|
XtVaSetValues (mdl_statext, XmNvalue, locstr, NULL);
|
|
strcpy (mdlsoundsta, locstr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void set_user_level (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* SET_USER_LEVEL */
|
|
/*************************************************************/
|
|
{
|
|
char *text_sta;
|
|
|
|
text_sta = XmTextGetString (wdgt);
|
|
|
|
if (text_sta != NULL)
|
|
sscanf (text_sta, "%f", &user_level);
|
|
else
|
|
user_level = 850.0F;
|
|
|
|
XtFree (text_sta);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
/* ARGSUSED */
|
|
void Load_mdl_sounding (Widget wdgt, XtPointer clnt, XtPointer call)
|
|
/*************************************************************/
|
|
/* LOAD_MDL_SOUNDING */
|
|
/*************************************************************/
|
|
{
|
|
XtPointer userdata;
|
|
struct mlist_struct *mlist;
|
|
float ix1, ix2;
|
|
int maxfls, nfiles, ii, ier, len;
|
|
char *cpos, tmplt[4], filnms[256];
|
|
int npxms, curpxm;
|
|
char winname[] = "skewt_canvas";
|
|
int ixsize, iysize, isxsiz, isysiz, ixo, iyo, ncurwn;
|
|
|
|
XtVaGetValues ((Widget)clnt, XmNuserData, &userdata, NULL);
|
|
if (mdlsoundsta[0] != '\0' && mdlsoundsta[1] != 'o' && userdata != NULL)
|
|
mlist = (struct mlist_struct *) userdata;
|
|
else
|
|
return;
|
|
|
|
len = strlen (winname);
|
|
xslwin (winname, &len, &ixsize, &iysize,
|
|
&isxsiz, &isysiz, &ixo, &iyo, &ncurwn, &ier);
|
|
xstanm (&ier);
|
|
|
|
_transferInterrupt = 0;
|
|
NxmBusy_invoke (draw_reg, &_transferInterrupt);
|
|
|
|
for (ii = 0; ii < mlist->nselect && !_transferInterrupt; ii++)
|
|
{
|
|
maxfls = 1;
|
|
fl_mfls (mlist->modlist[ii].model,
|
|
mlist->modlist[ii].fhour,
|
|
mlist->modlist[ii].cycle,
|
|
&maxfls,
|
|
filnms, &nfiles, tmplt, &ier,
|
|
strlen (mlist->modlist[ii].model),
|
|
strlen (mlist->modlist[ii].fhour),
|
|
strlen (mlist->modlist[ii].cycle),
|
|
sizeof (filnms), sizeof (tmplt));
|
|
|
|
if (ier != 0)
|
|
{
|
|
printf ("failed to get model sounding file name for %s %s %s\n",
|
|
mlist->modlist[ii].model, mlist->modlist[ii].fhour,
|
|
mlist->modlist[ii].cycle);
|
|
continue;
|
|
}
|
|
|
|
filnms[255] = '\0';
|
|
len = strcspn (filnms, "\t \0");
|
|
filnms[len] = '\0';
|
|
|
|
xsplot (&ier);
|
|
xqcpxm (&npxms, &curpxm);
|
|
canvas = xqpxms (0, curpxm);
|
|
NxmChangePixmapData (curpxm, npxms);
|
|
|
|
if (sndgs[curpxm] == NULL)
|
|
{
|
|
sndgs[curpxm] =
|
|
(struct sndg_struct *) malloc (sizeof (struct sndg_struct));
|
|
sndgs[curpxm]->numlev = 0;
|
|
}
|
|
|
|
sndgp = sndgs[curpxm];
|
|
|
|
if (sndgp->numlev > 0)
|
|
copy_sndg ();
|
|
else
|
|
sndgp->ovrlev = 0;
|
|
|
|
get_mdl_snd (filnms, mlist->modlist[ii].fhour, mdlsoundsta,
|
|
(float **) sndgs[curpxm]->sndg, &sndgp->numlev,
|
|
strlen (filnms), strlen (mlist->modlist[ii].fhour),
|
|
strlen (mdlsoundsta));
|
|
|
|
xtnd_sndg ();
|
|
save_origsndg ();
|
|
if ((cpos = strrchr (mlist->modlist[ii].model, '/')) == NULL)
|
|
sprintf (raobtitle, " %s %s %s ", mlist->modlist[ii].model,
|
|
mlist->modlist[ii].fhour, mdlsoundsta);
|
|
else
|
|
sprintf (raobtitle, " %s %s %s ", cpos + 1,
|
|
mlist->modlist[ii].fhour, mdlsoundsta);
|
|
strcpy (sndgs[curpxm]->title, raobtitle);
|
|
|
|
sprintf (raob_type, "Model Forecast");
|
|
mode = 1;
|
|
if (sndgp->numlev > 0)
|
|
{
|
|
define_parcel ((short)current_parcel, user_level);
|
|
mean_wind (sndgp->sndg[sfc ()].pres, (float) i_pres (msl (6000.0F)),
|
|
&ix1, &ix2, &sndgp->st_dir, &sndgp->st_spd);
|
|
sndgp->st_spd *= .75F;
|
|
sndgp->st_dir += 30.0F;
|
|
if (sndgp->st_dir > 360.0F)
|
|
sndgp->st_dir -= 360.0F;
|
|
pagenum = 1;
|
|
show_page (pagenum);
|
|
}
|
|
show_parcel();
|
|
draw_skewt();
|
|
NxmBusy_checkStopBtn();
|
|
}
|
|
xenanm (&ier);
|
|
|
|
if (!_transferInterrupt)
|
|
NxmBusy_animateFinish();
|
|
_transferInterrupt = 0;
|
|
|
|
ii = curpxm + 1;
|
|
while ((ii < MAX_PIXMAP) && (sndgs[ii] != NULL))
|
|
{
|
|
sndgs[ii]->numlev = 0;
|
|
ii++;
|
|
}
|
|
if (mlist->nselect > 1)
|
|
NxmLoopbuttonSensitive (True);
|
|
else
|
|
NxmLoopbuttonSensitive (False);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void ellipse (int type, short x, short y, short width, short height)
|
|
/*************************************************************/
|
|
/* ELLIPSE */
|
|
/*************************************************************/
|
|
{
|
|
|
|
if (type == 0)
|
|
{
|
|
XDrawArc (XtDisplay (draw_reg), (canvas), gc, (int) x, (int) y,
|
|
(Cardinal) (width - x), (Cardinal) (height - y), 0, 360 * 64);
|
|
}
|
|
else if (type == 1)
|
|
{
|
|
XFillArc (XtDisplay (draw_reg), (canvas), gc, (int) x, (int) y,
|
|
(Cardinal) (width - x), (Cardinal) (height - y), 0, 360 * 64);
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void StartLoop (void)
|
|
/*************************************************************/
|
|
/* STARTLOOP */
|
|
/*************************************************************/
|
|
{
|
|
set_font (2);
|
|
XtAppMainLoop (app);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
void Load_stationlist_pfc (void)
|
|
/*************************************************************/
|
|
/* LOAD_STATIONLIST_PFC */
|
|
/* */
|
|
/* T. Lee/SAIC 10/02 Used LLSTFL in station dimension */
|
|
/* R. Tian/SAIC 02/03 Added Cursor Points mark */
|
|
/* D.W.Plummer/NCEP 3/03 modify ctb_rdcpf calling sequence */
|
|
/*************************************************************/
|
|
{
|
|
char station_tbl[12], statlist[LLSTFL][18];
|
|
int nsta, ncp, i;
|
|
int ncolor, mrktyp, mrkwid, pltval, iposn, jcolr;
|
|
int iret;
|
|
float sta_lat[LLSTFL], sta_lon[LLSTFL], sizmrk;
|
|
float cpf_lat[LLSTFL], cpf_lon[LLSTFL];
|
|
static char map_winname[] = "mappfc";
|
|
|
|
|
|
switch (pfc_map.mapindx)
|
|
{
|
|
case 0:
|
|
sprintf (station_tbl, "US");
|
|
break;
|
|
|
|
case 1:
|
|
sprintf (station_tbl, "CN");
|
|
break;
|
|
|
|
case 2:
|
|
sprintf (station_tbl, "MX");
|
|
break;
|
|
|
|
default:
|
|
sprintf (station_tbl, "DSET");
|
|
|
|
}
|
|
|
|
|
|
nsharp_draw_map (map_winname, &pfc_map, &iret);
|
|
|
|
if (pfcsoundfile[0] != '\0' && pfcsoundtime[0] != '\0' &&
|
|
station_tbl[0] != '\0')
|
|
{
|
|
ncolor = 1;
|
|
mrktyp = 6;
|
|
sizmrk = 1.0F;
|
|
mrkwid = 2;
|
|
pltval = G_FALSE;
|
|
iposn = 0;
|
|
jcolr = 2;
|
|
|
|
|
|
/*printf( "Beginning GET_GEM_STNS %s\n", station_tbl ); */
|
|
get_gem_stns (pfcsoundfile, station_tbl, pfcsoundtime,
|
|
statlist, &nsta, sta_lat, sta_lon,
|
|
strlen (pfcsoundfile), strlen (station_tbl),
|
|
strlen (pfcsoundtime), 18);
|
|
/*printf( "Ending GET_GEM_STNS\n" ); */
|
|
|
|
map_mark (&nsta, sta_lat, sta_lon, NULL, &ncolor, NULL,
|
|
&jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval, &iposn, &iret);
|
|
|
|
ctb_rdcpf ("nmap2.cpf", &ncp, cpf_lat, cpf_lon, &iret);
|
|
if (iret == 0 && ncp > 0)
|
|
{
|
|
ncolor = 1;
|
|
mrktyp = 5;
|
|
sizmrk = 2.0F;
|
|
mrkwid = 2;
|
|
pltval = G_FALSE;
|
|
iposn = 0;
|
|
jcolr = 5;
|
|
|
|
map_mark (&ncp, cpf_lat, cpf_lon, NULL, &ncolor, NULL,
|
|
&jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval,
|
|
&iposn, &iret);
|
|
}
|
|
|
|
stnList.nstn = nsta;
|
|
for (i = 0; i < nsta; i++)
|
|
{
|
|
statlist[i][17] = 0;
|
|
stnList.lat[i] = sta_lat[i];
|
|
stnList.lon[i] = sta_lon[i];
|
|
strcpy (stnList.stnName[i], statlist[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
stnList.nstn = 0;
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void clean_uvvs (struct sndg_struct *sp)
|
|
{
|
|
int i;
|
|
for (i = 0; i < sp->numlev; i++)
|
|
sp->sndg[i].omega = (-999.0F);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void show_profiler_info (Widget wid)
|
|
/*************************************************************/
|
|
/* SHOW_PROFILER */
|
|
/* */
|
|
/* Display Profiler Map and get user selection. */
|
|
/*************************************************************/
|
|
{
|
|
printf ("Profiler data not implemented yet\n");
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void show_acars_info (Widget wid)
|
|
/*************************************************************/
|
|
/* SHOW_PROFILER */
|
|
/* */
|
|
/* Display ACARS Map and get user selection. */
|
|
/*************************************************************/
|
|
{
|
|
acars_selection ();
|
|
}
|